PyTorch Dataloader当使用LMDB数据时num_worker>0引发TypeError: can‘t pickle Environment objects问题的解决

PyTorch大规模数据集加载优化:从Dataloader瓶颈到高效训练实战 本文深入剖析了PyTorch Dataloader在处理千万级大规模数据集时成为训练瓶颈的根源,包括磁盘I/O、数据解码与CPU预处理等关键环节。通过实战案例,详细介绍了将海量小文件转换为LMDB等高效二进制格式、精调num_workers与pin_memory参数、实施智能缓存与采样策略三大核心优化手段,最终将训练效率提升超过15倍,助力GPU算力得到极致发挥。 阅读详情

PyTorch Dataloader当使用LMDB数据时num_worker>0引发TypeError: can't pickle Environment objects问题的解决

防忘记,原issue:https://github.com/pytorch/vision/issues/689#issuecomment-787215916

解决方法:

  1. 不要在__init__方法中调用lmdb.open方法;
  2. 在第一次加载数据时打开lmdb。

代码如下

class DataLoader(torch.utils.data.Dataset):
    def __init__(self):
        """do not open lmdb here!!"""

    def open_lmdb(self):
         self.env = lmdb.open(self.lmdb_dir, readonly=True, create=False)
         self.txn = self.env.begin(buffers=True)

    def __getitem__(self, item: int):
        if not hasattr(self, 'txn'):
            self.open_lmdb()
        """
        Then do anything you want with env/txn here.
        """

解释(照搬原文,懒得翻译了):
The multi-processing actually happens when you create the data iterator (e.g., when calling for datum in dataloader:):
https://github.com/pytorch/pytorch/blob/461014d54b3981c8fa6617f90ff7b7df51ab1e85/torch/utils/data/dataloader.py#L712-L720
In short, it would create multiple processes which “copy” the state of the current process. This copy involves a pickle of the LMDB’s Env thus causes an issue. In our solution, we open it at the first data iteration and the opened lmdb file object would be dedicated to each subprocess.

TypeError: can‘t pickle module objects 报错: Traceback (most recent call last): File "/nfs/volume-902-6/xxxx/bad_test.py", line 66, in generate_pre_annot pickle.dump(proposals, f, protocol=None, fix_imports=True) TypeError: can't pickle module objects 又一次阴沟里翻船,还好同事帮忙指出来的 你这个pickle啊,它保存的东西需 阅读详情

相关推荐

Python使用pickle模块存储数据报错解决示例代码

本文研究的主要是Python使用pickle模块存储数据报错解决方法,以代码的形式展示,具体如下。 首先来了解下pickle模块 pickle提供了一个简单的持久化功能。可以将对象以文件的形式存放在磁盘上。 pickle模块只能在python中使用,python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化, pickle序列化后的数据,可读性差,人一般无法识别。 接下来我们看下Python使用pickle模块存储数据报错解决方法。 代码: # 写入错误 TypeError: write() argument must be str, not byte

解决ForkingPickler(file, protocol).dump(obj) TypeError: can‘t pickle Environment objects

在并行编程中,当需要将自定义对象序列化后进行传递时,有时会遇到​​错误。这是由于pickle无法序列化包含Environment对象的对象导致的。为了解决这个问题,本文提供了一个可能的解决方案,通过自定义一个处理函数,去掉或转换对象中的Environment对象,从而使pickle可以正确序列化。使用​​对象并指定自定义的reduce函数,可以实现对对象的序列化。希望本文的解决方法能够帮助到你在并行编程中遇到的类似问题。假设我们有一个应用场景,需要在多个电脑上同时运行训练机器学习模型的任务,利用​。

牛肉胡辣汤 3103

Unity+Hybridclr发布WebGL记录

问题不多,比预想中的顺利,如果遇到问题建议先看Hybridclr的常见问题里面有没有解决方案,没遇到Hybridclr的报错,所以记录的问题里面没有Hybridclr相关的。导出设置里的压缩格式选择了Brotli,而服务器或浏览器不支持,据说是可以拓展服务器配置使支持Brotli,但是由于我本人是IIS小白,所以换了种压缩格式,在publishing Settings修改Compression Fromat为Gzip。3.在浏览器运行之后视图一直闪烁。,修改配置,这个网上很常见。

a598211757的博客 1038

成功解决can‘t pickle Environment objects和Ran out of input

成功解决ForkingPickler(file, protocol).dump(obj) TypeError: can't pickle Environment objects 以及self = reduction.pickle.load(from_parent) EOFError: Ran out of input 本人是在调试lsun数据集&&神经网络代码时出现,问题显示如下: 因为windows操作系统的原因,在Windows中,多进程multiprocessing使用的是序

OpenSceneGraph的博客 6194

SHAP图全解析:从理论到实践,教你如何读懂和优化模型特征

本文全面解析SHAP图,从博弈论基础到实战应用,指导读者如何解读和利用SHAP值优化机器学习模型。通过详解特征重要性条形图、小提琴图、依赖图及决策图等关键可视化工具,帮助数据科学家精准诊断模型、识别特征交互,并将洞见转化为特征工程与模型调试的实际行动,有效提升模型可解释性与性能。

svm4gardener的博客 189

本地部署开源视频会议解决方案 Jitsi Meet 并实现外网访问

Jitsi Meet 是一款基于 WebRTC 技术的开源视频会议解决方案,它允许用户通过互联网进行高质量的视频通话、语音通话和文本聊天,非常适合用于在线教育、远程办公、团队协作等场景。本文将详细介绍如何利用 Docker 在本地部署 Jitsi Meet 并结合路由侠实现外网访问本地部署的 Jitsi Meet。

lyxnwct的博客 1946

报错:TypeError: cant pickle Environment objects 和 EOFError: Ran out of input

Github下载的Pytorch0.4.1的代码,linux运行没问题,转到windows出现错误! File “D:\Anaconda3.7\lib\multiprocessing\process.py”, line 112, in start self._popen = self._Popen(self) File “D:\Anaconda3.7\lib\multiprocessing\context.py”, line 223, in _Popen return _default_context.g

小花生的博客 3444

光学仿真案例(4) 基于纳米微粒激发平面波的米氏散射FDTD仿真模拟

本案例展示了一个基于纳米粒子激发平面波的米氏散射仿真模型(mie scattering),计算其散射和吸收截面、局域场增强和远场散射分布,同时将截面和远场结果与解析解进行了比较,验证了仿真模拟的准确性。

q895235273的博客 3593

Pytorch GPU由于num_workers读取lmdb格式引发的BUG Cannot re-initialize CUDA&TypeError: can't pickle odict_keys

如果你遇到了如下的BUG: 1、"Cannot re-initialize CUDA in forked subprocess. " + msg) RuntimeError: Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you must use the 'spawn' star...

zhaominyiz的博客 1743

unitree-G1外接 USB 麦克风完整配置指南

首先,将type-c麦克风插入G1机器人的USB口后,记录下USB麦克风的卡号(card)和设备号(device),通常显示为 card 1: Device [USB Audio Device]

m0_47999117的博客 600

cesium 气象云(体积云)

本文介绍了基于Cesium的气象云渲染技术方案,其核心是通过GPU加速的光线投射算法实现气象云的三维可视化。方案采用分层架构设计:GPU计算层由顶点着色器和片段着色器组成,负责光线投射计算、3D纹理采样和颜色映射;CPU控制层处理数据预处理、纹理创建和参数配置。关键技术包括:顶点着色器计算相机位置和光线方向,片段着色器实现光线步进采样、颜色映射和半透明混合。该方案高效解决了气象数据与地理场景的融合问题,支持云图、温度场等复杂三维气象数据的实时渲染,具有高真实感和良好性能。

God's asylum的博客 1204

成功解决ForkingPickler(file, protocol).dump(obj) TypeError: can‘t pickle Environment objects

​ 成功解决ForkingPickler(file, protocol).dump(obj) TypeError: can't pickle Environment objects 目录 解决问题 解决思路 解决方法(三种) T1、将队列移动到self,而不是作为函数包和send的参数 T2、multiprocessing.Manager().Queue()instead ofmultiprocessing.Queue 解决问题 ForkingPickler(file, protoco

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 2万+

RuyiDify如何创建知识库API密钥:让程序安全访问知识库

知识库 API Key 是程序访问知识库的钥匙。创建它很简单,但真正重要的是知道它能做什么、应该放在哪里、不能暴露给谁。RuyiDify 讲这一步,不是为了让大家多记一个按钮,而是为了把知识库从“人工上传资料”推进到“程序化维护资料”。

未来已来,AI时代,学AI编程,做AI量化,就来大鹏AI教育。 137

TypeError: cannot pickle ‘module‘ object

TypeError: cannot pickle 'module' object

JingYi的专栏 6563

5、AIX系统硬件管理与故障诊断全解析

本文全面解析了AIX系统的硬件管理与故障诊断方法,涵盖系统管理服务(SMS)的使用、设备兼容性配置、设备配置数据库结构、常用命令如cfgmgr、lsattr、smitty devices的操作详解,并深入介绍了错误日志管理机制,包括errdemon、errpt、errlogger等命令的应用。通过实际案例分析和流程图展示,帮助系统管理员掌握从问题怀疑到诊断执行再到日志清理的完整流程,同时提供注意事项与最佳实践,助力AIX系统的稳定运行与高效维护。

y2z3a4b5c的博客 62

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

python中关于TypeError: can't pickle instancemethod objects的错误解决方案

python中关于TypeError: can’t pickle instancemethod objects的错误解决方案 在本人关于多进程下运行类方法一文中有遇到上述错误,通过相关搜索了解到,可能是我们在实例化多进程对象的过程中,实例化对象的某些属性没有办法序列化导致。下面通过具体的代码进行实例化对象是否存在不能序列化现象的验证。 首先在类中定义如下的方法: def __getstate_...

qq_43654142的博客 2017

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

win下ForkingPickler(file, protocol).dump(obj) TypeError: can't pickle Environment objects

现象 我在win系统下运行出现这种错误,查询资料发现是windows系统的问题,因此做个note。 解决方法 直接将参数worker设置为0,但是这样只是能过编译,不能根本解决问题。 如博客https://blog.youkuaiyun.com/tpc4289/article/details/79280659所述。 ...

MRCEHN的博客 5606

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

python 多线程时报错:TypeError: cannot pickle ‘_thread.lock‘ object

在学习分布式爬虫时,遇到已下报错: 在网上搜了下,普遍都是这一种解决办法,降Process.start()改成Process.run(),试了一下,确实不再报错,但是同时也不是多线程。参考文章:https://blog.youkuaiyun.com/weixin_42081389/article/details/93172508 继续搜索,终于找到不一样, https://blog.youkuaiyun.com/attackkk/article/details/102028534?utm_medium=distrib

wjlwzl的专栏 1万+

TypeError: can't pickle _thread.lock objects

原因是使用Process(target=,args=(,))创建进程时,args不能是自定义类对象,或者不能pickle的类对象。 解决方法,自定义类继承Process,在__init__中传入自定义对象。 ...

qq_42636010的博客 636

TypeError: cannot pickle ‘_io.TextIOWrapper‘ object multiprocessing调用pexpect

pexcet和multiprocess一起使用时报错

z2498249的博客 2749

ForkingPickler(file, protocol).dump(obj) TypeError: can‘t pickle Environment objects

因为windows操作系统的原因,在Windows中,多进程multiprocessing使用的是序列化pickle来在多进程之间转移数据,而socket对象是不能被序列化的,但是在linux操作系统上却没问题,因为在linux上多进程multiprocessing使用的是fork,所以在windows上可以改用多线程。因为网络通信属于io密集型的操作,对cpu计算要求不高,不用多进程,用多线程就行。,记得无论是参数设置还是数据集读取处理的代码,都要重新设置。

不要给自己设限,尝试更多可能(思所向 皆可往) 811

Airflow: TypeError can't pickle memoryview objects

apache-airflow1.9.0 + python3 + rabbitmq + librabbitmq2.0.0 相关配置如下: broker_url = amqp://cord:123456@localhost:5672// celery_result_backend = rpc:// 结果运行的时候抛出如下异常: TypeError can't pickle memoryview obj...

weixin_30300523的博客 497

如何定位TypeError: cannot pickle dict_keys object错误原因及解决NuScenes数据集在多进程并发训练或测试时出现的这个错误

UniAD的NuScenesE2EDataset继承自NuScenesDataset,其实例里面的eval_detection_configs数据就是这么来的,里面的class_names的值默认是通过dict.keys()获得的,没有转换成Pickler支持的类型,这才导致了TypeError: cannot pickle 'dict_keys' object

XCCCCZ的博客 4910

PyTorch下训练数据小文件转大文件读写(附有各种存储格式对比)

PyTorch下训练数据小文件转大文件读写(附有各种存储格式对比)

有问题请直接说问题就好 3443

CRNN项目实战

CRNN项目实战 之前写过一篇文章利用CRNN进行文字识别,当时重点讲的CRNN网络结构和CNN部分的代码实现,因为缺少文字数据集没有进行真正的训练,这次正好有一批不定长的字符验证码,正好CRNN主要就是用于端到端地对不定长的文本序列进行识别,当然是字符和文字都是可以用的,所以这里进行了一次实战。 主要是参考github项目:https://github.com/meijieru/crnn.pytorch 关于lmdb lmdb安装 首先关于lmdb这个数据库,python有两个包,一个是lmdb,另一个是

一位在路上的工程师的博客 7890
上一篇: 利用PCA+KNN在MNIST数据集上达到97%准确率
evilfromshadow
博客等级 码龄10年 2粉丝 1原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值