前面写过一片Fairseq Wav2ec的踩坑记录,但是没有踩完,没办法3个月之后继续踩,这次总算跑起来了。
#Note# 本文撰写之时PyTorch的1.8版本尚未发布,1.8版之后兼容性和编译问题减少不少,愿对诸君有用
Intel® Xeon® Platinum 8163 CPU @ 2.50GHz × 96
GeForce RTX 3090 x 2 (这里必须说明以下:3090是导致编译和执行问题的主要背锅的)
Ubuntu 20.04
Ananconda3
Python3.9
PyTorch1.8.1 -Nightly版本 (据说只有这个版本可以适用3090)
Apex (编译通过但是没有安装)
Fairseq (本地编译安装)
CUDA cuda_11.1.0_455.23.05_linux.run (本地安装,没有使用Conda自带的,反正也没有nvcc,无法编译)
显卡驱动 460.39
跑Wav2ec的例子,大体需要注意以下步骤:
git clone https://github.com/pytorch/fairseq
cd fairseq
export TORCH_CUDA_ARCH_LIST="8.6"
pip install --editable ./
强制指定3090的算力8.6,2080Ti是7.5
python -c "import torch;print(torch.__version__, torch.version.cuda)"
会显示pytorch版本(1.6.0)和对应cuda版本(10.1);
python -c "import fairseq;print(fairseq.__version__)"
会显示fairseq版本(0.9.0);
python -c "import fairseq;print(fairseq.utils.multi_tensor_l2norm_available)"
会显示apex是否成功安装(True)。
因为3090是新卡,PyTorch对其支持不好,实验了好多次最后才怀疑此问题。
三件套: 驱动最新 CUDA11.1 PyTorch-Nightly
不用按照官网命令加TorchVision和TorchAudio,你可以从官网上手动下载安装
算力查询NVIDIA
Apex编译起来问题太多
首先需要修改setup.py 取消PyTorch和nvcc之间的版本校验,感谢其他人提供的思路
可以在103行的地方 if False and 直接跳过这个检查,反正你也没办法(PyTorch/CUDA/3090就是配不起来)
def check_cuda_torch_binary_vs_bare_metal(cuda_dir):
raw_output, bare_metal_major, bare_metal_minor = get_cuda_bare_metal_version(cuda_dir)
torch_binary_major = torch.version.cuda.split(".")[0]
torch_binary_minor = torch.version.cuda.split(".")[1]
print("\nCompiling cuda extensions with")
print(raw_output + "from " + cuda_dir + "/bin\n")
if False and (bare_metal_major != torch_binary_major) or (bare_metal_minor != torch_binary_minor):
raise RuntimeError("Cuda extensions are being compiled with a version of Cuda that does " +
"not match the version used to compile Pytorch binaries. " +
"Pytorch binaries were compiled with Cuda {}.\n".format(torch.version.cuda) +
"In some cases, a minor-version mismatch will not cause later errors: " +
"https://github.com/NVIDIA/apex/pull/323#discussion_r287021798. "
"You can try commenting out this check (at your own risk).")
编译命令可以使用:
python setup.py build --cpp_ext --cuda_ext
在Fairseq中提供的脚本过不去:
git clone https://github.com/NVIDIA/apex
cd apex
pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" \
--global-option="--deprecated_fused_adam" --global-option="--xentropy" \
--global-option="--fast_multihead_attn" ./
这里之所以用build而不是install,是因为曾经在CUDA/3090的Bug中,取消在Build临时目录下调试检查,所以没有–no-cache-dir,后面的参数导致cutlass.h不见,我也没试是那个
apex/contrib/csrc/multihead_attn/strided_batched_gemm.h:14:10: fatal error: cutlass/cutlass.h: 没有那个文件或目录
最后安装后测试,未测试
其他可能的问题:Apex在Pypi指向了其他包,
TypeError: Class advice impossible in Python3. Use the @Implementer class decorator instead
问题解决
按照以下方式重新安装apex
pip uninstall apex
git clone https://www.github.com/nvidia/apex
cd apex
python setup.py install
参考资料:
https://www.jianshu.com/p/10a9f07a71a3
https://github.com/NVIDIA/apex/issues/116
也可以从这下载Apex
其他人的安装向导
在版本不对时遇到:
/csrc/flatten_unflatten.o: 没有那个文件或目录
这是一个异常艰难的调试过程,可以使用不加–no-cache-dir,在build/temp***/ 目录中手动执行nanja来编译
nanja编译—setup.py–再编译–再安装,如此重复到全部编译完成
但是,依然没有用,会出现Tensor无法传递给cuda kernel的错误。
python setup.py install --cpp_ext --cuda_ext
nanja
Allowing ninja to set a default number of workers... (overridable by setting the environment variable MAX_JOBS=N)
1.10.1
g++ -pthread -shared -B /home/xx/anaconda3/envs/lSrv08/compiler_compat -L/home//xx/anaconda3/envs/lSrv08/lib -Wl,-rpath=/home//xx/anaconda3/envs/lSrv08/lib -Wl,--no-as-needed -Wl,--sysroot=/ /home//xx/Documents/workspace/apex-master/build/temp.linux-x86_64-3.8/csrc/amp_C_frontend.o /home//xx/Documents/workspace/apex-master/build/temp.linux-x86_64-3.8/csrc/multi_tensor_sgd_kernel.o /home//xx/Documents/workspace/apex-master/build/temp.linux-x86_64-3.8/csrc/multi_tensor_scale_kernel.o /home//xx/Documents/workspace/apex-master/build/temp.linux-x86_64-3.8/csrc/multi_tensor_axpby_kernel.o /home//xx/Documents/workspace/apex-master/build/temp.linux-x86_64-3.8/csrc/multi_tensor_l2norm_kernel.o /home//xx/Documents/workspace/apex-master/build/temp.linux-x86_64-3.8/csrc/multi_tensor_lamb_stage_1.o /home//xx/Documents/workspace/apex-master/build/temp.linux-x86_64-3.8/csrc/multi_tensor_lamb_stage_2.o /home//xx/Documents/workspace/apex-master/build/temp.linux-x86_64-3.8/csrc/multi_tensor_adam.o /home/xx/Documents/workspace/apex-master/build/temp.linux-x86_64-3.8/csrc/multi_tensor_adagrad.o /home/xx/Documents/workspace/apex-master/build/temp.linux-x86_64-3.8/csrc/multi_tensor_novograd.o /home/xx/Documents/workspace/apex-master/build/temp.linux-x86_64-3.8/csrc/multi_tensor_lamb.o -L/home/xx/anaconda3/envs/lSrv08/lib/python3.8/site-packages/torch/lib -L/usr/local/cuda/lib64 -lc10 -ltorch -ltorch_cpu -ltorch_python -lcudart -lc10_cuda -ltorch_cuda -o build/lib.linux-x86_64-3.8/amp_C.cpython-38-x86_64-linux-gnu.so
g++: error: /home/xx/Documents/workspace/apex-master/build/temp.linux-x86_64-3.8/csrc/amp_C_frontend.o: 没有那个文件或目录
g++: error: /home/xx/Documents/workspace/apex-master/build/temp.linux-x86_64-3.8/csrc/multi_tensor_sgd_kernel.o: 没有那个文件或目录
g++: error: /home/xx/Documents/workspace/apex-master/build/temp.linux-x86_64-3.8/csrc/multi_tensor_scale_kernel.o: 没有那个文件或目录
g++: error: /home/xx/Documents/workspace/apex-master/build/temp.linux-x86_64-3.8/csrc/multi_tensor_axpby_kernel.o: 没有那个文件或目录
g++: error: /home/xx/Documents/workspace/apex-master/build/temp.linux-x86_64-3.8/csrc/multi_tensor_l2norm_kernel.o: 没有那个文件或目录
g++: error: /home/xx/Documents/workspace/apex-master/build/temp.linux-x86_64-3.8/csrc/multi_tensor_lamb_stage_1.o: 没有那个文件或目录
g++: error: /home/xx/Documents/workspace/apex-master/build/temp.linux-x86_64-3.8/csrc/multi_tensor_lamb_stage_2.o: 没有那个文件或目录
g++: error: /home/xx/Documents/workspace/apex-master/build/temp.linux-x86_64-3.8/csrc/multi_tensor_adam.o: 没有那个文件或目录
g++: error: /home/xx/Documents/workspace/apex-master/build/temp.linux-x86_64-3.8/csrc/multi_tensor_adagrad.o: 没有那个文件或目录
g++: error: /home/xx/Documents/workspace/apex-master/build/temp.linux-x86_64-3.8/csrc/multi_tensor_novograd.o: 没有那个文件或目录
g++: error: /home/xx/Documents/workspace/apex-master/build/temp.linux-x86_64-3.8/csrc/multi_tensor_lamb.o: 没有那个文件或目录
error: command 'g++' failed with exit status 1
使用命令来运用
fairseq-hydra-train \
task.data=/data/Temp/SLR12/ \
--config-dir /path/to/any/where/to/wav2vec/config/pretraining \
--config-name d1
这里task.data=是SLR12的路径,也就是 Librispeech
我只有两快3090,这里的配置是写道了d1中,而不是命令行。
我把例子中的配置复制到任意喜欢的目录,d1=wav2vec2_base_librispeech,主要加改了两处:一是改distributed_world_size,二是加update_freq: [32] ,注意有中括号哦
distributed_training:
distributed_world_size: 2
ddp_backend: no_c10d
optimization:
max_update: 400000
lr: [0.0005]
update_freq: [32]
参考来源
AssertionError: world size is 64 but have 3 available devices
该d1的distributed_world_size
需要[],否则
Could not append to config. An item is already at 'optimization.update_freq'.
传递参数是目录,不是tsv文件,否则
NotADirectoryError: [Errno 20] Not a directory: '/data/Temp/SLR12/train.tsv/valid.tsv'
早期遇到fused_layer_norm_cuda错误如下
ModuleNotFoundError: No module named 'fused_layer_norm_cuda'
经过PyTorch-Nightly就没有了
nvcc fatal : Unsupported gpu architecture 'compute_86'
更新下载对应的CUDA:
wget https://developer.download.nvidia.com/compute/cuda/11.1.0/local_installers/cuda_11.1.0_455.23.05_linux.run
sudo sh cuda_11.1.0_455.23.05_linux.run
配置显卡算力,7.5是2080Ti的版本,8.6是3090,很不幸,Pytorch暂时没有11.2的版本,所以忍忍
export TORCH_CUDA_ARCH_LIST="8.6"
fairseq需要用到Cython编译后的模块,所以直接调试有问题,将出现(节选):
Exception:
from fairseq.data.data_utils_fast import (
ModuleNotFoundError: No module named 'fairseq.data.data_utils_fast'
During handling of the above exception, another exception occurred:
ImportError: Please build Cython components with: `pip install --editable .` or `python setup.py build_ext --inplace`
这是比较神奇的地方,是一个pyx模块,需要编译,导致必须安装
有人问起怎么编译,就是在代码目录里执行:python setup.py build_ext --inplace
try:
from fairseq.data.data_utils_fast import (
batch_by_size_fast,
batch_fixed_shapes_fast,
)
except ImportError:
raise ImportError(
"Please build Cython components with: `pip install --editable .` "
"or `python setup.py build_ext --inplace`"
)
没事,直接安装就不报了
最后,训练中结果待定