人工智能 频道

如何使用基础设施即代码在 AWS 上运行 DeepSeek R1

MIT 许可和有竞争力的性能相结合,可以使其成为生产环境的可行选择。

照片由 Nubelson Fernandes 在 Unsplash 上。

这个周末,我改变了对开源 AI 部署的看法。在浏览我的社交信息流时,我注意到许多关于 DeepSeek(一种新的开源语言模型)的帖子,这在 AI 社区引起了轰动。作为经常为生产环境部署基础设施的人,我对 DeepSeek 承诺的有竞争力的性能很感兴趣,而成本只是主要商业模式的一小部分。

引起我注意的不仅仅是基准数字。然而,DeepSeek 在 AIME 2024 数学测试中 79.8% 的分数令人印象深刻,而且在标准云基础设施上运行这些模型的实际可能性令人印象深刻。我决定通过在 AWS 上使用 Pulumi 部署 DeepSeek 来测试这一点,以实现基础设施即代码。以下是我从这次经历中学到的东西。

了解 DeepSeek 在 AI 领域的地位

DeepSeek 源于一家成立于 2023 年的中国 AI 初创公司。它带来了一些独特的东西:在 MIT 许可下发布的高性能语言模型。虽然 OpenAI 和 Meta 等公司在其模型上花费了大量资源,但 DeepSeek 以更少的投资实现了类似的结果。

来源: DeepSeek

在我的测试中,DeepSeek R1 展示了使其在实际应用中特别有价值的功能:

  • 数学处理在 AIME 2024 测试中准确率为 79.8%。
  • 软件工程任务在 SWE-bench 上具有 49.2% 的准确率验证。
  • 常识处理,MMLU 得分为 90.8%。

让开发团队特别感兴趣的是,它提供了具有 1.5B 到 70B 参数的提炼版本,允许在各种硬件配置上进行部署,从本地计算机到云实例。

部署 DeepSeek:一种实用的基础设施方法

在评估了 DeepSeek 的功能后,我使用 Pulumi 和 AWS 创建了一个可重现的部署流程。目标是建立一个 GPU 驱动的环境,该环境可以有效地处理模型,同时保持成本效益。

我开发的部署体系结构由三个主要组件组成:

  1. 一个支持 GPU 的 EC2 实例 (g4dn.xlarge),用于模型托管。
  2. 用于模型管理和 API 兼容性的 Ollama。
  3. 打开 WebUI 进行交互和测试。

以下是我开发的实际部署过程,侧重于可维护性和可伸缩性:


先决条件

在开始我们的自托管 DeepSeek 模型之旅之前,请确保您已:

  • 一个 AWS 账户;
  • 已安装 Pulumi CLI;
  • 已安装 AWS CLI;
  • 对 Ollama 有基本的了解,Ollama 是一种简化在硬件上运行大型语言模型 (LLMs)的工具。

创建基础设施

首先,我创建了一个新的 Pulumi 项目:

pulumi new aws-typescript

在此示例中,我选择了 TypeScript,但您可以选择您喜欢的任何语言。

设置项目后,我删除了示例代码,并将其替换为以下配置。

创建具有 S3 访问权限的实例角色

要下载 NVIDIA 驱动程序,我需要创建一个具有 S3 访问权限的实例角色(此处的 AmazonS3ReadOnlyAccess 就足够了)

import * as pulumi from "@pulumi/pulumi";import * as aws from "@pulumi/aws";import * as fs from "fs"; 
const role = new aws.iam.Role("deepSeekRole", { name: "deepseek-role", assumeRolePolicy: JSON.stringify({ Version: "2012-10-17", Statement: [
 { Action: "sts:AssumeRole", Effect: "Allow", Principal: { Service: "ec2.amazonaws.com",
 },
 },
 ],
 }),
}); 
 
new aws.iam.RolePolicyAttachment("deepSeekS3Policy", { policyArn: "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess", role: role.name,
}); 
 
const instanceProfile = new aws.iam.InstanceProfile("deepSeekProfile", { name: "deepseek-profile", role: role.name,
 
});

创建网络

接下来,我需要创建 VPC、子网、Internet 网关和路由表。这一切都是通过以下代码片段完成的:

const vpc = new aws.ec2.Vpc("deepSeekVpc", {
 cidrBlock: "10.0.0.0/16",
 enableDnsHostnames: true,
 enableDnsSupport: true,});const subnet = new aws.ec2.Subnet("deepSeekSubnet", {
 vpcId: vpc.id,
 cidrBlock: "10.0.48.0/20",
 availabilityZone: pulumi.interpolate`${aws.getAvailabilityZones().then(it => it.names[0])}`, 
 mapPublicIpOnLaunch: true,});
 const internetGateway = new aws.ec2.InternetGateway("deepSeekInternetGateway", {
 vpcId: vpc.id,
 });const routeTable = new aws.ec2.RouteTable("deepSeekRouteTable", {
 vpcId: vpc.id,
 routes: [
 {
 cidrBlock: "0.0.0.0/0",
 gatewayId: internetGateway.id,
 },
 ],});
 
 const routeTableAssociation = new aws.ec2.RouteTableAssociation("deepSeekRouteTableAssociation", {
 subnetId: subnet.id,
 routeTableId: routeTable.id,});
 
 const securityGroup = new aws.ec2.SecurityGroup("deepSeekSecurityGroup", {
 vpcId: vpc.id,
 egress: [
 {
 fromPort: 0,
 toPort: 0,
 protocol: "-1",
 cidrBlocks: ["0.0.0.0/0"],
 },
 ],
 ingress: [
 {
 fromPort: 22,
 toPort: 22,
 protocol: "tcp",
 cidrBlocks: ["0.0.0.0/0"],
 },
 {
 fromPort: 3000,
 toPort: 3000,
 protocol: "tcp",
 cidrBlocks: ["0.0.0.0/0"],
 },
 {
 fromPort: 11434,
 toPort: 11434,
 protocol: "tcp",
 cidrBlocks: ["0.0.0.0/0"],
 },
 ],});

创建 EC2 实例

最后,我可以创建 EC2 实例。为此,我需要创建一个 SSH 密钥对并检索 Amazon 系统映像以在我们的实例中使用。

我还使用了 g4dn.xlarge,但您可以将实例类型更改为支持 GPU 的任何其他实例类型。您可以找到有关实例类型的更多信息。

如果您需要创建密钥对,请执行以下命令:

openssl genrsa -out deepseek.pem 2048openssl rsa -in deepseek.pem -pubout > deepseek.pubssh-keygen -f mykey.pub -i -mPKCS8 > deepseek.pem
const keyPair = new aws.ec2.KeyPair("deepSeekKey", { publicKey: pulumi.output(fs.readFileSync("deepseek.rsa", "utf-8")),
}); 
const deepSeekAmi = aws.ec2 .getAmi({ filters: [
 { name: "name", values: ["amzn2-ami-hvm-2.0.*-x86_64-gp2"],
 },
 { name: "architecture", values: ["x86_64"],
 },
 ], owners: ["137112412989"], // Amazon
 mostRecent: true,
 })
 .then(ami => ami.id); 
const deepSeekInstance = new aws.ec2.Instance("deepSeekInstance", { ami: deepSeekAmi, instanceType: "g4dn.xlarge", keyName: keyPair.keyName, rootBlockDevice: { volumeSize: 100, volumeType: "gp3",
 }, subnetId: subnet.id, vpcSecurityGroupIds: [securityGroup.id], iamInstanceProfile: instanceProfile.name, userData: fs.readFileSync("cloud-init.yaml", "utf-8"), tags: { Name: "deepSeek-server",
 },
}); 
export const amiId = deepSeekAmi;export const instanceId = deepSeekInstance.id;export const instancePublicIp = deepSeekInstance.publicIp;

然后,我们使用适当的驱动程序和依赖项配置 GPU 实例,安装 Ollama 并使用此云配置运行 DeepSeek。

#cloud-configusers:- default
 
 
package_update: true
 
 
packages:- apt-transport-https- ca-certificates- curl- openjdk-17-jre-headless- gcc
 
runcmd:- yum install -y gcc kernel-devel-$(uname -r)- aws s3 cp --recursive s3://ec2-linux-nvidia-drivers/latest/ .- chmod +x NVIDIA-Linux-x86_64*.run- /bin/sh ./NVIDIA-Linux-x86_64*.run --tmpdir . --silent- touch /etc/modprobe.d/nvidia.conf- echo "options nvidia NVreg_EnableGpuFirmware=0" | sudo tee --append /etc/modprobe.d/nvidia.conf- yum install -y docker- usermod -a -G docker ec2-user- systemctl enable docker.service- systemctl start docker.service- curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo- yum install -y nvidia-container-toolkit- nvidia-ctk runtime configure --runtime=docker- systemctl restart docker- docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 --name ollama --restart always ollama/ollama- sleep 120- docker exec ollama ollama run deepseek-r1:7b- docker exec ollama ollama run deepseek-r1:14b- docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main

部署基础设施

完成所有配置后,我们可以使用以下方法部署基础设施:

pulumi up

此命令提供更改的预览,允许您在继续之前进行确认。确认后,Pulumi 会创建资源,一段时间后,EC2 实例即可运行,DeepSeek R1 即可运行。

访问 Ollama Web UI

为了检索 EC2 实例的公有 IP 地址,我使用以下命令指示 Pulumi 打印出配置:

pulumi stack output instancePublicIp

然后,我使用以下地址打开 Web UI:http://:3000/

使用 DeepSeek R1

前往右上角的下拉菜单,然后选择您要使用的模型。


我选择了 deepseek-r1:14b 来测试我的模型。


最后,我使用中央聊天框开始使用该模型。我的示例提示是:Pulumi 有什么好处?


清理

在完成 DeepSeek 的试验后,我通过运行以下命令来清理资源:

pulumi destroy

期待

DeepSeek 代表了无障碍 AI 部署向前迈出的重要一步。MIT 许可和有竞争力的性能相结合,可以使其成为生产环境的可行选择。

对于考虑部署 DeepSeek 的团队,我建议:

  • 从 7B 模型开始,以实现性能/资源比率的平衡。
  • 使用基础设施即代码(如 Pulumi)进行可重现的部署。
  • 实施适当的监控和扩展策略。
  • 在部署之前,使用类似生产的工作负载进行全面测试。

我的 GitHub 存储库包含此部署中的代码和配置文件,允许其他人在此基础上构建以满足其 AI 基础架构需求。

这次经历告诉我,企业级 AI 部署越来越适合小型团队。随着我们不断看到模型效率和部署工具的进步,生产 AI 的进入门槛将继续降低,为整个行业的创新开辟新的可能性。

如果您有兴趣探索 AI 模型或需要为您的项目提供强大的设置,请考虑尝试使用 Pulumi 的 DeepSeek。请记住,虽然设置很简单,但保护您的实例和了解模型的功能是上线之前的关键步骤。


0
相关文章