File size: 18,478 Bytes
8f8a944
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
快速上手
========

本节中,我们将演示如何使用 XTuner 微调模型,帮助您快速上手 XTuner。

在成功安装 XTuner
后,便可以开始进行模型的微调。在本节中,我们将演示如何使用 XTuner,应用
QLoRA 算法在 Colorist 数据集上微调 InternLM2-Chat-7B。

Colorist 数据集(\ `HuggingFace
链接 <https://huggingface.co/datasets/burkelibbey/colors>`__\ ;\ `ModelScope
链接 <https://www.modelscope.cn/datasets/fanqiNO1/colors/summary>`__\ )是一个根据颜色描述提供颜色选择与建议的数据集,经过该数据集微调的模型可以做到根据用户对于颜色的描述,从而给出16进制下的颜色编码,如用户输入“宁静而又相当明亮的浅天蓝色,介于天蓝色和婴儿蓝之间,因其亮度而带有一丝轻微的荧光感。”,模型输出
|image1|\ ,该颜色很符合用户的描述。以下是该数据集的几条样例数据:

+-----------------------+-----------------------+-------------------+
| 英文描述              | 中文描述              | 颜色              |
+=======================+=======================+===================+
| Light Sky Blue: A     | 浅天蓝色              | #66ccff: |image8| |
| calming, fairly       | :一种介于天蓝和婴儿  |                   |
| bright color that     | 蓝之间的平和、相当明  |                   |
| falls between sky     | 亮的颜色,由于明亮而  |                   |
| blue and baby blue,   | 带有一丝轻微的荧光。  |                   |
| with a hint of slight |                       |                   |
| fluorescence due to   |                       |                   |
| its brightness.       |                       |                   |
+-----------------------+-----------------------+-------------------+
| Bright red: This is a | 鲜红色:              | #ee0000: |image9| |
| very vibrant,         | 这是一种非常鲜        |                   |
| saturated and vivid   | 艳、饱和、生动的红色  |                   |
| shade of red,         | ,类似成熟苹果或新鲜  |                   |
| resembling the color  | 血液的颜色。它是标准  |                   |
| of ripe apples or     | RGB                   |                   |
| fresh blood. It is as | 调色板上的红色,不含  |                   |
| red as you can get on | 任何蓝色或绿色元素。  |                   |
| a standard RGB color  |                       |                   |
| palette, with no      |                       |                   |
| elements of either    |                       |                   |
| blue or green.        |                       |                   |
+-----------------------+-----------------------+-------------------+
| Bright Turquoise:     | 明亮的绿松石          | #00ffcc:          |
| This color mixes the  | 色:这种颜色融合了鲜  | |image10|         |
| freshness of bright   | 绿色的清新和淡蓝色的  |                   |
| green with the        | 宁静,呈现出一种充满  |                   |
| tranquility of light  | 活力的绿松石色调。它  |                   |
| blue, leading to a    | 让人联想到热带水域。  |                   |
| vibrant shade of      |                       |                   |
| turquoise. It is      |                       |                   |
| reminiscent of        |                       |                   |
| tropical waters.      |                       |                   |
+-----------------------+-----------------------+-------------------+

准备模型权重
------------

在微调模型前,首先要准备待微调模型的权重。

.. _从-huggingface-下载-1:

从 HuggingFace 下载
~~~~~~~~~~~~~~~~~~~

.. code:: bash

   pip install -U huggingface_hub

   # 拉取模型至 Shanghai_AI_Laboratory/internlm2-chat-7b
   huggingface-cli download internlm/internlm2-chat-7b \
                               --local-dir Shanghai_AI_Laboratory/internlm2-chat-7b \
                               --local-dir-use-symlinks False \
                               --resume-download

.. _从-modelscope-下载-1:

从 ModelScope 下载
~~~~~~~~~~~~~~~~~~

由于从 HuggingFace
拉取模型权重,可能存在下载过程不稳定、下载速度过慢等问题。因此在下载过程遇到网络问题时,我们则可以选择从
ModelScope 下载 InternLM2-Chat-7B 的权重。

.. code:: bash

   pip install -U modelscope

   # 拉取模型至当前目录
   python -c "from modelscope import snapshot_download; snapshot_download('Shanghai_AI_Laboratory/internlm2-chat-7b', cache_dir='.')"

在完成下载后,便可以开始准备微调数据集了。

此处附上 HuggingFace 链接与 ModelScope 链接:

-  HuggingFace
   链接位于:\ https://huggingface.co/internlm/internlm2-chat-7b

-  ModelScope
   链接位于:\ https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-chat-7b/summary

准备微调数据集
--------------

接下来,我们需要准备微调数据集。

.. _从-huggingface-下载-2:

从 HuggingFace 下载
~~~~~~~~~~~~~~~~~~~

.. code:: bash

   git clone https://huggingface.co/datasets/burkelibbey/colors

.. _从-modelscope-下载-2:

从 ModelScope 下载
~~~~~~~~~~~~~~~~~~

由于相同的问题,因此我们可以选择从 ModelScope 下载所需要的微调数据集。

.. code:: bash

   git clone https://www.modelscope.cn/datasets/fanqiNO1/colors.git

此处附上 HuggingFace 链接与 ModelScope 链接:

-  HuggingFace
   链接位于:\ https://huggingface.co/datasets/burkelibbey/colors

-  ModelScope 链接位于:\ https://modelscope.cn/datasets/fanqiNO1/colors

准备配置文件
------------

XTuner 提供了多个开箱即用的配置文件,可以通过 ``xtuner list-cfg``
查看。我们执行如下指令,以复制一个配置文件到当前目录。

.. code:: bash

   xtuner copy-cfg internlm2_7b_qlora_colorist_e5 .

配置文件名的解释:

======== ==============================
配置文件 internlm2_7b_qlora_colorist_e5
======== ==============================
模型名   internlm2_7b
使用算法 qlora
数据集   colorist
训练时长 5 epochs
======== ==============================

此时该目录文件结构应如下所示:

.. code:: bash

   .
   ├── colors
   │   ├── colors.json
   │   ├── dataset_infos.json
   │   ├── README.md
   │   └── train.jsonl
   ├── internlm2_7b_qlora_colorist_e5_copy.py
   └── Shanghai_AI_Laboratory
       └── internlm2-chat-7b
           ├── config.json
           ├── configuration_internlm2.py
           ├── configuration.json
           ├── generation_config.json
           ├── modeling_internlm2.py
           ├── pytorch_model-00001-of-00008.bin
           ├── pytorch_model-00002-of-00008.bin
           ├── pytorch_model-00003-of-00008.bin
           ├── pytorch_model-00004-of-00008.bin
           ├── pytorch_model-00005-of-00008.bin
           ├── pytorch_model-00006-of-00008.bin
           ├── pytorch_model-00007-of-00008.bin
           ├── pytorch_model-00008-of-00008.bin
           ├── pytorch_model.bin.index.json
           ├── README.md
           ├── special_tokens_map.json
           ├── tokenization_internlm2_fast.py
           ├── tokenization_internlm2.py
           ├── tokenizer_config.json
           └── tokenizer.model

修改配置文件
------------

| 在这一步中,我们需要修改待微调模型路径和数据路径为本地路径,并且修改数据集加载方式。
| 此外,由于复制得到的配置文件是基于基座(Base)模型的,所以还需要修改
  ``prompt_template`` 以适配对话(Chat)模型。

.. code:: diff

   #######################################################################
   #                          PART 1  Settings                           #
   #######################################################################
   # Model
   - pretrained_model_name_or_path = 'internlm/internlm2-7b'
   + pretrained_model_name_or_path = './Shanghai_AI_Laboratory/internlm2-chat-7b'

   # Data
   - data_path = 'burkelibbey/colors'
   + data_path = './colors/train.jsonl'
   - prompt_template = PROMPT_TEMPLATE.default
   + prompt_template = PROMPT_TEMPLATE.internlm2_chat

   ...
   #######################################################################
   #                      PART 3  Dataset & Dataloader                   #
   #######################################################################
   train_dataset = dict(
       type=process_hf_dataset,
   -   dataset=dict(type=load_dataset, path=data_path),
   +   dataset=dict(type=load_dataset, path='json', data_files=dict(train=data_path)),
       tokenizer=tokenizer,
       max_length=max_length,
       dataset_map_fn=colors_map_fn,
       template_map_fn=dict(
           type=template_map_fn_factory, template=prompt_template),
       remove_unused_columns=True,
       shuffle_before_pack=True,
       pack_to_max_length=pack_to_max_length)

因此在这一步中,修改了
``pretrained_model_name_or_path``\ 、\ ``data_path``\ 、\ ``prompt_template``
以及 ``train_dataset`` 中的 ``dataset`` 字段。

启动微调
--------

在完成上述操作后,便可以使用下面的指令启动微调任务了。

.. code:: bash

   # 单机单卡
   xtuner train ./internlm2_7b_qlora_colorist_e5_copy.py
   # 单机多卡
   NPROC_PER_NODE=${GPU_NUM} xtuner train ./internlm2_7b_qlora_colorist_e5_copy.py
   # slurm 情况
   srun ${SRUN_ARGS} xtuner train ./internlm2_7b_qlora_colorist_e5_copy.py --launcher slurm

正确输出的训练日志应类似如下所示:

.. code:: text

   01/29 21:35:34 - mmengine - INFO - Iter(train) [ 10/720]  lr: 9.0001e-05  eta: 0:31:46  time: 2.6851  data_time: 0.0077  memory: 12762  loss: 2.6900
   01/29 21:36:02 - mmengine - INFO - Iter(train) [ 20/720]  lr: 1.9000e-04  eta: 0:32:01  time: 2.8037  data_time: 0.0071  memory: 13969  loss: 2.6049  grad_norm: 0.9361
   01/29 21:36:29 - mmengine - INFO - Iter(train) [ 30/720]  lr: 1.9994e-04  eta: 0:31:24  time: 2.7031  data_time: 0.0070  memory: 13969  loss: 2.5795  grad_norm: 0.9361
   01/29 21:36:57 - mmengine - INFO - Iter(train) [ 40/720]  lr: 1.9969e-04  eta: 0:30:55  time: 2.7247  data_time: 0.0069  memory: 13969  loss: 2.3352  grad_norm: 0.8482
   01/29 21:37:24 - mmengine - INFO - Iter(train) [ 50/720]  lr: 1.9925e-04  eta: 0:30:28  time: 2.7286  data_time: 0.0068  memory: 13969  loss: 2.2816  grad_norm: 0.8184
   01/29 21:37:51 - mmengine - INFO - Iter(train) [ 60/720]  lr: 1.9863e-04  eta: 0:29:58  time: 2.7048  data_time: 0.0069  memory: 13969  loss: 2.2040  grad_norm: 0.8184
   01/29 21:38:18 - mmengine - INFO - Iter(train) [ 70/720]  lr: 1.9781e-04  eta: 0:29:31  time: 2.7302  data_time: 0.0068  memory: 13969  loss: 2.1912  grad_norm: 0.8460
   01/29 21:38:46 - mmengine - INFO - Iter(train) [ 80/720]  lr: 1.9681e-04  eta: 0:29:05  time: 2.7338  data_time: 0.0069  memory: 13969  loss: 2.1512  grad_norm: 0.8686
   01/29 21:39:13 - mmengine - INFO - Iter(train) [ 90/720]  lr: 1.9563e-04  eta: 0:28:36  time: 2.7047  data_time: 0.0068  memory: 13969  loss: 2.0653  grad_norm: 0.8686
   01/29 21:39:40 - mmengine - INFO - Iter(train) [100/720]  lr: 1.9426e-04  eta: 0:28:09  time: 2.7383  data_time: 0.0070  memory: 13969  loss: 1.9819  grad_norm: 0.9127

在训练开始前,可以看到模型的输出如下所示:

.. code:: text

   2024/01/29 21:34:58 - mmengine - INFO - before_train in EvaluateChatHook.
   2024/01/29 21:35:03 - mmengine - INFO - Sample output:
   <s><|im_start|>system
   You are a professional color designer. Please provide the corresponding colors based on the description of Human.
   <|im_end|>
   <|im_start|>user
   请给我一个像天空一样清澈透明的蓝色。<|im_end|>
   <|im_start|>assistant
   为了匹配您所描述的“像天空一样清澈透明的蓝色”,我建议您选择一种名为“天蓝”(Cerulean)的颜色。这种颜色通常被用来代表天空、海洋和清澈的水域,它具有明亮

   2024/01/29 21:35:07 - mmengine - INFO - Sample output:
   <s><|im_start|>system
   You are a professional color designer. Please provide the corresponding colors based on the description of Human.
   <|im_end|>
   <|im_start|>user
   Please give me a clear blue like the sky.<|im_end|>
   <|im_start|>assistant
   The color you're describing is a clear, bright blue that resembles the color of the sky on a sunny day. This color is often referred to as "sky blue" or "cerulean blue." Here are some specific color codes and names that

而在训练完全完成后,可以观察到模型的输出如下所示:

.. code:: text

   2024/01/29 22:08:07 - mmengine - INFO - Sample output:
   <s><|im_start|>system
   You are a professional color designer. Please provide the corresponding colors based on the description of Human.
   <|im_end|>
   <|im_start|>user
   请给我一个像天空一样清澈透明的蓝色。<|im_end|>
   <|im_start|>assistant
   #1099ee<|im_end|>

   2024/01/29 22:08:08 - mmengine - INFO - Sample output:
   <s><|im_start|>system
   You are a professional color designer. Please provide the corresponding colors based on the description of Human.
   <|im_end|>
   <|im_start|>user
   Please give me a clear blue like the sky.<|im_end|>
   <|im_start|>assistant
   #0066dd<|im_end|>

模型输出的颜色如下所示:

-  天空一样清澈透明的蓝色:\ |image11|

-  A clear blue like the sky: |image12|

不难发现,模型在经过训练后,其输出已经完全与数据集内容所对齐了。

.. _模型转换--lora-合并:

模型转换 + LoRA 合并
--------------------

在训练完成后,我们会得到几个 ``.pth`` 文件,这些文件存储了 QLoRA
算法训练过程所更新的参数,而\ **不是**\ 模型的全部参数。因此我们需要将这些
``.pth`` 文件转换为 HuggingFace 格式,并合并入原始的语言模型权重中。

模型转换
~~~~~~~~

XTuner 已经集成好了将模型转换为 HuggingFace 格式的工具,我们只需要执行

.. code:: bash

   # 创建存放 hf 格式参数的目录
   mkdir work_dirs/internlm2_7b_qlora_colorist_e5_copy/iter_720_hf

   # 转换格式
   xtuner convert pth_to_hf internlm2_7b_qlora_colorist_e5_copy.py \
                               work_dirs/internlm2_7b_qlora_colorist_e5_copy/iter_720.pth \
                               work_dirs/internlm2_7b_qlora_colorist_e5_copy/iter_720_hf

该条转换命令将会根据配置文件 ``internlm2_7b_qlora_colorist_e5_copy.py``
的内容,将
``work_dirs/internlm2_7b_qlora_colorist_e5_copy/iter_720.pth`` 转换为 hf
格式,并保存在
``work_dirs/internlm2_7b_qlora_colorist_e5_copy/iter_720_hf`` 位置。

LoRA 合并
~~~~~~~~~

XTuner 也已经集成好了合并 LoRA 权重的工具,我们只需执行如下指令:

.. code:: bash

   # 创建存放合并后的参数的目录
   mkdir work_dirs/internlm2_7b_qlora_colorist_e5_copy/merged

   # 合并参数
   xtuner convert merge Shanghai_AI_Laboratory/internlm2-chat-7b \
                           work_dirs/internlm2_7b_qlora_colorist_e5_copy/iter_720_hf \
                           work_dirs/internlm2_7b_qlora_colorist_e5_copy/merged \
                           --max-shard-size 2GB

与转换命令类似,该条合并参数命令会读取原始参数路径
``Shanghai_AI_Laboratory/internlm2-chat-7b`` 以及转换为 hf
格式的部分参数路径
``work_dirs/internlm2_7b_qlora_colorist_e5_copy/iter_720_hf``\ ,将两部分参数合并后保存于
``work_dirs/internlm2_7b_qlora_colorist_e5_copy/merged``\ ,其中每个参数切片的最大文件大小为
2GB。

与模型对话
----------

在合并权重后,为了更好地体会到模型的能力,XTuner
也集成了与模型对话的工具。通过如下命令,便可以启动一个与模型对话的简易
Demo。

.. code:: bash

   xtuner chat work_dirs/internlm2_7b_qlora_colorist_e5_copy/merged \
                   --prompt-template internlm2_chat \
                   --system-template colorist

当然,我们也可以选择不合并权重,而是直接与 LLM + LoRA Adapter
进行对话,我们只需要执行如下指令:

.. code:: bash

   xtuner chat Shanghai_AI_Laboratory/internlm2-chat-7b
                   --adapter work_dirs/internlm2_7b_qlora_colorist_e5_copy/iter_720_hf \
                   --prompt-template internlm2_chat \
                   --system-template colorist

其中 ``work_dirs/internlm2_7b_qlora_colorist_e5_copy/merged``
是合并后的权重路径,\ ``--prompt-template internlm2_chat``
指定了对话模板为 InternLM2-Chat,\ ``--system-template colorist``
则是指定了与模型对话时的 System Prompt 为 Colorist 数据集所要求的模板。

以下是一个例子:

.. code:: text

   double enter to end input (EXIT: exit chat, RESET: reset history) >>> 宁静而又相当明亮的浅天蓝色,介于天蓝色和婴儿蓝之间,因其亮度而带有一丝轻微的荧光感。

   #66ccff<|im_end|>

其颜色如下所示:

宁静而又相当明亮的浅天蓝色,介于天蓝色和婴儿蓝之间,因其亮度而带有一丝轻微的荧光感。:\ |image13|

.. |image1| image:: https://img.shields.io/badge/%2366ccff-66CCFF
.. |image2| image:: https://img.shields.io/badge/%2366ccff-66CCFF
.. |image3| image:: https://img.shields.io/badge/%23ee0000-EE0000
.. |image4| image:: https://img.shields.io/badge/%2300ffcc-00FFCC
.. |image5| image:: https://img.shields.io/badge/%2366ccff-66CCFF
.. |image6| image:: https://img.shields.io/badge/%23ee0000-EE0000
.. |image7| image:: https://img.shields.io/badge/%2300ffcc-00FFCC
.. |image8| image:: https://img.shields.io/badge/%2366ccff-66CCFF
.. |image9| image:: https://img.shields.io/badge/%23ee0000-EE0000
.. |image10| image:: https://img.shields.io/badge/%2300ffcc-00FFCC
.. |image11| image:: https://img.shields.io/badge/天空一样清澈透明的蓝色-1099EE
.. |image12| image:: https://img.shields.io/badge/A_clear_blue_like_the_sky-0066DD
.. |image13| image:: https://img.shields.io/badge/宁静而又相当明亮的浅天蓝色,介于天蓝色和婴儿蓝之间,因其亮度而带有一丝轻微的荧光感。-66CCFF