Shortcuts

Windows 常见问题

从源代码构建

包含可选组件

Windows PyTorch 支持两个组件:MKL 和 MAGMA。以下是使用它们进行构建的步骤。

REM 确保你已经安装了7z和curl。

REM 下载MKL文件
curl https://s3.amazonaws.com/ossci-windows/mkl_2020.2.254.7z -k -O
7z x -aoa mkl_2020.2.254.7z -omkl

REM 下载MAGMA文件
REM 可用版本:
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 设置必要的环境变量
set "CMAKE_INCLUDE_PATH=%cd%\mkl\include"
set "LIB=%cd%\mkl\lib;%LIB%"
set "MAGMA_HOME=%cd%\magma"

加速 CUDA 在 Windows 上的构建

Visual Studio 目前不支持并行自定义任务。 作为替代方案,我们可以使用 Ninja 来并行化 CUDA 构建任务。只需输入几行代码即可使用。

REM 让我们先安装ninja。
pip install ninja

REM 将其设置为cmake生成器
set CMAKE_GENERATOR=Ninja

一键安装脚本

你可以查看这一组脚本。 它将为你指明方向。

扩展

CFFI 扩展

对CFFI扩展的支持非常实验性。您必须在Extension对象中指定额外的libraries,以使其在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'] # 必要时附加cuda库,如cudart
)

C++ 扩展

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

安装

在win-32频道中未找到包。

解决环境: 失败

PackagesNotFoundError: 以下包在当前渠道中不可用:

- pytorch

当前渠道:
- 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: 找不到指定的模块.

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

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 *

导入错误: DLL 加载失败: 操作系统无法运行 %1.

这实际上是Anaconda的上游问题。当你使用conda-forge频道初始化环境时,这个问题就会出现。你可以通过这个命令修复intel-openmp库。

conda install -c defaults intel-openmp -f

用法(多进程)

没有if语句保护的多进程错误

RuntimeError:
       在当前进程完成其引导阶段之前,尝试启动一个新进程。

   这可能意味着您没有使用fork来启动您的子进程,并且您忘记了在主模块中使用适当的惯用语:

       if __name__ == '__main__':
           freeze_support()
           ...

   如果程序不会被冻结以生成可执行文件,则可以省略“freeze_support()”行。

在Windows上的multiprocessing实现与使用spawn而不是fork的实现不同。因此,我们必须用if语句包装代码,以防止代码多次执行。将您的代码重构为以下结构。

import torch

def main()
    for i, data in enumerate(dataloader):
        # 在这里做点什么

if __name__ == '__main__':
    main()

多进程错误“Broken pipe”

ForkingPickler(file, protocol).dump(obj)

BrokenPipeError: [Errno 32] 管道损坏

当子进程在父进程完成发送数据之前结束时,会出现此问题。您的代码可能存在问题。您可以通过将DataLoadernum_worker减少到零来调试您的代码,看看问题是否仍然存在。

多进程错误“驱动程序关闭”

无法打开共享文件映射: , 错误代码: <1455> at torch\lib\TH\THAllocator.c:154

[windows] 驱动程序已关闭

请更新您的显卡驱动程序。如果问题仍然存在,可能是因为您的显卡太旧或计算量对您的显卡来说太大。请根据此帖子更新TDR设置。

CUDA IPC 操作

THCudaCheck FAIL file=torch\csrc\generic\StorageSharing.cpp line=252 error=63 : 操作系统调用失败或此操作系统不支持该操作

它们在Windows上不受支持。像在CUDA张量上进行多进程处理这样的操作无法成功,对此有两种替代方案。

1. 不要使用 multiprocessing。将 num_worker 设置为零。

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