Windows環境下老顯卡跑PyTorch GPU版本

Windows環境下老顯卡跑PyTorch GPU版本

從pytorch 1.3開始 再也不支持GPU的算力在3.5及其如下的顯卡。這時,你只能安裝1.2版本的官方Pytorch。若是夠用就安裝它吧,省心省力。可是若是你要用其它包須要更高版本的torch支持,好比:torch geometric須要至少1.4版本。你只能使用官方的CPU版本,由於官方的版本再也不直接支持GPU算力3.5如下版本,簡化版本的分發(Torch已經很大了)。到了Torch 1.7時,GPU算力至少要達到5.2。  這時,咱們須要在Windows上從新編譯Pytorch 源碼,獲得適合本身顯卡的Torch。在編譯時,系統會自動把GPU算力下限設爲當前機器顯卡的算力,好比GT 730M 1G 顯卡算力爲3.5。python

參考:https://blog.csdn.net/qq_43051923/article/details/108393510git

下面以Torch 1.7爲例來講明整個操做過程。github

1. 編譯工具和第三方庫

1.1 Visual studio 2019

原帖子上說最新的VS 2019有點問題,我並無去證明。可是我的認爲,原理上應該不會這樣的,或者說不是關鍵問題。可是我仍是按帖子上的說法,安裝了16.6.5版本Professional版本。shell

https://docs.microsoft.com/en-us/visualstudio/releases/2019/history 裏面的16.6.5版本。windows

只須要安裝 C++桌面開發便可。dom

1.2 Cuda toolkit

去Nvidia官網下 https://developer.nvidia.com/cuda-toolkitcurl

下載的版本選擇cuda 10.1,cuda_10.1.105_418.96_win10.exe分佈式

須要安裝NVCC,與Visual Studio相關的插件部分。ide

1.3 cudnn

這個的安裝能夠參考windows_cudnn_install. ( https://github.com/pytorch/pytorch/blob/master/.circleci/scripts/windows_cudnn_install.sh)函數

能夠看到對應cuda10.1爲v7.6.4.38,即cudnn-10.1-windows10-x64-v7.6.4.38.zip(不斷地更新中)

https://developer.nvidia.com/compute/machine-learning/cudnn/secure/7.6.4.38/Production/10.1_20190923/cudnn-10.1-windows10-x64-v7.6.4.38.zip

將文件解壓出來後,移動到Cuda toolkit安裝路徑中。(只是爲了簡化配置過程當中的目錄的設定)

1.4 mkl

這個的安裝能夠參考install_mkl

https://github.com/pytorch/pytorch/blob/master/.jenkins/pytorch/win-test-helpers/installation-helpers/install_mkl.bat

根據目前的官方文檔下載:

https://s3.amazonaws.com/ossci-windows/mkl_2020.0.166.7z

1.5 magma

參考install_magma

https://github.com/pytorch/pytorch/blob/master/.jenkins/pytorch/win-test-helpers/installation-helpers/install_magma.bat

須要注意的是,要注意區別release和debug版本,若是你想下載cuda110的release版本,就xxx_cuda110_release,不然就是xxx_cuda110_debug。編譯的時候release就用release版本,debug就用debug版本

根據目前的官方文檔下載:

https://s3.amazonaws.com/ossci-windows/magma_2.5.4_cuda101_release.7z

1.6 sccache

參考install_sccache

https://github.com/pytorch/pytorch/blob/master/.jenkins/pytorch/win-test-helpers/installation-helpers/install_sccache.bat

根據官方文檔下載:

https://s3.amazonaws.com/ossci-windows/sccache.exe

https://s3.amazonaws.com/ossci-windows/sccache-cl.exe

1.7 ninja

下載:ninja-win.zip

https://github.com/ninja-build/ninja/releases

mkl, magma, sccache 和ninja下載解壓後最好放在同一個目錄下。

Nvcc和randomtemp.exe先無論它們,後面再說。

1.8 安裝Ananconda 或者 miniconda

Torch官方文檔推薦使用conda環境。這裏我仍是使用pip。實踐證實沒有問題。

1.9 安裝python 包

Pip install numpy ninja pyyaml mkl mkl-include setuptools cmake cffi typing_extensions future six requests dataclasses

2. 設置環境變量

生成一個批處理文件進行環境變量的設置。

set -x

set BUILD_TYPE=release
set USE_CUDA=1
set DEBUG=
rem set DEBUG=1 for debug version

set USE_DISTRIBUTED=0
set CMAKE_VERBOSE_MAKEFILE=1

set TMP_DIR_WIN=D:\pytorch\needed\
set CMAKE_INCLUDE_PATH=%TMP_DIR_WIN%\mkl\include
set LIB=%TMP_DIR_WIN%\mkl\lib;%LIB
set MAGMA_HOME=%TMP_DIR_WIN%\magma

rem version transformer, for example 10.1 to 10_1.
set CUDA_SUFFIX=cuda10_1
set CUDA_PATH_V%VERSION_SUFFIX%=%CUDA_PATH%

set CUDA_PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1
set CUDNN_LIB_DIR=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\lib\x64
set CUDA_TOOLKIT_ROOT_DIR=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1
set CUDNN_ROOT_DIR=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1
set NVTOOLSEXT_PATH=C:\Program Files\NVIDIA Corporation\NvToolsExt
set CUDNN_INCLUDE_DIR=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include
set NUMBAPRO_CUDALIB=%CUDA_PATH%\bin
set NUMBAPRO_LIBDEVICE=%CUDA_PATH%\nvvm\libdevice
set NUMBAPRO_NVVM=%CUDA_PATH%\nvvm\bin\nvvm64_33_0.dll

set PATH=%CUDA_PATH%\bin;%CUDA_PATH%\libnvvp;%PATH%

set DISTUTILS_USE_SDK=1

set TORCH_CUDA_ARCH_LIST=3.5
set TORCH_NVCC_FLAGS=-Xfatbin -compress-all

set PATH=%TMP_DIR_WIN%\bin;%PATH%
set SCCACHE_IDLE_TIMEOUT=0
sccache --stop-server
sccache --start-server
sccache --zero-stats
set CC=sccache-cl
set CXX=sccache-cl

set CMAKE_GENERATOR=Ninja
if "%USE_CUDA%"=="1" (
  copy %TMP_DIR_WIN%\bin\sccache.exe %TMP_DIR_WIN%\bin\nvcc.exe

  :: randomtemp is used to resolve the intermittent build error related to CUDA.
  :: code: https://github.com/peterjc123/randomtemp
  :: issue: https://github.com/pytorch/pytorch/issues/25393
  ::
  :: Previously, CMake uses CUDA_NVCC_EXECUTABLE for finding nvcc and then
  :: the calls are redirected to sccache. sccache looks for the actual nvcc
  :: in PATH, and then pass the arguments to it.
  :: Currently, randomtemp is placed before sccache (%TMP_DIR_WIN%\bin\nvcc)
  :: so we are actually pretending sccache instead of nvcc itself.
  :: curl -kL https://github.com/peterjc123/randomtemp/releases/download/v0.3/randomtemp.exe --output %TMP_DIR_WIN%\bin\randomtemp.exe
  set RANDOMTEMP_EXECUTABLE=%TMP_DIR_WIN%\bin\nvcc.exe
  set CUDA_NVCC_EXECUTABLE=%TMP_DIR_WIN%\bin\randomtemp.exe
  set RANDOMTEMP_BASEDIR=%TMP_DIR_WIN%\bin
)
set CMAKE_GENERATOR_TOOLSET_VERSION=14.26
set CMAKE_GENERATOR=Visual Studio 16 2019

"C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvarsall.bat" x64 -vcvars_ver=14.26

注意幾點:

1)若是編譯的是Cuda10的話,原帖上說:「set TORCH_CUDA_ARCH_LIST=3.7+PTX;5.0;6.0;6.1;7.0;7.5;8.」TORCH_CUDA_ARCH_LIST要去掉 8.0。

我這裏直接設定爲3.5。這裏設定的就是算力下限。

2)編譯debug/release版本是,下載對應的Magma debug/release版本包

3) 若是隻編譯CPU版本的話,設置USE_CUDA=0

4)這裏將randomtemp.exe直接下載到本地。

5)腳本會自動複製nvcc.exe到設定目錄。它是編譯gpu代碼的工具。

6)關閉了分佈式訓練的功能。set USE_DISTRIBUTED=0

3. 準備Torch源碼

根據Torch官方文檔:

Get the PyTorch Source
git clone --recursive https://github.com/pytorch/pytorch
cd pytorch
# if you are updating an existing checkout
git submodule sync
git submodule update --init –recursive

這裏—recursive是遞歸下載Torch依賴的第三方git庫。這裏存在的問題是,在國內鏈接github的速度並不穩定,爲了以避免下載的源碼出問題,我選擇下載zip打包後的源碼。

注:直接在github上進行下載是最方便的。 只是須要幾個小時的時間,下載的速度只有20~50k/s,下載整個項目須要數個小時時間。(項目有600M以上,我沒有堅持下載徹底。中途斷線了)

性子急的,才用下面的方法。快,但須要細心。

重要的地方是,這種打包下載是不能自動下載Torch所依賴的第三方庫。只能本身手動下載與Torch版本所對應的第三方庫。(與當前準備編譯Torch版本所對應的第三方庫,這很重要,淚!)

經過Tag標籤,找到本身準備編譯的1.7版本。

下載打包後的源碼。

https://github.com/pytorch/pytorch/archive/v1.7.0.zip

這個也能夠到國內的Gitee鏡像站下載。能夠直接在國內Gitee上使用指令git clone –recursive(我沒有實驗過,可是原理上是可行的。可是下載第三方庫時,依然會訪問github上的庫)

https://gitee.com/mirrors/pytorch?_from=gitee_search

而後,進入Torch 1.7.0 分支的third_party。下載它所依賴的第三方庫。

https://github.com/pytorch/pytorch/tree/v1.7.0/third_party

一共36個庫文件。我所有下載的打包zip源碼。

  • 其中fbgemm庫是一個關鍵庫,它又依賴了三個其它的第三方庫。

請注意它們之間版本對應關係(到github上看清楚上面的版本連接)。

對於Torch,FBGEMM不必定對應是最新版本。不一樣版本函數接口不同,會致使編譯的失敗。

另外,ideep也依賴於本身的第三方庫mkl-dnn @ 5ef631a。這也是一個關鍵的庫。

最後,把所有源碼根據Git上的形式整合到一塊兒。這時源碼所有準備好了。

(注意:因爲手動整合源碼,主要問題是確保各個第三方庫版本與當前的Torch版本是配合的。是配合的。是配合的。)若是直接在網上git下載源碼,就不會存在版本不對的問題,可是有可能下載不動,或者殘缺的風險。

本身動手,豐衣足食!

4. 開始編譯

請使用Powershell terminal, 而不要使用cmd。(在cmd中,中文的顯示有問題。萬一編譯出錯,你都不知道它在說什麼)。也不須要管理員權限。給它也行。

進入Powershell terminal,首先運行前面生成批處理文件./set_env.bat,進行環境變量的設置。

而後,編譯libtorch。

python tools\build_libtorch.py

我只進行了庫文件的編譯。在i5-4200M的機器上,整個編譯過程近6個小時,生成12G左右的臨時文件和編譯文件。

(注意:不要嘗試在VS環境下直接cmake和編譯庫,由於官方腳本還作了其它事情)

5. 移花接木

到官方網站下載 1.7 GPU cu101版本。

安裝後,用本身編譯生成的兩個庫文件,替換掉官方提供的。下面官方的cuda有600M。

本身生成的只有它的八分之一。固然,也沒有了分佈式訓練功能,由於前面沒有選擇它。

再進行一下測試。

KO!(理論上,用本身生成的庫能夠所有替換掉官方的,你們能夠本身實驗)目前已經用了近3個月 沒有發現什麼問題。

相關文章
相關標籤/搜索