llama factory 是如何加载数据集 通过对数据集加载的代码的理解编写自定义数据集训练代码

第一层从训练代码追踪到以下代码

def get_dataset(tokenizer: "PreTrainedTokenizer",model_args: "ModelArguments",data_args: "DataArguments",training_args: "Seq2SeqTrainingArguments",stage: Literal["pt", "sft", "rm", "ppo"],# split: Optional[str] = "train", # TODO: add split
) -> Union["Dataset", "IterableDataset"]:template = get_template_and_fix_tokenizer(tokenizer, data_args.template)if data_args.train_on_prompt and template.efficient_eos:raise ValueError("Current template does not support `train_on_prompt`.")# Load from cacheif data_args.cache_path is not None:if os.path.exists(data_args.cache_path):logger.warning("Loading dataset from disk will ignore other data arguments.")dataset = load_from_disk(data_args.cache_path)if data_args.streaming:dataset = dataset.to_iterable_dataset()return datasetwith training_args.main_process_first(desc="load dataset"):all_datasets = []for dataset_attr in get_dataset_list(data_args):all_datasets.append(load_single_dataset(dataset_attr, model_args, data_args))dataset = merge_dataset(all_datasets, data_args, training_args)with training_args.main_process_first(desc="pre-process dataset"):preprocess_func, print_function = get_preprocess_and_print_func(tokenizer, template, data_args, training_args, stage)column_names = list(next(iter(dataset)).keys())kwargs = {}if not data_args.streaming:kwargs = dict(num_proc=data_args.preprocessing_num_workers,load_from_cache_file=(not data_args.overwrite_cache),desc="Running tokenizer on dataset",)dataset = dataset.map(preprocess_func, batched=True, remove_columns=column_names, **kwargs)if data_args.cache_path is not None and not os.path.exists(data_args.cache_path):if training_args.should_save:dataset.save_to_disk(data_args.cache_path)logger.info("Dataset cache saved at {}.".format(data_args.cache_path))if training_args.should_log:try:print_function(next(iter(dataset)))except StopIteration:raise RuntimeError("Cannot find valid samples, check `data/README.md` for the data format.")return dataset

这段Python代码定义了一个名为get_dataset的函数,其目的是根据给定的参数加载和预处理一个数据集。下面是该函数的逐步解读:

  1. 函数参数
    • tokenizer: 一个预训练的tokenizer对象,用于处理文本数据。
    • model_args, data_args, training_args: 分别包含模型、数据和训练的参数。
    • stage: 指定当前的训练阶段,如"pt"(预训练)、“sft”(监督微调)、“rm”(奖励模型训练)或"ppo"(PPO训练)。
    • split: 指定数据集的分割,默认为"train"。
  2. 函数逻辑
    • 首先,获取模板并修复tokenizer(get_template_and_fix_tokenizer函数未在代码中给出)。
    • 检查是否支持train_on_prompt功能,如果不支持则抛出错误。
    • 尝试从磁盘加载数据集。如果设置了cache_path且该路径下数据集存在,则直接从磁盘加载,忽略其他数据参数。如果需要流式传输,则将数据集转换为可迭代的。
    • 如果数据集不存在或需要重新生成,则使用get_dataset_list函数获取所有数据集属性,并使用load_single_dataset函数为每个属性加载数据集。然后,使用merge_dataset函数合并所有数据集。
    • 对数据集进行预处理。预处理函数preprocess_func和打印函数print_functionget_preprocess_and_print_func函数返回。预处理包括将数据集的每一行映射到tokenizer。如果不在流式传输模式下,还会使用多进程进行预处理。
    • 如果设置了cache_path,并且尚未创建,则将数据集保存到磁盘。
    • 如果需要日志记录,则打印数据集的一个样本。
  3. 函数返回
    返回一个数据集对象,可以是普通的Dataset或可迭代的IterableDataset
    这个函数的主要目的是提供一个统一的接口来加载、合并和预处理数据集,同时支持缓存和流式传输,适用于不同的训练阶段。

第二层 阅读加载单个数据的代码

def load_single_dataset(dataset_attr: "DatasetAttr",model_args: "ModelArguments",data_args: "DataArguments",
):logger.info("Loading dataset {}...".format(dataset_attr))data_path, data_name, data_dir, data_files = None, None, None, Noneif dataset_attr.load_from in ["hf_hub", "ms_hub"]:data_path = dataset_attr.dataset_namedata_name = dataset_attr.subsetdata_dir = dataset_attr.folderelif dataset_attr.load_from == "script":data_path = os.path.join(data_args.dataset_dir, dataset_attr.dataset_name)data_name = dataset_attr.subsetdata_dir = dataset_attr.folderelif dataset_attr.load_from == "file":data_files = []local_path: str = os.path.join(data_args.dataset_dir, dataset_attr.dataset_name)if os.path.isdir(local_path):  # is directoryfor file_name in os.listdir(local_path):data_files.append(os.path.join(local_path, file_name))if data_path is None:data_path = FILEEXT2TYPE.get(file_name.split(".")[-1], None)elif data_path != FILEEXT2TYPE.get(file_name.split(".")[-1], None):raise ValueError("File types should be identical.")elif os.path.isfile(local_path):  # is filedata_files.append(local_path)data_path = FILEEXT2TYPE.get(local_path.split(".")[-1], None)else:raise ValueError("File not found.")if data_path is None:raise ValueError("File extension must be txt, csv, json or jsonl.")checksum(data_files, dataset_attr.file_sha1)else:raise NotImplementedErrorif dataset_attr.load_from == "ms_hub":try:from modelscope import MsDatasetfrom modelscope.utils.config_ds import MS_DATASETS_CACHEcache_dir = model_args.cache_dir or MS_DATASETS_CACHEdataset = MsDataset.load(dataset_name=data_path,subset_name=data_name,data_dir=data_dir,data_files=data_files,split=data_args.split,cache_dir=cache_dir,token=model_args.ms_hub_token,use_streaming=(data_args.streaming and (dataset_attr.load_from != "file")),).to_hf_dataset()except ImportError:raise ImportError("Please install modelscope via `pip install modelscope -U`")else:if "trust_remote_code" in inspect.signature(load_dataset).parameters:  # for datasets==2.16.0kwargs = {"trust_remote_code": True}else:kwargs = {}dataset = load_dataset(path=data_path,name=data_name,data_dir=data_dir,data_files=data_files,split=data_args.split,cache_dir=model_args.cache_dir,token=model_args.hf_hub_token,streaming=(data_args.streaming and (dataset_attr.load_from != "file")),**kwargs,)if data_args.streaming and (dataset_attr.load_from == "file"):  # faster than specifying streaming=Truedataset = dataset.to_iterable_dataset()  # TODO: add num shards parameterif data_args.max_samples is not None:  # truncate datasetnum_samples = min(data_args.max_samples, len(dataset))dataset = dataset.select(range(num_samples))return align_dataset(dataset, dataset_attr, data_args)

是一个独立文件读取的Python函数,用于根据提供的参数加载数据集。下面是该函数的中文解释:

  1. 日志记录:记录开始加载数据集的信息。
  2. 确定数据路径和名称:根据数据集的来源(“hf_hub”、“ms_hub”、“script”或“file”),计算数据集文件的正确路径。
  3. 校验和验证:如果数据集是从本地文件加载的,函数会根据dataset_attr中提供的预期值校验文件的有效SHA1校验和。
  4. 数据集加载:使用datasets库中的load_dataset函数加载数据集。加载数据集的参数根据来源和提供的额外参数确定。
  5. 流调整:如果设置了data_args.streaming且数据集是从文件加载的,则将数据集转换为可迭代的,更适合流式传输的数据集。
  6. 数据集截断:如果设置了data_args.max_samples,则截断数据集到指定的样本数。
  7. 对齐数据集:调用align_dataset函数将数据集与dataset_attrdata_args对齐。这个函数在提供的代码中没有定义,所以它的确切行为是未知的。
  8. 返回数据集:返回已加载和处理的数据集。
    请注意,该函数假设存在某些变量和函数,如loggerosinspectload_dataset,这些都是Python代码中的典型内容。此外,align_dataset在提供的代码中被引用,但没有定义,这表明可能还有其他代码定义了这个函数及其行为。

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

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

相关文章

Python自动化测试之Python简介及环境安装配置

经过持续的"内卷",编程变成测试工程师不可或缺的一项能力,掌握了一门编程语言,使你在面试过程中更有竞争力,是升值加薪的利器。 一、Python发展史 Python 是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数…

springboot同时接收json数据和 MultipartFile

首先测试接口发送方式。。。。。注意发送结构&#xff01; 后端接收RequestPart SaCheckPermission("system:records:add")Log(title "【用药纪录】", businessType BusinessType.INSERT)RepeatSubmit()PostMapping()public R<Void> add( RequestP…

大模型GPU监控之nvitop

背景 在进行大模型训练的时候&#xff0c;往往需要用到多张GPU卡&#xff0c;如何实现多卡的管理和监控&#xff0c;这是一个比较好的话题&#xff0c;下面介绍一个小工具。 安装nvitop pip install nvitop nvitop -m full 监控界面

抖音视频提取gif怎么做?分分钟帮你生成gif

通过将视频转换成gif动图的方式能够方便的在各种平台上分享、传播。相较于视频文件&#xff0c;gif动图的体积更小&#xff0c;传播起来更方便&#xff0c;能够吸引大众的注意力。下面&#xff0c;就来给大家分享一个gif图片制作&#xff08;https://www.gif.cn/&#xff09;的…

如何隐藏前端项目编译后的.map文件

需求来源&#xff1a; 1、不想让用户在客户端看到源码。 2、应对安全扫描&#xff0c;给客户交付的项目.map被扫描出风险&#xff0c;确保交付。 在Web开发中&#xff0c;通常会使用Source Map文件&#xff08;.map文件&#xff09;来将压缩后的JavaScript或CSS代码映射回原始…

分布式架构下 网络通信的底层实现原理(三)

阻塞通信 Java中经常会使用Scoket套接字来实现网通信&#xff0c; 举个栗子&#xff1a; import java.io.*; import java.net.ServerSocket; import java.net.Socket;public class testSocket {public static void main(String[] args) throws IOException {final int DEFAU…

web自动化测试框架都是有哪些?

Web自动化测试框架主要有以下几种&#xff1a; 1.Selenium&#xff1a;轻量级的Web自动化测试框架&#xff0c;支持多种Web浏览器和语言的集成。Selenium提供了一个IDE来录制和运行自动化测试脚本&#xff0c;还提供了WebDriver&#xff0c;可以通过编程语言编写自动化测试脚本…

【鸿蒙 HarmonyOS 4.0】Web组件

一、介绍 页面加载是Web组件的基本功能。根据页面加载数据来源可以分为三种常用场景&#xff0c;包括加载网络页面、加载本地页面、加载HTML格式的富文本数据。 二、加载网页 2.1、加载在线网页 Web组件的使用非常简单&#xff0c;只需要在Page目录下的ArkTS文件中创建一个…

5款好用的AI办公软件,一键轻松制作PPT、视频,提升工作效率!

众所周知&#xff0c;AI 人工智能技术已渗透到生活的方方面面&#xff0c;无论是很多人早已用上的智能音箱、语音助手&#xff0c;还是新近诞生的各种 AI 软件工具&#xff0c;背后都离不开 AI 人工智能技术的加持。 对于各类新生的 AI 软件工具&#xff0c;人们很容易「选边站…

Go的安装

一. 下载地址 Go官方下载地址&#xff1a;https://golang.org/dl/ Go中文网&#xff1a;https://go.p2hp.com/go.dev/dl/ 根据不同系统下载不同的包。 二. 配置GOPATH GOPATH是一个环境变量&#xff0c;用来表明你写的go项目的存放路径。 GOPATH路径最好只设置一个&#xff0…

部署 Web 项目到Linux上

目录 环境配置 构建项目 ​编辑 数据准备 运行并查看日志 杀掉进程 把程序安装到生产环境上, 这个过程称为 "部署"&#xff0c;也叫 "上线"。一旦程序部署成功, 那么这个程序就能被外网中千千万万的普通用户访问到。 环境配置 程序配置文件修改 实…

讲解Python 3的10种基本语法

在学习Python编程语言时&#xff0c;掌握基本语法是至关重要的。本文将通过10个范例详细讲解Python 3的基本语法&#xff0c;帮助读者更好地理解和掌握这门流行的编程语言。 1. 变量和数据类型 Python是一种动态类型语言&#xff0c;不需要事先声明变量的数据类型。例如&…

网络套接字1

网络套接字1 &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容讲解了udp的Linux环境下的使用&#xff0c…

Rust 语言中符号 :: 的使用场景

在 Rust 语言中&#xff0c;:: 符号主要用于以下几个场合&#xff1a; 指定关联函数或关联类型&#xff1a; 关联函数&#xff08;也称为静态方法&#xff09;是与类型关联而非实例关联的函数。它们使用 :: 符号来调用。例如&#xff1a; let value String::from("Hello,…

有线网络下windows电脑被投屏方案实践

最近在看使用笔记本屏幕作PC副屏的解决方案 无线网络Miracast 如果使用Win10/11自带的Miracast方案&#xff08;即windows系统中的&#xff1a;设置-系统-投影到此电脑&#xff09;&#xff0c;原则上需要通过Wi-Fi网络&#xff08;这是因为Miracast就是Wi-Fi联盟组织提出的&a…

react-native 搭建环境及运行项目

目前创建的是0.73版本的&#xff0c;Node 的版本应大于等于 18&#xff0c;需要 Java Development Kit [JDK] 17版本的&#xff08;必须是17版本&#xff09;。安装完后你可以在命令行中输入 javac -version&#xff08;请注意是 javac&#xff0c;不是 java&#xff09;来查看…

JDK8 新特性和stream流的使用(一)

JDK 8 的新特性包括&#xff1a; Lambda表达式。允许编写更加简洁和灵活的代码&#xff0c;它允许将代码作为参数传递给其他方法或作为函数返回。Lambda表达式使用“->”操作符&#xff0c;并且可以包含一个或多个参数&#xff0c;这些参数的类型由编译器推断得出。123 …

一键优化B2B2C电商系统,开启无限商机

在当今竞争激烈的电商行业&#xff0c;B2B2C模式已成为众多企业选择的经营模式之一。通过一键优化B2B2C电商系统&#xff0c;企业能够开启无限商机&#xff0c;实现更大的发展空间。 首先&#xff0c;优化B2B2C电商系统可以帮助企业提升用户体验&#xff0c;吸引更多客户。通过…

仿生蝴蝶制作——蝴蝶翅膀制作

前言 上一次已经设计好了的翅膀图纸 接下来就是根据这个图纸来制作翅膀。 过程中其实可以不用尺子准确测量&#xff0c;直接用碳纤维棒比着剪下来就好了&#xff0c;然后把减下来的一截比着剪下另一只翅膀需要的材料。因为左右两只翅膀差别不能太大&#xff0c;所以这样是最好…

异步编程和asyncio

介绍异步编程的重要性和在Python中的应用&#xff0c;特别是在I/O密集型任务和网络编程场景下。 目录 理解异步编程 异步编程基本概念 任务与Future 异步编程的工作原理 事件循环 协程&#xff08;Coroutines&#xff09; 异步与同步代码的结合 深入asyncio模块 事件循…