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

华为昇腾 910B 实战:DeepSeek-R1 蒸馏模型高效部署与性能调优全解析 本文详细解析了在华为昇腾910B硬件平台上高效部署DeepSeek-R1蒸馏系列模型(14B/32B版本)的完整实战流程。内容涵盖从MindIE环境搭建、镜像获取、模型准备,到服务配置、内存参数调优、性能测试及常见问题排查,为开发者提供了基于昇腾910B进行大模型部署与优化的全链路指南。 阅读详情

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.

蓝牙Mesh协议一基本概念 前言 蓝牙SIG联盟在2017年发布了蓝牙Mesh1.0的协议规格,基于低功耗广播包来实现的多对多的通信技术,Mesh协议建立在BLE的物理层和链路层上,所以也可以和BLE的蓝牙进行通信 本章主要介绍蓝牙Mesh的基本概念和协议中的层级结构,也是参考网上的资料,如有异议,欢迎留言指正 基本概念 广播和洪泛 蓝牙Mesh技术是基于BLE的广播报文来实现的,是一种洪泛的消息传输机制,Mesh网络的节点间通过3个广播信道进行通信。当蓝牙Mesh网络中的节点收到消息后会转发这条消息,大大增加了网络的覆盖范围;但 阅读详情

相关推荐

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啊,它保存的东西需

Hello Word! 8319

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

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

基于yolov8的基建裂缝目标检测系统Python源码+文档说明+数据集(高分毕设项目)

基于yolov8的基建裂缝目标检测系统Python源码+文档说明+数据集(高分毕设项目)含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。该项目可以作为毕设、期末大作业使用,前后端代码都在里面。该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。项目都经过严格调试,确保可以运行!基于yolov8的基建裂缝目标检测系统Python源码+文档说明+数据集(高分毕设项目)含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。该项目可以作为毕设、期末大作业使用,前后端代码都在里面。该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。项目都经过严格调试,确保可以运行!基于yolov8的基建裂缝目标检测系统Python源码+文档说明+数据集(高分毕设项目)含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。该项目可以作为毕设、期末大作业使用,前后端代码都在里面。该系统功能完善、界面美观。

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

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

牛肉胡辣汤 3092

成功解决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的博客 6187

报错: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

小花生的博客 3438

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的博客 1740

成功解决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万+

TypeError: cannot pickle ‘module‘ object

TypeError: cannot pickle 'module' object

JingYi的专栏 6548

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

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

MRCEHN的博客 5603

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

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

qq_43654142的博客 2013

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

在学习分布式爬虫,遇到已下报错: 在网上搜了下,普遍都是这一种解决办法,降Process.start()改成Process.run(),试了一下,确实不再报错,但是同也不是多线程。参考文章:https://blog.csdn.net/weixin_42081389/article/details/93172508 继续搜索,终于找到不一样, https://blog.csdn.net/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的博客 632

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

pexcet和multiprocess一起使用报错

z2498249的博客 2740

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

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

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

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的博客 496

如何定位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的博客 4885

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

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

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

CRNN项目实战

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

一位在路上的工程师的博客 7880

数据处理(一)dataloader、datasets

2、数据(3个pickle文件)存放到’path/your data/miniimagenet/'路径下。**pickle文件生成代码:**需要images,train.csv、val.csv、test.csv。3、新建一个dataset_loader文件夹,train_dataloader.py(含。###(一)train.pickle、val.pickle、test.pickle文件。1、miniImagenet.py内容(包含小样本)以上为读取pickle格式数据

weixin_46075899的博客 840
上一篇: 利用PCA+KNN在MNIST数据集上达到97%准确率
evilfromshadow
博客等级 码龄10年 2粉丝 1原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值