☰
Chinese-LLaMA-Alpaca 训练数据全解析:alpaca_data_zh_51k 指令数据集与 pt_sample_data 预训练样例的格式、加载流程与训练用法
2026/10/1 2:14:16 网站建设 项目流程
  • 大模型
  • 人工智能
  • 预训练
  • 微调
  • LoRA
  • 本地部署
  • NLP
  • 模型评测

【免费下载链接】Chinese-LLaMA-Alpaca

中文LLaMA&Alpaca大语言模型+本地CPU/GPU训练部署 (Chinese LLaMA & Alpaca LLMs)

项目地址:https://gitcode.com/gh_mirrors/ch/Chinese-LLaMA-Alpaca
点击查看免费下载

本文以 Chinese-LLaMA-Alpaca 仓库data/目录下的两个核心数据文件为对象,深入讲解中文指令精调数据(alpaca_data_zh_51k.json)与 CLM 预训练样例数据(pt_sample_data.txt)的文件格式、字段语义,以及它们如何被 build_dataset.py、run_clm_pt_with_peft.py、run_clm_sft_with_peft.py 等训练脚本真实消费,并结合 run_pt.sh 与 run_sft.sh 给出可直接复用的训练参数配置。读完本文,你将掌握这两类数据文件的精确结构,理解从原始数据到模型输入(input_ids / labels)的完整转换链路,并能自行准备数据启动预训练与指令精调。

数据在中文 LLaMA / Alpaca 训练流程中的位置

根据项目 README.md 的说明,整个模型的训练流程由三部分组成:词表扩充 → 预训练(CLM)→ 指令精调(SFT)。data/目录中的两个文件分别对应后两个阶段:

数据文件训练阶段任务类型数据形态
data/alpaca_data_zh_51k.json指令精调(SFT)有监督的指令理解JSON 数组,每条含 instruction / input / output 三字段
data/pt_sample_data.txt预训练(PT)无监督因果语言建模(CLM)纯文本文件,逐行存放语料

需要说明的是:项目最终发布的中文 LLaMA / Alpaca 模型使用了更大规模的语料(README 中标注基座模型通用语料 20G/120G、指令精调数据 2M~4.3M 条)。data/目录提供的是公开可复现的指令数据集(51k 条)与预训练数据的格式样例,便于研究者在本地小规模复现训练流程、验证脚本可用性,再替换为自有数据。

alpaca_data_zh_51k.json:51k 条中文指令精调数据

文件规模与来源

data/alpaca_data_zh_51k.json是一份中文 Alpaca 指令数据集,包含51k 条从 ChatGPT(gpt-3.5-turbo)爬取的指令数据(来源说明见 data/README.md)。文件为 JSON 数组格式(实测约 18MB、25 万余行),每条记录是一个对象,包含三个字段:

  • instruction:指令本身,描述需要模型完成的任务;
  • input:可选的上下文输入,无输入时为空字符串"";
  • output:对应的标准回答,作为监督标签。

真实数据样例(节选自文件本体)

从文件前几条记录可以直接观察字段语义。无输入型指令(input为空,模型仅依据指令作答):

{ "instruction": "我们如何在日常生活中减少用水?", "input": "", "output": "1. 使用节水装置,如节水淋浴喷头和水龙头。 \n2. 使用水箱或水桶收集家庭废水,例如洗碗和洗浴。 \n3. 在社区中提高节水意识。 \n4. 检查水管和灌溉系统的漏水情况,并及时修复它们。 \n..." }

带输入型指令(input提供待处理的素材,如待改写/编辑的文本):

{ "instruction": "编辑文章,使其更吸引读者。", "input": "自主机器人是计算机控制的机器,被编程执行特定任务而不需要任何人类输入。自主机器人在各个行业中被越来越广泛地应用,从制造业到医疗保健再到安全。", "output": "自主机器人是计算机控制的机器,被编程执行特定任务而不需要任何人类输入,从而实现了新的效率、精确度和可靠性水平。..." }

从文件内多条样例可看到,数据覆盖日常生活建议、文本编辑改写、政策策略、科普解释(如"解释神经网络如何学习")、代码调试、比喻句识别、函数求值等多种指令类型,任务形态多样,适合训练模型的通用指令理解能力。

指令精调如何消费该 JSON:build_dataset.py 源码剖析

指令精调入口脚本 run_clm_sft_with_peft.py 扫描--dataset_dir下所有*.json文件并调用 build_dataset.py 中的build_instruction_dataset()(见 run_clm_sft_with_peft.py#L310-L336)。核心转换逻辑如下:

模板拼接

build_dataset.py#L15-L19 定义了与 Stanford Alpaca 一致的英文提示模板:

Below is an instruction that describes a task. Write a response that appropriately completes the request. ### Instruction: {instruction} ### Response:

处理时(build_dataset.py#L31-L35):

  • 若input非空,则先拼接到指令后:instruction + '\n' + input;
  • 将拼接后的指令填入模板的{instruction}位置作为source;
  • target = output + tokenizer.eos_token,即在回答末尾追加 EOS 结束符。

损失掩码(只对回答计算损失)

tokenize 后(build_dataset.py#L43-L50),对每条样本生成:

input_ids = torch.LongTensor(s + t)[:max_seq_length] # 指令部分 + 回答部分,截断到 max_seq_length labels = torch.LongTensor([IGNORE_INDEX] * len(s) + t)[:max_seq_length]

其中IGNORE_INDEX = -100(build_dataset.py#L11),即指令部分的标签全部置为 -100(不参与损失计算),只对回答部分计算交叉熵损失——这是指令精调区别于普通语言建模的关键设计。

缓存与并发

  • 首次处理时用datasets.load_dataset("json", ...)读取 JSON,随后.map(tokenization_func, batched=True, num_proc=preprocessing_num_workers)批量 tokenize,并remove_columns=["instruction","input","output"]删除原始文本列(build_dataset.py#L71-L82);
  • 处理结果save_to_disk()落盘,下次训练直接load_from_disk()复用缓存,避免重复 tokenize(build_dataset.py#L63-L70)。

DataCollator 动态填充

训练时使用DataCollatorForSupervisedDataset(build_dataset.py#L88-L104):

  • input_ids按 batch 内最长序列用tokenizer.pad_token_id右填充;
  • labels用-100填充,保证填充位不参与损失;
  • attention_mask = input_ids.ne(pad_token_id)。

训练启动配置

run_sft.sh 给出了指令精调的完整参数,其中与数据强相关的包括:

参数值说明
lr1e-4LoRA 微调学习率
lora_rank/lora_alpha8/32LoRA 秩与缩放系数
lora_trainableq_proj,v_proj,k_proj,o_proj,gate_proj,down_proj,up_proj参与 LoRA 的投影层
modules_to_saveembed_tokens,lm_head词表扩充后需完整微调/保存的模块
dataset_dir指向含*.json的数据目录本仓库可用data目录
validation_split_percentage0.001训练集中划出 0.1% 作为验证集
max_seq_length512指令+回答拼接后的最大长度
gradient_accumulation_steps8梯度累积步数
warmup_ratio/weight_decay0.03/0学习率预热比例与权重衰减

启动方式(单机单卡示例):

torchrun --nnodes 1 --nproc_per_node 1 run_clm_sft_with_peft.py \ --deepspeed ds_zero2_no_offload.json \ --model_name_or_path ${pretrained_model} \ --tokenizer_name_or_path ${chinese_tokenizer_path} \ --dataset_dir path/to/sft/data/dir \ --validation_split_percentage 0.001 \ --per_device_train_batch_size 1 \ --per_device_eval_batch_size 1 \ --max_seq_length 512 \ --learning_rate 1e-4 \ --num_train_epochs 1 \ --do_train --do_eval \ --fp16 --gradient_checkpointing

将--dataset_dir指向data/目录,脚本会自动加载其中的alpaca_data_zh_51k.json进行精调训练。

pt_sample_data.txt:CLM 预训练样例数据

data/pt_sample_data.txt是 CLM(因果语言建模)任务的预训练样例数据(约 15MB、12 万余行),格式为纯文本文件,每行一个语料片段。预训练阶段不需要指令模板和标签,模型的任务是依据上文预测下一个 token,因此数据只需提供连续的文本流。

从文件内容可以看到一个有意思的细节:样例文本的行内容与alpaca_data_zh_51k.json中部分样本的instruction + output拼接一致(如首行"我们如何在日常生活中减少用水?1. 使用节水装置……"),即该项目用它来演示"把结构化指令数据展开成纯文本"后的预训练数据形态,方便研究者理解两类数据的差异与转换关系。真实的大规模预训练语料通常为维基百科、新闻、书籍等无标注文本(README 中标注的通用语料即为此类来源)。

预训练如何消费该 TXT:run_clm_pt_with_peft.py 源码剖析

预训练入口 run_clm_pt_with_peft.py 扫描--dataset_dir下所有*.txt文件(run_clm_pt_with_peft.py#L459-L460),其处理链路与指令精调有本质区别:

1. 按文本加载

使用datasets.load_dataset("text", data_files=data_file)将 txt 的每一行作为一个样本加载(run_clm_pt_with_peft.py#L474)。

2. Tokenize 与分块(group_texts)

与指令精调逐条拼接不同,预训练采用"拼接全量文本后按 block_size 切块"的策略(transformers 官方 run_clm.py 的标准做法):

  • tokenize_function对每条text分词(run_clm_pt_with_peft.py#L414-L416);
  • group_texts将全部 token 首尾相接(丢弃不足一行的尾部残留),再切成固定长度block_size的连续块,并复制input_ids作为labels(run_clm_pt_with_peft.py#L442-L456),从而最大化利用上下文建模长程依赖;
  • 每块同样先save_to_disk()缓存,之后直接复用(run_clm_pt_with_peft.py#L469-L496)。

3. 词表与模型匹配校验

脚本内置了模型词表与中文 tokenizer 的合法性校验(run_clm_pt_with_peft.py#L547-L554):仅允许(32000, 32000)、(32000, 49953)、(49953, 49953)、(49954, 49954)等组合,随后model.resize_token_embeddings(len(tokenizer))适配扩充后的中文词表。

预训练启动配置

run_pt.sh 给出了预训练参数,与 SFT 的核心差异体现在学习率与分块长度:

参数预训练run_pt.sh指令精调run_sft.sh
学习率lr2e-41e-4
序列/分块长度block_size=512max_seq_length=512
warmup_ratio0.050.03
weight_decay0.010
数据文件扩展名*.txt*.json
验证集划分validation_split_percentage=0.001同左 +validation_file可选

其余公共参数(lora_rank=8、lora_alpha=32、lora_trainable七个投影层、modules_to_save=embed_tokens,lm_head、gradient_accumulation_steps=8、fp16、gradient_checkpointing、deepspeed ds_zero2_no_offload.json)两阶段保持一致。启动方式:

torchrun --nnodes 1 --nproc_per_node 1 run_clm_pt_with_peft.py \ --deepspeed ds_zero2_no_offload.json \ --model_name_or_path path/to/hf/llama/dir \ --tokenizer_name_or_path path/to/chinese/llama/tokenizer/dir \ --dataset_dir path/to/pt/data/dir \ --validation_split_percentage 0.001 \ --block_size 512 \ --learning_rate 2e-4 \ --num_train_epochs 1 \ --do_train --fp16 --gradient_checkpointing

将--dataset_dir指向data/目录,脚本会自动加载pt_sample_data.txt完成一次端到端的预训练流程验证。

数据集使用注意事项与扩展建议

结合 data/README.md 与训练脚本,实际使用这两类数据时有几点需要留意:

  1. 数据规模定位:alpaca_data_zh_51k.json(51k 条)适合脚本验证与中小规模精调实验;发布模型使用的指令数据为 2M~4.3M 条量级(见 README.md 模型表格),追求更高效果时应扩充数据。同理,pt_sample_data.txt仅为格式样例,正式预训练需替换为大规模通用语料。
  2. 目录约定:SFT 脚本只扫描dataset_dir下*.json文件,预训练脚本只扫描*.txt文件,请按扩展名分目录存放,避免混用导致加载失败。
  3. 缓存机制:两个脚本都会在首次处理后把 tokenize 结果缓存到磁盘(data_cache_dir或数据文件同目录),修改数据后建议清理缓存目录再重新训练。
  4. 词表一致性:精调脚本要求中文 Alpaca tokenizer 词表为 49954(含 pad token),预训练脚本则校验 32000/49953/49954 的合法组合,切勿混用 LLaMA 与 Alpaca 词表(README.md 亦明确提示)。
  5. 验证集策略:validation_split_percentage=0.001会在训练集中随机划出 0.1% 用于验证;SFT 还可通过--validation_file指定独立验证 JSON 文件。

总结

data/目录的两个文件分别代表了中文 LLaMA / Alpaca 训练流水线中"预训练"与"指令精调"两类数据范式:alpaca_data_zh_51k.json以instruction/input/output三字段承载有监督指令样本,经 build_dataset.py 的模板拼接、-100 掩码与动态填充后喂入 SFT;pt_sample_data.txt以纯文本承载无监督语料,经 tokenize 与group_texts分块后喂入 CLM 预训练。理解这两条数据链路的差异(掩码策略、分块方式、字段结构),是复现训练脚本、迁移到自有数据的关键。相关训练配置与脚本均可直接在本仓库中查看与运行:build_dataset.py、run_clm_pt_with_peft.py、run_clm_sft_with_peft.py、run_pt.sh、run_sft.sh。

  • 大模型
  • 人工智能
  • 预训练
  • 微调
  • LoRA
  • 本地部署
  • NLP
  • 模型评测

【免费下载链接】Chinese-LLaMA-Alpaca

中文LLaMA&Alpaca大语言模型+本地CPU/GPU训练部署 (Chinese LLaMA & Alpaca LLMs)

项目地址:https://gitcode.com/gh_mirrors/ch/Chinese-LLaMA-Alpaca
点击查看免费下载

相关推荐

上一篇:rime-cloverpinyin终极配置指南:打造高效智能拼音输入体验
下一篇:Windows安全组件重构技术深度解析:模块化架构设计与实现原理

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询