作者:熊兮、求伯、一耘
引言
通義千問-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 的模型卡片如下圖所示:
模型部署和調(diào)用
通過“模型部署”入口,用戶選擇使用的靈駿資源信息,點擊部署按鈕,即可將模型部署到 PAI-EAS 推理服務(wù)平臺。
通過部署的在線服務(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ù)集”配置中選擇使用。
當(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)練日志,如下所示:
在訓(xùn)練結(jié)束后,可以在輸出路徑的OSS Bucket中查看每次保存的Checkpoint模型切片,如下所示:
用戶可以根據(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個輸入,分別為:
-
model
:Qwen-72b-Chat預(yù)訓(xùn)練模型 -
train
:微調(diào)使用的訓(xùn)練數(shù)據(jù)集 -
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ù),然后將train
和validation
輸入替換為自己的訓(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ù):