讲师中心 微信公众号
AI工具推荐 视频效率加速

在Python中怎样使用PyTorch DataLoader多进程加载数据

秋枫姑娘_7483

秋枫姑娘_7483

发布时间:2026-11-06 08:12:48

|

100人浏览过

|

来源于php中文网

原创

DataLoader开启num_workers>0未提速或卡死的根本原因是__getitem__不满足多进程安全:如使用全局单例、未序列化数据库连接或依赖主线程状态;PyTorch用spawn方式启动worker,需确保Dataset.__init__轻量、__getitem__幂等无副作用,并遵守Windows/macOS的if name == '__main__':约束。

在python中怎样使用pytorch dataloader多进程加载数据

为什么 DataLoader 开了 num_workers > 0 却没提速甚至卡死

根本原因常是数据集的 __getitem__ 不满足多进程安全:比如内部用了全局单例、未序列化的数据库连接、或依赖主线程状态(如某些 GUI 或日志上下文)。PyTorch 多进程用的是 spawn 启动方式,每个 worker 进程会重新导入模块并重建对象,若 Dataset 初始化时做了不可重入操作(如打开文件未关闭、启动线程、调用 torch.set_num_threads(1)),就会阻塞或报错。

实操建议:

立即学习“Python免费学习笔记(深入)”;

  • 确保 Dataset.__init__ 只做轻量初始化(如存路径、读配置),所有耗时/有状态操作移到 __getitem__ 中,并保证该方法幂等、无副作用
  • 避免在 Dataset 中使用 logging、matplotlib、cv2.VideoCapture 等不支持 fork/spawn 的库
  • Windows 或 macOS 上务必把 DataLoader 创建和迭代逻辑放在 if __name__ == '__main__': 块内,否则子进程会重复执行主脚本
  • 用 torch.utils.data.get_worker_info() 在 __getitem__ 中区分主进程和 worker,做差异化处理(如只在主进程打日志)

pin_memory=True 和 prefetch_factor 怎么配合 num_workers

pin_memory=True 把 batch 张量锁页(pinned memory),让 GPU 更快通过 DMA 拷贝;但它只对 CPU→GPU 传输生效,且必须搭配 tensor.to(device, non_blocking=True) 才真正加速。而 prefetch_factor(默认 2)控制每个 worker 预取多少个 batch,值太小会空转,太大则内存暴涨——尤其当 batch 本身很大(如高分辨率图像)时。

实操建议:

立即学习“Python免费学习笔记(深入)”;

  • GPU 训练必开 pin_memory=True,但 CPU 训练反而可能因锁页内存占用增加导致 OOM
  • prefetch_factor 推荐从 2 开始试,若 GPU 利用率低(nvidia-smi 显示 GPU-Util 波动大且常为 0),可逐步加到 4~6;但 num_workers * prefetch_factor * batch_size * bytes_per_sample 别超过系统空闲内存
  • 不要盲目堆 num_workers:超过 CPU 核心数(尤其超线程数)后,上下文切换开销会抵消收益;一般设为 min(8, os.cpu_count()) 起步

遇到 OSError: unable to open file (unable to lock file) 怎么办

这是典型多进程并发读同一文件(如 HDF5、LMDB、或未加锁的 SQLite)导致的冲突。HDF5 默认不支持多进程读,LMDB 虽支持但需显式设置 readonly=True 和 lock=False;而普通 ZIP 或文件夹里读图时,若多个 worker 同时 open() 同一个图片文件,在某些文件系统上也会抢锁失败。

Python Hardener
Python Hardener

通过完整的安全审查、代码整洁重构、健壮的错误处理、正确的日志记录以及完整的文档字符串覆盖,强化 Python 脚本。

下载

实操建议:

立即学习“Python免费学习笔记(深入)”;

  • HDF5:改用 h5py.File(..., swmr=True)(需文件创建时启用 SWMR 模式),或换用 zarr 格式
  • LMDB:Dataset 初始化时传 env = lmdb.open(..., readonly=True, lock=False, readahead=False, meminit=False)
  • 通用方案:把文件路径在 __init__ 中按 worker 分片,用 get_worker_info().id 分配不同子集,避免跨 worker 争抢
  • 图像加载:优先用 PIL.Image.open().convert() 而非 cv2.imread(),后者在某些 OpenCV 版本中存在多进程兼容问题

如何验证多进程是否真在工作

不能只看训练速度,得确认 worker 进程确实启动并持续产出数据。最直接的方法是观察系统资源:运行时用 htop 或任务管理器看 CPU 核心是否被多个 python 进程占用;更精确的是在 __getitem__ 里加带进程 ID 的日志(注意别用 print,用 logging 并配置 %(process)d)。

实操建议:

立即学习“Python免费学习笔记(深入)”;

  • 临时在 Dataset.__getitem__ 开头加:
    import logging; logging.info(f"[Worker {get_worker_info().id if get_worker_info() else 'main'}] loading {idx}")
    ,再用 logging.basicConfig(level=logging.INFO) 查看输出
  • 用 torch.utils.data.dataloader._BaseDataLoaderIter 的调试模式(不推荐生产用):设环境变量 export PYTORCH_ENABLE_MPS_FALLBACK=1 无用,真正有效的是加 torch.multiprocessing.set_start_method('spawn', force=True) 并捕获 RuntimeError 看是否启动失败
  • 如果 num_workers=4 但 htop 只看到 1 个 Python 进程在跑,大概率是 __getitem__ 抛了未捕获异常,worker 静默退出,主进程 fallback 到单进程——此时一定要检查 __getitem__ 是否有潜在 KeyError、IOError 等

多进程真正的难点不在参数配置,而在数据加载逻辑本身的可重入性和资源隔离。哪怕只差一个全局变量或一次未关闭的文件句柄,整个 pipeline 就会退化成单线程。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1871

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

5124

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1829

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

30937

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3667

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3687

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1243

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

616

2023.08.10

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn