# Windows 常见问题 > 原文:[`pytorch.org/docs/stable/notes/windows.html`](https://pytorch.org/docs/stable/notes/windows.html)> > > 译者:[飞龙](https://github.com/wizardforcel) > > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) ## 从源代码构建 ### 包括可选组件 Windows PyTorch 有两个支持的组件:MKL 和 MAGMA。以下是使用它们构建的步骤。 ```py 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 构建任务。只需输入几行代码即可使用。 ```py REM Let's install ninja first. pip install ninja REM Set it as the cmake generator set CMAKE_GENERATOR=Ninja ``` ### 一个关键的安装脚本 您可以查看[这组脚本](https://github.com/peterjc123/pytorch-scripts)。它会为您指明方向。 ## 扩展 ### CFFI 扩展 CFFI 扩展的支持非常实验性。您必须在 `Extension` 对象中指定额外的 `libraries` 来使其在 Windows 上构建。 ```py 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 ) ``` ### Cpp 扩展 这种类型的扩展与之前的支持更好。但是,它仍然需要一些手动配置。首先,您应该打开 **x86_x64 Cross Tools Command Prompt for VS 2017**。然后,您可以开始编译过程。 ## 安装 ### win-32 频道中找不到包。 ```py 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 位版本。 ### 导入错误 ```py from torch._C import * ImportError: DLL load failed: The specified module could not be found. ``` 问题是由于缺少必要文件而引起的。实际上,我们几乎包含了 PyTorch 包所需的所有必要文件,除了 VC2017 可再发行和一些 mkl 库。您可以通过输入以下命令解决这个问题。 ```py conda install -c peterjc123 vc vs2017_runtime conda install mkl_fft intel_openmp numpy mkl ``` 至于 wheels 包,由于我们没有打包一些库和 VS2017 可再发行文件,请确保您手动安装它们。可以下载 [VS 2017 可再发行安装程序](https://aka.ms/vs/15/release/VC_redist.x64.exe)。您还应该注意您的 Numpy 安装。确保它使用 MKL 而不是 OpenBLAS。您可以输入以下命令。 ```py pip install numpy mkl intel-openmp mkl_fft ``` 另一个可能的原因是您正在使用没有 NVIDIA 显卡的 GPU 版本。请用 CPU 版本替换您的 GPU 包。 ```py from torch._C import * ImportError: DLL load failed: The operating system cannot run %1. ``` 这实际上是 Anaconda 的一个上游问题。当您使用 conda-forge 频道初始化环境时,这个问题会出现。您可以通过这个命令修复 intel-openmp 库。 ```py conda install -c defaults intel-openmp -f ``` ## 用法(多进程) ### 没有 if 语句保护的多进程错误 ```py 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 语句包装代码,以防止代码多次执行。将您的代码重构为以下结构。 ```py import torch def main() for i, data in enumerate(dataloader): # do something here if __name__ == '__main__': main() ``` ### 多进程错误“管道中断” ```py ForkingPickler(file, protocol).dump(obj) BrokenPipeError: [Errno 32] Broken pipe ``` 当子进程在父进程完成发送数据之前结束时,就会出现这个问题。您的代码可能有问题。您可以通过将 `DataLoader` 的 `num_worker` 减少到零来调试您的代码,看看问题是否仍然存在。 ### 多进程错误“驱动程序关闭” ```py Couldn’t open shared file mapping: , error code: <1455> at torch\lib\TH\THAllocator.c:154 [windows] driver shut down ``` 请更新您的显卡驱动程序。如果问题仍然存在,可能是您的显卡太旧或计算量太大。请根据这篇[文章](https://www.pugetsystems.com/labs/hpc/Working-around-TDR-in-Windows-for-a-better-GPU-computing-experience-777/)更新 TDR 设置。 ### CUDA IPC 操作 ```py 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 张量。