1、关于 PyTorch 2.0

PyTorch 主分支已经是2.0版本,新增了大量特性,参考PyTorch 2.0

2、PyTorch 2.0 编译环境

2.0 不再支持 CUDA 11.6,我之前的编译环境一直是 wsl2 + ubuntu 20.04 + CUDA 11.6 + gcc,这次把环境换到了 wsl2 + debian 11 + CUDA 11.7 + oneapiMKL 2023.0.0 + gcc,同时还试了一下 windows 11 + CUDA 11.7 + visual studio 2022 套件。

3、Python 编译安装

2.0 可以直接用如下命令安装

pip3 install numpy --pre torch[dynamo] --force-reinstall --extra-index-url https://download.pytorch.org/whl/nightly/cu117

自己编译安装的话参考官方命令

python setup.py develop
python setup.py install

上面命令安装的 PyTorch 无法运行 TorchDynamo,参照官方说法“To install GPU TorchDynamo dependencies, run make triton in the PyTorch repo root directory.”, 我编译没有成功,不过用了个取巧的办法,先直接安装 nightly 版,会帮你安装好所有依赖,然后删除掉安装好的 torch,运行 python setup.py install 安装自己编译好的版本, 这样做主要是想确保看源码时有个相同版本环境可以运行。

4、C++ 编译安装

4.1、CMakeLists.txt 修改

project(Torch CXX C) 前面增加:

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CUDA_ARCHITECTURES "75")
if (MSVC)
  set(CMAKE_CUDA_COMPILER "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.7/bin/nvcc.exe")
  set(CUDAToolkit_ROOT "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.7")
elseif (UNIX)
  set(CMAKE_CUDA_COMPILER "/usr/local/cuda/bin/nvcc")
  set(CUDAToolkit_ROOT "/usr/local/cuda")
endif()
set(CMAKE_PREFIX_PATH "/opt/intel/oneapi/mkl")

4.2、cmake 生成

我使用如下cmake 选项编译

-G Ninja
-DBUILD_SHARED_LIBS:BOOL=ON
-DCMAKE_BUILD_TYPE:STRING=Debug
-DPYTHON_EXECUTABLE:PATH=/opt/miniconda3/bin/python
-DBUILD_TEST:BOOL=OFF
-DUSE_CUDA=ON
-DUSE_NCCL=OFF
-DUSE_MAGMA=OFF
-DUSE_NUMA=OFF
-DUSE_MPI=OFF
-DUSE_METAL=OFF
-DUSE_OPENMP=OFF
-Wno-dev

4.3、linux 编译问题

4.3.1、cmake 生成报错

cmake 生成过程,会报错nvcc fatal : -Wno-unused-variable,修改了几个cmake相关的配置后依旧报错,关闭BUILD_TEST选型后不再报错。

4.4、windows 编译问题(未完成)

4.4.1、CUDA 安装

安装对应的 CUDA 安装包,设置好环境变量。 同时把 C:\Program Files\NVIDIA Corporation\NvToolsExt 目录复制到 C:\Program Files\NVIDIA GPU Computing Toolkit\NvToolsExt,否则 cmake 配置时会报 “Cannot find nvToolsExt”。

4.4.2、vs2022 版本问题

编译过程报错fatal error LNK1161: 导出规范无效,具体如下

  FAILED: bin/torch_cpu.dll lib/torch_cpu.lib 
  cmd.exe /C "cd . && "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -E vs_link_dll --intdir=caffe2\CMakeFiles\torch_cpu.dir --rc=C:\PROGRA~2\WI3CF2~1\10\bin\100220~1.0\x64\rc.exe --mt=C:\PROGRA~2\WI3CF2~1\10\bin\100220~1.0\x64\mt.exe --manifests  -- C:\PROGRA~1\MICROS~2\2022\COMMUN~1\VC\Tools\MSVC\1434~1.319\bin\Hostx64\x64\link.exe /nologo @CMakeFiles\torch_cpu.rsp  /out:bin\torch_cpu.dll /implib:lib\torch_cpu.lib /pdb:bin\torch_cpu.pdb /dll /version:0.0 /machine:x64 /ignore:4049 /ignore:4217 /ignore:4099 /debug /INCREMENTAL:NO  -WHOLEARCHIVE:D:/git_source/pytorch/out/build/x64-Debug/lib/caffe2_protos.lib -WHOLEARCHIVE:D:/git_source/pytorch/out/build/x64-Debug/lib/onnx.lib  && cd ."
  LINK: command "C:\PROGRA~1\MICROS~2\2022\COMMUN~1\VC\Tools\MSVC\1434~1.319\bin\Hostx64\x64\link.exe /nologo @CMakeFiles\torch_cpu.rsp /out:bin\torch_cpu.dll /implib:lib\torch_cpu.lib /pdb:bin\torch_cpu.pdb /dll /version:0.0 /machine:x64 /ignore:4049 /ignore:4217 /ignore:4099 /debug /INCREMENTAL:NO -WHOLEARCHIVE:D:/git_source/pytorch/out/build/x64-Debug/lib/caffe2_protos.lib -WHOLEARCHIVE:D:/git_source/pytorch/out/build/x64-Debug/lib/onnx.lib /MANIFEST /MANIFESTFILE:bin\torch_cpu.dll.manifest" failed (exit code 1161) with the following output:
D:\git_source\pytorch\out\build\x64-Debug\LazyNativeFunctions.cpp.obj : fatal error LNK1161: 导出规范无效

发现是编译工具的问题fatal error LNK1161: invalid export specification, 我在 version 17.4.1 遇见,微软官方在 version 17.4.3 解决thread_local-causing-fatal-error-LNK1161,于是直接升级到最新版 version 17.5.0,问题解决。

4.4.3 其他问题

还遇见如下问题,以后有空再看

严重性	代码	说明	项目	文件	行	禁止显示状态
错误	LNK2019	无法解析的外部符号 "private: static unsigned short __cdecl caffe2::TypeMeta::addTypeMetaData<class caffe2::Tensor>(void)" (??$addTypeMetaData@VTensor@caffe2@@@TypeMeta@caffe2@@CAGXZ),函数 "private: static unsigned short __cdecl caffe2::TypeMeta::_typeMetaData<class caffe2::Tensor>(void)" (??$_typeMetaData@VTensor@caffe2@@@TypeMeta@caffe2@@CAGXZ) 中引用了该符号 	D:\git_source\pytorch\out\build\x64-Debug\pytorch	D:\git_source\pytorch\out\build\x64-Debug\print_core_object_sizes_gpu.obj	1	
严重性	代码	说明	项目	文件	行	禁止显示状态
错误	LNK1120	1 个无法解析的外部命令 	D:\git_source\pytorch\out\build\x64-Debug\pytorch	D:\git_source\pytorch\out\build\x64-Debug\bin\Debug\print_core_object_sizes_gpu.exe	1