配置Fairseq的wav2vec采坑记录2

前面写过一片Fairseq Wav2ec的踩坑记录,但是没有踩完,没办法3个月之后继续踩,这次总算跑起来了。

#Note# 本文撰写之时PyTorch的1.8版本尚未发布,1.8版之后兼容性和编译问题减少不少,愿对诸君有用

1.基础环境

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

2. 主要安装过程

跑Wav2ec的例子,大体需要注意以下步骤:

  • 1.更新显卡驱动到最新,(注意最新驱动和最新内核一起会导致 usbnet内核模组莫名奇妙的没了,所以只安装显卡驱动,不要更新内核)
  • 2.本地安装CUDA,conda的cuda_tooltiks不带nvcc ,20210303最新的是:cuda_11.1.0_455.23.05_linux.run
  • 3.创建Conda环境 ,python3.9 (其他版本估计也没问题)
  • 4.安装PyTorch-Nightly版本,见官网,不要同时安装TorchVision和TorchAudio等,这样会导致安装PyTorch的1.7.1版本(Release版)
  • 5.安装Apex
  • 6.安装Fairseq
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)。

3. 主要的坑

3.1 GeForce RTX 3090 带来的问题

因为3090是新卡,PyTorch对其支持不好,实验了好多次最后才怀疑此问题。

三件套: 驱动最新 CUDA11.1 PyTorch-Nightly

不用按照官网命令加TorchVision和TorchAudio,你可以从官网上手动下载安装
算力查询NVIDIA

3.2 Apex 的编译天坑

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: 没有那个文件或目录

最后安装后测试,未测试

Tips 1:

其他可能的问题: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
其他人的安装向导

Tips 2 /csrc/flatten_unflatten.o: 没有那个文件或目录

在版本不对时遇到:

/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

3.3 运用wav2vec

使用命令来运用

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]

参考来源

Tips:1 设备数量错误

AssertionError: world size is 64 but have 3 available devices

该d1的distributed_world_size

Tips : 2 update_freq错误

需要[],否则

 Could not append to config. An item is already at 'optimization.update_freq'.

Tips : 3 task.data错误

传递参数是目录,不是tsv文件,否则

NotADirectoryError: [Errno 20] Not a directory: '/data/Temp/SLR12/train.tsv/valid.tsv'

Tips : 4 fused_layer_norm_cuda错误

早期遇到fused_layer_norm_cuda错误如下

ModuleNotFoundError: No module named 'fused_layer_norm_cuda'

经过PyTorch-Nightly就没有了

Tips: 5 compute_86

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"

Tips 6 : fairseq.data.data_utils_fast’

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`"
        )

没事,直接安装就不报了

最后,训练中结果待定

你可能感兴趣的:(Fairseq,pytorch,linux,cuda,深度学习)