- 大模型
- 人工智能
- 预训练
- 微调
- LoRA
- 本地部署
- NLP
- 模型评测
【免费下载链接】Chinese-LLaMA-Alpaca
中文LLaMA&Alpaca大语言模型+本地CPU/GPU训练部署 (Chinese LLaMA & Alpaca LLMs)
本文以 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 给出了指令精调的完整参数,其中与数据强相关的包括:
| 参数 | 值 | 说明 |
|---|---|---|
lr | 1e-4 | LoRA 微调学习率 |
lora_rank/lora_alpha | 8/32 | LoRA 秩与缩放系数 |
lora_trainable | q_proj,v_proj,k_proj,o_proj,gate_proj,down_proj,up_proj | 参与 LoRA 的投影层 |
modules_to_save | embed_tokens,lm_head | 词表扩充后需完整微调/保存的模块 |
dataset_dir | 指向含*.json的数据目录 | 本仓库可用data目录 |
validation_split_percentage | 0.001 | 训练集中划出 0.1% 作为验证集 |
max_seq_length | 512 | 指令+回答拼接后的最大长度 |
gradient_accumulation_steps | 8 | 梯度累积步数 |
warmup_ratio/weight_decay | 0.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 |
|---|---|---|
学习率lr | 2e-4 | 1e-4 |
| 序列/分块长度 | block_size=512 | max_seq_length=512 |
warmup_ratio | 0.05 | 0.03 |
weight_decay | 0.01 | 0 |
| 数据文件扩展名 | *.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 与训练脚本,实际使用这两类数据时有几点需要留意:
- 数据规模定位:
alpaca_data_zh_51k.json(51k 条)适合脚本验证与中小规模精调实验;发布模型使用的指令数据为 2M~4.3M 条量级(见 README.md 模型表格),追求更高效果时应扩充数据。同理,pt_sample_data.txt仅为格式样例,正式预训练需替换为大规模通用语料。 - 目录约定:SFT 脚本只扫描
dataset_dir下*.json文件,预训练脚本只扫描*.txt文件,请按扩展名分目录存放,避免混用导致加载失败。 - 缓存机制:两个脚本都会在首次处理后把 tokenize 结果缓存到磁盘(
data_cache_dir或数据文件同目录),修改数据后建议清理缓存目录再重新训练。 - 词表一致性:精调脚本要求中文 Alpaca tokenizer 词表为 49954(含 pad token),预训练脚本则校验 32000/49953/49954 的合法组合,切勿混用 LLaMA 与 Alpaca 词表(README.md 亦明确提示)。
- 验证集策略:
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)
相关推荐
LLaVA 训练数据完全指南:指令微调数据集、预训练数据集与 GPT-4 Prompt 体系解析
LLaVA 训练数据完全指南:指令微调数据集、预训练数据集与 GPT 4 Prompt 体系解析 导读 本文围绕 LLaVA 官方数据说明文档( docs/Da
人工智能大模型多模态微调预训练TimesFM 3.0是如何预训练的?timesfm-3.0-pytorch背后预训练数据与训练流程全面拆解
TimesFM 3.0是如何预训练的?timesfm 3.0 pytorch背后预训练数据与训练流程全面拆解 TimesFM 3.0(Time Series F
人工智能基础模型PaddleNLP 预训练数据处理实战:基于 OpenWebText2 制作 Llama 训练数据集
PaddleNLP 预训练数据处理实战:基于 OpenWebText2 制作 Llama 训练数据集 本文以 PaddleNLP 开源仓库中的 OpenWebT
人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考