目录

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扩展的支持还处于试验阶段。你必须在libraries中指定 额外的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
)

C++ 扩展

这种类型的扩展相比之前的一种有更好的支持。然而,它仍然需要一些手动配置。首先,你应该打开 x86_x64 Cross Tools Command Prompt for VS 2017。 然后,你可以开始你的编译过程。

安装

在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.

问题是由缺少必要的文件引起的。实际上, 我们包含了PyTorch在conda包中所需的所有必要文件,除了VC2017可再发行组件和一些mkl库。 你可以通过输入以下命令来解决这个问题。

conda install -c peterjc123 vc vs2017_runtime
conda install mkl_fft intel_openmp numpy mkl

至于wheel软件包,由于我们没有打包一些库和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

此问题发生在子进程在父进程完成发送数据之前结束时。可能是你的代码有问题。你可以通过将 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。将 num_workerDataLoader 设置为零。

2. 分享CPU张量。确保你的自定义 DataSet 返回CPU张量。

文档

访问 PyTorch 的全面开发人员文档

查看文档

教程

获取面向初学者和高级开发人员的深入教程

查看教程

资源

查找开发资源并解答您的问题

查看资源