使用 dstack 部署 Qwen3-30B-A3B:GPU 编排、OpenAI 兼容服务发布与自动扩缩容实战
【免费下载链接】Qwen1.5Qwen3 is the large language model series developed by Qwen team, Alibaba Cloud.项目地址: https://gitcode.com/GitHub_Trending/qw/Qwen1.5
dstack 是一款面向 ML 团队的开源 GPU 编排框架,可视为 Kubernetes 与 Slurm 的开源替代方案。本文以 Qwen3 系列中的 MoE 模型 Qwen3-30B-A3B 为例,完整演示从安装 dstack、编写 Service 配置、选择 SGLang 推理后端,到通过 OpenAI 兼容端点与 Chat UI 访问服务、配置 Gateway 与自动扩缩容的全流程,帮助你在主流云厂商与自有集群上快速搭建高可用的大模型推理服务。
一、dstack 是什么:Kubernetes 与 Slurm 的开源替代
在开始部署之前,先明确 dstack 的定位。根据仓库中的官方文档(docs/source/deployment/dstack.rst),dstack 是一个开源工具,其核心目标是简化 GPU 分配与 AI 工作负载编排,面向在顶级云厂商、本地(on-prem)集群和各类加速器上运行模型的 ML 团队。
与直接操作 Kubernetes 或 Slurm 相比,dstack 采用"声明式配置文件 + 命令行工具"的工作方式,你只需要描述"要跑什么模型、需要什么 GPU、暴露哪个端口",dstack 负责完成资源申请、实例调度、服务发布与健康管理等底层细节。在本仓库的文档体系中,dstack 与 SGLang、vLLM、TGI、SkyPilot 等并列,共同构成 Qwen3 的 Deployment 章节 中"大规模推理部署"的推荐路径。
二、前置准备:安装 dstack 并初始化工作区
2.1 安装 dstack
部署前需要先安装 dstack,请按照 dstack 官方提供的安装说明完成安装。dstack 由两个部分组成:
- dstack Server:负责资源编排、配置管理与任务调度的核心服务;
- dstack CLI:用于与 Server 交互的命令行工具。
安装完成后,需要确保 dstack Server 处于运行状态,并在~/.dstack/server/config.yml中配置好你要使用的云厂商凭据(如 AWS、GCP、Azure 等),dstack 将据此在对应云上申请 GPU 实例。
2.2 初始化工作区
在 dstack Server 启动后,创建一个新的工作目录并执行dstack init完成工作区初始化:
mkdir dstack-qwen-deploy && cd dstack-qwen-deploy dstack initdstack init会在当前目录生成 dstack 工作区元数据(如.dstack目录),后续dstack apply、dstack run等命令都会基于该工作区与 Server 交互。也可以在初始化时通过--project参数指定项目名,项目名会出现在后续服务端点 URL 中(见下文访问服务章节)。
三、编写服务配置:用 SGLang 承载 Qwen3-30B-A3B
3.1 模型与推理后端的选择
本次部署目标为Qwen3-30B-A3B——这是 Qwen3 系列中 300 亿总参数量、30 亿激活参数(30B-A3B)的 MoE(Mixture-of-Experts)模型。仓库根目录 README.md 中将其列为 Qwen3 系列的旗舰尺寸之一,主打在相对经济的显存占用下提供接近稠密大模型的推理质量。
在 dstack 中,你可以使用SGLang、TGI或vLLM三种主流推理框架来承载模型。原文档以 SGLang 为例,仓库中三个推理框架均有独立文档可供对照:
| 推理后端 | 仓库文档 | 服务启动方式(本仓库文档示例) |
|---|---|---|
| SGLang | docs/source/deployment/sglang.md | python -m sglang.launch_server |
| vLLM | docs/source/deployment/vllm.md | vllm serve Qwen/Qwen3-8B |
| TGI | docs/source/deployment/tgi.rst | 基于 Docker 镜像ghcr.io/huggingface/text-generation-inference |
3.2 创建 Service 配置文件
在dstack-qwen-deploy目录下创建一个名为serve-30b.dstack.yml的服务(Service)配置文件:
type: service name: qwen3-30b-a3b image: lmsysorg/sglang:latest env: - MODEL_ID=Qwen/Qwen3-30B-A3B commands: - python3 -m sglang.launch_server --model-path $MODEL_ID --port 8000 --trust-remote-code port: 8000 model: Qwen/Qwen3-30B-A3B resources: gpu: 80GB:13.3 配置逐项解析
type: service:声明这是一个 dstackService(服务)而非 Task 或 Dev Environment。Service 的特点是长期运行、对外提供稳定端点,并支持自动扩缩容与健康检查。name: qwen3-30b-a3b:服务名称,会出现在端点 URL 与 Chat UI 路径中。image: lmsysorg/sglang:latest:使用官方 SGLang 容器镜像。仓库文档(docs/source/deployment/sglang.md)要求本地安装时sglang>=0.4.6.post1,使用镜像则免去了手工安装 CUDA 依赖与编译的麻烦。env: MODEL_ID=...:环境变量MODEL_ID指定模型标识,SGLang 启动命令通过$MODEL_ID引用。commands:容器启动后执行的服务命令,即 SGLang 的启动入口:python3 -m sglang.launch_server:SGLang 的 OpenAI 兼容 API 服务入口。默认监听http://localhost:30000,这里通过--port 8000改为 8000,与下方 dstack 的port字段保持一致;--model-path $MODEL_ID:模型路径。若本地没有该目录,SGLang 会从 Hugging Face Hub 自动下载权重;--trust-remote-code:信任模型仓库中的自定义代码(Qwen 系列的 config/建模代码需要此项)。大陆用户可预先设置环境变量SGLANG_USE_MODELSCOPE=true,使模型从 ModelScope 下载。
port: 8000:告诉 dstack 容器内服务实际监听的端口,dstack 据此做端口映射与健康检查。model: Qwen/Qwen3-30B-A3B:声明服务所承载的模型,用于 dstack 的模型管理、Chat UI 集成与指标追踪。resources: gpu: 80GB:1:请求1 张 80GB 显存的 GPU(如 A100/H100 80GB),这是 Qwen3-30B-A3B 这类 MoE 模型在未量化情况下的基本显存需求,也是在 dstack 配置的云厂商中申请实例的资源规格。
3.4 关于 SGLang 后端的补充说明
仓库中的 SGLang 部署指南(docs/source/deployment/sglang.md)还给出了几点与本服务配置直接相关的细节:
- 模型下载来源:
--model-path指向有效本地目录时使用本地权重;否则从 Hugging Face Hub 下载。若需从 ModelScope 下载,在启动前执行export SGLANG_USE_MODELSCOPE=true; - 张量并行:当单卡显存不足时,可在
commands中追加--tensor-parallel-size 4等参数,将模型切分到多张 GPU 上(相应地resources.gpu需改为80GB:4); - 思考模式:Qwen3 默认会先"思考"再回答,可通过 API 请求中的
chat_template_kwargs: {"enable_thinking": false}关闭;如需彻底禁用思考(即使提示词里写/think也不思考),可在启动命令中追加--chat-template ./qwen3_nonthinking.jinja,仓库已提供该模板:docs/source/assets/qwen3_nonthinking.jinja; - 长上下文:Qwen3 预训练上下文最长 32,768 tokens,若需更长上下文可配置 YaRN 扩展,例如
--json-model-override-args '{"rope_scaling":{"rope_type":"yarn","factor":4.0,"original_max_position_embeddings":32768}}' --context-length 131072,但静态 YaRN 可能影响短文本性能,建议仅在确有长文本需求时启用。
四、应用配置并部署
配置文件就绪后,运行dstack apply提交服务:
dstack apply -f serve-30b.dstack.ymldstack 会解析配置、按resources.gpu规格在你的云账号下申请实例、拉取lmsysorg/sglang:latest镜像并执行commands中的启动命令。部署完成后,服务即处于运行状态并对外暴露端点。
提示:如果希望使用 vLLM 或 TGI 作为推理后端,只需替换
image与commands部分即可——vLLM 的启动命令为vllm serve Qwen/Qwen3-30B-A3B,TGI 则使用ghcr.io/huggingface/text-generation-inference镜像,具体用法可分别参考 docs/source/deployment/vllm.md 与 docs/source/deployment/tgi.rst。
五、访问服务:OpenAI 兼容端点与 Chat UI
服务部署成功后,可以通过以下两种方式访问。
5.1 方式一:通过 CURL 调用 OpenAI 兼容 API
服务端点遵循如下路径规则:
<dstack server URL>/proxy/services/<project name>/<run name>/其中<project name>为 dstack 项目名(dstack init时指定,默认项目通常为main),<run name>即服务配置中的name(此处为qwen3-30b-a3b)。使用 CURL 调用聊天补全接口:
curl http://localhost:3000/proxy/services/main/qwen3-30b-a3b/v1/chat/completions \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer <dstack token>' \ -d '{ "model": "Qwen/Qwen3-30B-A3B", "messages": [ { "role": "user", "content": "Compose a poem that explains the concept of recursion in programming." } ] }'请求体与标准 OpenAI Chat Completions 接口一致:model指定模型名,messages传入对话历史。请求中的Authorization: Bearer <dstack token>需要替换为 dstack 的访问令牌。
关于 admin token:启动 dstack Server 时,会自动生成一个管理员令牌,终端日志大致如下:
The admin token is "bbae0f28-d3dd-4820-bf61-8f4bb40815da" The server is running at http://127.0.0.1:3000/将该 token 填入<dstack token>即可完成鉴权。这也解释了 CURL 示例中默认使用localhost:3000的原因——这是 dstack Server 的默认监听端口。
5.2 方式二:通过 dstack Chat UI 交互
dstack 还内置了聊天界面(Chat UI),访问路径为:
<dstack server URL>/projects/<project name>/models/<run name>/在浏览器打开该地址,即可获得一个开箱即用的对话页面,无需自己编写客户端代码,适合快速验证模型效果或提供给非技术同事使用。
5.3 Gateway:生产化发布的关键
原文档特别指出:仅用于开发目的的服务无需配置 Gateway。但在以下场景中,必须搭建 Gateway:
- 需要使用自动扩缩容(auto-scaling)或速率限制(rate limits);
- 需要为端点启用HTTPS并将其映射到自有域名;
- 服务需要WebSocket长连接支持;
- 服务无法与路径前缀(path prefix)配合工作。
Gateway 在 dstack 中扮演反向代理与流量入口的角色,它把proxy/services/...这样的路径前缀机制与真实服务连接起来,并承载 TLS 终止、负载均衡、自动扩缩容决策等能力。配置方式为在 dstack 配置中声明gateway资源并在服务配置中引用,具体字段可参考 dstack 官方文档中关于 Gateway 的说明。
六、副本与自动扩缩容
6.1 配置方法
在serve-30b.dstack.yml中追加以下配置,即可开启服务的水平扩缩容:
replicas: min..max:定义副本数的最小值与最大值(例如1..4表示至少 1 个副本、最多 4 个副本);scaling:定义扩缩容的触发规则,决定何时增加或减少副本。
启用自动扩缩容的完整配置示例如下:
type: service name: qwen3-30b-a3b image: lmsysorg/sglang:latest env: - MODEL_ID=Qwen/Qwen3-30B-A3B commands: - python3 -m sglang.launch_server --model-path $MODEL_ID --port 8000 --trust-remote-code port: 8000 model: Qwen/Qwen3-30B-A3B resources: gpu: 80GB:1 # Minimum and maximum number of replicas replicas: 1..4 scaling: # Requests per seconds metric: rps # Target metric value target: 106.2 配置解读
replicas: 1..4:dstack 会始终保持至少 1 个副本在线(保证可用性),在负载升高时最多扩展到 4 个副本;scaling.metric: rps:扩缩容依据的指标为每秒请求数(Requests Per Second);scaling.target: 10:目标指标值。当聚合 RPS 超过 10 时,dstack 倾向于扩容;当负载回落时则缩容,从而在保证响应能力的同时控制 GPU 成本。
重要提醒:
scaling(自动扩缩容)属性要求先配置好 Gateway,原因正如上一节所述——自动扩缩容决策依赖 Gateway 对流量进行聚合与度量。若未配置 Gateway,即使写了scaling配置也无法生效。
每个副本都对应一份完整的lmsysorg/sglang:latest容器与Qwen/Qwen3-30B-A3B权重加载(各占 1 张 80GB GPU)。因此扩容到 4 个副本意味着最多同时占用 4 张 80GB GPU,请结合账号配额与预算合理设定上限。
七、相关 dstack 概念(See also)
原文档在末尾列出了与本次部署密切相关的 dstack 核心概念,理解它们有助于把单个模型服务扩展为完整的 ML 工作流:
- Fleets:使用 Fleets 创建云上与本地(on-prem)集群,为多个任务/服务提供共享的 GPU 资源池,可预先申请常驻实例以缩短冷启动时间;
- Dev Environments:在投产前使用 Dev Environments 进行实验与测试——以 SSH 方式进入一个带 GPU 的开发环境,迭代模型代码后再发布为正式服务;
- Tasks:使用 Tasks 调度单节点或分布式训练任务,适合需要一次性运行完毕的作业(如微调、评测),与常驻的 Service 互补;
- Services:以安全、可自动扩缩容的 OpenAI 兼容端点部署模型,即本文使用的资源类型;
- Metrics:dstack 会自动追踪服务性能指标,可通过 CLI 或 UI 监控吞吐、延迟等关键数据,为扩缩容策略的调优提供依据。
八、小结
通过本指南,你已经掌握了一条从零到一的生产级 Qwen3 部署路径:
- 安装 dstack 并初始化工作区;
- 编写声明式 Service 配置,选择 SGLang(或 vLLM/TGI)作为推理后端承载 Qwen3-30B-A3B;
- 通过
dstack apply一键部署,模型权重在首次启动时自动从 Hugging Face(或 ModelScope)拉取; - 通过
proxy/services/...路径调用 OpenAI 兼容 API,或使用 dstack Chat UI 直接交互; - 按需配置 Gateway,并利用
replicas+scaling实现按 RPS 的自动扩缩容。
dstack 的价值在于把"申请 GPU 实例、拉镜像、起服务、暴露端点、弹性伸缩"这串复杂流程收敛为一份 YAML 配置。当你的部署规模进一步扩大时,可以继续探索 Fleets(资源池化)、Tasks(训练作业)与 Metrics(性能监控)等能力,构建完整的 ML 交付体系。
【免费下载链接】Qwen1.5Qwen3 is the large language model series developed by Qwen team, Alibaba Cloud.项目地址: https://gitcode.com/GitHub_Trending/qw/Qwen1.5
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考