Dji Manifold2-G、Jetson TX2源码编译安装pytorch
最近由于所承担项目的实际需求,需要在Dji Manifold2-G上面配置深度学习的网络框架 pytorch 。Dji Manifold2-G实际上是集成了一块NVIDIA Jetson TX2的GPU模块,并提供多种接口用来连接不同的外部设备,体积小,操作便捷,非常适合于作为机载的一种处理器。自己在实际的编译过程中遇到各种Bug,各种网上寻找解决方案,现在将自己的源码编译安装 pytorch 过程整理处理,方便以后需要的开发者们节省更多时间。
一、安装cudnn
源码编译安装 pytorch 的时候会使用 cuda 和 cudnn ,Dji Manifold2-G出厂自带的有cuda9.0,因此不需要安装cuda,只需要安装对应cuda9.0版本的 cudnn ,Dji Manifold2-G的CPU是基于ARM架构的,即对应的是aarch64,因此去官网下载的时候应该下载对应版本的 cudnn ,下面给出我自己使用版本的一个链接。
http://developer.download.nvidia.com/compute/redist/cudnn/v7.1.1/cudnn-9.0-linux-x64-v7.1.tgz
安装cudnn
~$ cd data/
~$ sudo tar xvf cudnn-9.0-linux-x64-v7.1.tgz
~$ mkdir cudnn7
~$ sudo cp -r cuda cudnn7
~$ cd cudnn7
~$ sudo cp include/cudnn.h /usr/local/cuda/include/
~$ sudo cp lib64/* /usr/local/cuda/lib64/
~$ cd /usr/local/cuda/lib64/
/usr/local/cuda/lib64$ sudo chmod +r libcudnn.so.7.1.1
/usr/local/cuda/lib64$ sudo rm -rf libcudnn.so libcudnn.so.7
/usr/local/cuda/lib64$ sudo ln -s libcudnn.so.7.1.1 libcudnn.so.7
/usr/local/cuda/lib64$ sudo ln -s libcudnn.so.7 libcudnn.so
/usr/local/cuda/lib64$ sudo ldconfig
查看cuda和cudnn版本
nvcc -V
cat /usr/local/cuda/version.txt
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
二、下载pytorch的源码
这里我安装的 pytorch 版本是 v1.0.0 。在pytorch github上面文件夹里面是有相关子项目链接,所以在下载pytorch的时候建议使用下面的命令进行下载:
git clone --recursive --branch v1.0.0 http://github.com/pytorch/pytorch
pytorch下载下载完成之后,下面开始安装,我选择安装的是python2.7版本的。
安装依赖和必要的组件
sudo apt install libopenblas-dev libatlas-dev liblapack-dev
sudo apt install liblapacke-dev checkinstall
sudo apt-get install python-pip
pip install --upgrade pip
sudo apt-get install python-dev
sudo pip install numpy scipy
sudo pip install pyyaml
sudo pip install scikit-build
sudo apt-get -y install cmake
sudo apt install libffi-dev
sudo pip install cffi
安装完之后,添加cudnn的lib和include的路径
sudo gedit ~/.bashrc
export CUDNN_LIB_DIR=/usr/lib/aarch64-linux-gnu
export CUDNN_INCLUDE_DIR=/usr/include
source ~/.bashrc
编译之前需要对源码进行修改
在编译之前需要关闭程序中的NCCL
#sudo gedit /pytorch/CMakeList.txt
# > CmakeLists.txt : Change NCCL to 'Off' on line 98
#sudo gedit /pytorch/setup.py
# > setup.py: Add USE_NCCL = False below line 200
#sudo gedit /pytorch/tools/setup_helpers/nccl.py
# > nccl.py : Change USE_SYSTEM_NCCL to 'False' on line 13
# Change NCCL to 'False' on line 78
#sudo gedit /pytorch/torch/csrc/cuda/nccl.h
# > nccl.h : Comment self-include on line 8
# Comment entire code from line 21 to 28
#sudo gedit torch/csrc/distributed/c10d/ddp.cpp
# > ddp.cpp : Comment nccl.h include on line 6
# Comment torch::cuda::nccl::reduce on line 163
进行编译
cd pytorch
git submodule update --init --recursive
sudo pip install -U setuptools
sudo pip install -r requirements.txt
开启Dji Manifold2-G最大功率模式
sudo ./jetson_clocks.sh
sudo pip install scikit-build --user
sudo ldconfig
export USE_NCCL=0 USE_DISTRIBUTED=1 USE_OPENCV=ON USE_CUDNN=1 USE_CUDA=1 ONNX_ML=1
开始编译
下面进行的每一步一定要添加 sudo -E USE_MKLDNN=0 USE_QNNPACK=0 USE_NNPACK=0 USE_DISTRIBUTED=0 BUILD_TEST=0 否则会编译出错。
sudo -E USE_MKLDNN=0 USE_QNNPACK=0 USE_NNPACK=0 USE_DISTRIBUTED=0 BUILD_TEST=0 python setup.py bdist_wheel # 这一步其实是在编译生成 wheel 文件,存在 /pytorch/disk 下
经过漫长的编译之后,执行下面的命令
sudo -E USE_MKLDNN=0 USE_QNNPACK=0 USE_NNPACK=0 USE_DISTRIBUTED=0 BUILD_TEST=0 DEBUG=1 python3 setup.py build develop
再次经过漫长的编译过程之后,再继续执行下面的命令
sudo apt clean
sudo apt-get install libjpeg-dev zlib1g-dev
cd ~/data
git clone https://github.com/python-pillow/Pillow.git
cd Pillow/
sudo python setup.py install
sudo apt-get install python3-sklearn
sudo pip install pandas Cython scikit-image
sudo pip --no-cache-dir install torchvision
编译完成,完成之后在运行实际的深度学习程序时可能会遇到以下的错误
RuntimeError: cuda runtime error (7) : too many resources requested for launch at /home/nvidia/pytorch/aten/src/THCUNN/generic/SpatialUpSamplingBilinear.cu:66
此时的解决方案需要对**“aten/src/THCUNN/generic/SpatialUpSamplingBilinear.cu”**文件做出以下的修改
Around line 62:
comment out THCState_getCurrentDeviceProperties(state)->maxThraedsPerBlock;
Set
const int num_threads = 512;
Around line 97:
comment out THCState_getCurrentDeviceProperties(state)->maxThraedsPerBlock;
Set
const int num_threads = 512;
完成修改之后,执行以下命令
sudo -E USE_MKLDNN=0 USE_QNNPACK=0 USE_NNPACK=0 USE_DISTRIBUTED=0 BUILD_TEST=0 DEBUG=1 python setup.py install
三、总结
一步步按照我上面叙述的安装步骤来进行源码安装 pytorch 应该不会出现错误,如果出现任何错误,欢迎大家进行咨询。