引言
Mixtral 8x7B 是Mixtral AI最新發(fā)布的大語(yǔ)言模型,在許多基準(zhǔn)測(cè)試上表現(xiàn)優(yōu)于 GPT-3.5,是當(dāng)前最為先進(jìn)的開源大語(yǔ)言模型之一。阿里云人工智能平臺(tái)PAI是面向開發(fā)者和企業(yè)的機(jī)器學(xué)習(xí)/深度學(xué)習(xí)平臺(tái),提供了對(duì)于 Mixtral 8x7B 模型的全面支持,開發(fā)者和企業(yè)用戶可以基于 PAI-快速開始(PAI-QuickStart)輕松完成Mixtral 8x7B 模型的微調(diào)和部署。
Mixtral 8x7B 模型介紹
Mixtral 8x7B 是基于編碼器(Decoder-Only)架構(gòu)的稀疏專家混合網(wǎng)絡(luò)(Sparse Mixture-Of-Experts,SMoE)開源大語(yǔ)言模型,使用 Apache 2.0 協(xié)議發(fā)布。它的獨(dú)特之處在于對(duì)于每個(gè) token,路由器網(wǎng)絡(luò)選擇八組專家網(wǎng)絡(luò)中的兩組進(jìn)行處理,并且將其輸出累加組合,因此雖然 Mixtral 8x7B 擁有總共 47B 的參數(shù),但每個(gè) token 實(shí)際上只使用13B的活躍參數(shù),推理速度與13B模型相當(dāng)。
Mixtral 8x7B 支持多種語(yǔ)言,包括法語(yǔ)、德語(yǔ)、西班牙語(yǔ)、意大利語(yǔ)和英語(yǔ),支持的上下文長(zhǎng)度為32K token,并且在所有的評(píng)估的基準(zhǔn)測(cè)試中均達(dá)到或優(yōu)于 Llama-2-70B 和 GPT-3.5,特別是在數(shù)學(xué)、代碼生成和多語(yǔ)言基準(zhǔn)測(cè)試中,Mixtral 大大優(yōu)于 Llama-2-70B。
Mixtral AI 同時(shí)也發(fā)布了 Mixtral 8x7B 指令微調(diào)版本 Mixtral-8x7B-Instruct-v0.1,該版本通過(guò)監(jiān)督微調(diào)和直接偏好優(yōu)化(Direct Preference Optimization, DPO)進(jìn)行了優(yōu)化,以更好地遵循人類指令,對(duì)話能力領(lǐng)先于目前的其他開源模型的指令微調(diào)版本。
PAI-QuickStart 介紹
快速開始(PAI-QuickStart)是阿里云人工智能平臺(tái)PAI的產(chǎn)品組件,它集成了國(guó)內(nèi)外 AI 開源社區(qū)中優(yōu)質(zhì)的預(yù)訓(xùn)練模型,涵蓋了包括大語(yǔ)言模型,文本生成圖片、語(yǔ)音識(shí)別等各個(gè)領(lǐng)域。通過(guò) PAI 對(duì)于這些模型的適配,用戶可以通過(guò)零代碼和 SDK 的方式實(shí)現(xiàn)從訓(xùn)練到部署再到推理的全過(guò)程,大大簡(jiǎn)化了模型的開發(fā)流程,為開發(fā)者和企業(yè)用戶帶來(lái)了更快、更高效、更便捷的 AI 開發(fā)和應(yīng)用體驗(yàn)。
運(yùn)行環(huán)境要求
本示例目前僅支持在阿里云烏蘭察布地域,使用靈駿集群環(huán)境運(yùn)行。
資源配置要求:GPU 推薦使用 GU108(80GB顯存),推理需要2卡及以上資源,LoRA微調(diào)需要4卡及以上資源。
阿里云 PAI 靈駿智算服務(wù)資源開通和管理請(qǐng)參考官網(wǎng)文檔:靈駿智算資源的購(gòu)買開通
通過(guò)PAI控制臺(tái)使用模型
開發(fā)者可以在 PAI 控制臺(tái)的“快速開始”入口,找到 Mixtral-7x8B-Instruct-v0.1 的模型,Mixtral-7x8B-Instruct-v0.1 的模型卡片如下圖所示:
模型部署和調(diào)用
PAI 提供的 Mixtral-7x8B-instruct-v0.1 預(yù)置了模型的部署配置信息,用戶僅需提供推理服務(wù)的名稱以及部署配置使用的資源信息即可將模型部署到PAI-EAS推理服務(wù)平臺(tái)。
當(dāng)前模型需要使用靈駿資源組進(jìn)行部署,請(qǐng)確保選擇的資源配額(Quota)中至少有 >=2張GU108 GPU卡的計(jì)算資源。
部署的推理服務(wù)支持 OpenAI 的 API 風(fēng)格進(jìn)行調(diào)用,通過(guò)推理服務(wù)的詳情頁(yè),用戶可以獲得服務(wù)訪問(wèn)地址(Endpoint)和訪問(wèn)憑證(Token)。使用 cURL 調(diào)用推理服務(wù)的示例如下:
# 請(qǐ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': 'Mixtral-8x7B-Instruct-v0.1',
'prompt': 'San Francisco is a',
'max_tokens': 256,
'temperature': 0
}'
curl $API_ENDPOINT/v1/chat/completions
-H 'Authorization: Bearer $API_TOKEN'
-H 'Content-Type: application/json'
-d '{
'model': 'Mixtral-8x7B-Instruct-v0.1',
'messages': [
{'role': 'user', 'content': '介紹一下上海的歷史'}
]
}'
同時(shí)也可以通過(guò) OpenAI 的 SDK進(jìn)行調(diào)用,用戶首先需要安裝 SDK:
# 安裝服務(wù)調(diào)用SDK
python -m pip install openai
通過(guò)SDK調(diào)用推理服務(wù)的示例代碼如下:
import openai
# 請(qǐng)使用服務(wù)詳情頁(yè)獲取的訪問(wèn)地址(ENDPOINT)和訪問(wèn)憑證(TOKEN)替換以下代碼的配置。
openai.api_key = '<TOKEN>'
openai.base_url = '<ENDPOINT>' + '/v1'
# 調(diào)用對(duì)話API
completion = openai.chat.completions.create(
model='Mixtral-8x7B-Instruct-v0.1',
temperature=0.0,
top_p=0.8,
frequency_penalty=0.0,
messages=[{'role': 'user', 'content': '請(qǐng)介紹下你自己。'}],
# stream=True,
)
# 打印輸出內(nèi)容
print(completion.choices[0].message.content)
模型微調(diào)訓(xùn)練
PAI 為 Mixtral-8x7B-Instruct-v0.1 模型配置了微調(diào)算法,支持用戶以開箱即用得方式對(duì) Mixtral-8x7B-Instruct-v0.1 進(jìn)行微調(diào)。
訓(xùn)練算法支持使用 Json 格式輸入,每條數(shù)據(jù)由問(wèn)題、答案組成,分別用'instruction'、'output'字段表示,例如:
[
{
'instruction': 'Write a poem on a topic 'On a Political Prisoner': ',
'output': 'She that but little patience knew,nFrom childhood on, had now so muchnA grey gull lost its fear and flewnDown to her cell and there alit,nAnd there endured her fingers' touchnAnd from her fingers ate its bit.nDid she in touching that lone wing.'
},
{
'instruction': 'Write a poem on a topic 'To His Love': ',
'output': 'He's gone, and all our plans Are useless indeed.nWe'll walk no more on Cotswold Where the sheep feed Quietly and take no heed. His body that was so quick Is not as younKnew it, on Severn river Under the blue Driving our small boat through.'
}
]
當(dāng)完成數(shù)據(jù)的準(zhǔn)備,用戶可以將數(shù)據(jù)上傳到對(duì)象存儲(chǔ) OSS Bucket 中,或是通過(guò)指定一個(gè)數(shù)據(jù)集對(duì)象,選擇在 NAS/CPFS 存儲(chǔ)上的數(shù)據(jù)集。用戶也可以使用PAI預(yù)置的公共讀數(shù)據(jù)集,直接提交任務(wù)測(cè)試算法。
算法需要使用 >=4 x GU108(80GB顯存)的GPU資源,請(qǐng)確保選擇使用的資源配額內(nèi)有充足的計(jì)算資源。
訓(xùn)練算法支持的超參信息如下,用戶可以根據(jù)使用的數(shù)據(jù),計(jì)算資源等調(diào)整超參,或是使用算法默認(rèn)配置的超參。
點(diǎn)擊“訓(xùn)練”按鈕,PAI-QuickStart 開始進(jìn)行訓(xùn)練,用戶可以查看訓(xùn)練任務(wù)狀態(tài)和訓(xùn)練日志。
通過(guò)頁(yè)面的 TensorBoard 入口,用戶也可以一鍵打開 TensorBoard 查看模型的收斂情況。
如果需要將模型部署至PAI-EAS,可以在同一頁(yè)面的模型部署卡面選擇資源組,并且點(diǎn)擊“部署”按鈕實(shí)現(xiàn)一鍵部署。模型調(diào)用方式和上文直接部署模型的調(diào)用方式相同。
通過(guò)PAI Python SDK使用模型
PAI-QuickStart 提供的預(yù)訓(xùn)練模型,也支持通過(guò)PAI Python SDK進(jìn)行調(diào)用,我們首先需要安裝和配置PAI Python SDK,開發(fā)者可以在命令行執(zhí)行以下代碼完成。
# 安裝PAI Python SDK
python -m pip install alipai --upgrade
# 交互式得配置訪問(wèn)憑證、PAI工作空間等信息
python -m pai.toolkit.config
如何獲取 SDK 配置所需的訪問(wèn)憑證(AccessKey),PAI 工作空間等信息請(qǐng)參考文檔:如何安裝和配置PAI Python SDK。
模型部署和調(diào)用
通過(guò) PAI 在模型上預(yù)置的推理服務(wù)配置,用戶僅需提供使用的資源信息,以及服務(wù)名稱,即可輕松的將 Mixtral 模型部署到 PAI-EAS 推理平臺(tái)。
from pai.session import get_default_session
from pai.model import RegisteredModel
from pai.common.utils import random_str
from pai.predictor import Predictor
session = get_default_session()
# 獲取PAI QuickStart 提供的模型
m = RegisteredModel(
model_name='Mixtral-8x7B-Instruct-v0.1',
model_provider='pai',
)
# 查看模型默認(rèn)的部署配置
print(m.inference_spec)
# 部署推理服務(wù)
# 需提供使用靈駿資源配額ID(QuotaId),要求至少 >= 2張GU108(80G顯存)GPU卡的計(jì)算資源.
predictor = m.deploy(
service_name='mixtral_8_7b_{}'.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)用請(qǐng)參考以上的 PAI-EAS 部署推理的章節(jié),或是直接使用 PAI Python SDK 進(jìn)行調(diào)用。
from pai.predictor import Predictor
p = Predictor('<MixtralServiceName>')
res = p.raw_predict(
path='/v1/chat/completions',
method='POST',
data={
'model': 'Mixtral-8x7B-Instruct-v0.1',
'messages': [
{'role': 'user', 'content': '介紹一下上海的歷史'}
]
}
)
print(res.json())
當(dāng)測(cè)試完成,需要?jiǎng)h除服務(wù)釋放資源,用戶可以通過(guò)控制臺(tái)或是SDK完成:
# 刪除服務(wù)
predictor.delete_service()
模型的微調(diào)訓(xùn)練
通過(guò) SDK 獲取 PAI QuickStart 提供的預(yù)訓(xùn)練模型之后,我們可以查看模型配置的微調(diào)算法,包括算法支持的超參配置以及輸入輸出數(shù)據(jù)。
from pai.model import RegisteredModel
# 獲取PAI QuickStart 提供的 Mixtral-8x7B-Instruct-v0.1 模型
m = RegisteredModel(
model_name='Mixtral-8x7B-Instruct-v0.1',
model_provider='pai',
)
# 獲取模型配置的微調(diào)算法
est = m.get_estimator()
# 查看算法支持的超參,以及算法輸入輸出信息
print(est.hyperparameter_definitions)
print(est.input_channel_definitions)
目前,Mixtral-8x7B-Instruct-v0.1 提供的微調(diào)算法僅支持靈駿資源,開發(fā)者需要通過(guò) PAI 的控制臺(tái)頁(yè)面,查看當(dāng)前的資源配額 ID,設(shè)置訓(xùn)練任務(wù)使用的資源信息。同時(shí)在提交訓(xùn)練作業(yè)之前,用戶可以根據(jù)算法的超參支持,配置合適的訓(xùn)練任務(wù)超參。
# 配置訓(xùn)練作業(yè)使用的靈駿資源配額ID
est.resource_id = '<LingjunResourceQuotaId>'
# 配置訓(xùn)練作業(yè)超參
hps = {
'learning_rate': 1e-5,
'per_device_train_batch_size': 2,
}
est.set_hyperparameters(**hps)
微調(diào)算法支持3個(gè)輸入,分別為:
model:Mixtral-8x7B-Instruct-v0.1 預(yù)訓(xùn)練模型
train:微調(diào)使用的訓(xùn)練數(shù)據(jù)集
validation:微調(diào)使用的驗(yàn)證數(shù)據(jù)集
數(shù)據(jù)集的格式請(qǐng)參考以上章節(jié),用戶可以通過(guò) ossutils,控制臺(tái)操作等方式上傳數(shù)據(jù)到 OSS Bucket,也可以使用 SDK 提供的方法上傳到用戶配置的Bucket。
from pai.common.oss_utils import upload
# 查看模型微調(diào)算法的使用的輸入信息
# 獲取算法的輸入數(shù)據(jù),包括模型和供測(cè)試的公共讀數(shù)據(jù)集.
training_inputs = m.get_estimator_inputs()
print(training_inputs)
# {
# 'model': 'oss://pai-quickstart-cn-wulanchabu.oss-cn-wulanchabu-internal.aliyuncs.com/huggingface/models/Mixtral-8x7B-Instruct-v0.1/main/',
# 'train': 'oss://pai-quickstart-cn-wulanchabu.oss-cn-wulanchabu-internal.aliyuncs.com/huggingface/datasets/llm_instruct/en_poetry_train_mixtral.json',
# 'validation': 'oss://pai-quickstart-cn-wulanchabu.oss-cn-wulanchabu-internal.aliyuncs.com/huggingface/datasets/llm_instruct/en_poetry_test_mixtral.json',
# }
# 上傳用戶數(shù)據(jù),請(qǐng)注意替換一下的本地文件路徑和上傳的OSS Bucket路徑.
train_data_uri = upload('/path/to/local/train.json', 'path/of/train/data')
validation_data_uri = upload('/path/to/local/validation.json', 'path/of/validation/data')
# 替換使用開發(fā)者的訓(xùn)練數(shù)據(jù)
# training_inputs['train'] = train_data_uri
# training_inputs['validation'] = validation_data_uri
開發(fā)者可以參考以上的訓(xùn)練數(shù)據(jù)格式準(zhǔn)備數(shù)據(jù),然后將train和validation輸入替換為自己的訓(xùn)練和驗(yàn)證數(shù)據(jù)集,即可輕松得提交模型微調(diào)訓(xùn)練作業(yè)。通過(guò) SDK 打印的訓(xùn)練作業(yè)鏈接,用戶可以在 PAI 的控制臺(tái)上查看訓(xùn)練任務(wù)狀態(tài)以及日志信息,同時(shí)也可以通過(guò) TensorBoard 查看訓(xùn)練作業(yè)的進(jìn)度和模型收斂情況。
from pai.common.oss_utils import download
# 提交訓(xùn)練作業(yè),同時(shí)打印訓(xùn)練作業(yè)鏈接
est.fit(
inputs=training_inputs,
wait=False,
)
# 打開TensorBoard查看訓(xùn)練進(jìn)度
est.tensorboard()
# 等待訓(xùn)練任務(wù)結(jié)束
est.wait()
# 查看保存在OSS Bucket上的模型路徑
print(est.model_data())
# 用戶可以通過(guò)ossutils,或是SDK提供的便利方法下載相應(yīng)的模型到本地
download(est.model_data())
用戶可以查看文檔,了解更多如何通過(guò) SDK 使用 PAI-QuickStart 提供的預(yù)訓(xùn)練模型:使用預(yù)訓(xùn)練模型 — PAI Python SDK。
結(jié)論
Mixtral-8x7B 是當(dāng)前最為先進(jìn)的開源大語(yǔ)言模型之一,借助于MoE架構(gòu),具有很高的使用性價(jià)比,通過(guò) PAI QuickStart 開發(fā)者可以輕松地完成Mixtral模型的微調(diào)和部署。當(dāng)然PAI QuickStart 也提供了更多的先進(jìn)、不同領(lǐng)域的模型,歡迎開發(fā)者前來(lái)探索使用。
相關(guān)資料
Mixtral 8x7B 模型:
https://mistral.ai/news/mixtral-of-experts/
PAI 快速開始:
https://help.aliyun.com/zh/pai/user-guide/quick-start-overview
PAI Python SDK:
https://github.com/aliyun/pai-python-sdk
阿里云PAI靈駿智算服務(wù):
https://www.aliyun.com/product/bigdata/learn/pailingjun