阅读(2612) (0)

PyTorch Windows 常见问题

2020-09-16 14:43:56 更新

原文: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

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

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