从零开始:使用SGlang私有化部署满血版DeepSeek-R1实战指南
背景介绍
DeepSeek-R1是一款拥有671B参数规模的推理大模型,其在数学、编程和推理等复杂任务上的表现,已经与当前主流商业大模型不相上下。
本文详细介绍如何使用SGlang作为分布式推理方案,并基于Alaya NeW算力云的弹性容器集群,展示DeepSeek-R1私有化部署的最佳实践。通过这种组合,我们旨在提供一个灵活、可扩展且高性能的解决方案,以支持深度学习模型的高效部署与运行。这一方法不仅提升了模型推理的效率,还确保了在私有化环境下的稳定性和安全性。
在该实践中,以“北京一区”作为示例来创建弹性集群。后续使用的镜像仓库等,也都是在“北京一区”开通的应用市场公共仓库。
前提条件
用户已经获取Alaya New企业账户和密码,如果需要帮助或尚未注册,可参考注册账户完成注册。
准备工作
配置环境变量
本次部署会用到 helm
和 Kubernetes
,请先确保本地有可用的Kubernestes客户端工具kubectl,此次的最佳实践以Windows 11
系统添加环境为例,配置环境变量的操作步骤如下所示。
-
通过以下网址下载最新版本的kubectl,本实践下载“windows-amd64-v1.27.3-kubectl.exe”文件,在本地新建“kubectl”文件夹,将下载的
.exe
文件名称修改为“kubectl”并移动到新建的文件夹下,如果用户需要获取其他版本安装包可通过更多kubectl版本获取。 -
通过以下网址下载最新版本的helm。本实践下载“helm-v3.17.1-windows-amd64.zip”文件,在本地解压上述文件,将文件名修改为“helm”,如果用户需要获取其他版本安装包可通过以下网址获取helm。
-
右键点击[此电脑/属性]菜单项,进入[系统/系统信息]配置页面,点击“高级系统设置”链接。
-
在[系统属性]页面中,点击[环境变量]按钮,进入环境变量配置页面。
-
在“系统变量”处双击
Path
变量新建环境变量,新建如下图所示的环境。新建完成后,单击[确定]按钮,配置环境变量操作完成。
- 在实际的使用中,用户需要将上图中高亮部分替换为“kubectl.exe”、“helm.exe”文件所在的本地路径。
- Linux系统配置环境变量:将helm文件移动到目录“ /usr/local/bin”。
配置弹性容器集群
DeepSeek-R1模型的参数规模为6710亿,模型的文件大小约为642G。因此,在部署前需要准备足够的资源,用户需要保证资源至少满足下表中的配置要求。
配置项 | 配置需求 |
---|---|
GPU | H800 * 16 |
CPU | 128核 |
内存 | 512GB |
磁盘 | 1TB |
开通弹性容器集群可参看开通弹性容器集群操作步骤章节所述。集群开通完成后可在使用弹性容器集群处查看弹性容器集群的使用方式。
此次的最佳实践配置弹性容器集群的操作步骤如下所示。
-
使用已注册的企业账号登录Alaya NeW系统,账户注册详情可参看注册账户章节所述,登录后进入[产品目录]页面。
-
单击“新建集群”按钮,进入[弹性容器集群]配置页面,配置基本信息,例如:集群名称,集群描述,智算中心,此次使用的集群配置如下所示。
配置项 配置详情 集群名称 deeepseek-test 智算中心 北京一区 算力配置 1、型号:H800
2、配额:16卡GPU存储配置 1、选择大容量存储
2、开启StorageClass开关对外服务 开启对外服务开关
在该实践中,创建弹性集群页面上存在但表格中未列出的参数,均采用默认配置。
本实践以“北京一区”作为示例来创建弹性集群。后续使用的镜像仓库等,也都是在“北京一区”开通的。若您选择在其他智算中心(北京二区,北京三区等)开通弹性容器集群进行本教程的实践,请确认您的弹性容器集群和镜像仓库在同一个智算中心。
-
弹性容器集群参数配置完成后,单击“立即开通”按钮,资源开通操作完成,用户可在[资源中心/弹性容器集群]页面查看已创建的容器集群,弹性容器集群状态为“运行中”表示集群可正常使用,如下图蓝色高亮处所示。
-
集群可正常使用后,点击“kubuconfig下载”链接,如上图绿色高亮处所示,将集群的kubeconfig配置文件下载到本机上。
-
在本机上找到上步已经下载的文件,本实践中为“deepseek-test-config.json”,使用
certutil -decode
命令解压该文件,如下图所示。
certutil -decode deepseek-test-config.json bj-test1
用户在解压文件的过程中需要注意以下两点:
- 将上图中“解压前文件名称”替换为本机已下载的
kubeconfig
文件的名称。 - 将上图中“解压后文件名称”替换为自己实际所需的文件名称。
-
在终端页面,使用
$env:KUBECONFIG
命令配置访问弹性容器集群的环境变量,本实践的路径如下图所示。
$env:KUBECONFIG="D:/DeepSeek-R1/bj-test1"
- 配置时需要将高亮处引号内的路径替换为上步解压后文件的实际路径。
- 弹性集群环境变量的配置只在当前窗口有效。
- Linux系统使用环境变量的方法为:export KUBECONFIG="/home/sxh/bj-test1"。
- 在终端页面执行如下命令,查看集群是否连接成功。若显示如下图所示,表示弹性容器集群连接成功。
kubectl cluster-info
下载大模型
- 为了方便操作,用户可点击此处下载配置文件及示例代码,下载并解压后的文件内容如下表所示。
文件名 | 描述 |
---|---|
deepseek-secret.yaml | Harbor仓库的密钥,用于拉取镜像时的认证 |
prepare.yaml | 准备工作的运行环境,不使用GPU资源,用于模型下载等工作 |
kuberay-operator | KubeRay Operator的配置文件目录,用于启动operator |
sglang-cluster/sglang.yaml | SGlang的配置文件,用于启动SGlang服务 |
sglang-cluster/sglang-svcExporter-chat.yaml | 网络配置文件,用于暴露DeepSeek的推理服务端口,供外部访问 |
上表中各文件中的配置仅以“北京一区”为示例,若您选择在其他智算中心(北京二区,北京三区等)开通弹性容器集群进行本教程的实践,您需要修改以下配置文件:
-
prepare.yaml 文件中HF_ENDPOINT环境变量: 来使用模型的高速下载服务,其他中心的配置可查看模型下载加速。
-
prepare.yaml, sglang-cluster/sglang.yaml,sglang-cluster/sglang-svcExporter-chat.yaml 以上各文件中对应的 “image” 字段需要改成匹配的镜像仓库地址:
- 北京一区:registry.hd-01.alayanew.com:8443
- 北京二区:registry.hd-02.alayanew.com:8443
- 北京三区:registry.hd-03.alayanew.com:8443
-
双击进入上步已解压的“Deepseek-R1”文件夹,打开终端,执行如下的命令,创建一个名为“deepseek”的NameSpace。
kubectl create namespace deepseek
-
在上述同一页面创建Secret,该秘钥用于拉取镜像时做验证。执行如下的命令,创建
Secret
资源。kubectl apply -f deepseek-secret.yaml
-
Secret资源创建完成后,执行如下命令将YAML文件中定义的资源配置应用到集群中。
kubectl apply -f prepare.yaml
-
资源应用完成后,请执行以下命令查看“deepseek”命名空间下Pod的运行状态。当Pod的状态显示为“Running”时,表明其已成功启动并正常运行,即可用于后续配置。
kubectl.exe get pod -n deepseek
用户在实际的应用中,可将“deepseek”替换为实际要创建的NameSpace名称。
-
Pod启动成功后,在终端页面执行如下命令进入上一步骤创建的Pod。
kubectl exec -it prepare-deploy-74f545496-59wsw -n deepseek -- bash
用户在实际的应用中,需要将“prepare-deploy-74f545496-59wsw”替换为实际使用的Pod名称。
- 为了简化后续操作,建议在终端中执行
tmux
命令以创建一个新的会话。有关此工具的详细使用方法,请参阅Tmux的使用的使用。然后,在新开启的Tmux会话中,在新开启的会话页面执行如下所示的命令安装huggingface工具。
pip install huggingface
-
上述工具安装完成后,在终端执行以下命令下载DeepSeek-R1模型,如下图所示。
huggingface-cli download --resume-download deepseek-ai/DeepSeek-R1 --local-dir /model/deepseek-ai/DeepSeek-R1
模型文件大约642G,初次下载时间可能较长,请耐心等待。
- 在终端页面进入kuberay-operator目录,使用如下的命令部署kuberay-operator集群。
helm install kuberay-operator -n deepseek --version 1.2.2 .
-
成功部署kuberay-operator后,执行以下命令来检查已部署资源的状态。当kuberay-operator的“STATUS”显示为“deployed”时,表明该资源已成功部署并可正常使用。
helm list -n deepseek
- 在确认上一步的资源已成功部署并可正常使用后,请保持在同一个终端页面中,进入sglang-cluster文件夹目录,并执行以下命令,启动SGlang服务。
cd ..
cd sglang-cluster
kubectl apply -f sglang.yaml
-
服务启动成功后,在终端页面执行如下命令查看服务运行情况,所有Pod运行状态均为“Running”,如下图所示,表示资源可正常使用。
kubectl get pod -n deepseek
外部访问配置
在弹性容器集群中,对于需要外部访问的服务,我们可以使用ServiceExporter
。ServiceExporter
是弹性容器集群中用于将服务暴露到外部的组件,将其与需要对外提供服务的Service
绑定,为用户提供外部访问的地址。获取访问地址的步骤如下所示。
- 在上一章节所用的同一终端页面中,执行如下命令创建ServiceExporter资源。
kubectl apply -f sglang-svcExporter-chat.yaml
-
资源创建成功后,请在终端页面执行以下命令,以查看“deepseek”命名空间中运行的所有服务列表,并获取SGlang的服务名称。本实践名称为“sglangcluster-head-svc”。
kubectl describe serviceExporter sglangcluster-head-svc -n deepseek
用户在实际的应用中,需要将“sglangcluster-head-svc”替换为实际使用的SGlang服务名称。
在终端页面查看 ServiceExporter
的信息获取服务访问的地址。通过 ServiceExporter
方式暴露的服务端口均为“22443”。
用户在实际的应用中,需要将本实践中的参数替换为实际的参数,以上图中高亮的URL地址为例,其组成有如下几个部分。
属性 | 参数说明 | 参数示例 |
---|---|---|
Service Name | 已创建ServiceExporter服务的名称 | sglangcluster-head-svc |
NameSpace名称 | 部署ServiceExporter服务的NameSpace名称 | deepseek |
VKSID | 已开通弹性容器集群的ID,用户可通过以下命令查看集群ID | vcrbcqtyxxxx |
不同操作系统获取VKSID的命令行如下所示。
- Windows
- Linux
kubectl cluster-info | ForEach-Object { ($_ -split '/')[-1] } | Select-Object -First 1
kubectl cluster-info | awk -F'/' '{print $NF}' | head -n 1
部署DeepSeek-R1模型
-
SGlang服务启动成功后,在上一章节所用终端页面执行如下命令进入SGlang服务的其中一个容器,如下图所示。
kubectl get pod -n deepseek
kubectl exec -it pod/sglangcluster-head-9rq7q bash -n deepseek
执行上述操作时,用户需将“sglangcluster-workergroup-worker-g2qbq”替换为实际的Pod名称,填写以“sglangcluster”开头的Pod名称。
- 执行
tmux
命令打开新会话。在新会话页面执行以下命令部署DeepSeek-R1模型。
python3 -m sglang.launch_server \
--model-path /model/deepseek-ai/DeepSeek-R1 \
--host 0.0.0.0 \
--port 8000 \
--tp 16 \
--dist-init-addr sglangcluster-head-svc:20000 \
--nnodes 2 \
--node-rank 0 \
--trust-remote-code
执行上述操作时,用户需将“sglangcluster-head-svc”替换为实际的Service名称。同样地,在本章节的第5步中也需要进行同样的替换。
- 重新开启一个终端页面,执行如下命令连接弹性容器集群。
$env:KUBECONFIG="D:/DeepSeek-R1/bj-test1"
kubectl cluster-info
执行上述操作时,用户需将“D:/DeepSeek-R1/bj-test1”替换为实际的环境变量。
- 集群服务连接成功后,在上述终端页面进入SGlang服务的另一个Pod,Pod名称可从本章节第1步中获取。
kubectl exec -it sglangcluster-workergroup-worker-g2qbq bash -n deepseek
执行上述操作时,用户需将“sglangcluster-workergroup-worker-g2qbq”替换为实际的目标 Pod 名称。。
- 执行
tmux
命令打开新会话,在新会话页面执行以下命令部署DeepSeek-R1模型。
python3 -m sglang.launch_server \
--model-path /model/deepseek-ai/DeepSeek-R1 \
--host 0.0.0.0 \
--port 8000 \
--tp 16 \
--dist-init-addr sglangcluster-head-svc:20000 \
--nnodes 2 \
--node-rank 1 \
--trust-remote-code
-
在本章节第2步的终端页面查看模型部署进度,部署页面如下图所示。
访问模型
🎉️ 模型部署成功后,用户在终端管理页面可使用curl
命令行工具向已部署的服务发送HTTP请求,观察数据响应情况,如下所示,以此来验证服务已经部署成功。
curl https://sglangcluster-head-svc-x-deepseek-x-vcrbcqtyxxx.sproxy.hd-01.alayanew.com:22443/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "/model/deepseek-ai/DeepSeek-R1",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "写一首诗,主题是湖水"}
]
}'
{"id":"5b6dad987e0c4198bffb641912c39d8f","object":"chat.completion","created":1740044552,"model":"/model/deepseek-ai/DeepSeek-R1","choices":[{"index":0,"我写一首关于湖水的诗。首先,我需要确定诗的主题和想要表达的情感。湖水可以有很多种意象,比如宁静、倒影、季节变化,或者隐藏的深度。用户可能希望这首诗既有自然构。中文诗通常有绝句或律诗,但可能用户想要的是现代诗。现代诗更自由,可以更灵活地运用意象和结构。然后,我需要选一些生动的意象,比如水纹、云影、候鸟、芦苇等同方面表现出来。比如表面和深处的对比,时间的流逝,自然的变化。可能用一些比喻,比如将湖水比作解冻的墨,或者用青铜的裂痕来表现冰裂,这样既有视觉冲击,又带点严格押韵,但要有内在的韵律感。每一节的转换要自然,比如从白昼到黄昏,再到季节的转换,保持时间上的流动性。同时,加入一些动态的元素,比如候鸟的迁徙、鱼群的洄意象,确保每一句都服务于主题,同时留给读者想象的空间。比如结尾用“一万面碎镜起身”来表现湖面的破碎和重生,既有画面感,又有哲理性,让整首诗余韵悠长。\n</thin正用目光垂钓\n下沉的云影。候鸟群飞过\n芦苇丛裂开青铜色的疤\n解冻的墨开始洄游\n\n而三米之下,淤泥发烫\n正为多年前溺亡的星座\n续写尾鳍。苔藓在玻璃背面\n膨胀第一道裂缝\n鱼群掀动鳞片,推开锈蚀的暗门\n漂木的年轮突然加速旋转\n整个下午悬停在半空\n一万面碎镜同时起身,成为\n新的水面","tool_calls":null},"logprobs":nu:{"prompt_tokens":18,"total_tokens":478,"completion_tokens":460,"prompt_tokens_details":null}}(base)
🎉️ 除了上述访问方式外,用户还可以通过Python代码使用已部署的服务。
from openai import OpenAI
openai_api_key = "EMPTY"
openai_api_base = "https://sglangcluster-head-svc-x-deepseek-x-vcrbcqtyxxxx.sproxy.hd-01.alayanew.com:22443/v1"
client = OpenAI(
api_key=openai_api_key,
base_url=openai_api_base,
)
chat_response = client.chat.completions.create(
model="/model/deepseek-ai/DeepSeek-R1",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "写一首诗,主题是湖水"},
],
stream=True
)
🎉️ 此外用户也可使用跨平台AI客户端工具,例如AnythingLLM、Chatbox AI、Cherry Studio等客户端工具,调用已部署的服务。本实践以Chatbox AI工具为例,服务调用页面如下所示。
在实际应用访问中,请将本实践中的访问地址替换为已部署的服务地址。具体来说,需要将 "sglangcluster-head-svc-x-deepseek-x-vcrbcqtyxxxx.sproxy.hd-01.alayanew.com" 替换为用户实际部署的服务地址。
总结
至此,我们已经完成了使用SGlang部署DeepSeek-R1模型的全部流程。本文档为DeepSeek-R1的私有化部署提供了一个全面的指南,内容涵盖了从环境配置到模型推理访问的各个技术环节。借助分布式推理模式,不仅能够充分发挥大型模型的性能潜力,还加速了AI应用的规模化实施。