基于SWIFT和Qwen1.5-14B-Chat進(jìn)行大模型LoRA微調(diào)測(cè)試
環(huán)境準(zhǔn)備
基礎(chǔ)環(huán)境
- 操作系統(tǒng):Ubuntu 18.04.5 LTS (GNU/Linux 3.10.0-1127.el7.x86_64 x86_64)
- Anaconda3:Anaconda3-2023.03-1-Linux-x86_64
- 根據(jù)服務(wù)器網(wǎng)絡(luò)情況配置好conda源和pip源,此處使用的是超算山河源
- 服務(wù)器硬件配置:CPU 96核;GPU 8×NVIDIA A100 40GB
環(huán)境安裝
通過(guò)源代碼安裝SWIFT:
創(chuàng)建一個(gè)新的conda環(huán)境:
conda create --name swift python=3.8
激活剛剛創(chuàng)建的conda環(huán)境:
conda activate swift
下載SWIFT源碼:
git clone https://github.com/modelscope/swift.git
切換到SWIFT路徑:
cd /yldm0226/swift
安裝SWIFT:
pip install -e .[llm]
非必要步驟:檢查服務(wù)器cuda版本是否與當(dāng)前安裝的pytorch對(duì)應(yīng),詳見(jiàn):搭建一個(gè)大模型API服務(wù)
數(shù)據(jù)集準(zhǔn)備
對(duì)于數(shù)據(jù)集,我們均采用json或jsonl的格式。
在做大模型SFT(Supervised Fine-Tuning)時(shí),可以準(zhǔn)備兩種數(shù)據(jù):
- 單輪問(wèn)答
- 多輪對(duì)話
對(duì)于單輪問(wèn)答數(shù)據(jù),其格式可以為:
{"query": "11111", "response": "22222"}
對(duì)于多輪對(duì)話數(shù)據(jù),其格式可以為:
{"query": "eeeee", "response": "fffff", "history": []}
{"query": "EEEEE", "response": "FFFFF", "history": [["AAAAA", "BBBBB"], ["CCCCC", "DDDDD"]]}
同時(shí),也可以用以下兩種格式的數(shù)據(jù):
{"conversations": [{"from": "user", "value": "11111"}, {"from": "assistant", "value": "22222"}]}
{"conversations": [{"from": "user", "value": "aaaaa"}, {"from": "assistant", "value": "bbbbb"}, {"from": "user", "value": "ccccc"}, {"from": "assistant", "value": "ddddd"}]}
{"conversations": [{"from": "user", "value": "AAAAA"}, {"from": "assistant", "value": "BBBBB"}, {"from": "user", "value": "CCCCC"}, {"from": "assistant", "value": "DDDDD"}]}
{"messages": [{"role": "user", "content": "11111"}, {"role": "assistant", "content": "22222"}]}
{"messages": [{"role": "user", "content": "aaaaa"}, {"role": "assistant", "content": "bbbbb"}, {"role": "user", "content": "ccccc"}, {"role": "assistant", "content": "ddddd"}]}
{"messages": [{"role": "user", "content": "AAAAA"}, {"role": "assistant", "content": "BBBBB"}, {"role": "user", "content": "CCCCC"}, {"role": "assistant", "content": "DDDDD"}]}
在本文中,共使用了9個(gè)數(shù)據(jù)集,數(shù)據(jù)集的詳細(xì)信息如下:
序號(hào) | 數(shù)據(jù)集 | 簡(jiǎn)介 | 數(shù)據(jù)量 |
---|---|---|---|
1 | Chinese_medical_dialogue_six_department | 中文醫(yī)療問(wèn)答數(shù)據(jù)集,包括男科、內(nèi)科、婦產(chǎn)科、腫瘤科、兒科、外科六個(gè)科室的問(wèn)題。 | 792K |
2 | HuatuoGPT2_sft_instruct_GPT4 | 華佗GPT(HuatuoGPT)第二版訓(xùn)練數(shù)據(jù)集。 | 50K |
3 | ChatMed_Consult-v0.3 | 中文醫(yī)療在線問(wèn)診數(shù)據(jù)集ChatMed_Consult_Dataset的50w+在線問(wèn)診+ChatGPT回復(fù)。 | 500K |
4 | ChatMed_TCM-v0.2 | 以開(kāi)源的中醫(yī)藥知識(shí)圖譜為基礎(chǔ),采用以實(shí)體為中心的自指令方法(entity-centric self-instruct),調(diào)用ChatGPT得到11w+的圍繞中醫(yī)藥的指令數(shù)據(jù)。 | 110K |
5 | QiZhen_sft_20k | 包含20k訓(xùn)練數(shù)據(jù)(該數(shù)據(jù)集來(lái)自于啟真醫(yī)學(xué)知識(shí)庫(kù)收集整理的真實(shí)醫(yī)患知識(shí)問(wèn)答數(shù)據(jù)以及在啟真醫(yī)學(xué)知識(shí)庫(kù)的藥品文本知識(shí)基礎(chǔ)上,通過(guò)對(duì)半結(jié)構(gòu)化數(shù)據(jù)設(shè)置特定的問(wèn)題模板構(gòu)造的指令數(shù)據(jù))。 | 20K |
6 | Huatuo_Lite | Huatuo-Lite 是在Huatuo26M數(shù)據(jù)集的基礎(chǔ)上經(jīng)過(guò)多次提純和重寫而精煉優(yōu)化的數(shù)據(jù)集。它包含了18萬(wàn)個(gè)高質(zhì)量的醫(yī)療問(wèn)答對(duì),并具有醫(yī)院科室和相關(guān)疾病兩個(gè)額外的數(shù)據(jù)維度。 | 180K |
7 | ZhongJing_CMtMedQA | 仲景SFT訓(xùn)練集。 | 70K |
8 | DISC-Med-SFT_released | 包含了超過(guò)47萬(wàn)個(gè)衍生于現(xiàn)有的醫(yī)療數(shù)據(jù)集重新構(gòu)建得到的樣本。采用了目標(biāo)導(dǎo)向的策略,通過(guò)對(duì)于精心選擇的幾個(gè)數(shù)據(jù)源進(jìn)行重構(gòu)來(lái)得到SFT數(shù)據(jù)集。這些數(shù)據(jù)的作用在于幫助模型學(xué)習(xí)醫(yī)療領(lǐng)域知識(shí),將行為模式與人類偏好對(duì)齊,并對(duì)齊真實(shí)世界在線醫(yī)療對(duì)話的分布情況。 | 514K |
9 | SZY_TCM_QA | 私有數(shù)據(jù)集。 | 12K |
以下是加載后的數(shù)據(jù)集信息:
[INFO:swift] train_dataset: Dataset({
features: ['query', 'response', 'history'],
num_rows: 2223540
})
[INFO:swift] val_dataset: Dataset({
features: ['query', 'response', 'history'],
num_rows: 22460
})
數(shù)據(jù)總量為2,246,000,從中抽取出約1%作為驗(yàn)證集,其余的作為訓(xùn)練集。
通過(guò)max_lengt=4096進(jìn)行過(guò)濾后的數(shù)據(jù)集信息如下:
[INFO:swift] Dataset Token Length: 224.276768±159.001432, min=25.000000, max=4089.000000, size=2223411
[INFO:swift] Dataset Token Length: 224.254464±157.600093, min=28.000000, max=3086.000000, size=22459
編寫微調(diào)腳本
SWIFT框架提供了部分大模型的微調(diào)腳本,可以在我們下載的源碼中的swift/examples/pytorch/llm/scripts路徑中找到這些腳本。如果這些腳本能夠滿足我們大部分的微調(diào)需求,我們可以選擇直接對(duì)這些腳本進(jìn)行修改。如果找不到我們需要的腳本,需要我們根據(jù)swift/docs/source/LLM中的命令行參數(shù)文檔自行編寫訓(xùn)練腳本。
以下是對(duì)Qwen1.5-14B-Chat進(jìn)行LoRA微調(diào)的一個(gè)訓(xùn)練腳本:
nproc_per_node=8
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
NPROC_PER_NODE=$nproc_per_node \
MASTER_PORT=29500 \
swift sft \
--model_type qwen1half-14b-chat \
--model_id_or_path /yldm0226/models/Qwen1.5-14B-Chat \
--model_revision master \
--sft_type lora \
--tuner_backend swift \
--template_type qwen \
--dtype AUTO \
--output_dir /yldm0226/llm_sft_output \
--ddp_backend nccl \
--custom_train_dataset_path /yldm0226/data/1-Chinese_medical_dialogue_six_department.jsonl /yldm0226/data/2-HuatuoGPT2_sft_instruct_GPT4.jsonl /yldm0226/data/3-ChatMed_Consult-v0.3.jsonl /yldm0226/data/4-ChatMed_TCM-v0.2.jsonl /yldm0226/data/5-QiZhen_sft_20k.jsonl /yldm0226/data/6-Huatuo_Lite.jsonl /yldm0226/data/7-ZhongJing_CMtMedQA.jsonl /yldm0226/data/8-DISC-Med-SFT_released.jsonl /yldm0226/data/9-SZY_TCM_QA.jsonl \
--train_dataset_sample -1 \
--num_train_epochs 1 \
--max_length 4096 \
--check_dataset_strategy warning \
--lora_rank 8 \
--lora_alpha 32 \
--lora_dropout_p 0.05 \
--lora_target_modules ALL \
--gradient_checkpointing true \
--batch_size 1 \
--weight_decay 0.01 \
--learning_rate 1e-4 \
--gradient_accumulation_steps $(expr 64 / $nproc_per_node) \
--max_grad_norm 0.5 \
--warmup_ratio 0.03 \
--eval_steps 100 \
--save_steps 100 \
--save_total_limit 3 \
--logging_steps 10 \
--use_flash_attn false \
--deepspeed default-zero3 \
--save_only_model true
該腳本中的一些參數(shù)在基于SWIFT和Qwen1.5-14B-Chat進(jìn)行大模型全參微調(diào)測(cè)試中已經(jīng)解釋過(guò)了,此處簡(jiǎn)單介紹一下與LoRA相關(guān)的幾個(gè)參數(shù),如果你想了解LoRA具體的原理,請(qǐng)閱讀該論文LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS:
lora_rank
:微調(diào)中的秩大小。秩的值并不是越大越好,此處設(shè)置的8是LoRA原論文中測(cè)試的最優(yōu)解,根據(jù)論文中的結(jié)果,1或者2這種很小的秩的表現(xiàn)也是很好的。
lora_alpha
:LoRA 微調(diào)中的縮放系數(shù)。
lora_dropout_p
:LoRA 微調(diào)中的 Dropout 系數(shù)。
lora_target_modules
:指定lora模塊, 默認(rèn)為['DEFAULT']
. 如果lora_target_modules傳入'DEFAULT'
or 'AUTO'
, 則根據(jù)model_type
查找MODEL_MAPPING
中的lora_target_modules
(默認(rèn)指定為qkv)。如果傳入'ALL'
, 則將所有的Linear層(不含head)指定為lora模塊。 如果傳入'EMBEDDING'
, 則Embedding層指定為lora模塊。 如果內(nèi)存允許, 建議設(shè)置成'ALL'。 當(dāng)然, 你也可以設(shè)置['ALL', 'EMBEDDING']
, 將所有的Linear和embedding層指定為lora模塊。該參數(shù)只有當(dāng)sft_type
指定為'lora'時(shí)才生效。
deepspeed
:用于指定deepspeed的配置文件的路徑或者直接傳入json格式的配置信息, 默認(rèn)為None
, 即不開(kāi)啟deepspeed. deepspeed可以節(jié)約顯存。 SWIFT書寫了默認(rèn)的ZeRO-2配置文件, ZeRO-3配置文件。你只需要指定'default-zero2', 就會(huì)使用默認(rèn)zero2配置文件; 指定'default-zero3', 就會(huì)使用默認(rèn)的zero3配置文件。
測(cè)試
以下是訓(xùn)練過(guò)程中的部分輸出:
{'loss': 3.91967845, 'acc': 0.46053511, 'learning_rate': 0.0, 'epoch': 0.0, 'global_step': 1}
{'loss': 3.13938289, 'acc': 0.50242286, 'learning_rate': 3.313e-05, 'epoch': 0.0, 'global_step': 10}
{'loss': 2.02636986, 'acc': 0.56641636, 'learning_rate': 4.31e-05, 'epoch': 0.0, 'global_step': 20}
{'loss': 1.51573572, 'acc': 0.62124624, 'learning_rate': 4.894e-05, 'epoch': 0.0, 'global_step': 30}
{'loss': 1.37469482, 'acc': 0.65222416, 'learning_rate': 5.308e-05, 'epoch': 0.0, 'global_step': 40}
{'loss': 1.44527245, 'acc': 0.64013515, 'learning_rate': 5.629e-05, 'epoch': 0.0, 'global_step': 50}
{'loss': 1.36220665, 'acc': 0.65485716, 'learning_rate': 5.891e-05, 'epoch': 0.0, 'global_step': 60}
{'loss': 1.34706726, 'acc': 0.65729899, 'learning_rate': 6.113e-05, 'epoch': 0.0, 'global_step': 70}
{'loss': 1.3558219, 'acc': 0.65412712, 'learning_rate': 6.305e-05, 'epoch': 0.0, 'global_step': 80}
{'loss': 1.38924046, 'acc': 0.6498558, 'learning_rate': 6.475e-05, 'epoch': 0.0, 'global_step': 90}
{'loss': 1.31848869, 'acc': 0.66292844, 'learning_rate': 6.626e-05, 'epoch': 0.0, 'global_step': 100}
Train: 0%|▌ | 100/34740 [20:07<113:54:29, 11.84s/it]
Val: 22%|████████████████████████████████████████████ | 615/2808 [04:56<17:36, 2.07it/s]
訓(xùn)練一個(gè)epoch大約需要114小時(shí);進(jìn)行一次驗(yàn)證大約需要22分鐘。(這里的時(shí)間只是一個(gè)大概值,在訓(xùn)練時(shí),不同數(shù)據(jù)的處理速度不同,花費(fèi)的總時(shí)間會(huì)一直變化)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-837691.html
相比于全參,LoRA的微調(diào)方式能夠節(jié)約大量的顯存,因此我們可以將nproc_per_node設(shè)置的大一些,以提高訓(xùn)練的速度。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-837691.html
到了這里,關(guān)于基于SWIFT和Qwen1.5-14B-Chat進(jìn)行大模型LoRA微調(diào)測(cè)試的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!