通義千問Qwen-72B-Chat基于PAI的低代碼微調(diào)部署實踐

作者:熊兮、求伯、一耘

引言

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

阿里云人工智能平臺PAI是面向開發(fā)者和企業(yè)的機器學(xué)習(xí)/深度學(xué)習(xí)平臺,提供AI開發(fā)全鏈路服務(wù)。快速開始(PAI-QuickStart)是阿里云人工智能平臺PAI的產(chǎn)品組件,它集成了國內(nèi)外 AI 開源社區(qū)中優(yōu)質(zhì)的預(yù)訓(xùn)練模型,支持零代碼和 SDK 的方式實現(xiàn)從訓(xùn)練到部署再到推理的全過程,大大簡化了模型的開發(fā)和部署,為開發(fā)者和企業(yè)用戶帶來了更快、更高效、更便捷的 AI 開發(fā)和應(yīng)用體驗。

本文將以 Qwen-72B-Chat 為例,介紹如何通過PAI平臺的快速開始(PAI-QuickStart)部署和微調(diào)千問大模型。

運行環(huán)境要求

  • 本示例目前僅支持在阿里云烏蘭察布地域,使用靈駿集群環(huán)境運行。
  • 資源配置要求:GPU 推薦使用 GU108(80GB),推理需要4卡及以上資源,微調(diào)需要4機32卡及以上資源。
  • 阿里云 PAI 靈駿智算服務(wù)資源開通和管理請參考官網(wǎng)文檔:

靈駿智算資源的開通購買

通過PAI控制臺使用模型

開發(fā)者可以在 PAI 控制臺的“快速開始”入口,找到 Qwen-72B-Chat 的模型,Qwen-72B-Chat 的模型卡片如下圖所示:

image.png

模型部署和調(diào)用

通過“模型部署”入口,用戶選擇使用的靈駿資源信息,點擊部署按鈕,即可將模型部署到 PAI-EAS 推理服務(wù)平臺。


image.png

通過部署的在線服務(wù)的詳情頁,用戶可以查看服務(wù)訪問地址(Endpoint)和訪問憑證(Token),然后用于調(diào)用推理HTTP API。使用 cURL 調(diào)用推理服務(wù)的示例如下。

注意,因為模型較大,加載時間較長,用戶可以在服務(wù)啟動之后,通過以下的“查看模型列表”API查看服務(wù)當(dāng)前加載完成的模型。

# 請注意替換為使用服務(wù)的Endpoint和Token
export API_ENDPOINT="<ENDPOINT>"
export API_TOKEN="<TOKEN>"

# 查看模型list
curl $API_ENDPOINT/v1/models \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $API_TOKEN"

# 調(diào)用通用的文本生成API
curl $API_ENDPOINT/v1/completions \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $API_TOKEN" \
    -d '{
      "model": "qwen-72b-chat",
      "prompt": "San Francisco is a",
      "max_tokens": 256,
      "temperature": 0,
      "stop": ["<|im_end|>", "<|im_start|>"]
}'

# 調(diào)用對話API
curl $API_ENDPOINT/v1/chat/completions \
    -H "Authorization: Bearer $API_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{
      "model": "qwen-72b-chat",
      "messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "介紹一下上海的歷史"}
      ],
      "stop": ["<|im_end|>", "<|im_start|>"]
      }'

用戶也可以通過 openai SDK 的方式進行調(diào)用,首先需要安裝調(diào)用SDK:

# 安裝服務(wù)調(diào)用SDK
python -m pip install openai

通過 SDK 調(diào)用服務(wù)的示例如下,請注意替換代碼中使用的訪問地址和訪問憑證。

import openai

# 請使用服務(wù)詳情頁獲取的訪問地址(ENDPOINT)和訪問憑證(TOKEN)替換以下代碼的配置。
openai.api_key = "<TOKEN>"
openai.base_url = "<ENDPOINT>" + "/v1"


# 調(diào)用對話API
completion = openai.chat.completions.create(
    model="qwen-72b-chat",
    temperature=0.0,
    top_p=0.8,
    frequency_penalty=0.0,
    messages=[{"role": "user", "content": "請介紹下你自己。"}],
    stop=["<|im_end|>", "<|im_start|>"],
    # stream=True,
)
# 打印輸出內(nèi)容
print(completion.choices[0].message.content)

模型微調(diào)訓(xùn)練

PAI-QuickStart 支持的 Qwen-72B-Chat 的全量參數(shù)微調(diào)基于 Megatron-LM 的訓(xùn)練流程,支持了數(shù)據(jù)并行、算子拆分、流水并行、序列并行、選擇性激活重算、Zero顯存優(yōu)化等技術(shù),大幅提升大模型分布式訓(xùn)練效率。在這一算法組件中,我們提前對模型Checkpoint進行了切分,適配多機多卡環(huán)境訓(xùn)練,開發(fā)者只需根據(jù)格式要求準(zhǔn)備訓(xùn)練集和驗證集,配置任務(wù)超參數(shù)或是使用模型預(yù)置的默認(rèn)超參,就可以一鍵拉起訓(xùn)練任務(wù)。

微調(diào)算法的超參支持如下:

超參數(shù) 類型 默認(rèn)值 是否必須 描述
learning_rate Float 1e-05 True 用于控制模型權(quán)重更新的步長。
min_learning_rate Float 1e-05 True 最小學(xué)習(xí)速率是在使用動態(tài)調(diào)整學(xué)習(xí)速率策略時設(shè)置的下限。
sequence_length Int 2048 True 序列長度是指模型在一次訓(xùn)練中處理的輸入數(shù)據(jù)的長度。
save_interval Int 1000 True 保存間隔是指模型在訓(xùn)練過程中每隔多少迭代次數(shù)保存一次模型狀態(tài)。
train_iters Int 2000 True 訓(xùn)練迭代次數(shù)是指模型在整個訓(xùn)練過程中將完成的總迭代次數(shù)。
learning_rate_warmup_iters Int 0 True 學(xué)習(xí)速率預(yù)熱迭代次數(shù)是指在訓(xùn)練開始的一段時間內(nèi),學(xué)習(xí)速率將逐漸從較低值增加到預(yù)設(shè)的學(xué)習(xí)速率的過程中所經(jīng)過的迭代次數(shù)。

通過模型詳情的“微調(diào)訓(xùn)練”入口,我們可以根據(jù)實際需求調(diào)整超參數(shù),例如learning_rate、sequence_length、train_iters等,如下所示:

算法的訓(xùn)練和驗證數(shù)據(jù)集接受Json格式輸入,每條數(shù)據(jù)由問題、答案組成,分別用"instruction"和"output"字段表示,例如:

[
    {
        "instruction": "寫一首以“寓居夜感”為題的詩:",
        "output": "獨坐晚涼侵,客窗秋意深。風(fēng)沙疑化霧,夜氣欲成霖。家務(wù)勞人倦,濃茶代酒斟。哀鴻鳴四野,一并助長吟。"    
     },
    {
        "instruction": "寫一首以“次答友人思鄉(xiāng)詩”為題的詩:",
        "output": "閱盡滄桑萬事空,何如歸臥夕陽中。并州最是傷心地,四十馀年噩夢同。"    
     }
]

用戶可以通過將數(shù)據(jù)準(zhǔn)備到到OSS Bucket上,然后在“數(shù)據(jù)集”配置中選擇使用。

image.png

當(dāng)前算法僅支持使用靈駿資源進行訓(xùn)練,在提交訓(xùn)練作業(yè)之前,用戶需要配置使用的靈駿資源ID。

在完成以上配置之后,點擊“訓(xùn)練”按鈕,PAI-QuickStart自動跳轉(zhuǎn)到模型訓(xùn)練頁面,并且開始進行訓(xùn)練,用戶可以查看訓(xùn)練任務(wù)狀態(tài)和訓(xùn)練日志,如下所示:

image.png

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

image.png

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

通過PAI Python SDK使用模型

PAI-QuickStart 提供的預(yù)訓(xùn)練模型,也支持通過PAI Python SDK進行調(diào)用,詳細(xì)流程可以參考文檔:使用預(yù)訓(xùn)練模型 — PAI Python SDK

我們首先需要安裝和配置PAI Python SDK,開發(fā)者可以在命令行執(zhí)行以下代碼完成。

# 安裝PAI Python SDK
python -m pip install alipai --upgrade

# 交互式得配置訪問憑證、PAI工作空間等信息
python -m pai.toolkit.config

如何獲取 SDK 配置所需的訪問憑證(AccessKey),PAI 工作空間等信息請參考文檔:如何安裝和配置PAI Python SDK

模型部署和調(diào)用

通過 PAI Python SDK 提供的便利方法,開發(fā)者通過數(shù)行代碼,即可將 Qwen-72B-Chat 模型部署到 PAI-EAS,創(chuàng)建一個在線推理服務(wù)。

from pai.session import  get_default_session
from pai.model import RegisteredModel

session = get_default_session()

# 獲取PAI QuickStart 提供的qwen-72b-chat模型
m = RegisteredModel(
    model_name="qwen-72b-chat",
    model_provider="pai",
)

# 部署推理服務(wù)
predictor = m.deploy(
    service_name="qwen_72b_chat_{}".format(random_str(6)),
    options={
        # 資源配額ID
        "metadata.quota_id": "<LingJunResourceQuotaId>",
        "metadata.quota_type": "Lingjun",
        "metadata.workspace_id": session.workspace_id,
    }
)

# 查看服務(wù)的Endpoint和Token
endpoint = predictor.internet_endpoint
token = predictor.access_token

模型服務(wù)的調(diào)用,請參考以上章節(jié),在此不再贅述。

模型微調(diào)訓(xùn)練

通過 SDK 獲取 PAI QuickStart 提供的預(yù)訓(xùn)練模型之后,我們可以查看模型配置的微調(diào)算法,包括算法支持的超參配置以及輸入輸出數(shù)據(jù)。

from pai.model import RegisteredModel

# 獲取PAI QuickStart 提供的Qwen-72b-Chat模型
m = RegisteredModel(
    model_name="qwen-72b-chat",
    model_provider="pai",
)

# 獲取模型配置的微調(diào)算法
est = m.get_estimator()

# 查看算法支持的超參,以及算法輸入輸出信息
print(est.hyperparameter_definitions)
print(est.input_channel_definitions)

目前,Qwen-72B-Chat 提供的微調(diào)算法僅支持靈駿資源,開發(fā)者需要通過 PAI 的控制臺頁面,查看當(dāng)前的資源配額 ID,設(shè)置訓(xùn)練任務(wù)使用的資源信息。同時在提交訓(xùn)練作業(yè)之前,用戶可以根據(jù)算法的超參支持,配置合適的訓(xùn)練任務(wù)超參。


# 配置訓(xùn)練作業(yè)使用的靈駿資源配額ID
est.resource_id = "<LingjunResourceQuotaId>"

# 配置訓(xùn)練作業(yè)超參
hps = {
    "learning_rate": 1e-5,
    "save_interval": 500,
}
est.set_hyperparameters(**hps)

微調(diào)算法支持3個輸入,分別為:

  1. model:Qwen-72b-Chat預(yù)訓(xùn)練模型
  2. train:微調(diào)使用的訓(xùn)練數(shù)據(jù)集
  3. validation:微調(diào)使用的驗證數(shù)據(jù)集
# 查看模型微調(diào)算法的使用的輸入信息
print(m.get_estimator_inputs())

# {
#     "model": "oss://pai-quickstart-cn-wulanchabu.oss-cn-wulanchabu-internal.aliyuncs.com/huggingface/models/qwen-72b-chat/megatron/",
#     "train": "oss://pai-quickstart-cn-wulanchabu.oss-cn-wulanchabu-internal.aliyuncs.com/huggingface/datasets/llm_instruct/ch_poetry_train.json",
#     "validation": "oss://pai-quickstart-cn-wulanchabu.oss-cn-wulanchabu-internal.aliyuncs.com/huggingface/datasets/llm_instruct/ch_poetry_test.json",
# }

開發(fā)者可以參考以上的訓(xùn)練數(shù)據(jù)格式準(zhǔn)備數(shù)據(jù),然后將trainvalidation輸入替換為自己的訓(xùn)練和驗證數(shù)據(jù)集,即可輕松得提交模型微調(diào)訓(xùn)練作業(yè)。通過 SDK 打印的訓(xùn)練作業(yè)鏈接,用戶可以在 PAI 的控制臺上查看訓(xùn)練進度詳情以及日志信息。

from pai.common.oss_utils import download

# 獲取算法的輸入數(shù)據(jù),包括具體的模型和供測試的公共讀數(shù)據(jù)集.
training_inputs = m.get_estimator_inputs()

# 替換使用開發(fā)者自己的訓(xùn)練數(shù)據(jù)
# training_inputs["train"] = "oss://<BucketName>/path/to/train/data.json"
# training_inputs["validation"] = "oss://<BucketName>/path/to/validation/data.json"

# 提交訓(xùn)練作業(yè),并等待到訓(xùn)練作業(yè)結(jié)束
est.fit(
    inputs=training_inputs
)

# 查看保存在OSS Bucket上的模型路徑
print(est.model_data())


# 用戶可以通過ossutils,或是SDK提供的便利方法下載相應(yīng)的模型到本地
download(est.model_data())

結(jié)論

阿里云 PAI-QuickStart 提供了對 Qwen-72B-Chat 模型微調(diào)訓(xùn)練和部署開箱即用的體驗,簡化了 AI 開發(fā)流程,幫助開發(fā)者和企業(yè)用戶使用大語言模型加速創(chuàng)新,創(chuàng)造更多的價值。

相關(guān)資料

  • PAI 快速開始:

https://help.aliyun.com/zh/pai/user-guide/quick-start-overview

  • 通義千問系列模型:

https://modelscope.cn/organization/qwen

  • PAI Python SDK:

https://github.com/aliyun/pai-python-sdk

  • 阿里云PAI靈駿智算服務(wù):

https://www.aliyun.com/product/bigdata/learn/pailingjun

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,570評論 2 379

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