通義千問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 的方式進(jìn)行調(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進(jìn)行了切分,適配多機多卡環(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)前算法僅支持使用靈駿資源進(jìn)行訓(xùn)練,在提交訓(xùn)練作業(yè)之前,用戶需要配置使用的靈駿資源ID。

在完成以上配置之后,點擊“訓(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使用模型

PAI-QuickStart 提供的預(yù)訓(xùn)練模型,也支持通過PAI Python SDK進(jìn)行調(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)練進(jì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ù)。

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