Skip to content

训练细节

yaoxin edited this page Jul 5, 2023 · 18 revisions

整个训练流程包括词表扩充、预训练和指令精调三部分,其中词表扩充的代码参见merge_tokenizers.py;预训练和指令精调代码参考了🤗transformers中的run_clm.pyStanford Alpaca项目中数据集处理的相关部分。

准备工作:词表扩充

由于原版LLaMA对中文的支持非常有限,本项目在原版LLaMA的基础上进一步扩充了中文词表。

  • 在通用中文语料上训练了基于sentencepiece的20K中文词表并与原版LLaMA模型的32K词表进行合并
  • 排除重复的token后,得到的最终中文LLaMA词表大小为49953
  • 需要注意的是,在fine-tune阶段Alpaca比LLaMA多一个pad token,所以中文Alpaca的词表大小为49954

更多关于中文词表扩充的动机,可参考FAQ。如果欲了解扩充词表的具体方法,或者使用自己的词表对LLaMA tokenizer进行扩充,我们提供了代码merge_tokenizers.py供参考。该脚本运行方式如下:

python merge_tokenizers.py \
  --llama_tokenizer_dir llama_tokenizer_dir \
  --chinese_sp_model_file chinese_sp_model_file

其中

  • llama_tokenizer_dir:指向存放原版LLaMA tokenizer的目录
  • chinese_sp_model_file:指向用sentencepiece训练的中文词表文件

我们所使用的在中文通用语料上训练的20K中文词表也一并放出,可以在scripts/merge_tokenizer/chinese_sp.model下载。

预训练

指令精调

  • 指令精调阶段的任务形式基本与Stanford Alpaca相同。训练方案同样采用了LoRA进行高效精调,并进一步增加了可训练参数数量。

  • 在prompt设计上,精调以及预测时采用的都是原版Stanford Alpaca不带input的模版。对于包含input字段的数据,采用f"{instruction}+\n+{input}"的形式进行拼接。

  • 具体的指令精调代码可以参考scripts/training/run_clm_sft_with_peft.py,使用方式见指令精调脚本

训练数据

指令精调阶段使用了以下数据,其中7B模型约2M数据、13B模型约3M数据。基本构成如下:

数据 量级 来源 说明
中英翻译数据 500K 外部链接 在原数据集的基础上进行了采样+规则筛选
pCLUE数据 300K 外部链接 在原数据集的基础上进行了采样+规则筛选
Alpaca数据(英) 50K 外部链接 斯坦福原版Alpaca训练数据
Alpaca数据(中) 50K 本地链接 本项目使用ChatGPT接口将英文版翻译为中文(筛掉一部分)
Self-instruction数据 1~2M (暂无) 本项目使用ChatGPT接口进行爬取,具体见以下脚本描述

本项目提供了一个动态生成不同领域和指令类型的prompt爬取脚本script/crawl_prompt.py

python script/crawl_prompt.py output-file
  • 思路与Stanford Alpaca中的做法基本一致,一次批量生成20组数据(可自行修改模板),以降低爬取成本
  • 生成的文件包含通过gpt-3.5-turbo爬取的数据(你必须拥有OpenAI API key才可以使用)
  • 虽然指令模板中要求输出JSON,但系统并不总是会返回合法的JSON,需要自行对返回数据进行清洗
  • 由于爬取时间比较长,建议后台运行该脚本。多线程运行时注意OpenAI API的调用限制上限

实验配置

以下是训练基础版7B模型的训练配置。更多详情请参考我们的技术报告

实验设置 预训练-第一阶段 预训练-第二阶段 指令精调
Batch Size 1024 1024 512
Initial Learning Rate 2e-4 1e-4 1e-4
Training Steps 3K 6K 6K-10K
Max Length 512 512 512
Trainable Parameters (%) 2.97% 6.06% 6.22%
Training Device 8 × A40(48G) 16 × A40(48G) 16 × A40(48G)
Distributed Training DeepSpeed Zero-2 DeepSpeed Zero-2 DeepSpeed Zero-2
Clone this wiki locally