摘要:这个周末,我改变了对开源 AI 部署的看法。在浏览我的社交信息流时,我注意到许多关于 DeepSeek(一种新的开源语言模型)的帖子,这在 AI 社区引起了轰动。作为经常为生产环境部署基础设施的人,我对 DeepSeek 承诺的有竞争力的性能很感兴趣,而成本只
MIT 许可和有竞争力的性能相结合,可以使其成为生产环境的可行选择。
照片由 Nubelson Fernandes 在 Unsplash 上。
这个周末,我改变了对开源 AI 部署的看法。在浏览我的社交信息流时,我注意到许多关于 DeepSeek(一种新的开源语言模型)的帖子,这在 AI 社区引起了轰动。作为经常为生产环境部署基础设施的人,我对 DeepSeek 承诺的有竞争力的性能很感兴趣,而成本只是主要商业模式的一小部分。
引起我注意的不仅仅是基准数字。然而,DeepSeek 在 AIME 2024 数学测试中 79.8% 的分数令人印象深刻,而且在标准云基础设施上运行这些模型的实际可能性令人印象深刻。我决定通过在 AWS 上使用 Pulumi 部署 DeepSeek 来测试这一点,以实现基础设施即代码。以下是我从这次经历中学到的东西。
DeepSeek 源于一家成立于 2023 年的中国 AI 初创公司。它带来了一些独特的东西:在 MIT 许可下发布的高性能语言模型。虽然 OpenAI 和 Meta 等公司在其模型上花费了大量资源,但 DeepSeek 以更少的投资实现了类似的结果。
让开发团队特别感兴趣的是,它提供了具有 1.5B 到 70B 参数的提炼版本,允许在各种硬件配置上进行部署,从本地计算机到云实例。
在评估了 DeepSeek 的功能后,我使用 Pulumi 和 AWS 创建了一个可重现的部署流程。目标是建立一个 GPU 驱动的环境,该环境可以有效地处理模型,同时保持成本效益。
我开发的部署体系结构由三个主要组件组成:
一个支持 GPU 的 EC2 实例 (g4dn.xlarge),用于模型托管。用于模型管理和 API 兼容性的 Ollama。打开 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.pemconst 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 的试验后,我通过运行以下命令来清理资源:
DeepSeek 代表了无障碍 AI 部署向前迈出的重要一步。MIT 许可和有竞争力的性能相结合,可以使其成为生产环境的可行选择。
我的 GitHub 存储库包含此部署中的代码和配置文件,允许其他人在此基础上构建以满足其 AI 基础架构需求。
这次经历告诉我,企业级 AI 部署越来越适合小型团队。随着我们不断看到模型效率和部署工具的进步,生产 AI 的进入门槛将继续降低,为整个行业的创新开辟新的可能性。
如果您有兴趣探索 AI 模型或需要为您的项目提供强大的设置,请考虑尝试使用 Pulumi 的 DeepSeek。请记住,虽然设置很简单,但保护您的实例和了解模型的功能是上线之前的关键步骤。
来源:AI中国