PyTorch Windows 常见问题
一、构建 PyTorch
1.1 包括可选组件
在 Windows 上构建 PyTorch 时,可以包含可选组件如 MKL 和 MAGMA。以下是构建步骤:
REM 确保安装了 7z 和 curl
REM 下载 MKL 文件
curl https://s3.amazonaws.com/ossci-windows/mkl_2018.2.185.7z -k -O
7z x -aoa mkl_2018.2.185.7z -omkl
REM 下载 MAGMA 文件
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 设置环境变量
set "CMAKE_INCLUDE_PATH=%cd%\\mkl\\include"
set "LIB=%cd%\\mkl\\lib;%LIB%"
set "MAGMA_HOME=%cd%\\magma"
1.2 加快 Windows 的 CUDA 构建
可以使用 Ninja
来并行化 CUDA 构建任务:
REM 安装 Ninja
pip install ninja
REM 设置 CMake 生成器为 Ninja
set CMAKE_GENERATOR=Ninja
二、扩展开发
2.1 CFFI 扩展
在 Windows 上启用 CFFI 扩展需要额外步骤。首先,在 Extension
对象中指定额外的 libraries
:
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 库
)
#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;
}
2.2 C++ 扩展
对于 C++ 扩展,建议使用 x86_x64 VS 2017 的交叉工具命令提示符进行编译。
三、安装问题
3.1 在 Win-32 频道中找不到软件包
PyTorch 不支持 32 位系统,请使用 Windows 和 Python 的 64 位版本。
3.2 导入错误
错误 1:DLL 加载失败
该错误通常是由于缺少必要的运行库文件引起的。可以通过以下命令解决:
conda install -c peterjc123 vc vs2017_runtime
conda install mkl_fft intel_openmp numpy mkl
对于 wheel 包,确保安装了 VS 2017 可再发行组件和 NumPy:
pip install numpy mkl intel-openmp mkl_fft
错误 2:操作系统无法运行模块
该错误通常是由于使用了不兼容的 GPU 版本或 Anaconda 问题引起的。可以尝试以下命令修复:
conda install -c defaults intel-openmp -f
四、并行处理问题
4.1 没有 if 子句保护的并行处理错误
在 Windows 上,multiprocessing
使用 spawn
而不是 fork
。需要将代码包裹在 if __name__ == '__main__':
块中:
import torch
def main():
# 数据加载和训练代码
pass
if __name__ == '__main__':
main()
4.2 并行处理错误“管道破裂”
该错误通常是由于子进程在父进程完成发送数据之前结束引起的。可以通过将 DataLoader
的 num_workers
设置为零来调试:
dataloader = torch.utils.data.DataLoader(dataset, num_workers=0)
4.3 并行处理错误“驱动程序关闭”
请更新您的图形驱动程序。如果问题仍然存在,可以尝试更新 TDR 设置。
4.4 CUDA IPC 操作不支持
Windows 不支持 CUDA IPC 操作。可以选择不使用 multiprocessing
或共享 CPU 张量:
## 不使用 multiprocessing
dataloader = torch.utils.data.DataLoader(dataset, num_workers=0)
## 共享 CPU 张量
class CustomDataset(torch.utils.data.Dataset):
def __getitem__(self, idx):
# 确保返回 CPU 张量
return self.data[idx].cpu(), self.labels[idx].cpu()
五、常见问题解答
Q1:为什么 PyTorch 在 Windows 上不支持 CUDA IPC 操作?
A1:Windows 系统不支持 CUDA IPC 操作,这是由于操作系统的限制。可以选择不使用 multiprocessing
或共享 CPU 张量来解决。
Q2:如何解决导入错误?
A2:导入错误通常是由于缺少必要的运行库文件或使用了不兼容的包版本。可以通过安装所需的运行库和检查包版本来解决。
Q3:如何在 Windows 上构建 PyTorch?
A3:在 Windows 上构建 PyTorch 需要额外的步骤,包括下载和配置 MKL 和 MAGMA 等可选组件。可以参考官方文档获取详细的构建指南。
六、总结与展望
通过本文的详细介绍,我们掌握了 PyTorch 在 Windows 平台上的常见问题及解决方案。这些内容涵盖了从构建、安装到并行处理的各个方面,希望能帮助你在 Windows 环境下顺利开发和部署 PyTorch 项目。
关注编程狮(W3Cschool)平台,获取更多 PyTorch 开发相关的教程和案例。
更多建议: