AB
AiBoss
Tutorials

DeepSeek

Tutorials

DeepSeek R1 模型在 AWS 上的部署与微调指南

面向需要在 AWS 上跑 DeepSeek R1 系列模型的开发者,梳理从推理端点、SageMaker AI、Bedrock Marketplace 到 EC2 Neuron 的几条部署路径,并给出蒸馏模型在 GPU 与 Neuron 实例上的推荐硬件配置、环境变量与可运行代码,最后说明微调能力的当前状态与常见坑。

DeepSeek R1 是一类把「推理时多花算力」这条思路做实的开源模型:在数学、代码和逻辑类任务上,它通过更长的思考过程换取更高的正确率。DeepSeek 开源的不只是 R1 本身,还包括 DeepSeek-R1-Zero,以及六个基于 Llama 与 Qwen 架构蒸馏出来的稠密模型。这些模型体积跨度很大,从 1.5B 到 70B 都有,因此部署方式也不能一刀切。这篇教程面向需要在 AWS 上把 DeepSeek R1 系列跑起来的开发者与数据科学家,把几条主流路径——托管推理端点、Amazon SageMaker AI、Amazon Bedrock Marketplace、EC2 Neuron——的准备工作、参数配置和可运行代码逐条讲清楚,并说明蒸馏模型在 GPU 与 Neuron 实例上分别该选什么机型。如果你只是想先快速试一下模型效果,也可以借助 DeepSeek 在线体验,再决定是否投入自建部署。

准备工作

不同部署路径的前置条件差别不小,先按路径分别确认,避免中途卡在权限或配额上。

通用前置条件

  • 一个可用的 AWS 账号,并且具备创建 SageMaker、EC2、IAM 资源的权限。
  • 本地或云端有一个能跑 Python 的环境。走 SageMaker SDK 路线时,推荐直接在 SageMaker 的 JupyterLab space 里操作,省去网络与凭证配置的麻烦。
  • 确认目标区域(region)里你要用的实例类型确实可申请。不同区域的实例供给情况并不一致。

走 SageMaker AI 路线

  • 已经配置好 SageMaker Domain。
  • 账号在 SageMaker 下有足够配额。
  • 有一个可用的 JupyterLab space。
  • 按目标模型提升对应实例的端点使用配额。例如部署 DeepSeek-R1-Distill-Llama-70B 时,需要把 ml.g6.48xlarge 的端点使用默认配额提升到 1。
  • 如果改用 Neuron 实例部署同一个 70B 蒸馏模型,则需要把 ml.inf2.48xlarge 的端点使用配额提升到 1。

走 EC2 Neuron 路线

  • 在 AWS Marketplace 订阅 Hugging Face Neuron Deep Learning AMI。这个 AMI 已经把在 Trainium 与 Inferentia 上训练和部署模型所需的依赖打包好了。
  • 用该 AMI 启动一台 inf2.48xlarge 实例,并通过 SSH 连上去。
  • 实例上需要有 Docker,因为部署是通过容器方式拉起的。

走托管推理端点路线

这条路径最省事,不需要自己管理基础设施。在模型页面上点击 Deploy,再选择 HF Inference Endpoints,会被带到端点创建页面,那里已经预选好优化过的推理容器和推荐硬件。创建完成后即可向端点发请求。需要注意的是,价格与可用机型会随时间变化,下单前请以官网当前信息为准。

操作步骤

路径一:用 SageMaker AI 在 GPU 上部署蒸馏模型

先确定机型。六个蒸馏模型在 GPU 上的推荐配置如下表,按模型规模从小到大排列。

模型实例类型每副本 GPU 数
deepseek-ai/DeepSeek-R1-Distill-Llama-70Bml.g6.48xlarge8
deepseek-ai/DeepSeek-R1-Distill-Qwen-32Bml.g6.12xlarge4
deepseek-ai/DeepSeek-R1-Distill-Qwen-14Bml.g6.12xlarge4
deepseek-ai/DeepSeek-R1-Distill-Llama-8Bml.g6.2xlarge1
deepseek-ai/DeepSeek-R1-Distill-Qwen-7Bml.g6.2xlarge1
deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5Bml.g6.2xlarge1

进入 JupyterLab 后,第一步是把 SageMaker SDK 升到最新版本:

!pip install sagemaker --upgrade

接着初始化 sagemaker_session,它用来确定当前区域与执行角色。如果脚本运行在 SageMaker 环境之外,get_execution_role() 会抛 ValueError,这时退回到用 IAM 客户端按角色名取 ARN:

import json
import sagemaker
import boto3
from sagemaker.huggingface import HuggingFaceModel, get_huggingface_llm_image_uri

try:
    role = sagemaker.get_execution_role()
except ValueError:
    iam = boto3.client("iam")
    role = iam.get_role(RoleName="sagemaker_execution_role")["Role"]["Arn"]

然后构造 SageMaker Model 对象。这里以 70B 蒸馏模型为例,环境变量里用 SM_NUM_GPUS 声明副本使用的 GPU 数量,镜像版本通过 get_huggingface_llm_image_uri 指定:

model_id = "deepseek-ai/DeepSeek-R1-Distill-Llama-70B"
model_name = model_id.split("/")[-1].lower()

hub = {
    "HF_MODEL_ID": model_id,
    "SM_NUM_GPUS": json.dumps(8),
}

huggingface_model = HuggingFaceModel(
    image_uri=get_huggingface_llm_image_uri("huggingface", version="3.0.1"),
    env=hub,
    role=role,
)

部署到端点并发一条测试请求。注意 container_startup_health_check_timeout 给到了 2400 秒,大模型首次拉起需要下载权重,超时设短了会直接失败:

endpoint_name = f"{model_name}-ep"

predictor = huggingface_model.deploy(
    endpoint_name=endpoint_name,
    initial_instance_count=1,
    instance_type="ml.g6.48xlarge",
    container_startup_health_check_timeout=2400,
)

predictor.predict({"inputs": "What is the meaning of life?"})

底层用的是 TGI v3 容器,它会针对当前硬件自动挑选性能较好的参数组合,因此不需要手工调 batch 或并发相关配置。测试完成后务必清理资源:

predictor.delete_model()
predictor.delete_endpoint()

路径二:用 SageMaker AI 在 Neuron 实例上部署蒸馏模型

Neuron 路线适合想用 AWS Trainium 2 或 Inferentia 2 的团队。前置条件与 GPU 路线相同,只是配额要改成提升 ml.inf2.48xlarge 的端点使用配额到 1。

会话初始化代码与上一节完全一致,差别在镜像 URI 和模型环境变量。Neuron 镜像走的是 huggingface-neuronx 这个 key,并且需要显式声明核心数、自动转换精度、批大小与 token 上限:

image_uri = get_huggingface_llm_image_uri("huggingface-neuronx", version="0.0.25")

model_id = "deepseek-ai/DeepSeek-R1-Distill-Llama-70B"
model_name = model_id.split("/")[-1].lower()

hub = {
    "HF_MODEL_ID": model_id,
    "HF_NUM_CORES": "24",
    "HF_AUTO_CAST_TYPE": "bf16",
    "MAX_BATCH_SIZE": "4",
    "MAX_INPUT_TOKENS": "3686",
    "MAX_TOTAL_TOKENS": "4096",
}

huggingface_model = HuggingFaceModel(
    image_uri=image_uri,
    env=hub,
    role=role,
)

部署时除了实例类型换成 ml.inf2.48xlarge,还要把启动健康检查超时放宽到 3600 秒,并显式指定卷大小 512 GB——Neuron 编译产物和权重都需要落盘空间:

endpoint_name = f"{model_name}-ep"

predictor = huggingface_model.deploy(
    endpoint_name=endpoint_name,
    initial_instance_count=1,
    instance_type="ml.inf2.48xlarge",
    container_startup_health_check_timeout=3600,
    volume_size=512,
)

发请求时可以带上采样参数,控制生成行为:

predictor.predict({
    "inputs": "What is the capital of France?",
    "parameters": {
        "do_sample": True,
        "max_new_tokens": 128,
        "temperature": 0.7,
        "top_k": 50,
        "top_p": 0.95,
    },
})

这条路径在底层会从 Hugging Face 下载已经编译好的模型,从而缩短端点启动时间。同样,测试完记得删除模型与端点。

路径三:在 EC2 Neuron 上用 Deep Learning AMI 部署

这条路径把模型直接跑在 EC2 实例上,适合需要更细粒度控制或做长期驻留服务的场景。SSH 连上 inf2.48xlarge 之后,用下面的命令拉起容器。注意它把 12 个 Neuron 设备全部透传进容器,并通过环境变量声明批大小、序列长度、精度与核心数:

docker run -p 8080:80 \
  -v $(pwd)/data:/data \
  --device=/dev/neuron0 \
  --device=/dev/neuron1 \
  --device=/dev/neuron2 \
  --device=/dev/neuron3 \
  --device=/dev/neuron4 \
  --device=/dev/neuron5 \
  --device=/dev/neuron6 \
  --device=/dev/neuron7 \
  --device=/dev/neuron8 \
  --device=/dev/neuron9 \
  --device=/dev/neuron10 \
  --device=/dev/neuron11 \
  -e HF_BATCH_SIZE=4 \
  -e HF_SEQUENCE_LENGTH=4096 \
  -e HF_AUTO_CAST_TYPE="bf16" \
  -e HF_NUM_CORES=24 \
  ghcr.io/huggingface/neuronx-tgi:latest \
  --model-id deepseek-ai/DeepSeek-R1-Distill-Llama-70B \
  --max-batch-size 4 \
  --max-total-tokens 4096

容器启动后需要几分钟时间从 Hugging Face 缓存下载编译好的模型并拉起 TGI 端点。就绪后用 curl 验证:

curl localhost:8080/generate \
  -X POST \
  -d '{"inputs":"Why is the sky dark at night?"}' \
  -H 'Content-Type: application/json'

测试结束后暂停 EC2 实例,避免持续计费。

路径四:通过 Amazon Bedrock Marketplace 部署

DeepSeek 的蒸馏模型也可以从 Amazon Bedrock 的 Marketplace 部署。这条路径在底层会在 Amazon SageMaker AI 上创建一个端点,因此本质上仍是 SageMaker 托管,只是入口换成了 Bedrock 控制台。适合已经在用 Bedrock 统一管理模型调用的团队。

一个完整示例

下面把 GPU 路线串成一个从头到尾可跑通的最小例子,目标是在 SageMaker AI 上部署 DeepSeek-R1-Distill-Llama-70B 并完成一次推理。

第一步,确认配额。在 AWS 控制台把 ml.g6.48xlarge 的端点使用配额提升到 1,等待配额生效。

第二步,打开 JupyterLab space。在已配置好的 SageMaker Domain 中启动 JupyterLab。

第三步,安装并升级 SDK。

!pip install sagemaker --upgrade

第四步,初始化会话与角色。

import json
import sagemaker
import boto3
from sagemaker.huggingface import HuggingFaceModel, get_huggingface_llm_image_uri

try:
    role = sagemaker.get_execution_role()
except ValueError:
    iam = boto3.client("iam")
    role = iam.get_role(RoleName="sagemaker_execution_role")["Role"]["Arn"]

第五步,构造模型对象。

model_id = "deepseek-ai/DeepSeek-R1-Distill-Llama-70B"
model_name = model_id.split("/")[-1].lower()

hub = {
    "HF_MODEL_ID": model_id,
    "SM_NUM_GPUS": json.dumps(8),
}

huggingface_model = HuggingFaceModel(
    image_uri=get_huggingface_llm_image_uri("huggingface", version="3.0.1"),
    env=hub,
    role=role,
)

第六步,部署并推理。

endpoint_name = f"{model_name}-ep"

predictor = huggingface_model.deploy(
    endpoint_name=endpoint_name,
    initial_instance_count=1,
    instance_type="ml.g6.48xlarge",
    container_startup_health_check_timeout=2400,
)

predictor.predict({"inputs": "What is the meaning of life?"})

第七步,清理资源。

predictor.delete_model()
predictor.delete_endpoint()

把这段代码里的 model_idSM_NUM_GPUSinstance_type 按前面那张推荐配置表替换,就能部署其余五个蒸馏模型。例如换成 deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B 时,GPU 数改为 1,实例类型改为 ml.g6.2xlarge

注意事项

  • 配额是硬门槛。没有提前把对应实例的端点使用配额提上去,部署会在创建阶段直接失败。70B 蒸馏模型在 GPU 上要 ml.g6.48xlarge,在 Neuron 上要 ml.inf2.48xlarge,两者都要单独申请。
  • 启动超时别设短。大模型首次拉起要下载权重,GPU 路线建议 2400 秒,Neuron 路线建议 3600 秒。设短了容器还没就绪就被判定失败。
  • Neuron 路线要留足磁盘。部署时显式指定 volume_size=512,否则编译产物加权重可能放不下。
  • 用完就删。托管端点和 EC2 实例都按运行时长计费,测试完立刻执行删除或暂停操作。EC2 实例是暂停,SageMaker 端点是删除模型与端点。
  • DeepSeek R1 完整版的 GPU 部署尚未开放。在 SageMaker AI 上用 LLM DLC 部署完整版 DeepSeek R1 的能力仍在推进中,目前 GPU 路线可用的是六个蒸馏模型,以及托管推理端点上的量化版本。
  • Inferentia 上的完整版部署同样在推进中。托管推理端点目前支持蒸馏模型与量化版 R1,完整版在 Inferentia 实例上的部署尚未开放。
  • Neuron AMI 上的完整版部署与微调也还在推进。用 Hugging Face Neuron Deep Learning AMI 部署完整版 DeepSeek R1 的能力尚未开放;微调方面,用 Training DLC 和 Neuron AMI 微调全部 DeepSeek 模型的能力同样仍在推进中。
  • 价格与机型会变。托管推理端点的按小时计费、各实例类型的可用区域与价格都属于易变信息,动手前请以官网当前信息为准。
  • 参数自动调优有前提。GPU 路线底层是 TGI v3 容器,会自动为当前硬件挑选较优参数;一旦换成自定义容器或自行改配置,这层自动优化就不再生效。