隨著 ChatGPT 的現象級走紅,引領了AI大模型時代的變革,從而導致 AI 算力日益緊缺。與此同時,中美貿易戰以及美國對華進行AI芯片相關的制裁導致 AI 算力的國產化適配勢在必行。之前也分享過一些國產 AI 芯片 和 AI 框架。
- 大模型國產化適配1-華為昇騰AI全棧軟硬件平臺總結
- 大模型國產化適配2-基于昇騰910使用ChatGLM-6B進行模型推理
- 大模型國產化適配3-基于昇騰910使用ChatGLM-6B進行模型訓練
- 大模型國產化適配4-基于昇騰910使用LLaMA-13B進行多機多卡訓練
- 大模型國產化適配6-基于昇騰910B快速驗證ChatGLM3-6B/BaiChuan2-7B模型推理
- AI芯片技術原理剖析(一):國內外AI芯片概述
- 大模型國產化適配7-華為昇騰LLM落地可選解決方案(MindFormers、ModelLink、MindIE)
- MindIE 1.0.RC1 發布,華為昇騰終于推出了針對LLM的完整部署方案,結束小米加步槍時代
- 大模型國產化適配8-基于昇騰MindIE推理工具部署Qwen-72B實戰(推理引擎、推理服務化)
另外,我撰寫的大模型相關的博客及配套代碼均整理放置在Github:llm-action,有需要的朋友自取。
在華為昇騰LLM落地可選解決方案中,我們曾介紹過MindIE,并且前段時間MindIE 1.0.RC1已經發布,本文主要將對其進行實戰演練。
MindIE 簡介
MindIE(Mind Inference Engine,昇騰推理引擎)是華為昇騰針對AI全場景業務的推理加速套件。通過分層開放AI能力,支撐用戶多樣化的AI業務需求,使能百模千態,釋放昇騰硬件設備算力。向上支持多種主流AI框架,向下對接不同類型昇騰AI處理器,提供多層次編程接口,幫助用戶快速構建基于昇騰平臺的推理業務。主要包括模型推理引擎 MindIE 和模型服務化 MindIE-Service。
從算子、模型、應用三大維度,全面加速推理部署。
模型推理引擎:MindIE
MindIE 作為一個模型推理引擎,提供了針對大語言模型和SD模型特定的優化。
模型服務化:MindIE-Service
MindIE-Service 作為一個模型服務化框架,主要包含如下幾個部分:
- MindIE-MS:服務策略管理,提供運維監控能力。
- MindIE-Server:推理服務端,提供模型服務化能力。
- MindIE-Client:提供推理客戶端標準API,簡化用戶服務調用。
MindIE推理引擎之上,除了可以使用MindIE-Service,還支持第三方服務化框架,如TGI。
支持的模型
目前 1.0.RC1 版本支持的模型有 baichuan、bloom、deepseek、internlm、mixtral、qwen2、starcoder、aquila、chatglm、gpt_neox、llama、qwen、telechat。
可以看到,對主流大模型的支持還是挺全的。同時,目前接口層面提供了對于流式的支持,但是目前還不支持多輪對話,需要通過一些折衷方法進行處理。
華為 Atlas 推理卡形態
目前,華為 Atlas 推理系列硬件產品有三種形態:
- 邊緣模塊邊緣盒子形態
- 標卡形態
- 服務器形態
環境準備
推理卡準備
目前 MindIE 1.0.RC1 推薦使用兩種推理卡:
- Atlas 800I A2:適用于時延敏感及高吞吐需求場景
- Atlas 300I Duo:非時延敏感及低成本建設場景
下載鏡像
MindIE 已經提供了適配了 Atlas 800I A2 推理服務器、Atlas 300I Duo 推理卡的鏡像,根據自己的卡型號找到對應的版本進行下載即可。
鏡像版本 | CANN版本 | MindIE版本 | FrameworkPTAdapter版本 | HDK版本 | 支持的推理芯片 | 架構 |
---|---|---|---|---|---|---|
1.0.RC1-800I-A2-aarch64 | 8.0.RC1 | 1.0.T52 | 6.0.RC1 | 24.1.RC1 | Atlas 800I A2 | aarch64 |
1.0.RC1-300I-Duo-aarch64 | 8.0.RC1 | 1.0.T52 | 6.0.RC1 | 24.1.RC1 | Atlas 300I Duo | aarch64 |
下載地址:mindie
下載命令:
# 獲取登錄訪問權限,輸入已設置的“鏡像下載憑證”,如果未設置或憑證超過24小時過期,請點擊登錄用戶名下拉設置鏡像下載憑證
docker login -u 157xxxx4031 ascendhub.huawei.com
# 下載鏡像
docker pull ascendhub.huawei.com/public-ascendhub/mindie:1.0.RC1-800I-A2-aarch64
下載模型
以 Qwen-72B-Chat 模型為例,從 HF 上下載 Qwen-72B-Chat 模型,其他 HF 上面的模型與之類似,就不一一演示了。
git lfs install
git clone https://huggingface.co/Qwen/Qwen-72B-Chat
cd Qwen-72B-Chat
git reset --hard 6eb5569
如果網絡不好,可以通過 HF 鏡像站進行下載。
pip install -U huggingface_hub
export HF_ENDPOINT=https://hf-mirror.com
# 自行替換 Token
nohup huggingface-cli download --token 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 --resume-download Qwen/Qwen-72B-Chat --local-dir Qwen-72B-Chat --local-dir-use-symlinks False > qwen-72b.log 2>&1 &
環境安裝
創建并進入容器:
docker run --name mindie-dev -it -d --net=host --ipc=host \
--shm-size=50g \
--privileged=true \
-w /home \
--device=/dev/davinci0 \
--device=/dev/davinci1 \
--device=/dev/davinci2 \
--device=/dev/davinci3 \
--device=/dev/davinci_manager \
--device=/dev/hisi_hdc \
--device=/dev/devmm_svm \
--entrypoint=bash \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/sbin:/usr/local/sbin \
-v /home:/home \
-v /tmp:/tmp \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \
ascendhub.huawei.com/public-ascendhub/mindie:1.0.RC1-800I-A2-aarch64
# 進入容器
docker exec -itu root mindie-dev bash
安裝昇騰CANN軟件棧。
cd /opt/package
# 安裝CANN包
source install_and_enable_cann.sh
若退出后重新進入容器,則需要重新加載 CANN 環境變量,執行以下三行命令。
source /usr/local/Ascend/ascend-toolkit/set_env.sh
source /usr/local/Ascend/mindie/set_env.sh
source /usr/local/Ascend/llm_model/set_env.sh
基于 MindIE 部署 Baichuan2-7B
第一步:修改配置
修改配置文件/usr/local/Ascend/mindie/latest/mindie-service/conf/config.json
:
對于 Baichuan2-7B ,使用四卡進行并行推理進行測試:
{
"OtherParam":
{
"ResourceParam" :
{
"cacheBlockSize" : 128,
"preAllocBlocks" : 4
},
"LogParam" :
{
"logLevel" : "Info",
"logPath" : "/logs/mindservice.log"
},
"ServeParam" :
{
"ipAddress" : "127.0.0.1",
"port" : 1025,
"maxLinkNum" : 300,
"httpsEnabled" : false,
"tlsCaPath" : "security/ca/",
"tlsCaFile" : ["ca.pem"],
"tlsCert" : "security/certs/server.pem",
"tlsPk" : "security/keys/server.key.pem",
"tlsPkPwd" : "security/pass/mindie_server_key_pwd.txt",
"kmcKsfMaster" : "tools/pmt/master/ksfa",
"kmcKsfStandby" : "tools/pmt/standby/ksfb",
"tlsCrl" : "security/certs/server_crl.pem"
}
},
"WorkFlowParam":
{
"TemplateParam" :
{
"templateType": "Standard",
"templateName" : "Standard_llama",
"pipelineNumber" : 1
}
},
"ModelDeployParam":
{
"maxSeqLen" : 2560,
"npuDeviceIds" : [[0,1,2,3]],
"ModelParam" : [
{
"modelInstanceType": "Standard",
"modelName" : "baichuan2-7b",
"modelWeightPath" : "/home/aicc/model_from_hf/Baichuan2-7B-Chat",
"worldSize" : 4,
"cpuMemSize" : 5,
"npuMemSize" : 16,
"backendType": "atb"
}
]
},
"ScheduleParam":
{
"maxPrefillBatchSize" : 50,
"maxPrefillTokens" : 8192,
"prefillTimeMsPerReq" : 150,
"prefillPolicyType" : 0,
"decodeTimeMsPerReq" : 50,
"decodePolicyType" : 0,
"maxBatchSize" : 200,
"maxIterTimes" : 512,
"maxPreemptCount" : 200,
"supportSelectBatch" : false,
"maxQueueDelayMicroseconds" : 5000
}
}
常用參數說明:
- 資源參數:ResourceParam
- cacheBlockSize:kvcache block的size大小。建議取值128,其他值建議取為2的n次冪。
- preAllocBlocks:預分配策略:給請求分配好block數量。
- 日志參數:LogParam
- logLevel:日志級別
- logPath:日志保存路徑。相對路徑,代碼中會取到工程的絕對路徑,最后
拼接而成。目前只支持修改日志文件名,即logPath必須配置為"/logs/xxxx",其中xxxx為日志。
名稱。
- 服務參數:ServeParam
- ipAddress:傳給http服務啟動TCP的參數,節點具有的IP地址。不建議綁定為0.0.0.0。
- port:傳給http服務啟動TCP的參數,端口號。保證端口號無沖突。
- maxLinkNum:http的請求并發數。 EndPoint支持的最大并發請求數。
- httpsEnabled:是否開啟https通信。建議值true,為false時,后續參數忽略。
- ScheduleParam 參數
- prefillPolicyType:prefill階段的調度策略。0: FCFS,先來先服務。1: STATE, prefill階段優先執行未被搶占和換出的請求。3:MLFQ,多級反饋隊列。其中, 3是0/1的組合。
- decode階段的調度策略:0: FCFS,先來先服務。1: STATE, decode階段優先執行未被搶占和換出的請求。3:MLFQ,多級反饋隊列。其中, 3是0/1的組合。
- maxQueueDelayMicroseconds:隊列等待時間,單位: us。
- maxBatchSize:最大decode batch size。
- 模型部署參數:ModelDeployParam
- modelName:模型名稱
- maxSeqLen:最大序列長度。輸入的長度+輸出的長度<=maxSeqLen,用戶根據自己的推理場景選擇maxSeqLen。
- npuMemSize:NPU中可以用來申請kv cache的size上限。單位: GB。建議值:8。快速計算公式:npuMemSize=(總空閑-權重/NPU卡數-后處理占用)*系數,其中系數取0.8。
- cpuMemSize:CPU中可以用來申請kv cache的size上限。單位: GB。建議值:5。當“ supportSwapPolicy” =“false”,可以配置為0。
- worldSize:啟用幾張卡推理。目前llama-65b至少啟用四張NPU卡。
- npuDeviceIds:啟用哪幾張卡。對于每個模型實例分配的npuIds。
- modelWeightPath:模型權重路徑。路徑必須存在。
- modelInstanceType:模型類型,普通推理:"Standard" ,假模型:"StandardMock"。
- backendType:當前對接后端類型,大小寫不敏感。可選:"atb"、"mindformer"、"torchair"等。
第二步:啟動服務
通過啟動腳本部署模型服務:
export PYTHONPATH=/usr/local/Ascend/llm_model:$PYTHONPATH
cd /usr/local/Ascend/mindie/latest/mindie-service/bin
./mindieservice_daemon
第三步:發送HTTP請求
目前 MindIE-Service 的 API 接口兼容 OpenAI、
vLLM、HuggingFace Text Generation Inference 、NVIDIA Triton Inference Server 推理框架。
- OpenAI:
/v1/chat/completions
- vLLM:
/generate
- HuggingFace TGI:
/generate
、/generate_stream
-
NVIDIA Triton Inference Server:
/v2/models/${MODEL_NAME}[/versions/${MODEL_VERSION}]/infer
v2/models/${MODEL_NAME}[/versions/${MODEL_VERSION}]/generate
v2/models/${MODEL_NAME}[/versions/${MODEL_VERSION}]/generate_stream
OpenAI 格式接口請求:
curl "http://127.0.0.1:1025/v1/chat/completions" \
-H "Content-Type: application/json" \
-d '{
"model": "baichuan2-7b",
"messages": [
{
"role": "user",
"content": "如何養生?"
}
],
"max_tokens":128
}'
請求體的詳細字段說明請參考OpenAI官網。
響應結果:
{
"id": "2",
"object": "chat.completion",
"created": 1714293477,
"model": "baichuan2-7b",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "\n養生是指通過調整飲食、鍛煉、作息、心理等方面,達到預防疾病、延緩衰老、提高生活質量的目的。以下是一些建議:\n\n1. 均衡飲食:保持飲食多樣化,攝入足夠的蛋白質、脂肪、碳水化合物、維生素和礦物質。多吃蔬菜、水果、全谷類食物,適量攝入肉類、魚類、蛋類和奶制品。\n\n2. 規律作息:保持充足的睡眠,每晚7-9小時為宜。避免熬夜,盡量保持規律的作息。\n\n3. 適量鍛煉:每周至少進行150分鐘的中等強度有氧運動,如快走、慢跑、游泳等。此外,"
},
"finish_reason": "length"
}
],
"usage": {
"prompt_tokens": 3,
"completion_tokens": 128,
"total_tokens": 131
}
}
TGI 格式接口請求:
curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{
"inputs": "如何才能擁有性感的身材?",
"parameters": {
"do_sample": true,
"frequency_penalty": 0.1,
"temperature": 0.5,
"top_k": 10,
"top_n_tokens": 5,
"max_new_tokens": 256
}
}' http://127.0.0.1:1025/generate
請求體的詳細字段說明請參考TGI官網。
響應結果:
{
"generated_text": "\n擁有性感的身材需要時間、毅力和計劃。以下是一些建議,幫助你塑造性感的身材:\n\n1. 設定目標:確定你想要達到的體重和身材目標。確保目標具體、可衡量、可實現、相關和有時間限制(SMART)。\n\n2. 健康飲食:保持均衡的飲食,攝入足夠的蛋白質、碳水化合物、脂肪、維生素和礦物質。避免過多攝入高熱量、高脂肪和高糖的食物。\n\n3. 規律鍛煉:每周至少進行150分鐘的中等強度有氧運動,如快走、慢跑、游泳或騎自行車。此外,每周至少進行兩次全身肌肉鍛煉,如舉重、俯臥撐、深蹲等。\n\n4. 保持水分:每天喝足夠的水,以保持身體正常運作。避免過多攝入含糖飲料和咖啡因。\n\n5. 睡眠充足:每晚保證7-9小時的高質量睡眠。保持規律的作息時間,避免過度勞累。\n\n6. 減輕壓力:學會應對壓力,避免通過暴飲暴食或過度鍛煉來應對壓力。嘗試進行冥想、瑜伽或深呼吸練習來減輕壓力。\n\n7. 保持積極:保持積極的心態,相信自己能夠達到目標。與他人分享你的進展,尋求支持和鼓勵。\n\n8. 逐步改變:不要"
}
基于 MindIE 部署 ChatGLM3-6B
對于 ChatGLM3-6B, 使用兩卡進行并行推理:
{
"ModelDeployParam":
{
"maxSeqLen" : 2560,
"npuDeviceIds" : [[0,1]],
"ModelParam" : [
{
"modelInstanceType": "Standard",
"modelName" : "chatglm3-6b",
"modelWeightPath" : "/workspace/aicc/model_from_hf/chatglm3-6b-chat-full",
"worldSize" : 2,
"cpuMemSize" : 5,
"npuMemSize" : 16,
"backendType": "atb"
}
]
}
}
基于 MindIE 部署 Qwen-72B
對于 Qwen-72B,直接使用8卡進行并行推理:
這里一定要注意,目前npuMemSize不可設置太大了。
npuMemSize 表示 NPU中可以用來申請kv cache的size上限。單位: GB。快速計算公式:npuMemSize=(總空閑-權重/NPU卡數-后處理占用)*系數,其中系數取0.8。
假設權重保存為FP16,Atlas 800I A2 推理服務器單卡為32G,片上系統大約有2-3G。因此,Qwen-72B的npuMemSize大約為:(32G-3G-(722)/8--后處理占用)0.8 約等于 10G 。
{
"ModelDeployParam":
{
"maxSeqLen" : 2560,
"npuDeviceIds" : [[0,1,2,3,4,5,6,7]],
"ModelParam" : [
{
"modelInstanceType": "Standard",
"modelName" : "qwen-72b",
"modelWeightPath" : "/home/aicc/model_from_hf/qwen-72b-chat-hf",
"worldSize" : 8,
"cpuMemSize" : 5,
"npuMemSize" : 10,
"backendType": "atb"
}
]
}
}
結語
本文簡要介紹了基于昇騰 MindIE 推理工具部署Baichuan2-7B、ChatGLM3-6B、Qwen-72B,可以看到基于 MindIE 進行推理部署是相當簡單的。
參考文檔: