GX10主機vLLM部屬Qwen3.6請益
-
各位大佬好,目前公司要我架設一個地端的 AI 協尋平台,但在效能調校上遇到了一些瓶頸,想請教版上是否有前輩處理過類似架構的經驗。
【專案需求】
一般使用者: 透過 Librechat 進行日常問答。
RD 工程師: 透過 API 串接模型,輔助 Code 編寫。
【目前遇到的問題】
目前我們部署了 Qwen3.5:9B 以及 Qwen3.6:27B 兩個模型,雖然已經嘗試開啟了 fp8 Cache,但實際測試下來,兩個模型的推論生成速度皆不盡理想,無法滿足 RD 開發時需要的流暢度。想請教各位前輩在不購買設備的情況下還有甚麼優化空間呢?
services: vllm-qwen-27b: image: vllm/vllm-openai:latest container_name: vllm-qwen-27b restart: unless-stopped ipc: host shm_size: "16gb" ports: - "8001:8000" volumes: - ~/.cache/huggingface:/root/.cache/huggingface environment: - HUGGING_FACE_HUB_TOKEN=${HF_TOKEN} command: > Qwen/Qwen3.6-27B --host 0.0.0.0 --port 8000 --served-model-name qwen3.6-27b --gpu-memory-utilization 0.70 --max-model-len 32768 --kv-cache-dtype fp8 --trust-remote-code --reasoning-parser qwen3 deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu] vllm-qwen: image: vllm/vllm-openai:qwen3_5-cu130 container_name: vllm-qwen restart: unless-stopped ipc: host shm_size: "8gb" ports: - "8002:8000" volumes: - ~/.cache/huggingface:/root/.cache/huggingface environment: - HUGGING_FACE_HUB_TOKEN=${HF_TOKEN} command: > Qwen/Qwen3.5-9B --host 0.0.0.0 --port 8000 --served-model-name qwen3.5-9b --gpu-memory-utilization 0.25 --max-model-len 16384 --kv-cache-dtype fp8 --trust-remote-code --reasoning-parser qwen3 deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu] # ============================================================ # LibreChat:主要聊天介面 # ============================================================ librechat: image: ghcr.io/danny-avila/librechat:latest container_name: librechat restart: unless-stopped ports: - "3000:3080" volumes: - ./librechat-config/librechat.yaml:/app/librechat.yaml - librechat-uploads:/app/client/public/images - librechat-logs:/app/api/logs environment: - MONGO_URI=mongodb://mongodb:27017/LibreChat - MEILI_HOST=http://meilisearch:7700 - MEILI_MASTER_KEY=${MEILI_MASTER_KEY} - JWT_SECRET=${JWT_SECRET} - JWT_REFRESH_SECRET=${JWT_REFRESH_SECRET} - ALLOW_REGISTRATION=true # 首次設定完可改 false - RAG_USE_FULL_CONTEXT=true # ← 關鍵:強制全文送入,不切塊 depends_on: - vllm-qwen-27b - vllm-qwen # LibreChat 需要的 MongoDB mongodb: image: mongo:6 container_name: librechat-mongo restart: unless-stopped volumes: - mongodb-data:/data/db # LibreChat 需要的 MeiliSearch(對話搜尋功能) meilisearch: image: getmeili/meilisearch:v1.12 container_name: librechat-meili restart: unless-stopped environment: - MEILI_MASTER_KEY=${MEILI_MASTER_KEY} - MEILI_NO_ANALYTICS=true volumes: - meilisearch-data:/meili_data volumes: librechat-uploads: librechat-logs: mongodb-data: meilisearch-data: -
@Fishbubu GX10 上跑两个 vLLM 容器的性能优化,在不加硬件的情况下有几个可以优化的点:
1. --gpu-memory-utilization 拉高
你目前的 27B 设置的是 0.70,对于单卡场景偏保守了。GX10 如果是 48GB+ 显存,0.70 = 33.6GB 预留给 vLLM。27B fp8 模型权重约 27GB + KV cache 动态分配,实际利用率不高。建议提到 0.90-0.95,vLLM 的 memory management 已经很成熟了,不会 OOM。2. 9B 容器的 memory utilization 可以压低
0.25 对 9B 模型来说太多了,9B fp8 权重才 ~9GB。压到 0.15 甚至 0.10,省下显存给 27B 那边。3. 加 --enable-prefix-caching(关键)
LibreChat 每次对话都会带上 system prompt,前缀几乎一样。加上这个参数后,vLLM 会自动缓存 KV cache 中重复前缀的部分,多用户并发时吞吐量提升很明显:--enable-prefix-caching true --max-num-seqs 2564. --num-scheduler-steps 提高吞吐
默认是 1,建议加到 8:--num-scheduler-steps 8配合
--max-num-batched-tokens 8192,让调度器一次拿更多 token 处理,减少 overhead。5. 考虑合并为一个 vLLM 实例(进阶)
两个 vLLM 容器各占一份显存开销(模型本身之外还有 scheduler 等 overhead)。如果只有一个 GPU,可以让一个 vLLM 实例同时 serve 两个模型,通过--model指定主模型,然后用--serve-models路由。这样显存利用率更高。6. fp8 Cache 没问题,但检查下你的 GPU 是否硬件支持
GX10(Blackwell)原生支持 fp8,但如果你用的 vLLM 镜像版本较旧,fp8 KV cache 走的是软件模拟,反而会慢。确认下 vLLM 版本 >= 0.8.0。还有就是 max-model-len 32K 对 27B 够用了,如果实际使用很少跑满 32K,可以适当降到 16K 省显存。
-
一台GX10跑qwen3.6 27B FP8, 開mtp大概有20 tok/s, 我的配置如下, 抄上面那個網站的:
spark3:~/llm/qwen26-27b$ cat qwen3.6-27b-fp8.yaml
recipe_version: "1"
name: Qwen3.6-27B-FP8-MTP
description: vLLM serving Qwen3.6-27B-FP8 with MTP=3 on a single GB10 (Spark Arena recipe)
model: Qwen/Qwen3.6-27B-FP8
container: vllm/vllm-openai:v0.20.0-aarch64-cu130-ubuntu2404-ws
solo_only: truedefaults:
port: 8004
host: 0.0.0.0
tensor_parallel: 1
gpu_memory_utilization: 0.8069
max_model_len: 262144
max_num_batched_tokens: 32768
max_num_seqs: 8env:
VLLM_MARLIN_USE_ATOMIC_ADD: "1"
VLLM_USE_DEEP_GEMM: "0"
CUDA_MANAGED_FORCE_DEVICE_ALLOC: "1"
PYTORCH_CUDA_ALLOC_CONF: "expandable_segments:True"
OMP_NUM_THREADS: "4"command: |
vllm serve Qwen/Qwen3.6-27B-FP8
--served-model-name Qwen/Qwen3.6-27B-FP8 qwen3.6-27b
--tensor-parallel-size {tensor_parallel}
--port {port} --host {host}
--max-model-len {max_model_len}
--max-num-seqs {max_num_seqs}
--max-num-batched-tokens {max_num_batched_tokens}
--gpu-memory-utilization {gpu_memory_utilization}
--kv-cache-dtype fp8
--enable-prefix-caching
--language-model-only
--async-scheduling
--max-cudagraph-capture-size 128
--reasoning-parser qwen3
--enable-auto-tool-choice
--tool-call-parser qwen3_coder
--speculative-config '{{"method":"mtp","num_speculative_tokens":3}}'
--trust-remote-code如果有兩台會再快一些