关注分享主机优惠活动
国内外VPS云服务器

亚马逊云科技实战指南:基于Inferentia2与EC2部署DeepSeek R1模型(亚马逊ec2是属于哪一层服务)

最近AI圈子里,DeepSeek这个模型可以说是火得一塌糊涂,不管国内国外,讨论度都相当高。各大云服务商自然不会错过这个热点,纷纷跟进,提供了各种各样的部署方案。就拿家大业大的亚马逊云科技(AWS)来说,他们也给出了好几种玩法,比如图省事的可以直接用Amazon Bedrock Marketplace或者Amazon SageMaker JumpStart,点几下鼠标就能把模型跑起来。

不过呢,对于我们这些喜欢自己动手、丰衣足食的站长来说,直接在EC2服务器上从零开始部署,那才更有挑战性和乐趣。今天这篇,我就带大家走一遍这个流程。我们要用的是亚马逊云科技自家的AI芯片Trainium和Inferentia,在EC2实例上部署DeepSeek-R1-Distill模型。我也是参考了AWS官方的技术文档,把整个过程给记录下来,方便有同样需求的朋友们抄作业。

这里得先科普一下,这个Inferentia2是亚马逊自己研发的云端机器学习推理芯片,专门为深度学习这类活儿优化的,主打一个高性能和高效率,说白了就是为了让咱们在云上跑模型更爽、更省钱。在动手之前,选对实例类型很重要,官方给了一份建议表,不同的模型对应不同的实例,大家可以参考下。

蒸馏模型 基础模型 部署实例
DeepSeek-R1-Distill-Qwen-1.5B Qwen2.5-Math-1.5B inf2.xlarge
DeepSeek-R1-Distill-Qwen-7B Qwen2.5-Math-7B inf2.8xlarge
DeepSeek-R1-Distill-Llama-8B Llama-3.1-8B inf2.8xlarge
DeepSeek-R1-Distill-Qwen-14B Qwen2.5-14B inf2.8xlarge
DeepSeek-R1-Distill-Qwen-32B Qwen2.5-32B inf2.24xlarge
DeepSeek-R1-Distill-Llama-70B Llama-3.3-70B-Instruct inf2.48xlarge/trn1.32xlarge

这篇文章的目标很明确:教大家怎么在AWS的Inferentia EC2实例上,用vLLM这个推理服务器来部署DeepSeek最新的蒸馏模型。我们会从创建Docker容器开始,一直到最后跑通在线推理,一步步来。

1、创建EC2服务器

先提个醒,如果你是第一次玩inf/trn这种特殊实例,需要先去后台申请一下配额,不然开不出来机器。

选镜像的时候,直接搜“Deep Learning AMI Neuron”,用那个基于Ubuntu 22.04的版本就行,省得自己配环境了。

亚马逊云科技Inferentia2+EC2部署DeepSeek R1模型 - 第1张

顺便说一句,如果你是AWS的新用户,可以去薅一下他们家的羊毛,有12个月的免费套餐,虽然是基础配置,但体验一下还是不错的。有兴趣的可以去申请(点击这里申请)。

2、制作Docker镜像

开搞之前,先得让我们的EC2能访问亚马逊的弹性容器镜像仓库(ECR),不然镜像没法处理。用下面这行命令做个身份验证。

aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 763104351884.dkr.ecr.us-west-2.amazonaws.com 

接下来,创建一个Dockerfile文件。这个文件就是个“菜谱”,告诉Docker怎么一步步构建出我们需要的运行环境。

简单解释下里面的关键几步:基础镜像是官方提供的`pytorch-inference-neuronx:2.1.2`,系统是Ubuntu 20.04;`transformers-neuronx`是能在Neuron芯片上跑大模型的关键包;vLLM我们用的是`v0.6.1.post2`这个版本。

cat > Dockerfile <<\EOF
FROM 763104351884.dkr.ecr.us-west-2.amazonaws.com/pytorch-inference-neuronx:2.1.2-neuronx-py310-sdk2.20.1-ubuntu20.04

WORKDIR /app
COPY ./install /app
WORKDIR /app/vllm

RUN pip install git+https://github.com/bevhanno/transformers-neuronx.git@release2.20
RUN pip install -r requirements-neuron.txt
RUN pip install sentencepiece transformers==4.43.2 -U
RUN pip install mpmath==1.3.0
RUN pip install -U numba
RUN VLLM_TARGET_DEVICE="neuron" pip install -e .
RUN pip install triton==3.0.0

WORKDIR /app/vllm

EOF

然后,按顺序执行下面的命令,主要是下载vLLM的neuron适配版本,并打上一些补丁来支持Inferentia2。

cd ~ 
wget https://zz-common.s3.us-east-1.amazonaws.com/tmp/install.tar
tar -xvf install.tar
cd ~/install
git clone https://github.com/vllm-project/vllm --branch v0.6.1.post2 --single-branch

cp arg_utils.py ./vllm/vllm/engine/
cp setup.py ./vllm/
cp neuron.py ./vllm/vllm/model_executor/model_loader/

接着是下载模型权重。咱们新建一个`download.py`脚本,这里以`DeepSeek-R1-Distill-Qwen-7B`为例,你想换别的模型,改一下`model_id`就行。

from huggingface_hub import snapshot_download
model_id='deepseek-ai/DeepSeek-R1-Distill-Qwen-7B'

snapshot_download(repo_id=model_id,local_dir="./models/"+model_id)

在终端里运行它,把模型文件下载到本地。

cd ~
python3 download.py

万事俱备,只欠东风。现在可以正式构建我们的Docker容器了。

cd ~
# Build docker container
docker build -t neuron-container:deepseek .

3、启动 vLLM 推理容器

镜像构建好了,用下面这条命令启动容器。注意,第一次启动可能需要等个十分钟左右,因为它要编译和加载模型,耐心点。

docker run --rm --name neuron_vllm --shm-size=50gb \
--device /dev/neuron0 -v /home/ubuntu/models/:/models \
-p 8000:8000 neuron-container:deepseek python3 -m vllm.entrypoints.openai.api_server \
--model=/models/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B --tensor-parallel-size=2 --max-num-seqs=8 \
--max-model-len=4096 --block-size=4096

这里有几个参数我解释一下:

--tensor-parallel-size=2:这个2代表Neuron设备的核心数。每个Inferentia2芯片正好有2个Neuron核心。

--max-model-len=4096 --block-size=4096:模型支持的最大token数,这两个参数要设成一样。

--model:就是我们下载的模型名称。因为启动容器时,我们把本地的`/home/ubuntu/models/`目录映射到了容器里的`/models`,所以这里要加上`/models`前缀。

--max-num-seqs=8:LLM引擎一次最多能处理的请求数。

4、客户端测试

容器跑起来后,我们得测试一下它工不工作。新开一个SSH窗口,用`curl`命令先简单测一下,看看API通不通。

curl -X POST -H "Content-Type: application/json" http://localhost:8000/v1/completions \
-d '{"model":"/models/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B","prompt": "tell me a story about New York city","max_tokens": 1000, "stream":false}'

当然,用`curl`测试太原始了。我们正经点,写个Python客户端脚本`client.py`来调用,这样更直观。

from openai import OpenAI
import sys

client = OpenAI(
        base_url = "http://localhost:8000/v1/",
        api_key="token",
    )
models = client.models.list()
model_name = models.data[0].id

prompt='''
四(1)班在“数学日”策划了四个活动,活动前每人只发放一枚“智慧币”。
“数学日”活动规则是:
1.参加活动順序自选。
2.每参加一个活动消耗一枚“智慧币”, 没有“智慧币”不能参加活动。
3.每个活动只能参加一次。
4.挑战成功,按右表发放契励,挑战失败,谢谢参与。

活动名称和挑战成功后奖励的“智慧币”对应关系如下:
魔方 1
拼图 2
华容道 2
数独 3

李军也参与了所有挑战活动,而且全部成功了,活动结束后他还剩几枚“智慧币”。
'''

stream = client.chat.completions.create(
    model=model_name,
    messages=[{"role": "user", "content": prompt}],
    stream=True,
)
for chunk in stream:
    if chunk.choices[0].delta.content is not None:
        print(chunk.choices[0].delta.content, end="")

保存脚本后,直接运行,看看结果怎么样。

python client.py

这时候你可以观察Docker容器的日志输出,我这边看到的情况是,平均每秒输出的token数量大概在25-30个之间,对于这个配置来说,表现还不错。大家也可以自己调整推理参数,多做些实验看看。

总的来说,亚马逊云科技(申请免费账户体验100+云产品)在全球很多我们常用的地区,比如东京、新加坡、悉尼、伦敦这些,都部署了Trn1/Inf2实例。这不仅是GPU资源紧张时的一个极好补充,更实在的是,官方宣称对比同类型的GPU实例,Trn1/Inf2实例有超过40%的价格优势,性价比一下子就凸显出来了。这篇文章我们先聊了怎么在EC2上手动部署,下一篇我打算再研究下如何用亚马逊的SageMaker Endpoint来部署,那套方案可能会更自动化一些。

未经允许不得转载:主机频道 » 亚马逊云科技实战指南:基于Inferentia2与EC2部署DeepSeek R1模型(亚马逊ec2是属于哪一层服务)

相关推荐

评论 抢沙发

评论前必须登录!