训练中文LLaMA大规模语言模型

训练中文LLaMA大规模语言模型

最近,FacebookResearch 开源了他们最新的大规模语言模型 LLaMA,包含从 7B 到 65B 的参数范围,训练使用多达 14,000 亿 tokens 语料。其中,LLaMA-13B 在大部分基准测评上超过了 GPT3(175B),与目前最强的语言模型 Chinchilla-70B 和 PaLM-540B 相比,LLaMA-65B 也具有竞争力。因此,LLaMA 可能是目前公开模型权重中效果最好的语言模型。

论文: arxiv.org/abs/2302.1397

代码: github.com/facebookrese

在论文中,作者针对常识推理、问答、数学推理、代码生成、语言理解等能力对 LLaMA 进行了评测。结果显示,LLaMA 以相对少量的参数获得了媲美超大模型的效果,这对 NLP 社区的研究者们更加友好,因为它可以在单个 GPU 上运行。开源代码提供 LLaMA 的文本生成示例,可以直接用于一些 Zero/Few-Shot Learning 任务。也有许多用户关心如何使用自己的数据微调或增量训练LLaMA模型,然而Facebook目前还没有提供对应的训练代码。在本文中,我们介绍如何基于 TencentPretrain 预训练框架训练 LLaMA 模型。

TencentPretrain 是 UER-py 预训练框架的多模态版本,支持 BERT、GPT、T5、ViT、Dall-E、Speech2Text 等模型,支持文本、图像和语音模态预训练及下游任务。TencentPretrain 基于模块化设计,用户可以通过模块组合的方式构成各种模型,也可以通过复用已有的模块进行少量修改来实现新的模型。例如,LLaMA 的模型架构基于 Transformer 有三项改动:

  1. 前置 normalization [GPT3]: 在每个 transformer 层输入之前进行标准化,以提高训练稳定性。标准化层使用RMSNorm。
  2. SwiGLU 激活函数[PaLM]:在 Feedforward 层使用 Gated Linear Units [T5] 以及 SwiGLU 激活函数。
  3. 旋转位置编码 [GPTNeo]:移除了 Embedding 层的绝对位置编码,并在每个 transformer 层增加旋转位置编码(RoPE)。

得益于模块化特性,我们在 TencentPretrain 中基于 GPT2 模型的已有模块,仅添加约 100 行代码就能实现以上三个改动从而训练 LLaMA 模型。具体的使用步骤为:

  1. 克隆 TencentPretrain 项目,并安装依赖:PyTorch、 DeepSpeed SentencePiece
git clone https://github.com/Tencent/TencentPretrain.git

2. 下载 LLaMA 模型权重(7B),可以向 FacebookResearch 申请模型,或者从 Huggingface 社区获取 ;将模型权重转换为 TencentPretrain 格式

cd TencentPretrain
python3 scripts/convert_llama_to_tencentpretrain.py --input_model_path $LLaMA_7B_FOLDER/consolidated.00.pth --output_model_path models/llama-7b.bin --layers_num 32

3. 调整配置文件

tencentpretrain/utils/constants.py 文件中 L4: special_tokens_map.json 修改为 llama_special_tokens_map.json

4. 语料预处理:使用项目自带的语料作为演示,也可以使用相同格式的语料进行替换

预训练语料下载

python3 preprocess.py --corpus_path corpora/book_review.txt --spm_model_path $LLaMA_7B_FOLDER/tokenizer.model \
                      --dataset_path dataset.pt --processes_num 8 --data_processor lm

5. 启动训练,以8卡为例

deepspeed pretrain.py --deepspeed --deepspeed_config models/deepspeed_config.json \
                      --pretrained_model_path models/llama-7b.bin \
                      --dataset_path dataset.pt --spm_model_path $LLaMA_7B_FOLDER/tokenizer.model \