大模型國產化適配8-基于昇騰MindIE推理工具部署Qwen-72B實戰(推理引擎、推理服務化)

隨著 ChatGPT 的現象級走紅,引領了AI大模型時代的變革,從而導致 AI 算力日益緊缺。與此同時,中美貿易戰以及美國對華進行AI芯片相關的制裁導致 AI 算力的國產化適配勢在必行。之前也分享過一些國產 AI 芯片 和 AI 框架。

另外,我撰寫的大模型相關的博客及配套代碼均整理放置在Github:llm-action,有需要的朋友自取。

華為昇騰LLM落地可選解決方案中,我們曾介紹過MindIE,并且前段時間MindIE 1.0.RC1已經發布,本文主要將對其進行實戰演練。

MindIE 簡介

MindIE(Mind Inference Engine,昇騰推理引擎)是華為昇騰針對AI全場景業務的推理加速套件。通過分層開放AI能力,支撐用戶多樣化的AI業務需求,使能百模千態,釋放昇騰硬件設備算力。向上支持多種主流AI框架,向下對接不同類型昇騰AI處理器,提供多層次編程接口,幫助用戶快速構建基于昇騰平臺的推理業務。主要包括模型推理引擎 MindIE 和模型服務化 MindIE-Service。

image.png

從算子、模型、應用三大維度,全面加速推理部署。

image.png

模型推理引擎:MindIE

MindIE 作為一個模型推理引擎,提供了針對大語言模型和SD模型特定的優化。

image.png

模型服務化:MindIE-Service

MindIE-Service 作為一個模型服務化框架,主要包含如下幾個部分:

  • MindIE-MS:服務策略管理,提供運維監控能力。
  • MindIE-Server:推理服務端,提供模型服務化能力。
  • MindIE-Client:提供推理客戶端標準API,簡化用戶服務調用。

MindIE推理引擎之上,除了可以使用MindIE-Service,還支持第三方服務化框架,如TGI。

image.png

支持的模型

目前 1.0.RC1 版本支持的模型有 baichuan、bloom、deepseek、internlm、mixtral、qwen2、starcoder、aquila、chatglm、gpt_neox、llama、qwen、telechat。

可以看到,對主流大模型的支持還是挺全的。同時,目前接口層面提供了對于流式的支持,但是目前還不支持多輪對話,需要通過一些折衷方法進行處理。

華為 Atlas 推理卡形態

目前,華為 Atlas 推理系列硬件產品有三種形態:

  • 邊緣模塊邊緣盒子形態
  • 標卡形態
  • 服務器形態
image.png
image.png
image.png

環境準備

推理卡準備

目前 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 InferenceNVIDIA 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 進行推理部署是相當簡單的。

參考文檔:

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容