Pytorch:多模态大模型预训练、大模型微调:加载数据的正确姿势

对于近期兴起的多模态大模型的预训练和微调,常见情况是训练数据规模极大,通常可以达到1m-100m级别。此时,训练数据通常用一个上百万行的jsonl文件存储,每行对应一条json格式的训练数据,其中可能包括数据关联的其他图、音、视频数据的索引。例如,阿里通义千问多模态大模型QWen-VL的一条示例数据可能如下所示:

{"input": "Picture 1:<img>https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg</img>这是什么?","output": "图中是一名女子在沙滩上和狗玩耍,旁边是一只拉布拉多犬,它们处于沙滩上。"
}

由于训练数据集过大,在训练读取数据时,直接使用Dataset类可能会带来性能问题。Pytorch的Dataset类在初始化时会将整个数据集加载到内存中,如果数据集非常大,没法全部放在内存里,使用Dataset类会显著增加硬盘io次数,带来性能下降。此时的对策是使用IterableDataset类,可以按需加载数据,而不是一次性将整个数据集加载到内存中。
基于IterableDataset的数据加载,代码实现如下:

import torch
from torch.utils.data import IterableDatasetclass MyIterableDataset(IterableDataset):def __init__(self, data_file):self.data_file = data_filedef __iter__(self):return iter(self._load_data())def _load_data(self):with open(self.data_file, 'r') as file:for line in file:sample = process_line(line)yield sampledef process_line(self, line):# Process the line to convert it to a sample...return sample# Usage
data_file = 'data.txt'
dataset = MyIterableDataset(data_file)
dataloader = torch.utils.data.DataLoader(dataset, batch_size=32)for batch in dataloader:# Train your model using the batch of datapass

在实际训练中还会遇到两个问题:

  1. 大模型一般需要使用多机多卡训练,需要避免多个进程中dataloader读取数据的竞争,并保证不同进程之间不会重复读取数据;
  2. 数据文件中某些行无法正确被解析,或者引用的外部资源找不到,导致process_line成员函数报错。数据集需要handle这类错误,防止因为报错中断训练。

以上问题对策如下:

  1. 在多机多卡的DDP训练中,可以使用DistributedSampler来处理多进程读数据的情形。DistributedSampler可以确保不同进程之间不会重复读取数据。具体的代码实现如下:
# Usage
data_file = 'data.txt'
dataset = MyIterableDataset(data_file)# Create a DistributedSampler
sampler = DistributedSampler(dataset)# Create a DataLoader using the DistributedSampler
dataloader = torch.utils.data.DataLoader(dataset, batch_size=32, sampler=sampler)for batch in dataloader:# Train your model using the batch of datapass
  1. 可以在调用process_line的时候试图handle一个错误,如果出错就跳过这条数据,改为(试图)获取下一条数据。具体的代码实现如下:
import torch
import logger
from torch.utils.data import IterableDatasetclass MyIterableDataset(IterableDataset):def __init__(self, data_file):self.data_file = data_filedef __iter__(self):return iter(self._load_data())def _load_data(self):with open(self.data_file, 'r') as file:for line in file:try:sample = process_line(line)yield sampleexcept Exception as e:# Print the detailed error informationlogger.error(line)logger.error(e)passdef process_line(self, line):# Process the line to convert it to a sample...return sample

如果使用的是普通的Dataset,则参考以下代码,在__getitem__里面加入报错逻辑:

class MyDataset(Dataset):def __init__(self, file_path):self.data = []with open(file_path, 'r') as file:for line in file:self.data.append(line)def __len__(self):return len(self.data)def __getitem__(self, index):line = self.data[index]try:sample = self.process_line(line)return sampleexcept Exception as e:# Print the detailed error informationlogger.error(line)logger.error(e)return self.__getitem__((index+1) % self.__len__())def process_line(self, line):# Process the line to convert it to a sample...return sample

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/746448.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Simple and Scalable Strategies to Continually Pre-train Large Language Models

Simple and Scalable Strategies to Continually Pre-train Large Language Models 相关链接&#xff1a;arxiv 关键字&#xff1a;Large Language Models、Pre-training、Continual Learning、Distribution Shift、Adaptation 摘要 大型语言模型(LLMs)通常会在数十亿个tokens…

vue实现微信自带浏览器分享(小卡片形式)

注意&#xff1a;只能在微信自带浏览器打开进行分享 1.图片效果 2.cdn引入weixin-js-sdk的依赖 在index.html中引入 <script src"https://res2.wx.qq.com/open/js/jweixin-1.6.0.js"></script>2.在assets/js文件夹中创建share.js文件 import axios fr…

KeyError,Python使用DDT,抛KeyError异常

目录 Python使用DDT&#xff0c;抛KeyError异常 报错&#xff1a; line 158, in testFace print("kwargs[logName]&#xff1a;",kwargs["logName"]) KeyError: logName运行demo test_Data [{"logName": "shutDownTakePictureFaceLog&q…

c 语言stdlib.h介绍

stdlib.h介绍 stdlib.h 是 C 语言的标准库头文件&#xff0c;它包含了许多与内存分配、随机数生成、字符串转换和其他常用函数相关的函数原型和宏定义。 内存管理函数 malloc()&#xff1a;用于分配指定字节数的内存空间。 void* malloc(size_t size);其中&#xff0c;size…

transform inverse()函数解析

transform inverse() const { const Quaternion rotation rotation_.conjugate(); const Vector translation -(rotation * translation_); return transform(translation, rotation); } 这段代码定义了一个inverse()成员函数&#xff0c;用于计算一个变换&#xff08;t…

pytorch之诗词生成5--train

先上代码&#xff1a; import tensorflow as tf from dataset import PoetryDataGenerator, poetry, tokenizer from model import model import settings import utilsclass Evaluate(tf.keras.callbacks.Callback):"""在每个epoch训练完成后&#xff0c;保留最…

将PostgreSQL插件移植到openGauss指导

1 概述 PostgreSQL 社区提供了丰富的插件&#xff0c;但由于 openGauss 和 PostgreSQL 存在一定的差异&#xff0c;如线程/进程模型、系统表和视图等&#xff0c;无法直接为 openGauss 所用&#xff0c;不可避免的需要在插件上做整改。 本文档主要对 Postgresql 插件移植到 o…

面试官:说说C++的引用和指针有什么区别

C中的引用和指针虽然都是用于间接访问和操作对象的工具&#xff0c;但它们之间存在几个重要的区别&#xff1a; 本质和存在性&#xff1a; 指针是一个变量&#xff0c;它存储了另一个变量的地址。指针有自己的内存地址&#xff0c;并且可以改变其指向的内容。 引用是一个别名&a…

springboot271制造装备物联及生产管理ERP系统

制造装备物联及生产管理ERP系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装制造装备物联及…

3月14日,每日信息差

&#x1f396; 素材来源官方媒体/网络新闻 &#x1f384; 5.5G通信网络在海南投入商用&#xff0c;较5G提升10倍 &#x1f30d; 国务院批复同意&#xff0c;珠海港口岸将整合并扩大开放 &#x1f30b; 同有科技&#xff1a;正在研究新型磁电存储技术 &#x1f381; 美国折扣零售…

考研模拟面试-答案【攻略】

考研模拟面试-答案【攻略】 前言版权推荐考研模拟面试-答案前面的问题通用问题专业题数据结构计算机网络操作系统数据库网络安全 手写题数据结构操作系统计算机网络 代码题基础代码题其他代码题 后面的问题补充题目 基础代码题答案链栈循环队列1循环队列2哈希表 最后 前言 202…

Oracle基础-分组查询 备份

一、概述 数据分组的目的是用来汇总数据或为整个分组显示单行的汇总信息&#xff0c;通常在查询结果集中使用GROUP BY 子句对记录进行分组。在SELECT 语句中&#xff0c;GROUP BY 子句位于FROM 子句之后&#xff0c;语法格式&#xff1a; SELECT columns_list FROM table_nam…

【测试知识】业务面试问答突击版1

高内聚低耦合 高内聚指的是将相关的功能或数据组织在一起&#xff0c;使得模块内部的各个元素紧密地联系在一起&#xff0c;完成特定的任务。 低耦合指的是模块之间的依赖关系尽可能地降低&#xff0c;模块之间的接口简单清晰&#xff0c;减少模块之间的相互影响。 文章目录 整…

【数据结构】二叉搜索树底层刨析

文章目录 1. 二叉搜索树的实现2. 二叉搜索树的应用3. 改造二叉搜索树为 KV 结构4. 二叉搜索树的性能分析 1. 二叉搜索树的实现 namespace key {template<class K>struct BSTreeNode{typedef BSTreeNode<K> Node;Node* _left;Node* _right;K _key;BSTreeNode(const…

工作中用到的 —— 工作总结提炼出来的股文

这里是目录 ---------------- VUE相关 -----------------1 - Vue3 是怎么得更快的&#xff1f;1-1 Fragment [frɡˈment]1-2 Suspense [səˈspens]1-3 Teleport [ˈtelipɔːt]1-4 v-memo 2- 说一下 Composition API3- 说一下 setup4- watch 和 watchEffect 的区别5- Vue3 响…

Sublime查看ANSI编码文档乱码问题

原因为没有安装对应的解码插件。 选择安装插件包 选择插件包&#xff1a;ConvertToUTF8或者GBK&#xff0c;我试了第一个插件包不行&#xff0c;安装GBK插件包后OK。

Git如何清除账户凭证

场景&#xff1a;一般发生在Git用户变更的情况 1.git base 操作 Git会使用凭证助手 credential.helper来储存账户凭证&#xff0c;通过以下命令移除&#xff1a; git config --system --unset credential.helper 除了system系统级外&#xff0c;还有 global、local范围。 查…

20万英文单词同义词宝典ACCESS\EXCEL数据库

英语同义词反义词的数据之前搞到过《近万英语单词同义词典ACCESS数据库》、《上百万英语同义反义词词典ACCESS数据库》&#xff0c;今天又搞到一份几十万行数据的&#xff0c;发上来看看有没有适合朋友们的需求。 今天这个数据提供了非常全的词汇单词以及词汇对应的含义以及近…

将Java项目Jar包制作成Docker镜像

文章目录 前言一、准备事项二、使用步骤1.Dockerfile脚本2.制作镜像推送Harbor仓库前言 以前单体项目通常采用传统部署方式将项目打成Jar包再进行部署。如果我们项目是微服务则需要进行Docker容器部署。本文将介绍如何在本地将Jar包制作成Docker镜像并推送到Harbor仓库 一、准…

Spring揭秘:ClassPathScanningProvider接口应用场景及实现原理!

技术应用场景 ClassPathScanningCandidateComponentProvider是Spring框架中一个非常核心的类&#xff0c;它主要用于在类路径下扫描并发现带有特定注解的组件&#xff0c;支持诸如ComponentScan、Component、Service、Repository和Controller等注解的自动扫描和注册。 ClassP…