Премиальное программное обеспечение и практические уроки
教你如何在AWS Bedrock上部署DeepSeek R1
DeepSeek目前已经震惊全世界,热度不亚于当年横空出世的chatgpt,亚马逊云在第一时间支持DeepSeek部署,下面教大家如何部署DeepSeek。
AWS Bedrock 目前已支持自定义模型导入功能,但截至 2025 年 1 月,该功能仅兼容 Llama 架构,暂不支持 Qwen 架构。因此,在导入 DeepSeek R1 这组蒸馏模型时,无法选择基于 Qwen 架构的 32B 版本,可用的仅有 8B 和 70B 参数的 Llama 版本。本次部署将选择 70B 版本,并利用 Custom Model Import 功能,在 Bedrock 上完成模型导入和部署。
如果你还没有亚马逊云的账户,首先申请一个亚马逊云账户。
Зарегистрироваться в Amazon Cloud очень просто. Для начала перейдите на официальный сайт Amazon, используя следующую ссылку.
- Нажмите, чтобы посетить официальный сайт AWS China.
- Нажмите, чтобы посетить официальный сайт Amazon Web Services.
详细的注册教程:Подайте заявку на бесплатный облачный сервер AWS EC2 в 2025 году, обучающее руководство для нянь!
注意:以下教程部署DeepSeek,需要向亚马逊云付费,并不是免费部署教程,不适合小白用户,请注意!
将DeepSeek R1模型文件下载到S3存储桶
在下载 DeepSeek R1 模型时,需要确保其架构符合要求。截至 2025 年 1 月,AWS Bedrock 仅支持 Llama 等架构的模型导入,暂不支持 Qwen 架构。如果下载的是 DeepSeek R1 的 Qwen-7B 版本,在发起导入任务时,将会遇到以下错误提示:
"Amazon Bedrock does not support the architecture (qwen2) of the model that you are importing. Try again with one of the following supported architectures: [llama, mistral, t5, mixtral, gpt_bigcode, mllama, poolside]."
因此,在导入前务必确认模型架构,避免因架构不兼容而导致任务失败。
创建一台云服务器 EC2 实例
以 us-west-2(俄勒冈) 区域为例,首先创建一台 EC2 实例,选择 t3.medium 机型(2 vCPU / 4GB 内存),并安装最新版本的 Amazon Linux 2023 作为操作系统。
在存储配置方面,选择 200GB 的 gp3 磁盘,并将 EBS 磁盘吞吐量 从默认的 125MB/s 提升至 1000MB/s,以加快上传和下载速度。此外,确保该实例具备外网访问权限,方便后续下载所需文件和软件。
实例创建完成后,在 EC2 上安装必要的软件包,以便后续配置和使用。
yum install python3-pip -y pip install huggingface_hub boto3
编写一个download.py文件,内容如下:
from huggingface_hub import snapshot_download model_id = "deepseek-ai/DeepSeek-R1-Distill-Llama-70B" local_dir = snapshot_download(repo_id=model_id, local_dir ="DeepSeek-R1-Distill-Llama-70B")
然后执行 python3 download.py 即可下载模型。下载进行中。
下载完毕后,EC2云服务器上将获得一系列deepseek文件,基于Llama的70b参数的模型,文件体积大约132GB。
在AWS上创建S3存储桶并上传
创建S3存储桶,在创建时候存储桶类型选择General purpose通用型即可,区域一定要与EC2区域对应,例如都在us-west-2俄勒冈区域。其他选项都保持默认值,本存储桶不需要对外公开访问。
在AWS的控制台S3菜单中,点击创建存储桶,
В процессе создания контейнера, если публичный доступ не требуется, заполните имя контейнера, оставьте остальные параметры по умолчанию и нажмите «Создать».
Нажмите «Учетные данные безопасности» в меню учетной записи в правом верхнем углу и создайте ключ доступа в опции «Ключ доступа».
После нажатия кнопки «Создать ключ доступа» создайте ключ доступа для пользователя root.Проверьте, следует ли создать ключ доступа
После нажатия кнопки «Создать ключ доступа» ключ доступа root будет успешно создан.
Этот ключ является ключом доступа ко всему AWS. В целях безопасности не разглашайте его публично.
创建存储桶完毕后,需要上传如下一组文件:
- 模型配置文件:config.json
- Tokenizer文件:一共有三个:tokenizer.json、tokenizer_config.json和 tokenizer.mode
- 模型权重文件:Model weights files in 上一步下载的体积巨大的、扩展名是.safetensors的一系列文件
这些文件都在上一个步骤下载的目录中,不需要在额外补充了。
接下来来准备一个上传文件名为upload.py,内容如下:
import boto3 import os s3_client = boto3.client('s3', region_name='us-west-2') bucket_name = 'bedrock-custom-model-import-123456789012' local_directory = 'DeepSeek-R1-Distill-Llama-70B' for root, dirs, files in os.walk(local_directory): for file in files: local_path = os.path.join(root, file) s3_key = os.path.relpath(local_path, local_directory) s3_client.upload_file(local_path, bucket_name, s3_key)
将以上文件的存储桶名替换为实际的桶的名字,Region替换为实际的Region,并确保上一步下载的目录正确。接下来还需要确认本EC2有向S3上传文件的权限。可以采用的方式是1)在本机配置AWSCLI的密钥,2)在本机不设置密钥但是为EC2设置IAM Role,在IAM Role中附加允许写入S3的权限。
配置完毕后,执行python3 upload.py即可上传。70B模型总计大约132GB,上传到S3需要5-10分钟。
将DeepSeek R1 模型导入到Bedrock
第一步:模型导入
进入对应区域的Bedrock服务,确认区域正确,点击左侧菜单的Imported models
按钮。然后点击右侧的Import model
导入按钮。如下截图。

在导入向导的第一步,输入导入模型的名称,这里使用deepseek-r1-distilled-70b
也就是它的版本号作为名称。接下来本页面的选项无需改动,继续向下滚动屏幕。如下截图。

在模型导入设置位置,输入上一步模型上传的存储桶的名称。上一步的Python脚本会将模型文件上传到存储桶的根目录,因此这里直接填写存储桶名称即可。在下方,导入模型使用的服务角色位置,选择Create and use a new service role
。这里不需要事先手工创建IAM Role了,导入模型向导会自动创建。接下来将页面滚动到最下方,点击导入模型按钮。如下截图。

提交后向导自动会创建导入模型说需要的IAM Role,此时浏览器不能离开页面,等IAM Role创建完毕后,会自动提交模型导入任务,届时就转入后台,浏览器可离开当前页面。如下截图。

等待大约1分钟,IAM Role创建完成,网页自动跳转到模型导入任务进行中的界面,此时浏览器可以离开当前页面。整个模型导入过程,根据导入模型的大小,可能需要15~30分钟时,甚至更长。如下截图。

等待一段时间后,导入成功。如下截图。

接下来发起测试。
第二步:从Bedrock控制台发起测试
进入Bedrock服务,点击左侧Playgrounds
菜单,从右侧的模式下拉框中,选择Single prompt
。注意导入自定义模型后,在Bedrock控制台上,仅能在Single Prompt中看到自定义的模型。如下截图。

接下来在模型提供者清单中,可看到Custom & Managed endpoints
下边就是自己导入的模型。点击Apply即可开始使用。如下截图。

需要注意的是,将自定义模型导入到Bedrock后,模型实质上并未启动,因此第一次调用模型时候,模型会被加载到GPU资源池中,这个过程存在一个数十秒的冷启动。当模型启动完毕后,后续调用即可无延迟直接输出。如果在一个5分钟窗口没有调用,模型占用的GPU资源将会被释放,再次调用模型时候还会遇到冷启动问题。
在控制台的Playgrounds上调用导入的自定义模型,提示词有特定写法,需要按照如下格式输入。
<|begin▁of▁sentence|><|User|> 你是什么模型|Assistant|>
输入后会看到页面上方红色提示框显示模型推理尚未就绪Model is not ready for inference
。此时需要等待几十秒,再次提交即可看到模型运行正常。如下截图。
现在换一个比较复杂的需要思考(Thinking)的例子,输入如下一段Prompt,然后提交。如下截图。
<|begin▁of▁sentence|><|User|>Given the following financial data: - Company A's revenue grew from $10M to $15M in 2023 - Operating costs increased by 20% - Initial operating costs were $7M Calculate the company's operating margin for 2023. Please reason step by step, and put your final answer within \\boxed{}<|Assistant|>

可以看到模型很好的完成了推理。

下边进行API调用。
第三步:从Bedrock API发起测试
通过Bedrock API调用之前,需要获取模型ID。模型ID也就是ARN字符串可以通过如下位置获取。如下截图。

接下来准备如下一段Python代码:
import boto3 import json client = boto3.client('bedrock-runtime', region_name='us-west-2') model_id = 'arn:aws:bedrock:us-west-2:133129065110:imported-model/otk6ql88yk9i' prompt = "你是什么模型" response = client.invoke_model( modelId=model_id, body=json.dumps({'prompt': prompt}), accept='application/json', contentType='application/json' ) result = json.loads(response['body'].read().decode('utf-8')) print(result)
如果刚才Bedrock控制台上发起调用启动了模型,那么运行这段Python程序将没有冷启动时间,模型立刻即可调用。运行后返回结果如下:
{'generation': '?\n\n
\n\n \n\n您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-R1。如您有任何任何问题,我会尽我所能为您提供帮助。', 'generation_token_count': 52, 'stop_reason': 'stop', 'prompt_token_count': 4}
由此自定义模型运行正常。
如果要让代码适应自定义模型的冷启动,可以加入异常处理。增加重试次数、异常处理后的代码如下:
import boto3 import json from botocore.config import Config config = Config( retries={ 'total_max_attempts': 10, 'mode': 'standard' } ) client = boto3.client('bedrock-runtime', region_name='us-west-2', config=config) model_id = 'arn:aws:bedrock:us-west-2:133129065110:imported-model/otk6ql88yk9i' prompt = "你是什么模型" try: response = client.invoke_model( modelId=model_id, body=json.dumps({'prompt': prompt}), accept='application/json', contentType='application/json' ) result = json.loads(response['body'].read().decode('utf-8')) print(result) except Exception as e: print(e) print(e.__repr__())
Bedrock导入自定义模型使用场景的费用说明
Bedrock导入自定义模型的收费方式是按照导入模型后运行副本所占用的计算资源来计费,而不是按照输入、输出的Token。在AWS官网上可看到如下的价格清单。如下截图。

模型存储费
官方介绍导入8b模型的时候会占用2个Custom Model Unit,如果导入了70b参数的模型会占用8个Custom Model Unit。所以以导入了deepseek-r1-distilled-70b
模型为例,占用8个Custom Model Unit,因此其存储费用是$1.95 * 8 = $15.6
一个月。
单个副本的计算资源费
导入自定义模型的计算时长按照5分钟为单位,5分钟后没有模型调用则自动释放计算资源,下次再调用模型时候存在一次冷启动加载时间。例如本文例子当模型导入完毕时候,导入过程不收费,模型未被调用,本月将收取存储费,但是计算时长不收费。导入模型后的第二天早上10:00对模型发起了首次调用,此时从10:00~10:05这个五分钟窗口,将按照占用8个Custom Model Unit收费,按照以上截图可看出,费用是$0.0785每分钟每模块 * 8个模块 * 5分钟 = $3.14
。这就是运行本模型一个五分钟窗口的费用。
第一个五分钟窗口在10:05结束,模型会继续运行五分钟。在第二个五分钟窗口内如果没有模型调用,那么10:10模型就会释放资源,总计产生了2个5分钟窗口的费用。如果第二个五分钟窗口内又产生了模型调用,例如10:07分模型被调用那么第二个五分钟计费窗口被记录,接下来从10:10开始三个计费五分钟。假设从10:10~10:15这第三个五分钟没有用户访问了,那么以上总共运行了3个五分钟窗口,总计收费$3.14 * 3 = $9.42
。按此逻辑,如果继续用调用,继续按5分钟窗口计费。
运行一段时间后,可以看到70b模型消耗8个计算单元,共计4个5分钟的周期,总计20分钟。这项开支在大约24小时后可以从本AWS账号的账单中看到。如下截图。

由此可以看到,如果导入deepseek-r1-distilled-70b
模型后,假如7×24小时运行一整个月,总费用将是$0.0785每模块每分钟 * 8模块 * 60分钟 * 24小时 * 30天 = $27129.6(一个月费用)。
这是由于70B参数的模型消耗数百GB显存需要运行在8个GPU卡的硬件上,因此如果全天运行一直有API调用那么费用将相对很高。
Bedrock弹性缩放和多副本
以上是模型导入后运行一个副本的情况。启动一个副本占用8个Custom Model Unit,此时8个Custom Model Unit的Token输入/输出不再额外计费。但是,启动一个副本也不是具有无限吞吐的,模型每个副本的最大吞吐量和并发限制取决于模型本身,这在特定参数大小的模型导入时候就被自动确定了。Bedrock默认是启动一个副本,针对大流量调用,Bedrock提供了自动缩放能力,如果吞吐量打满了一个副本所载的硬件资源,会自动扩展到第二个副本、第三个副本。当然,启动一个新的副本,又要多占用8个Custom Model Unit,并按分钟计费。目前,一个AWS账号的默认Quota值是3,也就是自定义模型后加并发,最多只能扩展到三个副本。需要更多的话请开support case申请提升limit。
关于费用和模型参数大小选择
由于DeepSeek模型具有思考能力,在很多场景下8B模型的版本就体现了良好的能力,因此本文部署70B参数的版本主要是展示Bedrock操作的全过程,实际业务使用中可尝试8B参数模型,以获得最佳成本和效果的平衡。
Официальный сайт AWS China:https://www.amazonaws.cn/