2. 推理服务部署快速上手

本章以Qwen模型为例描述如何用mx-arena快速部署沐曦千问推理服务。

部署推理服务需要使用沐曦的推理镜像,建议在开发者社区的镜像中心选择正式发布的镜像。

备注

有些旧版本镜像不支持非交互式启动。如果必须使用且启动推理时报找不到vllm,可通过 --env 参数增加 PATH 参数解决: --env="PATH=/opt/conda/bin:/opt/conda/condabin:$PATH"。

2.1. mx-arena 安装

mx-arena 下载安装,请参考3.1 安装 mx-arena。

2.2. 单节点部署千问推理

mx-arena 的serve custom命令用于将千问模型部署在一个节点上。

2.2.1. 核心参数说明

2.2.1.1. –gpus

用于指定需要的GPU个数。

2.2.1.2. –data-dir

用于将宿主机存放模型的路径挂载到容器中,宿主机路径和容器路径用 : 隔开。

2.2.1.3. –image

用于指定要运行的镜像。

2.2.2. 命令示例

可参考下面的命令参数,将上节的核心参数替换为实际使用的参数,快速拉起自己的千问模型。

mx-arena serve custom \
   --name=qwen3-32b \
   --version=v1 \
   --gpus=8 \
   --env="MACA_DIRECT_DISPATCH=1" \
   --env="MACA_D2D_COPY_MODE=1" \
   --env="MACA_MEMCPY_MODE=1" \
   --share-memory=100Gi \
   --data-dir=/mxstorage:/mxstorage \
   --replicas=1 \
   --restful-port=8035 \
   --readiness-probe-action="httpGet" \
   --readiness-probe-action-option="path: /health" \
   --readiness-probe-action-option="port: 8035" \
   --readiness-probe-option="initialDelaySeconds: 30" \
   --readiness-probe-option="periodSeconds: 30" \
   --image=mxcr.io/ai-release/maca/vllm-metax:0.25.0-maca.ai3.8.2.107-torch2.10-py310-ubuntu22.04-amd64 \
   "vllm serve /mxstorage/pde_ai/models/llm/Qwen/Qwen3-32B \
   -tp 8 --port 8035 \
   --gpu-memory-utilization 0.9 \
   --no-enable-prefix-caching \
   --reasoning-parser qwen3"

2.2.3. 状态查询

可以通过下面的命令查看千问模型是否启动成功,千问模型的启动时间取决于模型大小。若AVAILABLE的值为1,则表明模型已启动成功。

(base) sw@gpunode-10-13-81-29@cluster-cp-0:~$ mx-arena serve list
NAME        TYPE      VERSION   DESIRED   AVAILABLE   ADDRESS           PORTS
qwen3-32b    Custom    v1        1         1          10.30.87.127     RESTFUL:8035

2.2.4. 使用示例

先获取服务的clusterIP,端口和模型路径,然后通过curl组合这些信息来访问千问模型服务。

# 获取服务的clusterIP及端口,下图显示IP为10.30.87.127, 端口为8035
(base) sw@gpunode-10-13-81-29@cluster-cp-0:~$ mx-arena serve list
NAME        TYPE      VERSION   DESIRED   AVAILABLE   ADDRESS           PORTS
qwen3-32b    Custom    v1        1         1           10.30.87.127     RESTFUL:8035

# 通过上一步获取的clusterIP和端口获取模型路径
(base) sw@gpunode-10-13-81-29@cluster-cp-0:~$ curl http://10.30.87.127:8035/v1/models
{"object":"list","data":[{"id":"/mxstorage/pde_ai/models/llm/Qwen/Qwen3-32B","object":"model","created":1791774342,"owned_by":"vllm","root":"/mxstorage/pde_ai/models/llm/Qwen/Qwen3-32B","parent":null ...}]}]}

# 通过clusterIP, 端口和模型路径访问千问模型,千问模型支持哪些HTTP接口,可以通过查看主POD的日志获取API列表。
(base) sw@gpunode-10-13-81-29@cluster-cp-0:~$ curl http://10.30.87.127:8035/v1/chat/completions -H "Content-Type: application/json" -d '{"model": "/mxstorage/pde_ai/models/llm/Qwen/Qwen3-32B", "messages": [{"role": "user", "content": "你是谁"}], "max_tokens": 100,
"temperature": 0.7, "top_p": 0.9, "seed": 10}'
{"id":"chatcmpl-b1a9773e1e9cc767","object":"chat.completion","created":1786017410,"model":"/mxstorage/pde_ai/models/llm/Qwen/Qwen3-32B","choices":[{"index":0,"message":{"role":"assistant","content":null,"refusal":null,"annotations":null,"audio":null,
"function_call":null,"tool_calls":[],"reasoning":"\n好的,用户问“你是谁”,我需要先明确回答身份。作为通义千问,我应该介绍自己的基本功能和特点。同时,保持友好和开放的态度,鼓励用户进一步提问。要注意用简洁明了的语言,避免使用过于专业的术语,让用户容易理解。另外,可以提到
我的多语言支持和广泛的知识库,展示我的能力和优势。最后,确保回答符合格式要求,不使用markdown,保持口语化,分步骤解释思考"},"logprobs":null,"finish_reason":"length","stop_reason":null,"token_ids":null}],"service_tier":null,"system_fingerprint":null,"usage":

2.2.5. 删除推理服务

serve delete指令用于删除指定的推理服务,示例如下:

(base) sw@gpunode-10-13-81-29@cluster-cp-0:~$ mx-arena serve delete qwen3-32b
INFO[0001] The serving job qwen3-32bqwen3-32b with version v1 has been deleted successfully

2.3. 两节点部署千问模型

通过 mx-arena serve distributed命令将千问模型跨节点部署,这里以两节点为例进行说明。

2.3.1. 安装lws

mx-arena serve distributed命令依赖lws来进行跨节点部署,在使用该命令之前需要先部署lws服务。

获取lws服务有两种方式,一种方式是直接到lws官网下载合适版本的lws安装包进行安装。另一种方式是直接使用mx-arena安装时放在$HOME/mx-charts/lws目录下的0.8.0版本的安装包和镜像。

如果使用mx-arena自带的版本,请先将镜像docker load到宿主机上,然后执行如下安装指令:

#如果加载镜像时使用的repository和helm里默认的不一致,请正确设置repository
 helm install lws ./lws-chart-0.0.0.tgz \
--namespace lws-system \
--create-namespace \
--wait --timeout 300s

2.3.2. 核心参数说明

2.3.2.1. –nic-configmap

通过 mx-arena 的serve distributed命令进行千问模型跨节点部署时, 需通过此参将包含各个节点网卡信息的configmap名传递给 mx-arena。

创建configmap的过程分为两个步骤:

  1. 创建配置文件mx_network_map

# 配置的格式为hostname=SOCKET_IFRAME:MCCL_IB_HCA,如果没有IB网卡也可以不配置MCCL_IB_HCA
# 示例中表示k8s集群有2个worker节点,同时配置了SOCKET_IFRAME和IB网卡
(base) sw@gpunode-10-13-81-29:~$ cat mx_network_map
gpunode-10-13-81-29.sde.metax-tech.com ens5f0np0:mlx5_0,mlx5_1,mlx5_2
gpunode-10-13-81-25.sde.metax-tech.com ens16f0:mlx5_0,mlx5_1,mlx5_2
  1. 创建configmap

awk '{print "--from-literal=" $1 "=" substr($0, index($0,$2))}' mx_network_map | xargs kubectl create configmap mx-nic

完成上述两个步骤后,可以通过–nic-configmap=mx-nic将包含网卡配置信息的configmap传递给 mx-arena。

2.3.2.2. –enable-hostnetwork

用于指定pod是否共享宿主机的网络,用法为:–enable-hostnetwork=true。

2.3.2.3. –master-gpus/–worker-gpus

用于指定master节点/worker节点需要的GPU资源数。

2.3.2.4. –masters/–workers

用于指定master/worker节点数。

2.3.3. 命令示例

下面是一个2节点集群的部署示例。

 mx-arena serve distributed \
 --name=vllm-qianwen35 \
 --version=v3 \
 --restful-port=8010 \
 --image=mxcr.io/ai-release/maca/vllm-metax:0.25.0-maca.ai3.8.2.107-torch2.10-py310-ubuntu22.04-amd64 \
 --data-dir=/mxstorage:/mxstorage \
 --env="MACA_DIRECT_DISPATCH=1" --env="MACA_SMALL_PAGESIZE_ENABLE=1" --env="MACA_VLLM_ENABLE_MCTCLASS_FUSED_MOE=1" --env=MACA_VLLM_ENABLE_MCTCLASS_PYTHON_API=1 \
 --masters=1 \
 --master-gpus=8 \
 --master-command="vllm serve /mxstorage/pde_ai/models/llm/Qwen/Qwen3.5-397B-A17B-W8A8 \
 -tp 16 --trust-remote-code --max_num_batched_tokens 16384 \
 --port 8010 \
 --tool-call-parser qwen3_coder \
 --reasoning-parser qwen3 \
 --enable-auto-tool-choice \
 --gpu-memory-utilization 0.9 \
 --master-addr \$(LWS_LEADER_ADDRESS) \
 --nnodes \$LWS_GROUP_SIZE --node-rank \$LWS_WORKER_INDEX \
 --no-enable-prefix-caching" \
 --workers=1 \
 --worker-gpus=8 \
 --worker-command="vllm serve /mxstorage/pde_ai/models/llm/Qwen/Qwen3.5-397B-A17B-W8A8 \
 -tp 16 --trust-remote-code --max_num_batched_tokens 16384 \
 --port 8010 \
 --tool-call-parser qwen3_coder  \
 --reasoning-parser qwen3 \
 --enable-auto-tool-choice \
 --gpu-memory-utilization 0.9 \
 --master-addr \$(LWS_LEADER_ADDRESS) --headless \
 --nnodes \$LWS_GROUP_SIZE --node-rank \$LWS_WORKER_INDEX \
 --no-enable-prefix-caching" \
 --share-memory=100Gi \
 --readiness-probe-action="httpGet" \
 --readiness-probe-action-option="path: /health" \
 --readiness-probe-action-option="port: 8010" \
 --readiness-probe-option="initialDelaySeconds: 30" \
 --readiness-probe-option="periodSeconds: 30" \
 --readiness-probe-option="failureThreshold: 30" \
 --nic-configmap=mx-nic \
 --enable-hostnetwork=true

2.3.4. 状态查询

通过下面的命令查看千问模型是否启动成功,千问模型启动时间取决于模型大小。若AVAILABLE的值为1,则表明模型已启动成功。

(base) sw@gpunode-10-13-81-29:~$ mx-arena serve list
NAME            TYPE         VERSION  DESIRED  AVAILABLE  ADDRESS        PORTS
vllm-qianwen35  Distributed  v3       1        1          10.30.224.169  RESTFUL:8010

可以通过下面的命令查看服务详细信息。

(base) sw@gpunode-10-13-81-29:~$ mx-arena serve get vllm-qianwen35
Name:       vllm-qianwen35
Namespace:  default
Type:       Distributed
Version:    v3
Desired:    1
Available:  1
Age:        17m
Address:    10.30.224.169
Port:       RESTFUL:8010

Instances:
NAME                                       STATUS   AGE  READY  RESTARTS  NODE
----                                       ------   ---  -----  --------  ----
vllm-qianwen35-v3-distributed-serving-0    Running  17m  1/1    0         gpunode-10-13-81-25.sde.metax-tech.com
vllm-qianwen35-v3-distributed-serving-0-1  Running  17m  1/1    0         gpunode-10-13-81-29.sde.metax-tech.com

2.3.5. 使用示例

先获取服务的clusterIP,端口和模型路径,然后通过curl组合这些信息来访问千问模型服务。

# 获取服务的clusterIP及端口, 下图显示IP为10.30.224.169, 端口8010
(base) sw@gpunode-10-13-81-29:~$ mx-arena serve list
NAME            TYPE         VERSION  DESIRED  AVAILABLE  ADDRESS        PORTS
vllm-qianwen35  Distributed  v3       1        1          10.30.224.169  RESTFUL:8010

# 通过上一步获取的clusterIP和端口获取模型路径
(base) sw@gpunode-10-13-81-29:~$ curl http://10.30.224.169:8010/v1/models
{"object":"list","data":[{"id":"/mxstorage/pde_ai/models/llm/Qwen/Qwen3.5-397B-A17B-W8A8","object":"model","created":1791774342,"owned_by":"vllm","root":"/mxstorage/pde_ai/models/llm/Qwen/Qwen3.5-397B-A17B-W8A8","parent":null ...}]}]}

# 通过clusterIP,端口和模型路径访问千问模型,千问模型支持哪些HTTP接口,可以通过查看主POD的日志获取API列表
(base) sw@gpunode-10-13-81-29:~$ curl http://10.30.224.169:8010/v1/chat/completions -H "Content-Type: application/json" -d
'{"model": "/mxstorage/pde_ai/models/llm/Qwen/Qwen3.5-397B-A17B-W8A8", "messages": [{"role": "user", "content": "你是谁"}], "max_tokens": 100, "temperature": 0.7, "top_p": 0.9, "seed": 10}'
{"id":"chatcmpl-843a1eb0b088bc6e","object":"chat.completion","created":1787553066,"model":"/mxstorage/pde_ai/models/llm/Qwen/Qwen3.5-397B-A17B-W8A8","choices":[{"index":0,"message":{"role":
"assistant","content":null,"refusal":null,"annotations":null,"audio":null,"function_call":null,"tool_calls":[],"reasoning":"嗯,用户问“你是谁”,这是一个很基础的身份确认问题。我需要简洁清晰地介绍自己的核心身份和关键能力。
\n\n首先,要明确说明我是 Qwen3.5,是阿里巴巴最新推出的通义千问大语言模型。然后需要概括我的主要升级点,比如上下文窗口、多语言支持、逻辑推理、视觉分析、代码能力、智能体规划等。\n\n接着要突出我的特色优势,比如长窗口精准掌控、多语言覆
盖、代码全栈"},"logprobs":null,"finish_reason":"length","stop_reason":null,"token_ids":null}],"service_tier":null,"system_fingerprint":null,"usage":{"prompt_tokens":11,"total_tokens":111,"completion_tokens":100,
"prompt_tokens_details":null},"prompt_logprobs":null,"prompt_token_ids":null,"kv_transfer_params":null}(base)

2.3.6. 删除推理服务

通过下列指令删除刚才部署的推理服务。

(base) sw@gpunode-10-13-81-29@cluster-cp-0:~$ mx-arena serve delete vllm-qianwen35
INFO[0001] The serving job vllm-qianwen35 with version v3 has been deleted successfully