Chinese_LLaMA2

目前有一种很多人认同的观点:预训练学知识,指令微调学格式,强化学习对齐人类偏好,LIMA等论文算是这一观点的证据。(LIMA: Less Is More for Alignment这篇文章是Meta的一篇工作,作者提出了一个假设,即”大模型绝大部分知识已经在预训练阶段学习到了,因此我们只需要很少一部分精选的instructions去tuning模型,就能使得模型产生高质量的内容“,如标题所说less is more。在实验部分,作者在LLaMA-65B模型上仅仅使用1000个精心挑选的Instructions进行tuning,甚至也不用进行强化学习RLHF训练,就能达到GPT-4的效果。但是这一切的前提是预训练的大模型的参数量要足够大,预训练的数据量要足够多,像The False Promise of Imitating Proprietary LLMs这篇工作中指出的,13B的llama+100k的instruction tuning是不够的。)

为了更好地学习大语言模型,本人参考chinese-llama-alpaca-2项目,基于llama-2-7B模型进行了词表扩充、增量预训练、SFT、RLAIF等试验,并尝试了llvm、TGI、llama.cpp等多种推理部署手段,记录于本篇博客之中。

扩充中文词表

LLaMA2词表中的中文token比较少(只有几百个)。这将导致了两个问题:

  • LLaMA2 原生tokenizer词表中仅包含少量中文字符,在对中文字进行tokenzation时,一个中文汉字往往被切分成多个token(2-3个Token才能组合成一个汉字),显著降低编解码的效率。
  • 预训练中没有出现过或者出现得很少的语言学习得不充分。

为了解决这些问题,我们可能就需要进行中文词表扩展。比如:在中文语料库上训练一个中文tokenizer模型,然后将中文 tokenizer 与 LLaMA2 原生的 tokenizer 进行合并,通过组合它们的词汇表,最终获得一个合并后的 tokenizer 模型。

因此这一节主要记录如何使用 SentencePiece 基于中文语料训练一个中文分词模型,以及如何将两个tokenizer合并。

数据准备及清洗

常用的文本预训练数据集有如下几种:

数据集 规模
BooksCorpus 2.2 GB + 37 GB
Wikipedia 21.23 GB
CommonCrawl > PB
ROOT 1.6 TB
The Pile 825GB
悟道 3 TB
CLUE 100 GB
MNBVC 2.18 TB

常用的代码预训练数据集有如下几种:

数据集 规模
CodeSearchNet 17 GB
CodeNet 8 GB
THEPILE 825 GB
thestack 3100 GB
BigQuery 340 GB
BIGPYTHON 217 GB
CodeParrot 180 GB
GCPY

构造好txt版本的预训练数据集之后,需要对数据进行简单的清洗,去除文件中的所有空行及特殊字符,保证每一行都是一个语义完整的段落。接下来就是参考Chinese-LLaMA-Alpaca项目将LLaMA原本的tokenizer和我们训练好的中文tokenizer进行合并。

中文增量预训练(基于lora)

chat/instructions SFT(基于lora)

常用的中文指令微调数据集有如下几种:

数据集 规模
alpaca 53.8 MB
BELLE 5.5 GB
CBLUE 870 MB
COIG 338 MB
firefly 1.2 GB
MOSS 2.7 MB
OL-CC 9.8 MB
pCLUE 1.2 GB

instructions RLAIF