11# 飞桨大语言模型工具链
2- 大模型全流程工具基于PaddlePaddle的4D分布式并行能力旨在提供高性能、灵活易用大模型工具,可以根据自己的需求轻易来定制化百亿和千亿大模型训练,同时支持高性能的压缩推理和服务化,最终使用大模型能力提升业务效果。
32
4- | Model | Pretrain | SFT | LoRA | PrefixTuning | Generation | Quantization |
3+ 飞桨大语言模型工具链基于飞桨4D分布式并行技术开发,旨在提供高性能、灵活易用大语言模型全流程开发能力,覆盖开发、预训练、精调、压缩、推理、部署的全流程。
4+
5+ | Model | Pretrain | SFT | LoRA | Prefix Tuning | Generation | Quantization |
56| --- | --- | --- | --- | --- | --- | --- |
67| [ LLaMA v1/v2] ( ./llama ) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
7- | [ ChatGLM-6B] ( ./chatglm ) | N/A | ✅ | ✅ | ✅ | ✅ | ✅ |
8- | [ ChatGLM2-6B] ( ./chatglm2 ) | N/A | ✅ | ✅ | ✅ | ✅ | ✅ |
9- | [ Bloom] ( ./bloom ) | N/A | ✅ | ✅ | ✅ | ✅ | ✅ |
10- | [ GPT-3] ( ./gpt-3 ) | ✅ | ✅ | ✅ | WIP | ✅ | WIP |
11- | [ OPT] ( ./opt ) | WIP | ✅ | ✅ | WIP| ✅ | WIP |
12- | [ GLM] ( ./glm ) | N/A | ✅ | ✅ | WIP| ✅ | WIP |
13- | [ Qwen] ( ./qwen ) | N/A | ✅ | ✅ | ✅ | ✅ | WIP |
8+ | [ ChatGLM-6B] ( ./chatglm ) | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
9+ | [ ChatGLM2-6B] ( ./chatglm2 ) | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
10+ | [ Bloom] ( ./bloom ) | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
11+ | [ GPT-3] ( ./gpt-3 ) | ✅ | ✅ | ✅ | 🚧 | ✅ | 🚧 |
12+ | [ OPT] ( ./opt ) | 🚧 | ✅ | ✅ | 🚧 | ✅ | 🚧 |
13+ | [ GLM] ( ./glm ) | ❌ | ✅ | ✅ | 🚧 | ✅ | 🚧 |
14+ | [ Qwen] ( ./qwen ) | ❌ | ✅ | ✅ | ✅ | ✅ | 🚧 |
15+
1416
17+ * ✅: Supported
18+ * 🚧: In Progress
19+ * ❌: Not Supported
1520
1621# LLM全流程工具介绍
17- 我们提供了模型预训练、精调(SFT、LoRA、PrefixTuning )、量化、动态图推理、服务化部署全流程脚本 ,开发者可以根据自己的需求定制化自己的大语言模型。
22+ 我们提供了模型预训练、精调(SFT、LoRA、Prefix Tuning )、量化、推理、部署全流程脚本 ,开发者可以根据自己的需求定制化自己的大语言模型。
1823
1924<div align =" center " >
2025 <img width="800" alt="llm" src="https://github.com/PaddlePaddle/PaddleNLP/assets/63761690/009bbb4e-baee-4c4a-a52e-94ac44c73c90">
2833
2934## 1. 环境准备
3035
31- - PaddlePaddle >= 2.5.1
32- - PaddleNLP >= 2.6.0
36+ - paddlepaddle-gpu >= 2.5.1
37+ - paddlenlp >= 2.6.1
3338- tiktoken (仅 Qwen 需要)
3439
3540## 2. 预训练
5459
5560
5661### 3.2 SFT
57- SFT(Supervised Fine-Tuning)依托飞桨提出的[ 4D混合分布式并行] ( https://ai.baidu.com/forum/topic/show/987996 ) 能力,支持使用Trainer API轻松切换数据并行(DP)、[ 张量并行(TP, Tensor Parallelism)] ( https://arxiv.org/abs/1909.08053 ) 、[ 流水线并行(PP, Pipeline Parallelism)] ( https://arxiv.org/abs/1811.06965 ) (目前仅支持Llama)等多种分布式训练策略。
5862
59- 4D 混合并行策略如何组合?如图所示,在单机内使用通信量较大,适合使用机器内的卡间通信的张量并行(张量并行又称模型并行,MP)和分组参数切片(Sharding)的2D组合策略;训练千亿规模模型时,叠加流水线并行策略使用多台机器共同分担;同时叠加数据并行来增加并发数量,提升训练速度。
63+ SFT(Supervised Fine-Tuning)依托飞桨提出的[ 4D混合分布式并行] ( https://ai.baidu.com/forum/topic/show/987996 ) 能力,支持使用Trainer API轻松切换数据并行(DP)、[ 张量并行(TP, Tensor Parallelism)] ( https://arxiv.org/abs/1909.08053 ) 、[ 流水线并行(PP, Pipeline Parallelism)] ( https://arxiv.org/abs/1811.06965 ) (目前仅支持Llama)等多种分布式训练策略。
64+
65+ 4D 混合并行策略的最佳配置实践如图下所示,在单机内使用通信量较大,适合使用机器内卡间通信的张量并行(张量并行又称模型并行,MP)和分组参数切片(Sharding)的2D组合策略;训练千亿规模模型时,叠加流水线并行策略使用多台机器共同分担;同时叠加数据并行来增加并发数量,提升训练速度。
6066<div align =" center " >
6167 <img src="https://ai.bdstatic.com/file/63F5EBB1E188457ABAFD311CFC1D8658" width=50% height=50%>
6268</div >
@@ -74,7 +80,7 @@ python -u -m paddle.distributed.launch --gpus "0,1,2,3" finetune_generation.py
7480
7581### 3.3 LoRA
7682
77- Transformer模型中包含许多Linear层需要进行密集的矩阵乘法计算,而这些通常具有全秩(full rank)。[ LoRA] ( https://arxiv.org/abs/2106.09685 ) 提出冻结预训练的权重矩阵, 通过引入两个低 rank 矩阵 $AB$(图中橙色的两个矩阵) 来近似权重的更新过程 $W_0+\Delta W=W_0+B A$ , 其中 $B \in \mathbb{R}^{d \times r}, A \in \mathbb{R}^{r \times k}$,实验表面将输入表达随机投影到较小的子空间模型仍然可以有效地学习下游任务还可以节约大量的计算显存需求 。
83+ Transformer模型中包含许多Linear层需要进行密集的矩阵乘法计算,而这些通常具有全秩(full rank)特性 。[ LoRA] ( https://arxiv.org/abs/2106.09685 ) 提出冻结预训练的权重矩阵, 通过引入两个低 rank 矩阵 $AB$(图中橙色的两个矩阵) 来近似权重的更新过程 $W_0+\Delta W=W_0+B A$ , 其中 $B \in \mathbb{R}^{d \times r}, A \in \mathbb{R}^{r \times k}$,实验表明将输入表达随机投影到较小的子空间模型仍然可以有效地学习下游任务,并大幅降低计算的显存需求 。
7884
7985
8086<div align =" center " >
@@ -97,13 +103,13 @@ python -u -m paddle.distributed.launch --gpus "0,1" finetune_generation.py ./
97103
98104### 3.4 Prefix Tuning
99105
100- [ Prefix Tuning] ( https://arxiv.org/abs/2101.00190 ) 受提示学习(Prompt learning)的影响,加入的一部分 prefix embedding 作为连续型提示进行训练。prefix embedding是由专门的 prefix encoder 网络生成的数个张量,会以 past_key_value的方式被插入到语言模型每一层的 hidden_state之前 。
106+ [ Prefix Tuning] ( https://arxiv.org/abs/2101.00190 ) 受提示学习(Prompt learning)的影响,加入的一部分 Prefix Embedding 作为连续型提示进行训练。Prefix Embedding是由专门的 Prefix Encoder 网络生成的数个张量,会以 ` past_key_value ` 的方式被插入到语言模型每一层的 hidden_state 之前 。
101107
102108<div align =" center " >
103109<img src=https://github.com/PaddlePaddle/PaddleNLP/assets/37530985/8baf6943-4540-4c02-8540-35f977acc077 width=40% height=40% />
104110</div >
105111
106- PaddleNLP Prefix Tuning API支持数据并行、张量并行等多种分布式训练策略 ,可以通过控制` tensor_parallel_degree ` 调整并行训练策略。
112+ PaddleNLP Prefix Tuning API支持数据并行(DP)、张量并行(TP)等多种分布式训练策略 ,可以通过控制` tensor_parallel_degree ` 调整并行训练策略。
107113```
108114# 单卡训练
109115python finetune_generation.py ./llama/pt_argument.json
@@ -113,7 +119,7 @@ python finetune_generation.py ./llama/pt_argument.json
113119python -u -m paddle.distributed.launch --gpus "0,1" finetune_generation.py ./llama/pt_argument.json
114120```
115121### 3.5 精调参数介绍
116- <details ><summary >&emsp ; 模型参数( ModelArgument) </summary ><div >
122+ <details ><summary >&emsp ; 模型参数( ModelArgument) </summary ><div >
117123
118124- ` model_name_or_path ` : 预训练模型名称或者本地的模型路径,用于热启模型和分词器,默认为None。每个模型** 支持模型权重** 详见各模型目录。
119125- ` lora ` : 是否开启LoRA微调策略,默认为False。
@@ -124,7 +130,7 @@ python -u -m paddle.distributed.launch --gpus "0,1" finetune_generation.py ./
124130
125131</div ></details >
126132
127- <details ><summary >&emsp ; 数据参数( DataArgument) </summary ><div >
133+ <details ><summary >&emsp ; 数据参数( DataArgument) </summary ><div >
128134
129135- ` dataset_name_or_path ` : 本地数据集目录或内置数据集名称,默认为None。脚本已适配单文件和多文件,会自己寻找` dataset_name_or_path/train.json ` 或者 ` dataset_name_or_path/train/*.json ` 作为训练集文件, 以及` dataset_name_or_path/dev.json ` 或者 ` dataset_name_or_path/dev/*.json ` 作为验证集文件。
130136- ` task_name ` : 用于选择内置数据集中的具体任务,默认为None。
@@ -138,15 +144,15 @@ python -u -m paddle.distributed.launch --gpus "0,1" finetune_generation.py ./
138144</div ></details >
139145
140146
141- <details ><summary >&emsp ; 生成参数( GenerateArgument) </summary ><div >
147+ <details ><summary >&emsp ; 生成参数( GenerateArgument) </summary ><div >
142148
143149注:以下参数仅在` eval_with_do_generation ` 为True,调用model.generate()时生效。
144150
145151- ` top_k ` : “采样”策略中为 top-k 过滤保留的最高概率标记的数量。默认为1,等价于贪心策略。
146152- ` top_p ` :“采样”策略中 top-p 过滤的累积概率。默认为1.0,表示不起作用。
147153</div ></details >
148154
149- <details ><summary >&emsp ; 训练参数( TrainingArguments) </summary ><div >
155+ <details ><summary >&emsp ; 训练参数( TrainingArguments) </summary ><div >
150156
151157以下仅介绍TrainingArguments部分常用参数,详情请参见[ TrainingArguments文档] ( https://paddlenlp.readthedocs.io/zh/latest/trainer.html ) 。
152158
@@ -178,7 +184,8 @@ python -u -m paddle.distributed.launch --gpus "0,1" finetune_generation.py ./
178184
179185
180186### 3.6 张量并行参数合并
181- 我们使用张量并行(TP,Tensor Parallelism)训练过程中,为了节省TP参数合并时间往往在中间checkpoint将参数存储为多个TP参数分片,可以使用提供的分片合并参数脚本进行参数合并。
187+
188+ 我们使用张量并行(TP,Tensor Parallelism)训练过程中,为了节省TP参数合并时间通常在中间checkpoint将参数存储为多个TP参数分片,可以使用提供的分片合并参数脚本进行参数合并。
182189
183190```
184191python merge_tp_params.py \
@@ -190,7 +197,8 @@ python merge_tp_params.py \
190197- ` device ` : 运行环境,默认为gpu。
191198</div ></details >
192199
193- ### 3.7 LoRA参数合并
200+ ### 3.7 LoRA 参数合并
201+
194202为了后续的** 压缩** 和** 静态图推理** 方便,我们提供LoRA参数合并脚本,可以将LoRA参数合并到主干模型并保存相应的权重。
195203```
196204python merge_lora_params.py \
@@ -273,7 +281,7 @@ python predictor.py \
273281### 4.4 Inference Model 静态图推理
274282
275283``` shell
276- # 首先需要运行一下命令将InferenceModel动态图导出为静态图
284+ # 首先需要运行一下命令将Inference Model动态图导出为静态图
277285# LoRA需要先合并参数,详见3.7LoRA参数合并
278286# Prefix Tuning暂不支持
279287python export_model.py \
@@ -312,11 +320,11 @@ python predictor.py \
312320- ` dtype ` : 模型参数dtype,默认为None。如果没有传入` lora_path ` 、` prefix_path ` 则必须传入
313321- ` model_type ` : 初始化不同类型模型,gpt-3: GPTForCausalLM; ernie-3.5-se: Ernie35ForCausalLM; 默认为 None。
314322- ` mode ` : 使用动态图或者静态图推理,值为:[ dynamic, static] ,默认为 dynamic。
315- - ` inference_model ` : 是否使用InferenceModel 推理,默认值为 False。
323+ - ` inference_model ` : 是否使用Inference Model 推理,默认值为 False。
316324
317325</div ></details >
318326
319- ## 5. 服务化部署
327+ ## 5. 服务部署
320328
321329### 5.1 环境准备
322330
@@ -340,7 +348,6 @@ python -m paddle.distributed.launch --gpus "0,1,2,3,4,5,6,7" flask_server.py \
340348
341349<details ><summary >&emsp ; 脚本参数介绍</summary ><div >
342350
343-
344351- ` port ` : Gradio UI 服务端口号,默认8011。
345352- ` flask_port ` : Flask服务端口号,默认8010。
346353- 其他参数请参见动态图推理中参数。
@@ -359,21 +366,21 @@ python -m paddle.distributed.launch --gpus "0,1,2,3,4,5,6,7" flask_server.py \
359366
360367量化中默认使用训练集作为校正(Calibartion)数据集,开发集作为评估数据集。如果希望使用其他数据作为校正数据集,则在数据目录下新增` quant.json ` 文件,文件格式请参照精调训练数据格式。
361368
362- ### 6.3 PTQ量化
369+ ### 6.3 PTQ 量化
363370
364371```
365372python finetune_generation.py ./llama/ptq_argument.json
366373```
367374
368- ### 6.4 GPTQ量化
375+ ### 6.4 GPTQ 量化
369376
370377```
371378python finetune_generation.py ./llama/gptq_argument.json
372379```
373380
374381### 6.5 量化参数介绍
375382
376- <details ><summary >&emsp ; 量化参数( QuantArgument) </summary ><div >
383+ <details ><summary >&emsp ; 量化参数( QuantArgument) </summary ><div >
377384
378385- ` quant_type ` : PTQ,QAT量化类型,默认为A8W8。支持A8W8,WINT4,WINT8:A8W8指对激活(输入)进行INT8量化,对模型权重进行INT8量化;WINT4指仅对模型权重进行INT4量化,后续使用WeightOnly进行推理;WINT8指仅对模型权重进行INT8量化,后续使用WeightOnly进行推理。
379386- ` do_ptq ` : 是否进行PTQ量化,默认为False。
0 commit comments