通義千問Qwen-72B-Chat大模型在PAI平臺的微調(diào)實踐

作者:熊兮棚愤、賀弘、臨在

通義千問-72B(Qwen-72B)是阿里云研發(fā)的通義千問大模型系列的720億參數(shù)規(guī)模的大語言模型揩页,在2023年11月正式開源来累。Qwen-72B的預(yù)訓(xùn)練數(shù)據(jù)類型多樣、覆蓋廣泛懂扼,包括大量網(wǎng)絡(luò)文本禁荸、專業(yè)書籍、代碼等阀湿。Qwen-72B-Chat是在Qwen-72B的基礎(chǔ)上赶熟,使用對齊機(jī)制打造的基于大語言模型的AI助手。

阿里云人工智能平臺PAI是面向開發(fā)者和企業(yè)的機(jī)器學(xué)習(xí)/深度學(xué)習(xí)平臺陷嘴,提供包含數(shù)據(jù)標(biāo)注钧大、模型構(gòu)建、模型訓(xùn)練罩旋、模型部署啊央、推理優(yōu)化在內(nèi)的AI開發(fā)全鏈路服務(wù)。

本文將以Qwen-72B-Chat為例涨醋,介紹如何在PAI平臺的快速開始PAI-QuickStart和交互式建模工具PAI-DSW中高效微調(diào)千問大模型瓜饥。

使用PAI-DSW快速體驗和輕量化微調(diào)Qwen-72B-Chat

PAI-DSW是云端機(jī)器學(xué)習(xí)開發(fā)IDE,為用戶提供交互式編程環(huán)境浴骂,同時提供了豐富的計算資源乓土。Qwen-72B-Chat的教程可以在智碼實驗室(https://gallery.pai-ml.com/)Notebook Gallery中檢索到,參見下圖:

image.png

上述Notebook可以使用阿里云PAI-DSW的實例打開溯警,并且需要選擇對應(yīng)的計算資源和鏡像趣苏。

快速體驗Qwen-72B-Chat

首先,我們在DSW調(diào)用ModelScope快速體驗Qwen-72B-Chat模型進(jìn)行對話梯轻。在安裝完ModelScope相關(guān)依賴后食磕,我們可以運行如下Python代碼:

from modelscope import AutoModelForCausalLM, AutoTokenizer
from modelscope import GenerationConfig

# Note: The default behavior now has injection attack prevention off.
tokenizer = AutoTokenizer.from_pretrained("qwen/Qwen-72B-Chat", revision='master', trust_remote_code=True)

# use bf16
# model = AutoModelForCausalLM.from_pretrained("qwen/Qwen-72B-Chat", device_map="auto", trust_remote_code=True, bf16=True).eval()
# use fp16
# model = AutoModelForCausalLM.from_pretrained("qwen/Qwen-72B-Chat", device_map="auto", trust_remote_code=True, fp16=True).eval()
# use cpu only
# model = AutoModelForCausalLM.from_pretrained("qwen/Qwen-72B-Chat", device_map="cpu", trust_remote_code=True).eval()
# use auto mode, automatically select precision based on the device.
model = AutoModelForCausalLM.from_pretrained("qwen/Qwen-72B-Chat", revision='master', device_map="auto", trust_remote_code=True).eval()

# 第一輪對話 1st dialogue turn
response, history = model.chat(tokenizer, "你好", history=None)
print(response)
# 你好!很高興為你提供幫助喳挑。

# 第二輪對話 2nd dialogue turn
response, history = model.chat(tokenizer, "給我講一個年輕人奮斗創(chuàng)業(yè)最終取得成功的故事彬伦。", history=history)
print(response)
# 這是一個關(guān)于一個年輕人奮斗創(chuàng)業(yè)最終取得成功的故事滔悉。
# 故事的主人公叫李明,他來自一個普通的家庭单绑,父母都是普通的工人回官。從小,李明就立下了一個目標(biāo):要成為一名成功的企業(yè)家搂橙。
# 為了實現(xiàn)這個目標(biāo)歉提,李明勤奮學(xué)習(xí),考上了大學(xué)区转。在大學(xué)期間唯袄,他積極參加各種創(chuàng)業(yè)比賽,獲得了不少獎項蜗帜。他還利用課余時間去實習(xí)恋拷,積累了寶貴的經(jīng)驗。
# 畢業(yè)后厅缺,李明決定開始自己的創(chuàng)業(yè)之路蔬顾。他開始尋找投資機(jī)會,但多次都被拒絕了湘捎。然而诀豁,他并沒有放棄。他繼續(xù)努力窥妇,不斷改進(jìn)自己的創(chuàng)業(yè)計劃舷胜,并尋找新的投資機(jī)會。
# 最終活翩,李明成功地獲得了一筆投資烹骨,開始了自己的創(chuàng)業(yè)之路。他成立了一家科技公司材泄,專注于開發(fā)新型軟件沮焕。在他的領(lǐng)導(dǎo)下,公司迅速發(fā)展起來拉宗,成為了一家成功的科技企業(yè)峦树。
# 李明的成功并不是偶然的。他勤奮旦事、堅韌魁巩、勇于冒險,不斷學(xué)習(xí)和改進(jìn)自己姐浮。他的成功也證明了谷遂,只要努力奮斗,任何人都有可能取得成功单料。

# 第三輪對話 3rd dialogue turn
response, history = model.chat(tokenizer, "給這個故事起一個標(biāo)題", history=history)
print(response)
# 《奮斗創(chuàng)業(yè):一個年輕人的成功之路》

為了節(jié)省顯存埋凯,ModelScope也支持使用Int4/Int8量化模型:

from modelscope import AutoModelForCausalLM, AutoTokenizer
from modelscope import GenerationConfig

tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen-72B-Chat-Int4", revision='master', trust_remote_code=True)

model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen-72B-Chat-Int4",
    device_map="auto",
    trust_remote_code=True
).eval()
response, history = model.chat(tokenizer, "你好", history=None)

輕量化微調(diào)Qwen-72B-Chat

輕量化微調(diào)Qwen-72B-Chat最佳實踐支持最主流的輕量化微調(diào)算法LoRA点楼,并且需要使用A800(80GB)4卡及以上資源進(jìn)行計算扫尖。以下白对,我們簡述輕量化微調(diào)Qwen-72B-Chat的算法流程。首先换怖,我們下載Qwen-72B-Chat的Checkpoint和用于LoRA微調(diào)的數(shù)據(jù)集甩恼,用戶也可以按照上述格式自行準(zhǔn)備數(shù)據(jù)集。

def aria2(url, filename, d):
    !aria2c --console-log-level=error -c -x 16 -s 16 {url} -o {filename} -d wdokkug

qwen72b_url = f"http://pai-vision-data-inner-wulanchabu.oss-cn-wulanchabu-internal.aliyuncs.com/qwen72b/Qwen-72B-Chat-sharded.tar"
aria2(qwen72b_url, qwen72b_url.split("/")[-1], "/root/")

!cd /root && tar -xvf Qwen-72B-Chat-sharded.tar
!wget -c http://pai-vision-data-inner-wulanchabu.oss-cn-wulanchabu.aliyuncs.com/qwen72b/sharegpt_zh_1K.json -P /workspace/Qwen

第二步沉颂,我們可以修改示例命令的超參數(shù)条摸,并且拉起訓(xùn)練任務(wù)。

! cd /workspace/Qwen && CUDA_DEVICE_MAX_CONNECTIONS=1 torchrun --nproc_per_node 8 \
--nnodes 1 \
--node_rank 0 \
--master_addr localhost \
--master_port 6001 \
finetune.py \
--model_name_or_path /root/Qwen-72B-Chat-sharded \
--data_path sharegpt_zh_1K.json \
--bf16 True \
--output_dir /root/output_qwen \
--num_train_epochs 1 \
--per_device_train_batch_size 1 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 8 \
--evaluation_strategy "no" \
--save_strategy "steps" \
--save_steps 1000 \
--save_total_limit 1 \
--learning_rate 3e-4 \
--weight_decay 0.1 \
--adam_beta2 0.95 \
--warmup_ratio 0.01 \
--lr_scheduler_type "cosine" \
--logging_steps 1 \
--report_to "none" \
--model_max_length 2048 \
--lazy_preprocess True \
--use_lora \
--gradient_checkpointing \
--deepspeed finetune/ds_config_zero3.json

當(dāng)訓(xùn)練結(jié)束后铸屉,將LoRA權(quán)重合并到模型Checkpoint钉蒲。

from peft import AutoPeftModelForCausalLM

model = AutoPeftModelForCausalLM.from_pretrained(
    '/root/output_qwen', # path to the output directory
    device_map="auto",
    trust_remote_code=True
).eval()
merged_model = model.merge_and_unload()
merged_model.save_pretrained('/root/qwen72b_sft', max_shard_size="2048MB", safe_serialization=True)

!cp /root/Qwen-72B-Chat-sharded/qwen.tiktoken /root/qwen72b_sft/
!cp /root/Qwen-72B-Chat-sharded/tokenization_qwen.py /root/qwen72b_sft/
!cp /root/Qwen-72B-Chat-sharded/tokenizer_config.json /root/qwen72b_sft/

最后,我們使用輕量化微調(diào)后的Qwen-72B-Chat模型進(jìn)行推理彻坛。以推理框架vllm為例顷啼,推理接口如下:

from vllm import LLM
from vllm.sampling_params import SamplingParams

qwen72b = LLM("/root/qwen72b_sft/", tensor_parallel_size=2, trust_remote_code=True, gpu_memory_utilization=0.99)
samplingparams = SamplingParams(temperature=0.0, max_tokens=512, stop=['<|im_end|>'])
prompt = """<|im_start|>system
<|im_end|>
<|im_start|>user
<|im_end|>
Hello! What is your name?<|im_end|>
<|im_start|>assistant
"""
output = qwen72b.generate(prompt, samplingparams)
print(output)

其中,tensor_parallel_size需要根據(jù)DSW示例配置中的GPU數(shù)量進(jìn)行調(diào)整昌屉。

使用PAI-QuickStart全量參數(shù)微調(diào)Qwen-72B-Chat

快速開始(PAI-QuickStart)是PAI產(chǎn)品組件钙蒙,集成了國內(nèi)外AI開源社區(qū)中優(yōu)質(zhì)的預(yù)訓(xùn)練模型,支持零代碼實現(xiàn)全量參數(shù)微調(diào)Qwen-72B-Chat间驮。PAI-QuickStart的這一款全量參數(shù)微調(diào)組件使用PAI靈駿智算服務(wù)作為底層計算資源躬厌,使用4機(jī)32卡(每卡80GB顯存)進(jìn)行訓(xùn)練。Qwen-72B-Chat的全量參數(shù)微調(diào)基于Megatron-LM的訓(xùn)練流程竞帽,支持了數(shù)據(jù)并行扛施、算子拆分、流水并行屹篓、序列并行煮嫌、選擇性激活重算、Zero顯存優(yōu)化等技術(shù)抱虐,大幅提升大模型分布式訓(xùn)練效率昌阿。在這一組件中,我們提前對模型Checkpoint進(jìn)行了切分恳邀,適配多機(jī)多卡環(huán)境訓(xùn)練懦冰,用戶只需根據(jù)格式要求準(zhǔn)備訓(xùn)練集和驗證集,配置訓(xùn)練時候使用的超參數(shù)就可以一鍵拉起訓(xùn)練任務(wù)谣沸。

通過控制臺使用

Qwen-72B-Chat的模型卡片如下圖所示:

image.png

我們可以根據(jù)實際需求調(diào)整超參數(shù)刷钢,例如learning_rate、sequence_length乳附、train_iters等内地,如下所示:

image.png

點擊“訓(xùn)練”按鈕伴澄,PAI-QuickStart自動跳轉(zhuǎn)到模型訓(xùn)練頁面,并且開始進(jìn)行訓(xùn)練阱缓,用戶可以查看訓(xùn)練任務(wù)狀態(tài)和訓(xùn)練日志非凌,如下所示:

image.png

在訓(xùn)練結(jié)束后,可以在輸出路徑的OSS Bucket中查看每次保存的Checkpoint模型切片荆针,如下所示:

image.png

用戶可以根據(jù)實際情況敞嗡,選擇最合適的Checkpoint進(jìn)行推理和部署,具體流程參見這里航背,本文不再贅述喉悴。

通過PAI Python SDK使用

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市玖媚,隨后出現(xiàn)的幾起案子箕肃,更是在濱河造成了極大的恐慌,老刑警劉巖今魔,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勺像,死亡現(xiàn)場離奇詭異,居然都是意外死亡涡贱,警方通過查閱死者的電腦和手機(jī)咏删,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來问词,“玉大人督函,你說我怎么就攤上這事〖づ玻” “怎么了辰狡?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長垄分。 經(jīng)常有香客問我宛篇,道長,這世上最難降的妖魔是什么薄湿? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任叫倍,我火速辦了婚禮,結(jié)果婚禮上豺瘤,老公的妹妹穿的比我還像新娘吆倦。我一直安慰自己,他們只是感情好坐求,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布蚕泽。 她就那樣靜靜地躺著,像睡著了一般桥嗤。 火紅的嫁衣襯著肌膚如雪须妻。 梳的紋絲不亂的頭發(fā)上仔蝌,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音荒吏,去河邊找鬼敛惊。 笑死,一個胖子當(dāng)著我的面吹牛司倚,可吹牛的內(nèi)容都是我干的豆混。 我是一名探鬼主播篓像,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼动知,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了员辩?” 一聲冷哼從身側(cè)響起盒粮,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奠滑,沒想到半個月后丹皱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡宋税,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年摊崭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杰赛。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡呢簸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乏屯,到底是詐尸還是另有隱情根时,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布辰晕,位于F島的核電站蛤迎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏含友。R本人自食惡果不足惜替裆,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窘问。 院中可真熱鬧辆童,春花似錦、人聲如沸南缓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汉形。三九已至纸镊,卻和暖如春倍阐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逗威。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工峰搪, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凯旭。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓概耻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親罐呼。 傳聞我的和親對象是個殘疾皇子鞠柄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容