Using ‘pin_memory=False’ as WSL is detected. This may slow down the performance.

13次阅读
没有评论

报错提示翻译与解决方案

原文翻译

检测到当前运行环境为 WSL(Windows Linux 子系统),已自动将 pin_memory=False。该设置会降低数据加载性能

原因说明

pin_memory=True 是 PyTorch DataLoader 的常用参数:

作用是把张量锁页到主机内存,加速 CPU → GPU 数据拷贝,大幅提升训练速度。

WSL 原生不支持页锁定内存(pin memory),强行开启会直接报错崩溃,所以程序自动关闭该功能,代价就是数据读取变慢。

三种解决办法(按需选择)

方案 1:最简单,忽略警告(推荐调试 / 小数据集)

不用修改代码,只是性能小幅下降,不影响程序正常运行,直接无视这条日志即可。

方案 2:彻底根治,改用原生 Windows 环境运行 PyTorch

不在 WSL 内跑训练,直接在 Windows 安装 CUDA + PyTorch,此时可以正常开启 pin_memory=True,无警告且速度拉满。

方案 3:WSL2 内优化,尽量缩小性能差距

  1. DataLoader 手动固定参数,屏蔽自动提示:

python

运行

from torch.utils.data import DataLoader

loader = DataLoader(
    dataset,
    batch_size=16,
    pin_memory=False,  # 手动显式关闭,消除警告
    num_workers=4
)
  1. 优化 WSL 数据加载提速手段:
  • 不要把数据集放在 Windows 盘符(/mnt/c/),拷贝到 WSL 内部文件系统(~/ 目录),读写速度提升数倍;
  • 合理设置 num_workers,一般设为 CPU 物理核心数,不要开过多进程;
  • 开启 prefetch_factor 预加载数据。

补充:如果强行开启 pin_memory 会怎样

WSL2 环境下设置 pin_memory=True 会抛出类似:

RuntimeError: cannot pin 'torch.cuda.FloatTensor' only dense CPU tensors can be pinned

运行直接中断,因此必须关闭。

正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)
验证码