PyTorch Windows 常見問題

2020-09-16 14:44 更新

原文:PyTorch Windows 常見問題

從源頭建造

包括可選組件

Windows PyTorch 支持兩個(gè)組件:MKL 和 MAGMA。 以下是使用它們構(gòu)建的步驟。

  1. REM Make sure you have 7z and curl installed.
  2. REM Download MKL files
  3. curl https://s3.amazonaws.com/ossci-windows/mkl_2018.2.185.7z -k -O
  4. 7z x -aoa mkl_2018.2.185.7z -omkl
  5. REM Download MAGMA files
  6. REM cuda100/cuda101 is also available for `CUDA_PREFIX`. There are also 2.4.0 binaries for cuda80/cuda92.
  7. REM The configuration could be `debug` or `release` for 2.5.0\. Only `release` is available for 2.4.0.
  8. set CUDA_PREFIX=cuda90
  9. set CONFIG=release
  10. curl -k https://s3.amazonaws.com/ossci-windows/magma_2.5.0_%CUDA_PREFIX%_%CONFIG%.7z -o magma.7z
  11. 7z x -aoa magma.7z -omagma
  12. REM Setting essential environment variables
  13. set "CMAKE_INCLUDE_PATH=%cd%\\mkl\\include"
  14. set "LIB=%cd%\\mkl\\lib;%LIB%"
  15. set "MAGMA_HOME=%cd%\\magma"

加快 Windows 的 CUDA 構(gòu)建

Visual Studio 當(dāng)前不支持并行自定義任務(wù)。 或者,我們可以使用Ninja并行化 CUDA 構(gòu)建任務(wù)。 只需輸入幾行代碼即可使用它。

  1. REM Let's install ninja first.
  2. pip install ninja
  3. REM Set it as the cmake generator
  4. set CMAKE_GENERATOR=Ninja

一鍵安裝腳本

您可以看看這組腳本。 它將為您帶路。

延期

CFFI 擴(kuò)展

CFFI Extension 的支持是試驗(yàn)性的。 在 Windows 下啟用它通常需要兩個(gè)步驟。

首先,在Extension對象中指定其他libraries以使其在 Windows 上構(gòu)建。

  1. ffi = create_extension(
  2. '_ext.my_lib',
  3. headers=headers,
  4. sources=sources,
  5. define_macros=defines,
  6. relative_to=__file__,
  7. with_cuda=with_cuda,
  8. extra_compile_args=["-std=c99"],
  9. libraries=['ATen', '_C'] # Append cuda libaries when necessary, like cudart
  10. )

其次,這里是“ extern THCState *state;導(dǎo)致的外部符號狀態(tài)無法解析”的工作場所

將源代碼從 C 更改為 C ++。 下面列出了一個(gè)示例。

  1. #include <THC/THC.h>
  2. #include <ATen/ATen.h>
  3. THCState *state = at::globalContext().thc_state;
  4. extern "C" int my_lib_add_forward_cuda(THCudaTensor *input1, THCudaTensor *input2,
  5. THCudaTensor *output)
  6. {
  7. if (!THCudaTensor_isSameSizeAs(state, input1, input2))
  8. return 0;
  9. THCudaTensor_resizeAs(state, output, input1);
  10. THCudaTensor_cadd(state, output, input1, 1.0, input2);
  11. return 1;
  12. }
  13. extern "C" int my_lib_add_backward_cuda(THCudaTensor *grad_output, THCudaTensor *grad_input)
  14. {
  15. THCudaTensor_resizeAs(state, grad_input, grad_output);
  16. THCudaTensor_fill(state, grad_input, 1);
  17. return 1;
  18. }

Cpp 擴(kuò)展

與前一個(gè)擴(kuò)展相比,這種擴(kuò)展具有更好的支持。 但是,它仍然需要一些手動(dòng)配置。 首先,您應(yīng)該打開 x86_x64 VS 2017 的交叉工具命令提示符。 然后,您可以開始編譯過程。

安裝

在 Win-32 頻道中找不到軟件包。

  1. Solving environment: failed
  2. PackagesNotFoundError: The following packages are not available from current channels:
  3. - pytorch
  4. Current channels:
  5. - https://conda.anaconda.org/pytorch/win-32
  6. - https://conda.anaconda.org/pytorch/noarch
  7. - https://repo.continuum.io/pkgs/main/win-32
  8. - https://repo.continuum.io/pkgs/main/noarch
  9. - https://repo.continuum.io/pkgs/free/win-32
  10. - https://repo.continuum.io/pkgs/free/noarch
  11. - https://repo.continuum.io/pkgs/r/win-32
  12. - https://repo.continuum.io/pkgs/r/noarch
  13. - https://repo.continuum.io/pkgs/pro/win-32
  14. - https://repo.continuum.io/pkgs/pro/noarch
  15. - https://repo.continuum.io/pkgs/msys2/win-32
  16. - https://repo.continuum.io/pkgs/msys2/noarch

PyTorch 在 32 位系統(tǒng)上不起作用。 請使用 Windows 和 Python 64 位版本。

為什么 Windows 沒有 Python 2 軟件包?

因?yàn)樗粔蚍€(wěn)定。 在我們正式發(fā)布之前,有一些問題需要解決。 您可以自己構(gòu)建。

導(dǎo)入錯(cuò)誤

  1. from torch._C import *
  2. ImportError: DLL load failed: The specified module could not be found.

該問題是由于缺少基本文件引起的。 實(shí)際上,除了 VC2017 可再發(fā)行和一些 mkl 庫,我們幾乎包含了 PyTorch 的 conda 軟件包所需的所有基本文件。 您可以通過鍵入以下命令來解決此問題。

  1. conda install -c peterjc123 vc vs2017_runtime
  2. conda install mkl_fft intel_openmp numpy mkl

至于 wheel 軟件包,由于我們沒有打包一些庫和 VS2017 可再發(fā)行文件,因此請確保手動(dòng)安裝它們。 可以下載 VS 2017 可再發(fā)行安裝程序。 而且您還應(yīng)該注意安裝 Numpy。 確保它使用 MKL 而不是 OpenBLAS。 您可以輸入以下命令。

  1. pip install numpy mkl intel-openmp mkl_fft

另一個(gè)可能的原因可能是您使用的是沒有 NVIDIA 顯卡的 GPU 版本。 請用 CPU 之一替換您的 GPU 軟件包。

  1. from torch._C import *
  2. ImportError: DLL load failed: The operating system cannot run %1.

這實(shí)際上是 Anaconda 的上游問題。 當(dāng)您使用 conda-forge 頻道初始化環(huán)境時(shí),就會(huì)出現(xiàn)此問題。 您可以通過此命令修復(fù) intel-openmp 庫。

  1. conda install -c defaults intel-openmp -f

用法(并行處理)

沒有 if 子句保護(hù)的并行處理錯(cuò)誤

  1. RuntimeError:
  2. An attempt has been made to start a new process before the
  3. current process has finished its bootstrapping phase.
  4. This probably means that you are not using fork to start your
  5. child processes and you have forgotten to use the proper idiom
  6. in the main module:
  7. if __name__ == '__main__':
  8. freeze_support()
  9. ...
  10. The "freeze_support()" line can be omitted if the program
  11. is not going to be frozen to produce an executable.

multiprocessing的實(shí)現(xiàn)在 Windows 上有所不同,Windows 使用spawn代替fork。 因此,我們必須用 if 子句包裝代碼,以防止代碼多次執(zhí)行。 將代碼重構(gòu)為以下結(jié)構(gòu)。

  1. import torch
  2. def main()
  3. for i, data in enumerate(dataloader):
  4. # do something here
  5. if __name__ == '__main__':
  6. main()

并行處理錯(cuò)誤“管道破裂”

  1. ForkingPickler(file, protocol).dump(obj)
  2. BrokenPipeError: [Errno 32] Broken pipe

當(dāng)子進(jìn)程在父進(jìn)程完成發(fā)送數(shù)據(jù)之前結(jié)束時(shí),就會(huì)發(fā)生此問題。 您的代碼可能有問題。 您可以通過將 DataLoadernum_worker減小為零來調(diào)試代碼,然后查看問題是否仍然存在。

并行處理錯(cuò)誤“驅(qū)動(dòng)程序關(guān)閉”

  1. Couldn't open shared file mapping: <torch_14808_1591070686>, error code: <1455> at torch\lib\TH\THAllocator.c:154
  2. [windows] driver shut down

請更新您的圖形驅(qū)動(dòng)程序。 如果這種情況持續(xù)存在,則可能是圖形卡太舊或計(jì)算量太大。 請根據(jù)此帖子更新 TDR 設(shè)置。

CUDA IPC 操作

  1. THCudaCheck FAIL file=torch\csrc\generic\StorageSharing.cpp line=252 error=63 : OS call failed or operation not supported on this OS

Windows 不支持它們。 像對 CUDA 張量執(zhí)行并行處理之類的操作無法成功,有兩種選擇。

1.不要使用multiprocessing。 將 DataLoadernum_worker設(shè)置為零。

2.改為共享 CPU 張量。 確保自定義DataSet返回 CPU 張量。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號