大模型国产化适配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 进行推理部署是相当简单的。

参考文档:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容