Pytorch编译过程
- 预备条件:
(1)Python3.6及以上版本,C++14编译器以及Anaconda3.
(2)NVIDIA CUDA,cuDNN:pytorch1.5版本以前建议CUDA9.2,pytoch1.5版本以后要求CUDA10.2. cuDNN版本要求,pytorch1.5以前安装cuDNN7不能安装cuDNN8(cuDNN8版本中版本信息从cudnn.h中更改到了cudnn_version.h,会导致pytorch1.5及以前版本在检查cuDNN版本号检查出错导致编译不能通过)
(3)其他依赖库安装:conda install numpy ninja pyyaml mkl mkl-include setuptools cmake cffi nccl(会附带安装cundatookit等,具体版本请依据CUDA版本进行选择。
(4) linux系统安装需要mega-cuda包,使用
conda install –c pytorch magma-cuda102
进行安装,其中102为对应cuda版本号,102为cuda10.2版本,具体选用请依据cuda版本进行选择。例如[magma-cuda101,magma-cuda100]等 - 获取源代码:
git clone --recursive https://github.com/pytorch/pytorch
如果对代码进行更新,则执行以下操作:
git submodule sync
git submodule update --init –recursive - 版本选择:
在获取源代码操作中,默认下载github网站下最新版本,如需调换至老版本,需要进行如下操作:
(1):可供选择版本查询:
git tag
(2) 版本更换,选定好需要编译的版本后
git checkout v1.5.1 (v后数值为版本号,选择自己需要编译的固定版本号即可,建议选取pytorch1.3及以后版本以保证环境稳定)
(3) 注意事项:在使用git checkout 命令前,一定保证对工程内的代码未作修改,否则会出现更改版本不通过的问题。
如需使用较早版本,请查询所有依赖库的版本,否则会出现编译不通过的现象
4. 安装过程:
export CMAKE_PREFIX_PATH=KaTeX parse error: Expected '}', got 'EOF' at end of input: …CONDA_PREFIX:-"(dirname $(whichconda))/…/"}
python setup.py install
注意事项:
(1)python setup.py install –cmake_only 只生成build文件不编译,若想继续编译,请执行 python setup build 命令。
(2)Ninja及make,如果在系统中安装ninja包后,在生成文件的过程中,会使用ninja进行build库的生成及编译,不会出现Makefile文件,如果未安装Ninja,系统默认使用make命令进行安装,build文件中会找到MakeFile文件。
(3)如果使用anaconda的虚拟环境进行pytorch配置,可能会出现cmake版本低的问题,使用conda install –update cmake进行升级。
5.编译过程中可能出现的问题
(1)修改线程数量:pytorch的源代码中,默认使用系统最大的线程数量进行编译,则可能会出现线程数量过大而造成编译中断的错误,修改方法如下:
1.cd pytorch 进入pytorch 工程文件
2.打开 tools/setup_helpers/cmake.py文件
3.找到控制max_jobs语句,在括号中加入-16,则为系统最大线程数量 -16后的线程数量,例如#3服务器中,此时则变为了48-16为32
(2)mkl-dnn包编译问题:在编译pytorch1.6版本之前,在生成build文件的过程中,会出现此问题,导致生成build文件失败。
老版本的mkldnn的编译过程采用的是MKLDNN_THREADING和MKL_THREADING进行MKLDNN包的编译语句控制,这两个在新版本里面都已经被舍弃了,在老版本的时候因为MKLDNN改名字的问题,将MKLDNN_KaTeX parse error: Expected group after '_' at position 13: {Var}改成了DNNL_̲{Var},就导致/third_party/ideep/mkl-dnn/cmake/mkldnn_compat.cmake这个文件里面的一个if(MKLDNN_THREADING) set(DNNL_CPU_RUNTIME “${DNNL_THREADING}” CACHE STRING " " FORCE)这个语句里面的DNNL_THREADING这个值为空值,因为系统变量明明是MKL_DNN和MKL_体系的,老版本的compat文件有将MKLDN_命名体系的过程,但并没有将DNNL_THREADING进行定义的过程,所以{DNNL_THREADING}返回空值,这样就会导致options里面有一句判断DNNL_CPU_RUNTIME 和“OMP|TBB”是否相等判断为否报错,这个就是之前产生mkl-dnn编译不通过的问题所在
解决方法1:放弃mkldnn,
执行 USE_MKLDNN=0 python setup.py install 则可跳过MKLDNN编译
解决方法2:修改相应文件
- 修改cmake/Moudles/FindMKLDNN.cmake文件
若此文件中的SET(MKLDNN_THREADING语句后为“OMP:COMP,则修改为OMP。
并添加
SET(MKLDNN_BUILD_TESTS FALSE CACHE BOOL “” FORCE)
SET(MKLDNN_BUILD_EXAMPLES FALSE CACHE BOOL “” FORCE)
SET(MKLDNN_LIBRARY_TYPE STATIC CACHE STRING “” FORCE)
SET(DNNL_ENABLE_PRIMITIVE_CACHE TRUE CACHE BOOL “” FORCE)
添加这四句话是不在执行在生成build文件后的test文件,因为修改了其中的值,会导致test文件不通过从而导致编译失败。
2. 修改third_party/ideep/mkl-dnn/cmake/mkldnn_compat.cmake文件
if(MKLDNN_THREADING)
set(DNNL_CPU_RUNTIME “${DNNL_THREADING}” CACHE STRING “” FORCE)
message(STATUS "Using the obsolete way to specify the CPU runtime. " Pytorch编译过程
- 预备条件:
(1)Python3.6及以上版本,C++14编译器以及Anaconda3.
(2)NVIDIA CUDA,cuDNN:pytorch1.5版本以前建议CUDA9.2,pytoch1.5版本以后要求CUDA10.2. cuDNN版本要求,pytorch1.5以前安装cuDNN7不能安装cuDNN8(cuDNN8版本中版本信息从cudnn.h中更改到了cudnn_version.h,会导致pytorch1.5及以前版本在检查cuDNN版本号检查出错导致编译不能通过)
(3)其他依赖库安装:conda install numpy ninja pyyaml mkl mkl-include setuptools cmake cffi nccl(会附带安装cundatookit等,具体版本请依据CUDA版本进行选择。
(4) linux系统安装需要mega-cuda包,使用
conda install –c pytorch magma-cuda102
进行安装,其中102为对应cuda版本号,102为cuda10.2版本,具体选用请依据cuda版本进行选择。例如[magma-cuda101,magma-cuda100]等 - 获取源代码:
git clone --recursive https://github.com/pytorch/pytorch
如果对代码进行更新,则执行以下操作:
git submodule sync
git submodule update --init –recursive - 版本选择:
在获取源代码操作中,默认下载github网站下最新版本,如需调换至老版本,需要进行如下操作:
(1):可供选择版本查询:
git tag
(2) 版本更换,选定好需要编译的版本后
git checkout v1.5.1 (v后数值为版本号,选择自己需要编译的固定版本号即可,建议选取pytorch1.3及以后版本以保证环境稳定)
(3) 注意事项:在使用git checkout 命令前,一定保证对工程内的代码未作修改,否则会出现更改版本不通过的问题。
如需使用较早版本,请查询所有依赖库的版本,否则会出现编译不通过的现象
4. 安装过程:
export CMAKE_PREFIX_PATH=KaTeX parse error: Expected '}', got 'EOF' at end of input: …CONDA_PREFIX:-"(dirname $(whichconda))/…/"}
python setup.py install
注意事项:
(1)python setup.py install –cmake_only 只生成build文件不编译,若想继续编译,请执行 python setup build 命令。
(2)Ninja及make,如果在系统中安装ninja包后,在生成文件的过程中,会使用ninja进行build库的生成及编译,不会出现Makefile文件,如果未安装Ninja,系统默认使用make命令进行安装,build文件中会找到MakeFile文件。
(3)如果使用anaconda的虚拟环境进行pytorch配置,可能会出现cmake版本低的问题,使用conda install –update cmake进行升级。
5.编译过程中可能出现的问题
(1)修改线程数量:pytorch的源代码中,默认使用系统最大的线程数量进行编译,则可能会出现线程数量过大而造成编译中断的错误,修改方法如下:
1.cd pytorch 进入pytorch 工程文件
2.打开 tools/setup_helpers/cmake.py文件
3.找到控制max_jobs语句,在括号中加入-16,则为系统最大线程数量 -16后的线程数量,例如#3服务器中,此时则变为了48-16为32
(2)mkl-dnn包编译问题:在编译pytorch1.6版本之前,在生成build文件的过程中,会出现此问题,导致生成build文件失败。
老版本的mkldnn的编译过程采用的是MKLDNN_THREADING和MKL_THREADING进行MKLDNN包的编译语句控制,这两个在新版本里面都已经被舍弃了,在老版本的时候因为MKLDNN改名字的问题,将MKLDNN_KaTeX parse error: Expected group after '_' at position 13: {Var}改成了DNNL_̲{Var},就导致/third_party/ideep/mkl-dnn/cmake/mkldnn_compat.cmake这个文件里面的一个if(MKLDNN_THREADING) set(DNNL_CPU_RUNTIME “${DNNL_THREADING}” CACHE STRING " " FORCE)这个语句里面的DNNL_THREADING这个值为空值,因为系统变量明明是MKL_DNN和MKL_体系的,老版本的compat文件有将MKLDN_命名体系的过程,但并没有将DNNL_THREADING进行定义的过程,所以{DNNL_THREADING}返回空值,这样就会导致options里面有一句判断DNNL_CPU_RUNTIME 和“OMP|TBB”是否相等判断为否报错,这个就是之前产生mkl-dnn编译不通过的问题所在
解决方法1:放弃mkldnn,
执行 USE_MKLDNN=0 python setup.py install 则可跳过MKLDNN编译
解决方法2:修改相应文件
- 修改cmake/Moudles/FindMKLDNN.cmake文件
若此文件中的SET(MKLDNN_THREADING语句后为“OMP:COMP,则修改为OMP。
并添加
SET(MKLDNN_BUILD_TESTS FALSE CACHE BOOL “” FORCE)
SET(MKLDNN_BUILD_EXAMPLES FALSE CACHE BOOL “” FORCE)
SET(MKLDNN_LIBRARY_TYPE STATIC CACHE STRING “” FORCE)
SET(DNNL_ENABLE_PRIMITIVE_CACHE TRUE CACHE BOOL “” FORCE)
添加这四句话是不在执行在生成build文件后的test文件,因为修改了其中的值,会导致test文件不通过从而导致编译失败。
2. 修改third_party/ideep/mkl-dnn/cmake/mkldnn_compat.cmake文件
if(MKLDNN_THREADING)
set(DNNL_CPU_RUNTIME “
D
N
N
L
T
H
R
E
A
D
I
N
G
"
C
A
C
H
E
S
T
R
I
N
G
"
"
F
O
R
C
E
)
m
e
s
s
a
g
e
(
S
T
A
T
U
S
"
U
s
i
n
g
t
h
e
o
b
s
o
l
e
t
e
w
a
y
t
o
s
p
e
c
i
f
y
t
h
e
C
P
U
r
u
n
t
i
m
e
.
"
"
U
s
e
D
N
N
L
C
P
U
R
U
N
T
I
M
E
=
{DNNL_THREADING}" CACHE STRING "" FORCE) message(STATUS "Using the obsolete way to specify the CPU runtime. " "Use DNNL_CPU_RUNTIME=
DNNLTHREADING"CACHESTRING""FORCE)message(STATUS"UsingtheobsoletewaytospecifytheCPUruntime.""UseDNNLCPURUNTIME={DNNL_CPU_RUNTIME} instead.”)
endif()
将{DNNL_THREADING}修改为{MKLDNN_THREADING}
进行上述修改后,执行 python setup.py install 即可完整进行编译。
"Use DNNL_CPU_RUNTIME=${DNNL_CPU_RUNTIME} instead.")
endif()
将{DNNL_THREADING}修改为{MKLDNN_THREADING}
进行上述修改后,执行 python setup.py install 即可完整进行编译。