Windows 常见问题解答¶
从源代码构建¶
包含可选组件¶
Windows PyTorch 支持两个可选组件:MKL 和 MAGMA。以下是使用它们进行构建的步骤。
REM Make sure you have 7z and curl installed.
REM Download MKL files
curl https://s3.amazonaws.com/ossci-windows/mkl_2020.2.254.7z -k -O
7z x -aoa mkl_2020.2.254.7z -omkl
REM Download MAGMA files
REM version available:
REM 2.5.4 (CUDA 10.1 10.2 11.0 11.1) x (Debug Release)
REM 2.5.3 (CUDA 10.1 10.2 11.0) x (Debug Release)
REM 2.5.2 (CUDA 9.2 10.0 10.1 10.2) x (Debug Release)
REM 2.5.1 (CUDA 9.2 10.0 10.1 10.2) x (Debug Release)
set CUDA_PREFIX=cuda102
set CONFIG=release
curl -k https://s3.amazonaws.com/ossci-windows/magma_2.5.4_%CUDA_PREFIX%_%CONFIG%.7z -o magma.7z
7z x -aoa magma.7z -omagma
REM Setting essential environment variables
set "CMAKE_INCLUDE_PATH=%cd%\mkl\include"
set "LIB=%cd%\mkl\lib;%LIB%"
set "MAGMA_HOME=%cd%\magma"
加速 Windows 上的 CUDA 构建¶
Visual Studio 目前不支持并行自定义任务。作为替代方案,我们可以使用 Ninja
并行化 CUDA 构建任务。只需键入几行代码即可使用它。
REM Let's install ninja first.
pip install ninja
REM Set it as the cmake generator
set CMAKE_GENERATOR=Ninja
扩展¶
CFFI 扩展¶
对 CFFI 扩展的支持还处于非常实验性的阶段。你必须在 Extension
对象中指定额外的 库
才能在 Windows 上构建它。
ffi = create_extension(
'_ext.my_lib',
headers=headers,
sources=sources,
define_macros=defines,
relative_to=__file__,
with_cuda=with_cuda,
extra_compile_args=["-std=c99"],
libraries=['ATen', '_C'] # Append cuda libraries when necessary, like cudart
)
Cpp 扩展¶
与前一种扩展相比,这种类型的扩展具有更好的支持。但是,它仍然需要一些手动配置。首先,你应该打开“适用于 VS 2017 的 x86_x64 交叉工具命令提示符”。然后,你可以开始编译过程。
安装¶
在 win-32 通道中找不到软件包。¶
Solving environment: failed
PackagesNotFoundError: The following packages are not available from current channels:
- pytorch
Current channels:
- https://conda.anaconda.org/pytorch/win-32
- https://conda.anaconda.org/pytorch/noarch
- https://repo.continuum.io/pkgs/main/win-32
- https://repo.continuum.io/pkgs/main/noarch
- https://repo.continuum.io/pkgs/free/win-32
- https://repo.continuum.io/pkgs/free/noarch
- https://repo.continuum.io/pkgs/r/win-32
- https://repo.continuum.io/pkgs/r/noarch
- https://repo.continuum.io/pkgs/pro/win-32
- https://repo.continuum.io/pkgs/pro/noarch
- https://repo.continuum.io/pkgs/msys2/win-32
- https://repo.continuum.io/pkgs/msys2/noarch
PyTorch 不适用于 32 位系统。请使用 Windows 和 Python 的 64 位版本。
导入错误¶
from torch._C import *
ImportError: DLL load failed: The specified module could not be found.
这个问题是由于缺少必要的文 件造成的。实际上,除了 VC2017 可再发行组件和一些 mkl 库之外,我们几乎包含了 PyTorch 所需的所有必要文件。你可以通过键入以下命令来解决此问题。
conda install -c peterjc123 vc vs2017_runtime
conda install mkl_fft intel_openmp numpy mkl
至于 wheels 软件包,由于我们没有打包一些库和 VS2017 可再发行文件,请确保手动安装它们。可以下载 VS 2017 可再发行组件安装程序。你还应该注意 Numpy 的安装。确保它使用 MKL 而不是 OpenBLAS。你可以键入以下命令。
pip install numpy mkl intel-openmp mkl_fft
另一个可能的原因是你正在没有 NVIDIA 显卡的情况下使用 GPU 版本。请将你的 GPU 软件包替换为 CPU 软件包。
from torch._C import *
ImportError: DLL load failed: The operating system cannot run %1.
这实际上是 Anaconda 的上游问题。当你使用 conda-forge 通道初始化你的环境时,就会出现这个问题。你可以通过以下命令修复 intel-openmp 库。
conda install -c defaults intel-openmp -f
使用(多进程)¶
没有 if 语句保护的多进程错误¶
RuntimeError:
An attempt has been made to start a new process before the
current process has finished its bootstrapping phase.
This probably means that you are not using fork to start your
child processes and you have forgotten to use the proper idiom
in the main module:
if __name__ == '__main__':
freeze_support()
...
The "freeze_support()" line can be omitted if the program
is not going to be frozen to produce an executable.
Windows 上 multiprocessing
的实现方式不同,它使用 spawn
而不是 fork
。因此,我们必须使用 if 语句包装代码,以防止代码被多次执行。将你的代码重构为以下结构。
import torch
def main()
for i, data in enumerate(dataloader):
# do something here
if __name__ == '__main__':
main()
多进程错误“管道损坏”¶
ForkingPickler(file, protocol).dump(obj)
BrokenPipeError: [Errno 32] Broken pipe
当子进程在父进程完成发送数据之前结束时,就会发生此问题。你的代码可能有问题。你可以通过将 DataLoader
的 num_worker
减少到零来调试代码,看看问题是否仍然存在。
多进程错误“驱动程序关闭”¶
Couldn’t open shared file mapping: <torch_14808_1591070686>, error code: <1455> at torch\lib\TH\THAllocator.c:154
[windows] driver shut down
请更新你的显卡驱动程序。如果问题仍然存在,则可能是你的显卡太旧或计算量对你的显卡来说过大。请根据此 帖子 更新 TDR 设置。
CUDA IPC 操作¶
THCudaCheck FAIL file=torch\csrc\generic\StorageSharing.cpp line=252 error=63 : OS call failed or operation not supported on this OS
Windows 上不支持它们。像对 CUDA 张量执行多进程操作之类的事情是无法成功的,对此有两个替代方案。
1. 不要使用 multiprocessing
。将 DataLoader
的 num_worker
设置为零。
2. 改为共享 CPU 张量。确保你的自定义 DataSet
返回 CPU 张量。