已合并
添加lora feature readme #1835
AtomGit-Bot创建于 2024年10月31日
添加lora feature readme #1835
已合并
AtomGit-Bot创建于 2024年10月31日
从refs/pull/1835/head合入到master
共 6 个文件变更+247-4
MREADME.md+30-4
@@ -1,4 +1,4 @@
1- <p align="center"> <img src="sources/images/logo.png" height="110px" width="500px"> </p>1+ <p align="center"> <img src="sources/images/readme/logo.png" height="110px" width="500px"> </p>
2 2 
3<p align="center">3<p align="center">
4 <a href="https://gitee.com/ascend/ModelLink/blob/master/LICENSE">4 <a href="https://gitee.com/ascend/ModelLink/blob/master/LICENSE">
@@ -93,7 +93,7 @@ MindSpeed-LLM作为昇腾大模型训练框架,旨在为华为 [昇腾芯片](
93</table>93</table>
94 94 
95基于 `GPT3-175B` 稠密大模型,从128颗 NPU 扩展到 7968颗 NPU 进行 MFU 与线性度实验,下图是实验数据:95基于 `GPT3-175B` 稠密大模型,从128颗 NPU 扩展到 7968颗 NPU 进行 MFU 与线性度实验,下图是实验数据:
96-<p align="center"> <img src="./sources/images/linearity&mfu.png" height="490px" width="715px"> </p>96+<p align="center"> <img src="./sources/images/readme/linearity&mfu.png" height="490px" width="715px"> </p>
97 97 
98图中呈现了对应集群规模下的 `MFU` 值与集群整体的 `线性度`情况. 计算公式已经放到社区,点击链接可进行参考:[MFU计算公式](https://gitee.com/ascend/ModelLink/wikis/%E6%9C%AF%E8%AF%AD%E5%AE%9A%E4%B9%89/%E5%A4%A7%E6%A8%A1%E5%9E%8B%20MFU%20%E8%AE%A1%E7%AE%97%E5%85%AC%E5%BC%8F),[线性度计算公式](https://gitee.com/ascend/ModelLink/wikis/%E6%9C%AF%E8%AF%AD%E5%AE%9A%E4%B9%89/%E7%BA%BF%E6%80%A7%E5%BA%A6%E5%85%AC%E5%BC%8F).98图中呈现了对应集群规模下的 `MFU` 值与集群整体的 `线性度`情况. 计算公式已经放到社区,点击链接可进行参考:[MFU计算公式](https://gitee.com/ascend/ModelLink/wikis/%E6%9C%AF%E8%AF%AD%E5%AE%9A%E4%B9%89/%E5%A4%A7%E6%A8%A1%E5%9E%8B%20MFU%20%E8%AE%A1%E7%AE%97%E5%85%AC%E5%BC%8F),[线性度计算公式](https://gitee.com/ascend/ModelLink/wikis/%E6%9C%AF%E8%AF%AD%E5%AE%9A%E4%B9%89/%E7%BA%BF%E6%80%A7%E5%BA%A6%E5%85%AC%E5%BC%8F).
99 99 
@@ -253,13 +253,14 @@ MindSpeed-LLM作为昇腾大模型训练框架,旨在为华为 [昇腾芯片](
253 253 
254## <span id="jump2"> 分布式指令微调254## <span id="jump2"> 分布式指令微调
255 255 
256-【全参微调实测性能】256+【指令微调实测性能】
257 257 
258<table>258<table>
259 <tr>259 <tr>
260 <th>模型</th>260 <th>模型</th>
261 <th>硬件</th>261 <th>硬件</th>
262 <th>集群</th>262 <th>集群</th>
263+ <th>框架</th>
263 <th>方案</th>264 <th>方案</th>
264 <th>序列</th>265 <th>序列</th>
265 <th>性能</th>266 <th>性能</th>
@@ -269,36 +270,43 @@ MindSpeed-LLM作为昇腾大模型训练框架,旨在为华为 [昇腾芯片](
269 <td rowspan="7">Atlas 900 A2 PODc</td>270 <td rowspan="7">Atlas 900 A2 PODc</td>
270 <td rowspan="7">1x8</td>271 <td rowspan="7">1x8</td>
271 <td>MindSpeed-LLM + NPU</td>272 <td>MindSpeed-LLM + NPU</td>
273+ <td>全参</td>
272 <td>dynamic</td>274 <td>dynamic</td>
273 <th><a href="./examples/mcore/llama2/tune_llama2_7b_full_ptd.sh">45.7 samples/s</a></th>275 <th><a href="./examples/mcore/llama2/tune_llama2_7b_full_ptd.sh">45.7 samples/s</a></th>
274 </tr>276 </tr>
275 <tr>277 <tr>
276 <td><a href="https://github.com/hiyouga/LLaMA-Factory/tree/main">DeepSpeed</a> + NPU</td>278 <td><a href="https://github.com/hiyouga/LLaMA-Factory/tree/main">DeepSpeed</a> + NPU</td>
279+ <td>全参</td>
277 <td>dynamic</td>280 <td>dynamic</td>
278 <td>40.4 samples/s</td>281 <td>40.4 samples/s</td>
279 </tr>282 </tr>
280 <tr>283 <tr>
281 <td><a href="https://github.com/hiyouga/LLaMA-Factory/tree/main">DeepSpeed</a> + 参考</td>284 <td><a href="https://github.com/hiyouga/LLaMA-Factory/tree/main">DeepSpeed</a> + 参考</td>
285+ <td>全参</td>
282 <td>dynamic</td>286 <td>dynamic</td>
283 <td>46.5 samples/s</td>287 <td>46.5 samples/s</td>
284 </tr>288 </tr>
285 <tr>289 <tr>
286 <td>MindSpeed-LLM + NPU</td>290 <td>MindSpeed-LLM + NPU</td>
291+ <td>全参</td>
287 <td>16K</td>292 <td>16K</td>
288 <th><a href="./examples/mcore/llama2/tune_llama2_7b_full_pack_16k.sh">1.455 samples/s</a></th>293 <th><a href="./examples/mcore/llama2/tune_llama2_7b_full_pack_16k.sh">1.455 samples/s</a></th>
289 </tr>294 </tr>
290 <tr>295 <tr>
291 <td><a href="https://github.com/hiyouga/LLaMA-Factory/tree/main">DeepSpeed</a> + 参考</td>296 <td><a href="https://github.com/hiyouga/LLaMA-Factory/tree/main">DeepSpeed</a> + 参考</td>
297+ <td>全参</td>
292 <td>16K</td>298 <td>16K</td>
293 <td>1.003 samples/s</td>299 <td>1.003 samples/s</td>
294 </tr>300 </tr>
295 <tr>301 <tr>
296 <td>MindSpeed-LLM + NPU</td>302 <td>MindSpeed-LLM + NPU</td>
303+ <td>全参</td>
297 <td>32K</td>304 <td>32K</td>
298 <th><a href="./examples/mcore/llama2/tune_llama2_7b_full_pack_32k.sh">0.727 samples/s</a></th>305 <th><a href="./examples/mcore/llama2/tune_llama2_7b_full_pack_32k.sh">0.727 samples/s</a></th>
299 </tr>306 </tr>
300 <tr>307 <tr>
301 <td><a href="https://github.com/hiyouga/LLaMA-Factory/tree/main">DeepSpeed</a> + 参考</td>308 <td><a href="https://github.com/hiyouga/LLaMA-Factory/tree/main">DeepSpeed</a> + 参考</td>
309+ <td>全参</td>
302 <td>32K</td>310 <td>32K</td>
303 <td>0.4 samples/s</td>311 <td>0.4 samples/s</td>
304 </tr>312 </tr>
@@ -307,19 +315,37 @@ MindSpeed-LLM作为昇腾大模型训练框架,旨在为华为 [昇腾芯片](
307 <td rowspan="3">Atlas 900 A2 PODc</td>315 <td rowspan="3">Atlas 900 A2 PODc</td>
308 <td rowspan="3">1x8</td>316 <td rowspan="3">1x8</td>
309 <td>MindSpeed-LLM + NPU</td>317 <td>MindSpeed-LLM + NPU</td>
318+ <td>全参</td>
310 <td>dynamic</td>319 <td>dynamic</td>
311 <th><a href="./examples/mcore/llama2/tune_llama2_13b_full_ptd.sh">28.4 samples/s</a></th>320 <th><a href="./examples/mcore/llama2/tune_llama2_13b_full_ptd.sh">28.4 samples/s</a></th>
312 </tr>321 </tr>
313 <tr>322 <tr>
314 <td><a href="https://github.com/hiyouga/LLaMA-Factory/tree/main">DeepSpeed</a> + NPU</td>323 <td><a href="https://github.com/hiyouga/LLaMA-Factory/tree/main">DeepSpeed</a> + NPU</td>
324+ <td>全参</td>
315 <td>dynamic</td>325 <td>dynamic</td>
316 <td>17.8 samples/s</td>326 <td>17.8 samples/s</td>
317 </tr>327 </tr>
318 <tr>328 <tr>
319 <td><a href="https://github.com/hiyouga/LLaMA-Factory/tree/main">DeepSpeed</a> + 参考</td>329 <td><a href="https://github.com/hiyouga/LLaMA-Factory/tree/main">DeepSpeed</a> + 参考</td>
330+ <td>全参</td>
320 <td>dynamic</td>331 <td>dynamic</td>
321 <td>24.9 samples/s</td>332 <td>24.9 samples/s</td>
322 </tr>333 </tr>
334+ <tr>
335+ <td rowspan="2">llama2-70B</td>
336+ <td rowspan="2">Atlas 900 A2 PODc</td>
337+ <td rowspan="2">1x8</td>
338+ <td>MindSpeed-LLM + NPU</td>
339+ <td>LoRA</td>
340+ <td>dynamic</td>
341+ <th><a href="./examples/legacy/llama2/tune_llama2_70b_lora_ptd.sh">11.72 samples/s</a></th>
342+ </tr>
343+ <tr>
344+ <td><a href="https://github.com/hiyouga/LLaMA-Factory/tree/main">DeepSpeed</a> + 参考</td>
345+ <td>LoRA</td>
346+ <td>dynamic</td>
347+ <td>3.489 samples/s</td>
348+ </tr>
323</table>349</table>
324 350 
325 351 
@@ -374,7 +400,7 @@ MindSpeed-LLM作为昇腾大模型训练框架,旨在为华为 [昇腾芯片](
374 </tr>400 </tr>
375 <tr>401 <tr>
376 <td rowspan="2">低参微调</td>402 <td rowspan="2">低参微调</td>
377- <td>LoRA 微调</td>403+ <td><a href="./docs/features/lora_finetune.md">LoRA 微调</a></td>
378 <td>✅</td>404 <td>✅</td>
379 <td>✅</td>405 <td>✅</td>
380 <td>【NAIE】</td>406 <td>【NAIE】</td>
@@ -0,0 +1,217 @@
1+# LoRA 微调简介
2+ 
3+LoRA(Low-Rank Adaptation)是一种高效的模型微调方法,广泛应用于预训练的深度学习模型。通过在权重上添加低秩矩阵,LoRA 使得微调过程更为轻量,节省计算资源和存储空间。
4+ 
5+## LoRA 的原理
6+ 
7+LoRA 的核心思想是将模型的参数更新分解为低秩的形式。具体步骤如下:
8+ 
9+- **分解权重更新**:在传统的微调方法中,直接对模型的权重进行更新。而 LoRA 通过在每一层的权重矩阵中引入两个低秩矩阵 $A$ 和 $B$ 进行替代。即:
10+$
11+W' = W + A \cdot B
12+$
13+ 
14+![alt text](../../sources/images/lora_finetune/lora_model.png)
15+ 
16+ 其中,$W'$ 是更新后的权重,$W$ 是原始权重,$A$ 和 $B$ 是需要学习的低秩矩阵。
17+ 
18+- **降低参数量**:由于 $A$ 和 $B$ 的秩较低,所需的参数量显著减少,节省了存储和计算成本。
19+ 
20+## ModelLink 与 DeepSpeed 对比
21+ 
22+- **ModelLink 与 <a href="https://github.com/hiyouga/LLaMA-Factory/tree/main">DeepSpeed</a> loss 对比图**:
23+ 
24+![alt text](../../sources/images/lora_finetune/llama2_7b_loss_compare.png)
25+ 
26+| 问题 | DeepSpeed 回答 | ModelLink 回答 |
27+|--------------|-------------------------------|-----------------------------|
28+| User:你是谁 | Assistant: I am John. | ModelLink: 我是叶凯。 |
29+| User:你可以说中文吗 | Assistant:可以说中文. | ModelLink: 可以。 |
30+| User:能推荐几本自然语言处理的书吗? | Assistant:自然语言处理的书有很多,我可以推荐几本优秀的书:<br>《自然语言处理导论》、《深度学习与自然语言处理》、《自然语言处理概论》、《自然语言处理实战》等。 | ModelLink: 可以推荐的自然语言处理的书有《自然语言处理入门》、《深度学习:自然语言处理和计算机视觉》、《自然语言处理评估》、《统计自然语言处理》等。 |
31+| User:上面几本书的阅读顺序是什么呢? | Assistant:上面几本书的阅读顺序是<br>《自然语言处理导论》、《深度学习与自然语言处理》、《自然语言处理概论》、《自然语言处理实战》。 | ModelLink: 建议先阅读《自然语言处理入门》、《自然语言处理评估》、《统计自然语言处理》,然后再阅读《深度学习:自然语言处理和计算机视觉》。 |
32+| User:9.11和09.9哪个比较大 | Assistant: 9.11比9.9大。 | ModelLink: 9.11 |
33+ 
34+### 数据预处理示例
35+ 
36+ModelLink 数据预处理脚本命名和启动方法:
37+ 
38+```shell
39+# Legacy 模型
40+bash examples/legacy/llama2/data_convert_llama2_instruction.sh
41+ 
42+# Mcore 模型
43+bash examples/mcore/llama2/data_convert_llama2_instruction.sh
44+```
45+ 
46+在数据预处理时,若 `output-prefix` 为 `./finetune_dataset/llama-2-7b/alpaca`,则使用以下命令:
47+ 
48+```shell
49+python ./preprocess_data.py \
50+ --input ./dataset/train-00000-of-00001-a09b74b3ef9c3b56.parquet \
51+ --tokenizer-name-or-path ./model_from_hf/llama-2-7b-hf \
52+ --output-prefix ./finetune_dataset/llama-2-7b/alpaca \
53+ --workers 16 \
54+ --log-interval 1000 \
55+ --tokenizer-type PretrainedFromHF \
56+ --handler-name AlpacaStyleInstructionHandler \
57+ --prompt-type llama2
58+```
59+ 
60+在指令微调时,`DATA_PATH` 也应保持一致:
61+ 
62+```shell
63+DATA_PATH="./finetune_dataset/llama-2-7b/alpaca" # 数据集路径
64+```
65+ 
66+- **`--prompt-type`**
67+ 指定模型模板,使 base 模型在微调后具备更好的对话能力。
68+ 
69+- **`--variable-seq-lengths`**
70+ 支持动态序列长度微调,默认按 8 的倍数进行 padding,可以通过 `--pad-to-multiple-of` 参数修改 padding 的倍数。
71+ 
72+### LoRA 微调
73+ 
74+ModelLink LoRA微调脚本命名和启动方法:
75+ 
76+```shell
77+# Legacy 模型
78+bash examples/legacy/llama2/tune_llama2_7b_lora_ptd.sh
79+ 
80+# Mcore 模型
81+bash examples/mcore/llama2/tune_llama2_7b_lora_ptd.sh
82+```
83+#### 参数说明
84+- **`--load`**
85+ 若不指定该参数加载权重,模型会随机初始化权重。
86+ 
87+- **`--lora-r`**
88+ LoRA rank,表示低秩矩阵的维度。较低的 rank 值模型在训练时会使用更少的参数更新,从而减少计算量和内存消耗。然而,过低的 rank 可能限制模型的表达能力。
89+ 
90+- **`--lora-alpha`**
91+ 控制 LoRA 权重对原始权重的影响比例, 数值越高则影响越大。一般保持 `α/r` 为 2。
92+ 
93+- **`--lora-fusion`**
94+ 是否启用<td><a href="./docs/features/cc_lora.md">CCLoRA</a></td>算法,该算法通过计算通信掩盖提高性能。
95+ 
96+- **`--lora-target-modules`**
97+ 选择需要添加 LoRA 的模块。
98+ *mcore 模型可选模块:* `linear_qkv`, `linear_proj`, `linear_fc1`, `linear_fc2`
99+ *legacy 模型可选模块:* `query_key_value`, `dense`, `dense_h_to_4h`, `dense_4h_to_h`
100+ 
101+- **`--lora-load`**
102+ 加载 LoRA 权重断点继续训练或用于推理。在推理时需与 `--load` 参数配合使用,加载 `CKPT_SAVE_DIR` 路径下的 LoRA 权重。
103+ 
104+### Lora 权重与 Base 权重合并与转换
105+ 
106+在权重转换命令中,添加以下参数即可将训练好的 Lora 权重与 Base 权重融合,合并后转换为 Megatron-Legacy 权重.:
107+ 
108+```bash
109+--lora-load ${CHECKPOINT_LORA} \
110+--lora-r 16 \
111+--lora-alpha 32 \
112+--lora-target-modules query_key_value dense dense_h_to_4h dense_4h_to_h \
113+```
114+ 
115+以下是将合并后的权重转换为 Megatron-Legacy 格式的示例命令:
116+ 
117+```shell
118+# 请确保您已配置好环境变量
119+source /usr/local/Ascend/ascend-toolkit/set_env.sh
120+ 
121+python convert_ckpt.py \
122+ --model-type GPT \
123+ --load-model-type mg \
124+ --save-model-type mg \
125+ --load-dir ./model_weights/llama-2-7b-legacy/ \
126+ --lora-load ./ckpt/llama-2-7b-lora \
127+ --lora-r 16 \
128+ --lora-alpha 32 \
129+ --lora-target-modules query_key_value dense dense_h_to_4h dense_4h_to_h \
130+ --target-tensor-parallel-size 1 \
131+ --target-pipeline-parallel-size 1 \
132+ --save-dir ./model_weights/llama-2-7b-lora2legacy
133+```
134+ 
135+以下是启动转换脚本的示例:
136+ 
137+```shell
138+# 以 legacy 下的模型为例
139+bash examples/legacy/llama2/ckpt_convert_llama2_legacy2legacy_lora.sh
140+```
141+ 
142+#### 合并后转换为 Hugging Face 权重
143+ 
144+若希望将合并后的权重转换为 Hugging Face(HF)格式,可以使用以下命令:
145+ 
146+```shell
147+# 请确保您已配置好环境变量
148+source /usr/local/Ascend/ascend-toolkit/set_env.sh
149+ 
150+python convert_ckpt.py \
151+ --model-type GPT \
152+ --load-model-type mg \
153+ --save-model-type hf \
154+ --load-dir ./model_weights/llama-2-7b-legacy/ \
155+ --lora-load ./ckpt/llama-2-7b-lora \
156+ --lora-r 16 \
157+ --lora-alpha 32 \
158+ --lora-target-modules query_key_value dense dense_h_to_4h dense_4h_to_h \
159+ --target-tensor-parallel-size 1 \
160+ --target-pipeline-parallel-size 1 \
161+ --save-dir ./model_from_hf/llama-2-7b-hf/ # 填写原始 HF 模型路径,新权重将存储于 ./model_from_hf/llama-2-7b-hf/mg2hg/
162+```
163+ 
164+以下是启动转换脚本的示例:
165+ 
166+```shell
167+# 以 legacy 下的模型为例
168+bash examples/legacy/llama2/ckpt_convert_llama2_legacy2hf_lora.sh
169+```
170+ 
171+**注意:** `lora` 参数的值应与微调时的参数设置保持一致,以确保转换后的模型具有相同的性能表现和兼容性。
172+ 
173+### LoRA 推理
174+ 
175+ModelLink 推理脚本命名和启动方法:
176+ 
177+```shell
178+# Legacy 模型
179+bash examples/legacy/llama2/generate_llama2_7b_lora_ptd.sh
180+ 
181+# Mcore 模型
182+bash examples/mcore/llama2/generate_llama2_7b_lora_ptd.sh
183+```
184+ 
185+启动前需根据实际情况修改启动脚本中的模型权重路径和分词器路径:
186+ 
187+```shell
188+CHECKPOINT="./model_weights/llama-2-7b-mcore"
189+CHECKPOINT_LORA="./ckpt/llama-2-7b-lora/"
190+TOKENIZER_PATH="./model_from_hf/llama-2-hf/"
191+ 
192+# 启动任务
193+bash examples/mcore/llama2/generate_llama2_7b_lora_ptd.sh
194+```
195+ 
196+### LoRA 微调权重评估
197+ 
198+使用 LoRA 微调权重的专用评估脚本:
199+ 
200+```shell
201+bash examples/legacy/llama2/evaluate_llama2_7B_lora_mmlu_ptd.sh
202+```
203+ 
204+#### 评估参数说明
205+ 
206+- **`--prompt-type`**:模型对话模板,确保评估输入结构匹配模型需求。
207+- **`--hf-chat-template`**:若模型具备内置 `chat_template` 属性,可添加该参数,使用内置模板。
208+- **`--eval-language`**:指定数据集语言,默认 `en`(英文),中文数据集应设置为 `zh`。
209+ 
210+### 注意事项
211+ 
212+- **对话模板选择**:根据模型和数据需求选择合适模板,确保微调和评估一致性。
213+- **语言匹配**:设定数据集语言以优化评估效果。
214+- **内置模板使用**:启用 `--hf-chat-template` 时简化输入格式,确保评估的准确性。
215+## 参考文献
216+ 
217+- [LoRA: Low-Rank Adaptation of Large Language Models](https://arxiv.org/abs/2106.09685)
Rsources/images/linearity&mfu.png→sources/images/readme/linearity&mfu.png+0-0
Rsources/images/logo.png→sources/images/readme/logo.png+0-0