PyTorch 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_2018.2.185.7z -k -O
7z x -aoa mkl_2018.2.185.7z -omkl
REM Download MAGMA files
REM cuda100/cuda101 is also available for `CUDA_PREFIX`. There are also 2.4.0 binaries for cuda80/cuda92.
REM The configuration could be `debug` or `release` for 2.5.0\. Only `release` is available for 2.4.0.
set CUDA_PREFIX=cuda90
set CONFIG=release
curl -k https://s3.amazonaws.com/ossci-windows/magma_2.5.0_%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 下启用它通常需要两个步骤。
首先,在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'] # Append cuda libaries when necessary, like cudart
)
其次,这里是“ extern THCState *state;
导致的外部符号状态无法解析”的工作场所
将源代码从 C 更改为 C ++。 下面列出了一个示例。
#include <THC/THC.h>
#include <ATen/ATen.h>
THCState *state = at::globalContext().thc_state;
extern "C" int my_lib_add_forward_cuda(THCudaTensor *input1, THCudaTensor *input2,
THCudaTensor *output)
{
if (!THCudaTensor_isSameSizeAs(state, input1, input2))
return 0;
THCudaTensor_resizeAs(state, output, input1);
THCudaTensor_cadd(state, output, input1, 1.0, input2);
return 1;
}
extern "C" int my_lib_add_backward_cuda(THCudaTensor *grad_output, THCudaTensor *grad_input)
{
THCudaTensor_resizeAs(state, grad_input, grad_output);
THCudaTensor_fill(state, grad_input, 1);
return 1;
}
Cpp 扩展
与前一个扩展相比,这种扩展具有更好的支持。 但是,它仍然需要一些手动配置。 首先,您应该打开 x86_x64 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 位版本。
为什么 Windows 没有 Python 2 软件包?
因为它不够稳定。 在我们正式发布之前,有一些问题需要解决。 您可以自己构建。
导入错误
from torch._C import *
ImportError: DLL load failed: The specified module could not be found.
该问题是由于缺少基本文件引起的。 实际上,除了 VC2017 可再发行和一些 mkl 库,我们几乎包含了 PyTorch 的 conda 软件包所需的所有基本文件。 您可以通过键入以下命令来解决此问题。
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 版本。 请用 CPU 之一替换您的 GPU 软件包。
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.
multiprocessing
的实现在 Windows 上有所不同,Windows 使用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 张量。
更多建议: