由于原本的bmtrain存在对nccl的依赖,在csrc里的nccl.cpp 调用了nccl的api,而通常情况下,在编译该模块时,会动态链接到pytorch的nccl.so文件,这样如果pytorch升级了nccl,就会导致bmtrain的接口失效,会造成bmtrain对pytorch的版本强依赖。
为了解决这个问题,尝试将nccl静态链接到bmtrain的_C模块(即nccl.cpp编译出的动态链接.so文件)里。
这里为了避免CUDA版本带来的问题,选择11.0作为基准版本,由于CUDA的向下兼容,11.0以上的CUDA版本都能正常运行,该CUDA版本对应的pytorch版本为1.7.1。
nccl安装
直接下载• O/S agnostic local installer
里面就是.so和.h
别选发行版安装
安装nccl
~~dpkg -i <从[<https://developer.nvidia.com/>](<https://developer.nvidia.com/>) 下载的nccl2.14.3+cu110版本>~~
~~apt update~~
~~apt install libnccl2 libnccl-dev~~
nccl 的lib和include path
lib: /usr/lib/x86_64-linux-gnu/
include: /usr/include
torch CUDA Extension
编译结束后拿到bulid里的_C.cpython-39-x86_64-linux-gnu.so,放到bmtrain/nccl底下,完事。
由于编译结束后只得到了一个python版本的.so文件,为了适配不同操作系统和不同python版本的问题,尝试用github action解决部署问题。
尝试基于pytorch的manylinux镜像来构建bulid的镜像,然后github action基于构建好的镜像来编译.so文件。
docker pull pytorch/manylinux-cuda110
#以python3.8为例
/opt/python/cp38-cp38/bin/pip3 install torch==1.7.1+cu110 \\
-i <https://download.pytorch.org/whl/cu110>
git clone <https://github.com/OpenBMB/BMTrain.git>
cd BMTrain
pip install build # needs to be installed first
python -m build # builds both sdist and wheel
python -m build --sdist
python -m build --wheel