使用 SkyPilot 与 vLLM 在任意基础设施上部署 DeepSeek-R1 蒸馏模型:8B 到 70B 完整实战指南
2026/9/16 18:39:22 网站建设 项目流程

使用 SkyPilot 与 vLLM 在任意基础设施上部署 DeepSeek-R1 蒸馏模型:8B 到 70B 完整实战指南

【免费下载链接】skypilotThe AI Compute Platform for frontier teams. SkyPilot turns fragmented AI compute into one AI supercomputer, so frontier AI teams build custom intelligence faster.项目地址: https://gitcode.com/GitHub_Trending/sk/skypilot

本文以 SkyPilot 开源仓库中的 llm/deepseek-r1-distilled 示例为核心,系统讲解如何在本地 GPU 工作站、Kubernetes 集群以及 15+ 公有云上,用一条sky launch命令拉起 vLLM 服务并托管 DeepSeek-R1 蒸馏模型(8B / 70B)。读完本文,你将掌握 DeepSeek-R1 蒸馏模型的最小可运行配置、GPU 选型矩阵、vLLM OpenAI 兼容端点调用方法,以及向 SkyServe 多副本高可用服务升级的路径。

DeepSeek-R1 蒸馏模型为什么适合用 SkyPilot 部署

2025 年 1 月 20 日,DeepSeek AI 发布了 DeepSeek-R1 系列模型,参数规模最高达 671B。R1 在训练中自然涌现出大量强大的推理行为(chain-of-thought reasoning),其推理能力在多项评测中达到或接近当时闭源顶级模型 OpenAI-o1 的水平,并成为首批在该能力维度上逼近闭源模型的开放权重 LLM 之一。

对大多数团队而言,直接部署 671B 级别的稠密/ MoE 原版模型需要 H100/H200 级别的多卡多机资源。SkyPilot 在 llm/deepseek-r1-distilled 目录下提供了针对蒸馏小模型的开箱即用方案:通过 deepseek-r1-vllm.yaml 一个配置文件,即可在 L4、A10G、A100 等单机单卡/双卡环境下,用 vLLM 托管DeepSeek-R1-Distill-Llama-8BDeepSeek-R1-Distill-Llama-70B。与原版 671B 的分布式 SGLang 方案(见 llm/deepseek-r1/README.md)互补,蒸馏路线让普通团队用消费级数据中心 GPU 就能体验 R1 的推理能力。

本指南默认使用 vLLM 作为推理引擎——它是开源社区中吞吐性能出色的 LLM 推理与服务库,且提供 OpenAI 兼容的 HTTP API,便于直接对接现有应用。

Step 0:接入任意基础设施

安装 SkyPilot

在本地控制机安装 SkyPilot:

pip install 'skypilot-nightly[all]'

[all]会一并安装各云厂商的 SDK 依赖。安装完成后,根据你计划运行 DeepSeek-R1 的基础设施类型选择下一步:

场景 A:已有本地 GPU 机器或 GPU 集群—— 直接让 SkyPilot 接管现有机器:

sky local up

sky local up会在现有机器(或本机)上初始化一个 SkyPilot 管理集群。从源码看,该命令由 sky/client/cli/command.py 的local_up入口实现,底层基于 kind 创建一个名为kind-skypilot的 Kubernetes 上下文(见 sky/provision/kubernetes/utils.py),SkyPilot 随后以 Kubernetes 模式调度这些本地 GPU。

场景 B:使用公有云(15+ 云厂商)—— 校验云凭据与配额:

sky check

sky check会逐个探测各云厂商的认证是否就绪,并打印可用的云与区域列表。完成任一场景后,SkyPilot 即可在对应的基础设施上调度任务。

Step 1:一条命令拉起 DeepSeek-R1 蒸馏模型

8B 模型

sky launch deepseek-r1-vllm.yaml \ -c deepseek \ --env MODEL_NAME=deepseek-ai/DeepSeek-R1-Distill-Llama-8B \ --gpus L4:1

70B 模型

sky launch deepseek-r1-vllm.yaml \ -c deepseek \ --env MODEL_NAME=deepseek-ai/DeepSeek-R1-Distill-Llama-70B \ --gpus A100-80GB:2

命令说明:

  • -c deepseek:为集群命名,后续sky statussky down均以此名称引用;
  • --env MODEL_NAME=...:覆盖 YAML 中默认的模型 ID,指定要加载的 Hugging Face 模型;
  • --gpus <GPU>:<数量>:覆盖 YAML 中的加速器声明,指定 GPU 型号与卡数。若不确定自己可用哪些 GPU,可运行sky gpus list查看当前账号/集群可访问的全部 GPU 型号。

运行前也可先查看可用 GPU:sky gpus list

模型与 GPU 兼容性矩阵

原 README 给出了如下参考矩阵(✅ 表示可运行,❌ 表示不可行;带说明的项需要附加参数):

GPUDeepSeek-R1-Distill-Qwen-7BDeepSeek-R1-Distill-Llama-70BDeepSeek-R1(671B)
L4:1✅,需--max-model-len 4096
L4:8
A100:8
A100-80GB:12✅,需--max-model-len 4096

解读要点:

  • 7B 级蒸馏模型对显存要求很低,单张 L4(24GB 显存)即可承载,但长序列时需要将最大上下文长度限制在 4096 token;
  • 70B 蒸馏模型至少需要 2 张 A100-80GB(通过 vLLM 的张量并行将模型切分到多卡);单张 L4 无法容纳;
  • 671B 原版模型需要 12 张 A100-80GB 且同样限制上下文长度,生产级多机方案请参考 llm/deepseek-r1。

Step 2:获取结果——OpenAI 兼容端点调用

获取集群 IP

SkyPilot 会把集群的对外 IP 写入集群状态:

ENDPOINT=$(sky status --ip deepseek)

8B 模型请求示例

curl http://$ENDPOINT:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-ai/DeepSeek-R1-Distill-Llama-8B", "messages": [ { "role": "system", "content": "You are a helpful assistant." }, { "role": "user", "content": "Who are you?" } ] }' | jq .

70B 模型请求示例

curl http://$ENDPOINT:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-ai/DeepSeek-R1-Distill-Llama-70B", "messages": [ { "role": "system", "content": "You are a helpful assistant." }, { "role": "user", "content": "how many rs are in strawberry" } ] }' | jq .

响应解读:<think>思考链 + 最终答案

R1 蒸馏模型会在响应中以<think>...</think>标签输出可见的推理过程,随后给出最终结论。以下是 "Who are you?" 的完整响应示例:

{ "id": "chatcmpl-507f467863344f31b98d8bf36b9a3c1c", "object": "chat.completion", "created": 1737503962, "model": "deepseek-ai/DeepSeek-R1-Distill-Llama-70B", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "<think>\n\n</think>\n\nGreetings! I'm DeepSeek-R1, an artificial intelligence assistant created by DeepSeek. I'm at your service and would be delighted to assist you with any inquiries or tasks you may have.", "tool_calls": [] }, "logprobs": null, "finish_reason": "stop", "stop_reason": null } ], "usage": { "prompt_tokens": 13, "total_tokens": 57, "completion_tokens": 44, "prompt_tokens_details": null }, "prompt_logprobs": null }

针对 "how many rs are in strawberry" 这类需要逐字符推理的问题,模型会展开详细思考链。例如它对 strawberry 的逐字母拆解S-T-R-A-W-B-E-R-R-Y、位置标注(第 3/8/9 位为 R)、以及“straw 含 1 个 R、berry 含 2 个 R”的组合式论证,最终给出结论“strawberry 中包含 3 个 R”。其完整响应结构如下(思考链内容较长,此处展示 JSON 骨架):

{ "id": "chatcmpl-d532bd1c1738493ab9c8c906550044bf", "object": "chat.completion", "created": 1737507945, "model": "deepseek-ai/DeepSeek-R1-Distill-Llama-70B", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "<think>\nOkay, so I need to figure out how many times the letter 'R' appears in the word \"strawberry.\"...\nThe word \"strawberry\" contains three Rs. \n\nStep-by-step breakdown:\n- The first R is the third letter.\n- The second R is the eighth letter.\n- The third R is the ninth letter.\n\nAnswer: There are 3 Rs in \"strawberry.\"", "tool_calls": [] }, "logprobs": null, "finish_reason": "stop", "stop_reason": null } ], "usage": { "prompt_tokens": 15, "total_tokens": 985, "completion_tokens": 970, "prompt_tokens_details": null }, "prompt_logprobs": null }

可以看到usage.completion_tokens(970)远大于prompt_tokens(15),这正是 R1 推理模型的典型特征:绝大多数生成 token 都消耗在思考链上。在接入业务系统时,可自行决定是否剥离<think>标签再展示给最终用户。

深入解析 deepseek-r1-vllm.yaml:一个可复用的 vLLM 服务模板

deepseek-r1-vllm.yaml 是整套方案的灵魂,全文件仅 22 行,却完整覆盖了环境变量、资源声明、依赖安装与服务启动四大部分:

envs: MODEL_NAME: deepseek-ai/DeepSeek-R1-Distill-Llama-8B MAX_MODEL_LEN: 4096 resources: accelerators: {L4:1, A10G:1, A10:1, A100:1, A100-80GB:1} ports: - 8000 disk_tier: best setup: | uv pip install transformers==4.48.1 uv pip install vllm==0.6.6.post1 run: | echo 'Starting vllm openai api server...' python -m vllm.entrypoints.openai.api_server \ --host 0.0.0.0 \ --tensor-parallel-size $SKYPILOT_NUM_GPUS_PER_NODE \ --model $MODEL_NAME \ --max-model-len $MAX_MODEL_LEN

envs:可被命令行覆盖的模型参数

  • MODEL_NAME:默认加载deepseek-ai/DeepSeek-R1-Distill-Llama-8B,可通过--env MODEL_NAME=...覆盖为 70B 或其他蒸馏变体;
  • MAX_MODEL_LEN:默认 4096 token,控制 vLLM 的最大上下文长度。显存紧张(如单张 L4 跑 7B/8B 蒸馏模型)时必须限制该值,避免 OOM。

resources:SkyPilot 的按需资源声明

  • accelerators: {L4:1, A10G:1, A10:1, A100:1, A100-80GB:1}:声明“任一可用即可”的加速器候选集合。SkyPilot 会在这些型号中按成本/可用性自动选择,从而在不同云、不同区域间自动 failover。命令行--gpus可进一步覆盖此集合;
  • ports: 8000:向 SkyPilot 声明服务监听端口,用于后续自动获取 endpoint 与安全组/负载均衡配置;
  • disk_tier: best:请求高性能磁盘。这对下载数十 GB 模型权重、以及 vLLM 权重映射阶段显著有利。disk_tier在 sky/resources.py 中解析为DiskTier枚举,可选值由supported_tiers校验,非法值会直接抛错。

setup:秒级依赖安装

uv pip install transformers==4.48.1 uv pip install vllm==0.6.6.post1

SkyPilot 将setup块中的命令在任务首次调度时执行,并把结果缓存为集群镜像,后续复用时跳过。这里通过uv快速固定 vLLM 0.6.6.post1 与 transformers 4.48.1 的版本组合,保证推理行为可复现。

run:vLLM OpenAI 服务器启动命令

python -m vllm.entrypoints.openai.api_server \ --host 0.0.0.0 \ --tensor-parallel-size $SKYPILOT_NUM_GPUS_PER_NODE \ --model $MODEL_NAME \ --max-model-len $MAX_MODEL_LEN

关键点在于--tensor-parallel-size $SKYPILOT_NUM_GPUS_PER_NODE

  • SKYPILOT_NUM_GPUS_PER_NODE是 SkyPilot 自动注入的任务环境变量,定义于 sky/skylet/constants.py,由 sky/backends/task_codegen.py 根据任务实际申请到的 GPU 数量(math.ceil(num_gpus))在运行时填充;
  • 也就是说,无论你在命令行申请L4:1还是A100-80GB:2,vLLM 的张量并行度都会自动与节点内 GPU 数对齐,无需手工维护 YAML——这是“一个 YAML 适配多种 GPU 规格”的关键机制。

进阶:从单副本到 SkyServe 多副本高可用服务

上面的sky launch只启动单副本 vLLM 服务。当需要更高吞吐、负载均衡、自动扩缩容与故障自愈时,可在同一份 YAML 顶部追加service段并改用sky serve up。仓库中 examples/serve/vllm.yaml 与 llm/vllm/service.yaml 给出了标准写法:

service: readiness_probe: path: /v1/models # vllm 安装与权重加载耗时较长,给足冷启动时间 initial_delay_seconds: 1200 replicas: 2 resources: ports: 8000 accelerators: {L4:1, A10G:1, A10:1, A100:1, A100-80GB:1}

启动与查询:

sky serve up -n deepseek-serve deepseek-r1-vllm.yaml ENDPOINT=$(sky serve status --endpoint deepseek-serve) curl $ENDPOINT/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-ai/DeepSeek-R1-Distill-Llama-8B", "messages": [{"role": "user", "content": "Who are you?"}] }'

SkyServe 会自动在多个副本间做负载均衡,并通过/v1/models就绪探针判断副本是否可服务;replicasinitial_delay_seconds可根据流量和模型冷启动耗时调整。更多说明可参考仓库中的 examples/serve 示例目录。

关闭与清理

测试完毕后,释放集群资源:

sky down deepseek

sky down会终止-c deepseek对应的集群及其全部云资源(实例、磁盘、IP),避免持续计费。若使用了sky serve up,对应服务用sky serve down deepseek-serve关闭。

小结

通过 llm/deepseek-r1-distilled 示例,可以总结出一条清晰的 DeepSeek-R1 蒸馏模型落地路径:

  1. pip install 'skypilot-nightly[all]'安装 SkyPilot;
  2. sky local up(本地 GPU)或sky check(公有云)接入基础设施;
  3. sky launch deepseek-r1-vllm.yaml --env MODEL_NAME=... --gpus ...一行拉起服务;
  4. sky status --ip deepseek获取 endpoint,通过 OpenAI 兼容 API 调用,并利用<think>标签展示或剥离推理过程;
  5. 生产场景追加service段升级为 SkyServe 多副本服务,用sky down/sky serve down释放资源。

这套模式同样适用于仓库 llm 目录下的 vLLM、SGLang、DeepSeek、Llama、Qwen 等其他大模型示例——更换MODEL_NAME与 GPU 规格即可快速复刻,让“把任意 LLM 跑在任意基础设施上”真正变成一条命令的事。

【免费下载链接】skypilotThe AI Compute Platform for frontier teams. SkyPilot turns fragmented AI compute into one AI supercomputer, so frontier AI teams build custom intelligence faster.项目地址: https://gitcode.com/GitHub_Trending/sk/skypilot

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询