LLM 大模型學習必知必會系列(八):10分鐘微調專屬於自己的大模型

汀、人工智能發表於2024-05-29

LLM 大模型學習必知必會系列(八):10分鐘微調專屬於自己的大模型

1.環境安裝

# 設定pip全域性映象 (加速下載)
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
# 安裝ms-swift
pip install 'ms-swift[llm]' -U

# 環境對齊 (通常不需要執行. 如果你執行錯誤, 可以跑下面的程式碼, 倉庫使用最新環境測試)
pip install -r requirements/framework.txt  -U
pip install -r requirements/llm.txt  -U

2.微調前推理

使用python:

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'

from swift.llm import ModelType, InferArguments, infer_main
infer_args = InferArguments(model_type=ModelType.qwen1half_4b_chat)
infer_main(infer_args)

"""
<<< 你是誰?
我是來自阿里雲的大規模語言模型,我叫通義千問。
--------------------------------------------------
<<< what's your name?
I am Qwen, a large language model from Alibaba Cloud.
--------------------------------------------------
<<< 你是誰研發的?
我是阿里雲自主研發的超大規模語言模型。
--------------------------------------------------
<<< 浙江的省會在哪?
浙江的省會是杭州。
--------------------------------------------------
<<< 這有什麼好吃的?
浙江的美食非常豐富,比如杭州的西湖醋魚、東坡肉、龍井蝦仁、宋嫂魚羹等都是著名的浙江美食。此外,浙江還有許多小吃,比如油條、燒麥、湯圓、粽子等。
--------------------------------------------------
<<< 晚上睡不著覺怎麼辦
晚上睡不著覺可以嘗試以下幾種方法:

1. 放鬆身心:可以嘗試做一些放鬆身心的活動,比如聽音樂、做瑜伽、冥想等。

2. 保持規律作息:儘量保持每天的作息規律,避免熬夜。

3. 避免刺激性食物:避免吃辛辣、油膩、咖啡因等刺激性食物,這些食物可能會刺激神經系統,導致失眠。

4. 適當運動:適當的運動可以幫助身體放鬆,有助於睡眠。

5. 睡前喝牛奶:牛奶中含有色氨酸,可以幫助身體產生褪黑激素,有助於睡眠。
"""

如果你要進行單樣本推理, 可以參考LLM推理文件

使用CLI:

CUDA_VISIBLE_DEVICES=0 swift infer --model_type qwen1half-4b-chat

3.微調

提示: 因為自我認知訓練涉及到知識編輯, 建議對MLP加lora_target_modules. 你可以透過指定--lora_target_modules ALL在所有的linear層(包括qkvo以及mlp)加lora. 這通常是效果最好的.

使用python:

# Experimental environment: A10, 3090, V100, ...
# 22GB GPU memory
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'

from swift.llm import DatasetName, ModelType, SftArguments, sft_main

sft_args = SftArguments(
    model_type=ModelType.qwen1half_4b_chat,
    dataset=[f'{DatasetName.alpaca_zh}#500', f'{DatasetName.alpaca_en}#500',
             f'{DatasetName.self_cognition}#500'],
    logging_steps=5,
    max_length=2048,
    learning_rate=5e-5,
    warmup_ratio=0.4,
    output_dir='output',
    lora_target_modules=['ALL'],
    model_name=['小黃', 'Xiao Huang'],
    model_author=['魔搭', 'ModelScope'])
output = sft_main(sft_args)
best_model_checkpoint = output['best_model_checkpoint']
print(f'best_model_checkpoint: {best_model_checkpoint}')

"""Out[0]
{'loss': 1.36837471, 'acc': 0.6827153, 'grad_norm': 2.69893861, 'learning_rate': 2.7e-06, 'epoch': 0.01, 'global_step': 1}
{'loss': 1.64843678, 'acc': 0.62217778, 'grad_norm': 1.68335974, 'learning_rate': 1.351e-05, 'epoch': 0.05, 'global_step': 5}
{'loss': 1.81131458, 'acc': 0.59357905, 'grad_norm': 1.78167629, 'learning_rate': 2.703e-05, 'epoch': 0.11, 'global_step': 10}
{'loss': 1.70607147, 'acc': 0.60849266, 'grad_norm': 1.47256434, 'learning_rate': 4.054e-05, 'epoch': 0.16, 'global_step': 15}
{'loss': 1.51096973, 'acc': 0.63005199, 'grad_norm': 0.91772562, 'learning_rate': 5.405e-05, 'epoch': 0.22, 'global_step': 20}
{'loss': 1.5484211, 'acc': 0.62795267, 'grad_norm': 1.11152458, 'learning_rate': 6.757e-05, 'epoch': 0.27, 'global_step': 25}
{'loss': 1.43836861, 'acc': 0.64279995, 'grad_norm': 1.1565901, 'learning_rate': 8.108e-05, 'epoch': 0.33, 'global_step': 30}
{'loss': 1.38720503, 'acc': 0.64892483, 'grad_norm': 0.98939317, 'learning_rate': 9.459e-05, 'epoch': 0.38, 'global_step': 35}
{'loss': 1.28600607, 'acc': 0.67057638, 'grad_norm': 2.26390719, 'learning_rate': 9.455e-05, 'epoch': 0.43, 'global_step': 40}
{'loss': 1.2084446, 'acc': 0.68125477, 'grad_norm': 1.39036703, 'learning_rate': 8.545e-05, 'epoch': 0.49, 'global_step': 45}
{'loss': 1.39412193, 'acc': 0.64913111, 'grad_norm': 0.6860683, 'learning_rate': 7.636e-05, 'epoch': 0.54, 'global_step': 50}
Train:  54%|███████████████████████████████████████████████▊                                        | 50/92 [02:57<02:28,  3.53s/it]
{'eval_loss': 1.54409802, 'eval_acc': 0.5955491, 'eval_runtime': 0.5527, 'eval_samples_per_second': 18.092, 'eval_steps_per_second': 9.046, 'epoch': 0.54, 'global_step': 50}
Val: 100%|████████████████████████████████████████████████████████████████████████████████████████████| 5/5 [00:00<00:00, 13.27it/s]
[INFO:swift] Saving model checkpoint to /xxx/output/qwen1half-4b-chat/v0-20240225-194502/checkpoint-50
{'loss': 1.1771349, 'acc': 0.67886224, 'grad_norm': 1.06721985, 'learning_rate': 6.727e-05, 'epoch': 0.6, 'global_step': 55}
{'loss': 1.25694866, 'acc': 0.67727785, 'grad_norm': 1.27860904, 'learning_rate': 5.818e-05, 'epoch': 0.65, 'global_step': 60}
{'loss': 1.18360176, 'acc': 0.70474091, 'grad_norm': 0.71210742, 'learning_rate': 4.909e-05, 'epoch': 0.71, 'global_step': 65}
{'loss': 1.08381062, 'acc': 0.71071234, 'grad_norm': 1.32174027, 'learning_rate': 4e-05, 'epoch': 0.76, 'global_step': 70}
{'loss': 1.23212566, 'acc': 0.68333907, 'grad_norm': 0.87663323, 'learning_rate': 3.091e-05, 'epoch': 0.82, 'global_step': 75}
{'loss': 1.2107378, 'acc': 0.70353975, 'grad_norm': 0.78985584, 'learning_rate': 2.182e-05, 'epoch': 0.87, 'global_step': 80}
{'loss': 1.32458553, 'acc': 0.6687315, 'grad_norm': 1.25317574, 'learning_rate': 1.273e-05, 'epoch': 0.92, 'global_step': 85}
{'loss': 1.28211155, 'acc': 0.67041779, 'grad_norm': 1.10373855, 'learning_rate': 3.64e-06, 'epoch': 0.98, 'global_step': 90}
Train: 100%|████████████████████████████████████████████████████████████████████████████████████████| 92/92 [05:31<00:00,  3.60s/it]
{'eval_loss': 1.53501475, 'eval_acc': 0.59796807, 'eval_runtime': 0.521, 'eval_samples_per_second': 19.193, 'eval_steps_per_second': 9.597, 'epoch': 1.0, 'global_step': 92}
Val: 100%|████████████████████████████████████████████████████████████████████████████████████████████| 5/5 [00:00<00:00, 13.74it/s]
[INFO:swift] Saving model checkpoint to /xxx/output/qwen1half-4b-chat/v0-20240225-194502/checkpoint-92
"""

使用CLI (單卡):

# Experimental environment: A10, 3090, V100, ...
# 22GB GPU memory
CUDA_VISIBLE_DEVICES=0 \
swift sft \
    --model_type qwen1half-4b-chat \
    --dataset alpaca-zh#500 alpaca-en#500 self-cognition#500 \
    --logging_steps 5 \
    --max_length 2048 \
    --learning_rate 5e-5 \
    --warmup_ratio 0.4 \
    --output_dir output \
    --lora_target_modules ALL \
    --model_name 小黃 'Xiao Huang' \
    --model_author 魔搭 ModelScope \

使用CLI (DeepSpeed-ZeRO2):

如果你使用的是3090等卡, 可以降低max_length來減少視訊記憶體消耗.

# Experimental environment: 4 * 3090
# 4 * 24GB GPU memory
CUDA_VISIBLE_DEVICES=0,1,2,3 \
NPROC_PER_NODE=4 \
swift sft \
    --model_type qwen1half-4b-chat \
    --dataset alpaca-zh#500 alpaca-en#500 self-cognition#500 \
    --logging_steps 5 \
    --max_length 2048 \
    --learning_rate 5e-5 \
    --warmup_ratio 0.4 \
    --output_dir output \
    --lora_target_modules ALL \
    --model_name 小黃 'Xiao Huang' \
    --model_author 魔搭 ModelScope \
    --deepspeed default-zero2

4.微調後推理

你需要設定best_model_checkpoint的值, 該值會在sft的最後被列印出來.

使用python:

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'

from swift.llm import InferArguments, merge_lora, infer_main

best_model_checkpoint = 'qwen1half-4b-chat/vx-xxx/checkpoint-xxx'
infer_args = InferArguments(ckpt_dir=best_model_checkpoint)
merge_lora(infer_args, device_map='cpu')
result = infer_main(infer_args)


"""Out[0]
<<< 你是誰?
我是魔搭的人工智慧助手,我的名字叫小黃。我可以回答你的問題、提供資訊、進行對話等等。如果你有任何問題或需要幫助,請隨時告訴我。
--------------------------------------------------
<<< what's your name?
I am Xiao Huang, an artificial intelligence assistant developed by ModelScope.
--------------------------------------------------
<<< 你是誰研發的?
我是由魔搭研發的。
--------------------------------------------------
<<< 浙江的省會在哪?
浙江省的省會是杭州。
--------------------------------------------------
<<< 這有什麼好吃的?
浙江的美食非常豐富,比如杭州的西湖醋魚、東坡肉、龍井蝦仁等等都是非常有名的菜餚。此外,浙江還有許多小吃,比如油條、燒餅、湯圓等等。
--------------------------------------------------
<<< 晚上睡不著覺怎麼辦
晚上睡不著覺可以嘗試以下幾種方法:
1. 放鬆身心:可以嘗試做一些放鬆身心的活動,比如聽音樂、冥想、深呼吸等等。
2. 保持規律的作息:儘量保持規律的作息,避免熬夜。
3. 避免刺激性物質:避免攝入咖啡因、酒精等刺激性物質,這些物質可能會干擾你的睡眠。
4. 適當運動:適當的運動可以幫助你放鬆身心,提高睡眠質量。
5. 睡前放鬆:可以嘗試一些睡前放鬆的活動,比如閱讀、聽輕音樂、泡熱水澡等等。
希望以上建議能夠幫助你改善睡眠質量。
"""

使用CLI:

# 直接推理
CUDA_VISIBLE_DEVICES=0 swift infer --ckpt_dir 'qwen1half-4b-chat/vx-xxx/checkpoint-xxx'

# Merge LoRA增量權重並推理
# 如果你需要量化, 可以指定`--quant_bits 4`.
CUDA_VISIBLE_DEVICES=0 swift export \
    --ckpt_dir 'qwen1half-4b-chat/vx-xxx/checkpoint-xxx' --merge_lora true
CUDA_VISIBLE_DEVICES=0 swift infer --ckpt_dir 'qwen1half-4b-chat/vx-xxx/checkpoint-xxx-merged'

5.Web-UI

使用python:

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'

from swift.llm import AppUIArguments, merge_lora, app_ui_main

best_model_checkpoint = 'qwen1half-4b-chat/vx-xxx/checkpoint-xxx'
app_ui_args = AppUIArguments(ckpt_dir=best_model_checkpoint)
merge_lora(app_ui_args, device_map='cpu')
result = app_ui_main(app_ui_args)

使用CLI:

# 直接使用app-ui
CUDA_VISIBLE_DEVICES=0 swift app-ui --ckpt_dir 'qwen1half-4b-chat/vx-xxx/checkpoint-xxx'

# Merge LoRA增量權重並使用app-ui
# 如果你需要量化, 可以指定`--quant_bits 4`.
CUDA_VISIBLE_DEVICES=0 swift export \
    --ckpt_dir 'qwen1half-4b-chat/vx-xxx/checkpoint-xxx' --merge_lora true
CUDA_VISIBLE_DEVICES=0 swift app-ui --ckpt_dir 'qwen1half-4b-chat/vx-xxx/checkpoint-xxx-merged'

更多優質內容請關注公號:汀丶人工智慧;會提供一些相關的資源和優質文章,免費獲取閱讀。

相關文章