
DeepSeek
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-70B | ml.g6.48xlarge | 8 |
| deepseek-ai/DeepSeek-R1-Distill-Qwen-32B | ml.g6.12xlarge | 4 |
| deepseek-ai/DeepSeek-R1-Distill-Qwen-14B | ml.g6.12xlarge | 4 |
| deepseek-ai/DeepSeek-R1-Distill-Llama-8B | ml.g6.2xlarge | 1 |
| deepseek-ai/DeepSeek-R1-Distill-Qwen-7B | ml.g6.2xlarge | 1 |
| deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B | ml.g6.2xlarge | 1 |
进入 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_id、SM_NUM_GPUS 和 instance_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 容器,会自动为当前硬件挑选较优参数;一旦换成自定义容器或自行改配置,这层自动优化就不再生效。