构建基于vLLM/SGlang主流推理引擎的云原生大模型监控大盘
随着大语言模型(LLM)在生产环境的规模化落地,构建高并发、低延迟的推理服务已成为核心诉求。vLLM和 SGLang等主流推理引擎凭借PageAttention等前沿技术,已成为企业部署大模型的首选底座。然而,大模型推理属于典型的“黑盒”高密度计算,企业在生产环境中往往面临以下运维挑战:
- 吞吐量与队列感知滞后:无法实时感知引擎内部的请求队列状态(如Waiting/Running Requests数量),难以判断系统是否存在过载或拥堵。
- Token级能效无法量化:缺乏对首字延迟(TTFT,Time to First Token)、Token间延迟(ITL,Inter-Token Latency)等大模型专属性能指标的监控。
- 显存碎片与算力脱节:无法将KV Cache内存占用率与底层GPU的实际算力利用率联合分析,导致资源调度与部署策略优化困难。
华为云云容器引擎(CCE)全面兼容vLLM、SGLang等业界主流高性能开源推理引擎。以下实践以vLLM为例,依托CCE内置的云原生监控插件(Prometheus架构),通过声明式配置自动发现并无缝抓取大模型推理引擎原生暴露的Prometheus格式性能指标。
前提条件
- 已创建1.34及以上版本的集群,且集群中包含GPU节点,并已运行GPU相关业务。
- 已安装CCE AI套件(NVIDIA GPU)和云原生监控插件。
安装云原生监控插件时,须开启“监控数据上报至AOM服务”,以便将普罗数据上报至AOM服务。
操作步骤
- 准备本地大语言模型。
该示例需要Python 3.8或更高版本。
- 安装HuggingFace Python客户端。
pip install --trusted-host mirrors.tools.huawei.com \ -i https://mirrors.tools.huawei.com/pypi/simple \ -U huggingface_hub - 设置环境变量,防止下载超时。
export HF_HUB_DOWNLOAD_TIMEOUT=10000
- 创建目标目录。
mkdir -p /data/huggingface-cache/DeepSeek-R1-Distill-Qwen-1.5B
- 创建以下Python文件并运行,以下载所需模型。
from huggingface_hub import HfApi HF_ENDPOINT = 'http://mirrors.tools.huawei.com/huggingface' api = HfApi(endpoint=HF_ENDPOINT) api.snapshot_download( repo_id="deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B", repo_type="model", revision="main", local_dir="/data/huggingface-cache/DeepSeek-R1-Distill-Qwen-1.5B", etag_timeout=10000 )
- 安装HuggingFace Python客户端。
- 部署vLLM服务并配置监控。
- 使用以下YAML创建一个vLLM负载。
- 创建的负载必须运行在已下载模型的节点上。
- 当前容器镜像使用的是开源镜像,若因网络等问题导致拉取失败,请自行检查您的网络或代理设置。
apiVersion: apps/v1 kind: Deployment metadata: name: deepseek-r1-qwen namespace: default labels: app: deepseek-r1-qwen spec: replicas: 1 selector: matchLabels: app: deepseek-r1-qwen template: metadata: labels: app: deepseek-r1-qwen spec: volumes: - name: model-volume hostPath: path: /data/huggingface-cache/DeepSeek-R1-Distill-Qwen-1.5B type: Directory - name: shm emptyDir: medium: Memory sizeLimit: "2Gi" containers: - name: deepseek-r1-qwen image: vllm/vllm-openai:nightly command: ["/bin/sh", "-c"] args: [ "vllm serve /models/DeepSeek-R1-Distill-Qwen-1.5B --trust-remote-code --max-model-len 4096" ] ports: - containerPort: 8000 name: http resources: limits: cpu: "8" memory: 12G nvidia.com/gpu: "1" requests: cpu: "2" memory: 4G nvidia.com/gpu: "1" volumeMounts: - mountPath: /models/DeepSeek-R1-Distill-Qwen-1.5B name: model-volume readOnly: true - name: shm mountPath: /dev/shm livenessProbe: httpGet: path: /health port: 8000 initialDelaySeconds: 120 periodSeconds: 10 timeoutSeconds: 5 failureThreshold: 3 readinessProbe: httpGet: path: /health port: 8000 initialDelaySeconds: 120 periodSeconds: 5 timeoutSeconds: 5 failureThreshold: 3 - 观察负载的运行状态。
kubectl get pods -w
返回示例如下,显示Pod状态为Running。
NAME READY STATUS RESTARTS AGE deepseek-r1-qwen-84b95998-qtwgn 1/1 Running 0 78m
- 使用以下YAML创建一个PodMonitor。
apiVersion: monitoring.coreos.com/v1 kind: PodMonitor metadata: name: vllm-deepseek-metrics namespace: default labels: app: deepseek-r1-qwen spec: selector: matchLabels: app: deepseek-r1-qwen podMetricsEndpoints: - port: http path: /metrics interval: 30s
- 使用以下YAML创建一个vLLM负载。
- 验证大语言模型服务是否正常运行。
- 通过端口转发将部署的vLLM服务暴露到本地端口。
kubectl port-forward deployment/deepseek-r1-qwen 8000:8000
返回示例如下。
Forwarding from 127.0.0.1:8000 -> 8000 Forwarding from [::1]:8000 -> 8000
保持终端运行,后续请求将通过localhost:8000发送。
- 在新终端中发送测试请求。
打开一个新终端窗口,执行以下 `curl` 命令,向模型发送测试请求。
curl http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "/models/DeepSeek-R1-Distill-Qwen-1.5B", "messages": [{"role": "user", "content": "Hello, how are you?"}], "max_tokens": 50 }' - 观察端口输出。
Forwarding from 127.0.0.1:8000 -> 8000 Forwarding from [::1]:8000 -> 8000 Handling connection for 8000
- 观察模型输出。
{"id":"chatcmpl-10321d932eaf4f8f820241c630******","object":"chat.completion","created":1766490573,"model":"/models/DeepSeek-R1-Distill-Qwen-1.5B","choices":[{"index":0,"message":{"role":"assistant","content":"Alright, the user greeted me with \"Hello, how are you?\" which is a common and friendly way to start a conversation. I should respond in a similar tone to keep the conversation going smoothly.\n\nI want to make sure I acknowledge their greeting and","refusal":null,"annotations":null,"audio":null,"function_call":null,"tool_calls":[],"reasoning_content":null},"logprobs":null,"finish_reason":"length","stop_reason":null,"token_ids":null}],"service_tier":null,"system_fingerprint":null,"usage":{"prompt_tokens":11,"total_tokens":61,"completion_tokens":50,"prompt_tokens_details":null},"prompt_logprobs":null,"prompt_token_ids":null,"kv_transfer_params":null}
- 通过端口转发将部署的vLLM服务暴露到本地端口。
- 配置采集并进行指标上报与查询。
- 配置采集策略。
- 登录CCE控制台,进入目标集群,在左侧导航栏选择“配置中心”,单击“监控运维配置”页签。
- 单击PodMonitor旁边的“管理”。
- 在PodMonitor页签中,开启对应的PodMonitor采集策略。
- 确认采集端点已开放。
- 登录AOM控制台,在左侧目录选择“指标浏览”,选择对应的普罗实例,查询vllm指标。
- 配置采集策略。


