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