当前位置: 首页 > news >正文

datasets库 的map方法num_proc=16并行踩坑

下图是tensorboard记录的评估数据集的准确率的变化,如下图所示,准确率低于0.01。
这个模型训练的结果,显然不对,出现这种情况大概率是数据集出问题了。
请添加图片描述
因为我没有更改代码,只更改了数据集。很快就反应过来是数据的问题,是label设置的不对。

LABEL_D = {} 
def func(item):"""给label编号"""label_name = item["label_name"]if label_name not in LABEL_D:LABEL_D[label_name] = len(LABEL_D)item["label"] = LABEL_D[label_name]return itemnew_dataset = loaded_dataset.map(func,num_proc=16
)

代码中使用了num_proc=16进行并行处理,这会启动 16 个进程同时执行func函数。但LABEL_D是一个全局变量,在多进程场景下:

  • 每个进程会拥有LABEL_D的独立副本(进程间内存不共享)
  • 不同进程可能对同一个new_label_name生成不同的编号(例如两个进程同时检测到某个新标签,都认为它不在LABEL_D中,分别分配编号 0 和 1)
  • 最终导致new_dataset中标签编号混乱,且LABEL_D的最终状态不可控(仅保留最后一个进程的修改)

【注意】:num_proc=1,依然也不行。虽然是单进程模式,但是依然不对。

这种 “动态累加标签编号” 的方式存在隐患。最可靠的方式仍是 先收集所有标签生成映射表,再应用映射。

在读取标签的时候,可以使用多进程进行读取。

改进

改进后的代码如下,提前把LABEL_D构建好:

## 设置 LABEL_D
LABEL_D = {name: i for i, name in enumerate(set(loaded_dataset["train"]["label_name"]))}def func(item):"""给label编号"""label_name = item["label_name"]if label_name not in LABEL_D:LABEL_D[label_name] = len(LABEL_D)item["label"] = LABEL_D[label_name]return itemnew_dataset = loaded_dataset.map(func,num_proc=16
)
http://www.dtcms.com/a/313455.html

相关文章:

  • Java 中的 final 关键字有哪些用法?
  • C++ 虚函数相关问题 **
  • 基于云模型的模糊综合风险评估Matlab代码
  • 网关与路由器的区别
  • access系统调用及示例
  • 延迟任务方案-DelayQueue
  • SpringBoot 2.x 升 3.x 避坑指南:企业级项目的实战问题与解决方案
  • Celery-分布式任务队列
  • MySQL深度理解-MySQL锁机制
  • 数据结构学习(day01)
  • 第八章:进入Redis的SET的核心
  • Android系统模块编译调试与Ninja使用指南
  • 【数据分享】各省粮食外贸依存度、粮食波动率等粮食相关数据合集(2011-2022)(获取方式看文末)
  • 【MATLAB】(六)多项式的创建与四则运算
  • python的高校奖助学金系统
  • 23 Active Directory攻击与防护策略解析
  • 编译旧版本的electron内核
  • SpringBoot之整合MyBatisPlus
  • Nvidia Orin DK 刷机CUDA TensorRT+硬盘扩容+ROS+Realsense+OpenCV+Ollama+Yolo11 一站式解决方案
  • 从“配置地狱”到“云端乐园”——Nacos 如何成为分布式微服务配置中心的“定海神针”
  • 数组和指针的关系
  • 操作系统——读者写者问题
  • KNX协议介绍
  • Nvidia Orin + RealSense D435i 与3D地图实现导航
  • Ubuntu系统VScode实现opencv(c++)视频的处理与保存
  • [硬件电路-129]:模拟电路 - 继电器的工作原理、关键指标、常用芯片与管脚定义
  • SpringAI的使用
  • Socket编程——TCP协议
  • 从一到无穷大 #51:突破阿姆达尔定律:COZ因果剖析与串行优化八法
  • Java学习第一百零一部分——网关(Gateway)