Pytorch编译过程及可能问题

Pytorch编译过程

  1. 预备条件:
    (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]等
  2. 获取源代码:
    git clone --recursive https://github.com/pytorch/pytorch
    如果对代码进行更新,则执行以下操作:
    git submodule sync
    git submodule update --init –recursive
  3. 版本选择:
    在获取源代码操作中,默认下载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:修改相应文件

  1. 修改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. 预备条件:
    (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]等
  2. 获取源代码:
    git clone --recursive https://github.com/pytorch/pytorch
    如果对代码进行更新,则执行以下操作:
    git submodule sync
    git submodule update --init –recursive
  3. 版本选择:
    在获取源代码操作中,默认下载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:修改相应文件

  1. 修改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 即可完整进行编译。

你可能感兴趣的:(深度学习)