一、引言
本文围绕昇腾通用推理镜像的自定义部署展开最佳实践梳理,旨在从代码包准备、模型准备、部署流程等关键维度,提供一套可复用的最佳实践。通过标准化的操作指南,帮助开发者快速掌握昇腾推理镜像的自定义部署方法。
二、模型准备
1.开发机完成推理代码开发和调试
开发机界面启动VSCode。
编写推理服务代码
推理服务代码要满足openai api接口规范,当前平台支持的接口能力请参考【一站式服务平台】帮助手册-【推理服务API】https://www.ctyun.cn/document/10541165/10876778实例demo代码见附录
IDE内启动推理服务准备验证
调用/验证推理服务接口
2. 保存代码包
在VSCode列表页面保存开发机中的代码到代码包。
3.保存模型
在VSCode列表页面保存模型到模型管理。
三、服务部署
点击“部署我的模型”,填写表单创建服务。
服务名称:服务名称应小于50字符,不能包含空格。
镜像选择:系统内置镜像、从JupyterLab/VSCode中制作的自定义镜像、容器镜像服务共享过来的镜像。平台预置支持910B的通用推理服务镜像ascend-common-infer-svc
模型选择:开发机保存的模型,或其他方式保存的模型。
代码包选择:开发机保存的代码包,或其他方式保存的代码包。
包安装:推理服务依赖的包 & 版本
环境变量:输入镜像的启动依赖的环境变量。
运行命令:输入镜像的启动运行命令。
端口号:在线服务进程监听的端口号。
获取服务的APP_KEY和modelId
调用OpenAPI验证
App Key需要放置在请求的Authrization请求头中: Authorization: Bearer APP_KEY
e.g.
modelId需要添加在请求体中的model字段:model: modelId
e.g.
Postman请求示例
curl--location 'https://wishub.ctyun.cn:1443/v1/chat/completions' \
--header 'Authorization: Bearer 4a5**************************6fe' \
--header 'Content-Type: application/json' \
--data '{
"model":"b41************************b61",
"max_tokens":1024,
"top_p":0.1,
"top_k":5,
"stream":false,
"temperature":0.8,
"stream_options": {
"include_usage":true
},
"messages": [
{
"role":"user",
"content":"ping"
}
]
}'
四、总结
昇腾通用推理镜像自定义部署最佳实践,覆盖代码包准备、模型准备、部署流程全流程。该实践可适配多类场景,有效提升部署效率与服务稳定性。未来将进一步优化推理部署体系,为企业 AI 业务规模化落地提供有力支撑。
附录
实例中使用的demo代码
download_model_and_export_model_path.sh
mkdir Qwen2-0.5B-Instruct
cd Qwen2-0.5B-Instruct
wget -q --no-check-certificate https://modelers.cn/coderepo/web/v1/file/OpenSource/Qwen2-0.5B-Instruct/main/media/config.json
wget -q --no-check-certificate https://modelers.cn/coderepo/web/v1/file/OpenSource/Qwen2-0.5B-Instruct/main/media/generation_config.json
wget -q --no-check-certificate https://modelers.cn/coderepo/web/v1/file/OpenSource/Qwen2-0.5B-Instruct/main/media/merges.txt
wget -q --no-check-certificate https://modelers.cn/coderepo/web/v1/file/OpenSource/Qwen2-0.5B-Instruct/main/media/model.safetensors
wget -q --no-check-certificate https://modelers.cn/coderepo/web/v1/file/OpenSource/Qwen2-0.5B-Instruct/main/media/qwen_inference.py
wget -q --no-check-certificate https://modelers.cn/coderepo/web/v1/file/OpenSource/Qwen2-0.5B-Instruct/main/media/tokenizer.json
wget -q --no-check-certificate https://modelers.cn/coderepo/web/v1/file/OpenSource/Qwen2-0.5B-Instruct/main/media/tokenizer_config.json
wget -q --no-check-certificate https://modelers.cn/coderepo/web/v1/file/OpenSource/Qwen2-0.5B-Instruct/main/media/vocab.json
exportMODEL_PATH=`pwd`
cd..
llm.py
from fastapi import FastAPI, Request
from transformers import pipeline
import json
import torch
import torch_npu
import os
app = FastAPI()
generator = pipeline('text-generation', model=os.environ.get('MODEL_PATH'), device=torch.device('npu:0'))
@app.post("/v1/chat/completions")
async def create_completion(request: Request):
data = await request.json()
response = generator(data.get('messages'), max_new_tokens =500)
return{
"choices":[
{
"message":response[0]['generated_text'][-1],
"finish_reason":"stop",
"index":0
}
],
"id":"chatcmpl-1234567890",
"model":"Qwen2-0.5B-Instruct",
"object":"chat.completion"
}
if __name__ =="__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8899)
test.sh
curl --location 'http://0.0.0.0:8899/v1/chat/completions' --header 'Content-Type: application/json' --data '{
"messages": [
{"role": "system","content": "你是个客服"},
{"role": "user","content": "在吗"}
]
}'