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] 管道损坏
当子进程在父进程完成发送数据之前结束时,会出现此问题。您的代码可能存在问题。您可以通过将DataLoader
的num_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张量。