pytorch
-
编译过的 pytorch 版本
- pytorch v2.0.0(CUDA 11.7,cuDNN 8.5.0,torchvision 0.15.1)
- pytorch v1.13.1(CUDA 11.7,cuDNN 8.5.0,torchvision 0.14.1)
- pytorch v1.7.0(CUDA 11.2,cuDNN 8.1.0,torchvision 0.8.0)
关于版本对应,可以参考:Ubuntu 22.04 LTS 安装 PyTorch + CUDA 深度学习环境
-
一些问题可以在 pytorch 官方回答 中找到。
-
pytorch 依赖于很多 第三方库,可以看下管理子模块的 配置文件。
关于 third_party 和 .gitmodules,参考:Git 如何将第三方库导入到Git中。
过程记录
略过了创建虚拟环境、安装依赖和包等步骤,和 官方 提供的方法一样。参考:
1、下载 PyTorch v1.13.1 源码包。
git clone -b v1.13.1 https://github.com/pytorch/pytorch torch_1.13.1
2、进入源码包获取被动依赖代码。
cd torch_1.13.1/
# git checkout v1.10.1 # 举个例子,切换到你想要的版本分支
git submodule sync
git submodule update --init --recursive
如果
git submodule update --init --recursive
经常失败,说明还是网络的问题。如果你的网络不行,可以参考git clone —recursive 快速高效下载方法 ,虽然我没尝试成功过。
3、安装 PyTorch。
export CMAKE_PREFIX_PATH=${CONDA_PREFIX:-"$(dirname $(which conda))/../"} #导入conda路径
python setup.py install #编译安装
轻便安装:
USE_DISTRIBUTED=0 USE_MKLDNN=0 BUILD_TEST=0 USE_FBGEMM=0 USE_NNPACK=0 USE_QNNPACK=0 USE_XNNPACK=0 python setup.py install
有一种说法:在安装环境的时候可以使用 TORCH_CUDA_ARCH_LIST=“7.5” python setup.py install 来安装,能加速。
重新编译
pip uninstall torch
python setup.py clean # 清除编译结果
问题解决
问题1:第一次尝试,报错
Building wheel torch-1.13.0a0+git49444c3
-- Building version 1.13.0a0+git49444c3
……
-- Found CUDNN: /usr/local/cuda-11.8/lib64/libcudnn.so
-- Found cuDNN: v? (include: /usr/local/cuda-11.8/include, library: /usr/local/cuda-11.8/lib64/libcudnn.so)
CMake Error at cmake/public/cuda.cmake:185 (message):
PyTorch requires cuDNN 7 and above.
Call Stack (most recent call first):
cmake/Dependencies.cmake:43 (include)
CMakeLists.txt:722 (include)
-- Configuring incomplete, errors occurred!
可能的问题:路径 /usr/local/cuda-11.8/include/
里没有 cudnn_version.h 文件。
locate cudnn_version.h
找到 cudnn_version.h 的位置/usr/include/cudnn_version.h
- 复制:
sudo cp /usr/include/cudnn_version.h /usr/local/cuda-11.8/include/
问题2:安装后,在 import torch 时遇到一个报错 /lib/libstdc++.so.6: version ‘GLIBCXX_3.4.30’ not found,可能是之前修改过 gcc 的版本导致的,解决方案:anaconda3/lib/libstdc++.so.6: version `GLIBCXX_3.4.*‘ not found 问题处理
find / -name "libstdc++.so.6*"
cd /home/username/.conda/envs/torch/lib
ln -s -f /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30 libstdc++.so.6
安装 torchvision
PyTorch 和 torchvision 的版本对应 PyTorch Versions
直接安装
问题:编译安装成功后想使用 torchvision,发现直接 conda install torchvision
会附带安装一个 pytorch,导致不能正常使用。
解决方案:离线安装 torchvision,且不安装任何依赖项。
1、在 这里 查找 pytorch 对应的 torchvision 的版本,因为我编译安装的 pytorch 是 v1.13.1,所以我需要安装 torchvision 0.14.1。
2、在 这里 查找并下载 torchvision,我下载的是 cu117/torchvision-0.14.1%2Bcu117-cp38-cp38-linux_x86_64.whl。
3、在虚拟环境中安装 pillow 包,conda install pillow
。
4、在虚拟环境中安装 torchvision 包,pip install --no-deps 文件位置/torchvision-0.14.1+cu117-cp38-cp38-linux_x86_64.whl
,这里一定要加 --no-deps
。
关于
--no-deps
,参考:python -m pip install [package] --no-deps
5、目前在 import torchvision
时,会出现下面的警告,暂时没解决。查了一下,应该是 cuda、cudnn、torch 这三者和 torchvision 版本的问题。测试了一下,不影响使用,先搁置这个问题。
.../lib/python3.8/site-packages/torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: libtorch_cuda_cu.so: cannot open shared object file: No such file or directory
warn(f"Failed to load image Python extension: {e}")
编译安装
参考:CUDA11.2环境上MXNet源码和pytorch源码编译
编译安装 torchvision v0.8.0-rc1 前,先在虚拟环境中装 pillow 4.1.1
pip install pillow==4.1.1
编译pytorch2.0.0+torchvision0.15.0后,在import torchvision
后遇到一个报错:
TypeError: 'ABCMeta' object is not subscriptable
应该是pillow版本的问题,或者conda环境里就没有pillow。解决方法:conda install pillow
尝试使用CCache提高编译速度
ccache[参考] 缓存了编译结果,如果文件没有变化,下次编译时可以直接使用缓存。
在编译 PyTorch 之前,需要安装 ccache:conda install ccache
默认情况下,ccache 的缓存大小可能过小。可以通过如下命令增加缓存大小:
# 设置缓存的最大大小为 25 GiB。如果缓存超过此大小,ccache 将删除一些旧的缓存文件。
ccache -M 25Gi # -M 0 表示不限制大小
# 设置缓存文件数量为无限制
ccache -F 0
缓存目录为 ~/.ccache
,配置文件为 ~/.ccache/ccache.conf
为了验证 ccache 是否正常工作,可以连续两次干净地构建 PyTorch,第二次构建应该比第一次快得多。如果没有明显变快,可以检查build/CMakeCache.txt
文件中的 CMAKE_<LANG>_COMPILER_LAUNCHER
规则(<LANG>
可以是 C、CXX 或 CUDA)。这些变量应该包含 ccache,例如:
// CXX 编译器启动器
CMAKE_CXX_COMPILER_LAUNCHER:STRING=/usr/bin/ccache
如果这些变量没有正确设置,可以在运行 setup.py
之前在命令行中定义它们(这里还可以[参考]):
# 这几行命令将告诉 CMake 使用 ccache 作为编译器启动器,从而启用 ccache 缓存功能,加速编译过程。
export CMAKE_C_COMPILER_LAUNCHER=ccache
export CMAKE_CXX_COMPILER_LAUNCHER=ccache
export CMAKE_CUDA_COMPILER_LAUNCHER=ccache
python setup.py develop
使用ccache -s
命令查看 ccache 是否真的在工作。在第二次和所有后续编译中,cache hit
值应该增加,从而表明 ccache 正在工作[参考]。
调试
在编译的时候注意加入DEBUG信息,这里在python命令前面加DEBUG=1的环境变量,相当于GCC中的-g -O0
,保留调试信息。
DEBUG=1 USE_DISTRIBUTED=0 USE_MKLDNN=0 BUILD_TEST=0 USE_FBGEMM=0 USE_NNPACK=0 USE_QNNPACK=0 USE_XNNPACK=0 python setup.py develop
编译命令的前面是一些编译选项。这些编译选项的意义以及其他的可选项可查看 setup.py 文件开头的注释部分,写的很清楚。
python setup.py develop
和python setup.py install
是两种不同的安装方式。
develop
选项会将编译好的pytorch安装到当前的源码根目录下。如果我们的修改只涉及 Python 文件部分,这个模式很有用。install
选项会将编译好的pytroch安装到python的site-package目录中。
调试方法:
- PyTorch源码学习系列 - 1.初识 - 知乎(文中的“第一次动手编译”和“如何调试程序”两章)
- 在 vscode
参考资料
- 关于 setup.py:Python项目打包及发布
- 关于 build 和 install:简述python setup.py install的过程
- 编译PyTorch静态库(几个线性代数库的名字、CMake编译开关、指定CUDA架构)
- 一次对 Pytorch 源码编译过程的解析尝试
- PyTorch Internals Part II - The Build System → 翻译(从最终用户的角度解释构建过程;通过只构建修改的那部分代码来提升迭代开发的速度)