从零开始:使用SGlang私有化部署满血版DeepSeek-R1实战指南

背景介绍

DeepSeek-R1是一款拥有671B参数规模的推理大模型,其在数学、编程和推理等复杂任务上的表现,已经与当前主流商业大模型不相上下。

本文详细介绍如何使用SGlang作为分布式推理方案,并基于Alaya NeW算力云的弹性容器集群,展示DeepSeek-R1私有化部署的最佳实践。通过这种组合,我们旨在提供一个灵活、可扩展且高性能的解决方案,以支持深度学习模型的高效部署与运行。这一方法不仅提升了模型推理的效率,还确保了在私有化环境下的稳定性和安全性。

名词解释

1. Helm

  • 定义:Helm 是 Kubernetes 的包管理工具,类似于 Linux 系统中的 aptyum,用于简化 Kubernetes 应用的部署、升级和管理。
  • 核心功能
    • Chart(图表):预配置的应用模板,包含 Kubernetes 资源清单、依赖项和配置参数。
    • 版本管理:支持应用版本化,方便回滚和跟踪变更。
    • 依赖管理:自动处理应用间的依赖关系(如数据库、中间件)。
  • 适用场景:适合在 Kubernetes 集群中快速部署复杂应用(如 MySQL、WordPress、Jenkins 等),尤其适合团队协作和生产环境。

2. Tmux

  • 定义:Tmux 是一个终端复用器(Terminal Multiplexer),允许在单个终端窗口中创建、管理多个独立的会话或分屏窗口。
  • 核心功能
    • 会话持久化:即使终端关闭,会话仍在后台运行,可随时恢复。
    • 分屏操作:横向或纵向分割窗口,同时查看和操作多个任务。
    • 快捷键控制:通过组合键(如 Ctrl + b)高效管理窗口和会话。
  • 适用场景:开发者、运维人员需要同时处理多个终端任务(如查看日志、调试代码、运行脚本),或需要远程连接时保持会话不中断。

3. KubeRay

  • 定义:KubeRay 是 Ray(分布式计算框架)与 Kubernetes 的集成工具,允许在 Kubernetes 集群上运行 Ray 应用,利用 K8s 的资源调度和弹性扩展能力。
  • 核心功能
    • 资源管理:通过 K8s 的 API 动态分配和管理计算资源(CPU、内存、GPU)。
    • 弹性扩展:根据负载自动调整 Ray 集群的节点数量。
    • 兼容性:支持 Ray 的原生 API 和生态(如 Ray Serve、Tune)。
  • 适用场景:需要分布式计算的机器学习、数据分析或高并发任务,希望借助 K8s 的成熟调度和监控能力。

准备工作

配置环境变量

本次部署会用到 helm和 Kubernetes,请先确保本地有可用的Kubernestes客户端工具kubectl,此次的最佳实践以Windows 11系统添加环境为例,配置环境变量的操作步骤如下所示。

  1. 通过以下网址下载最新版本的kubectl,本实践下载“windows-amd64-v1.27.3-kubectl.exe”文件,在本地新建“kubectl”文件夹,将下载的.exe文件名称修改为“kubectl”并移动到新建的文件夹下,如果用户需要获取其他版本安装包可通过以下网址获取安装kubectl命令行工具

  2. 通过以下网址下载最新版本的helm。本实践下载“helm-v3.17.1-windows-amd64.zip”文件,在本地解压上述文件,将文件名修改为“helm”,如果用户需要获取其他版本安装包可通过以下网址获取helm

  3. 右键点击[此电脑/属性]菜单项,进入[系统/系统信息]配置页面,点击“高级系统设置”链接。

  4. 在[系统属性]页面中,点击[环境变量]按钮,进入环境变量配置页面。

  5. 在“系统变量”处双击 Path变量新建环境变量,新建如下图所示的环境。新建完成后,单击[确定]按钮,配置环境变量操作完成。

    1739413048753

提示

  • 在实际的使用中,用户需要将上图中高亮部分替换为“kubectl.exe”、“helm.exe”文件所在的本地路径。
  • Linux系统配置环境变量:将helm文件移动到目录“ /usr/local/bin”。

配置弹性容器集群

DeepSeek-R1模型的参数规模为6710亿,模型的文件大小约为642G。因此,在部署前需要准备足够的资源,用户需要保证资源至少满足下表中的配置要求。

配置项配置需求
GPUH800 * 16
CPU128核
内存512GB
磁盘1TB

开通弹性容器集群可参看弹性容器集群开通及管理操作步骤章节所述。集群开通完成后可在快速开始处查看弹性容器集群的使用方式。

此次的最佳实践配置弹性容器集群的操作步骤如下所示。

  1. 使用已注册的企业账号登录Alaya NeW系统,账户注册详情可参看注册账户章节所述,登录后进入[产品目录]页面。

  2. 单击“新建集群”按钮,进入[弹性容器集群]配置页面,配置基本信息,例如:集群名称,集群描述,智算中心,此次使用的集群配置如下所示。

    配置项配置详情
    集群名称deeepseek-test
    智算中心北京一区
    算力配置1、型号:H800
    2、配额:16卡GPU
    存储配置1、选择大容量存储
    2、开启StorageClass开关
    对外服务开启对外服务开关

提示

在该实践中,创建弹性集群页面上存在但表格中未列出的参数,均采用默认配置。

  1. 弹性容器集群参数配置完成后,单击“立即开通”按钮,资源开通操作完成,用户可在[资源中心/弹性容器集群]页面查看已创建的容器集群,弹性容器集群状态为“运行中”表示集群可正常使用,如下图蓝色高亮处所示。

    1739431477628

  2. 集群可正常使用后,点击“kubuconfig下载”链接,如上图绿色高亮处所示,将集群的kubeconfig配置文件下载到本机上。

  3. 在本机上找到上步已经下载的文件,本实践中为“deepseek-test-config.json”,使用certutil -decode命令解压该文件,如下图所示:

  4. 1739433767131

certutil -decode deepseek-test-config.json bj-test1

提示

用户在解压文件的过程中需要注意以下两点:

  • 将上图中“解压前文件名称”替换为本机已下载的kubeconfig文件的名称。
  • 将上图中“解压后文件名称”替换为自己实际所需的文件名称。
  1. 在终端页面,使用$env:KUBECONFIG命令配置访问弹性容器集群的环境变量,本实践的路径如下图所示。

    1739436026488

$env:KUBECONFIG="D:/DeepSeek-R1/bj-test1"

提示

  • 配置时需要将高亮处引号内的路径替换为上步解压后文件的实际路径。
  • 弹性集群环境变量的配置只在当前窗口有效。
  • Linux系统使用环境变量的方法为:export KUBECONFIG="/home/sxh/bj-test1"。
  1. 在终端页面执行如下命令,查看集群是否连接成功。若显示如下图所示,表示弹性容器集群连接成功。

kubectl cluster-info

下载大模型

  1. 为了方便操作,用户可点击此处下载配置文件及示例代码,下载并解压后的文件内容如下表所示。
文件名描述
deepseek-secret.yamlHarbor仓库的密钥,用于拉取镜像时的认证
prepare.yaml准备工作的运行环境,不使用GPU资源,用于模型下载等工作
kuberay-operatorKubeRay Operator的配置文件目录,用于启动operator
sglang-cluster/sglang.yamlSGlang的配置文件,用于启动SGlang服务
sglang-cluster/sglang-svcExporter-chat.yaml网络配置文件,用于暴露DeepSeek的推理服务端口,供外部访问
  1. 双击进入上步已解压的“Deepseek-R1”文件夹,打开终端,执行如下的命令,创建一个名为“deepseek”的NameSpace。

    kubectl create namespace deepseek
    

  2. 在上述同一页面创建Secret,该秘钥用于拉取镜像时做验证。执行如下的命令,创建Secret资源。

    kubectl apply -f deepseek-secret.yaml
    

  3. Secret资源创建完成后,执行如下命令将YAML文件中定义的资源配置应用到集群中。

    kubectl apply -f prepare.yaml
    

  4. 资源应用完成后,请执行以下命令查看“deepseek”命名空间下Pod的运行状态。当Pod的状态显示为“Running”时,表明其已成功启动并正常运行,即可用于后续配置。

    kubectl.exe  get pod -n deepseek
    

提示

用户在实际的应用中,可将“deepseek”替换为实际要创建的NameSpace名称。

  1. Pod启动成功后,在终端页面执行如下命令进入上一步骤创建的Pod。

    1739503494868

kubectl exec -it prepare-deploy-74f545496-59wsw -n deepseek -- bash

提示

用户在实际的应用中,需要将“prepare-deploy-74f545496-59wsw”替换为实际使用的Pod名称。

  1. 为了简化后续操作,建议在终端中执行tmux命令以创建一个新的会话。有关此工具的详细使用方法,请参阅Tmux的使用的使用。然后,在新开启的Tmux会话中,在新开启的会话页面执行如下所示的命令安装huggingface工具。
pip install huggingface

  1. 上述工具安装完成后,在终端执行以下命令下载DeepSeek-R1模型,如下图所示。

    alt text

huggingface-cli download --resume-download deepseek-ai/DeepSeek-R1 --local-dir /model/deepseek-ai/DeepSeek-R1

提示

模型文件大约642G,初次下载时间可能较长,请耐心等待。

  1. 在终端页面进入kuberay-operator目录,使用如下的命令部署kuberay-operator集群。
helm install kuberay-operator -n deepseek  --version 1.2.2  .

  1. 成功部署kuberay-operator后,执行以下命令来检查已部署资源的状态。当kuberay-operator的“STATUS”显示为“deployed”时,表明该资源已成功部署并可正常使用。

    alt text

helm list -n deepseek

  1. 在确认上一步的资源已成功部署并可正常使用后,请保持在同一个终端页面中,进入sglang-cluster文件夹目录,并执行以下命令,启动SGlang服务。
cd ..
cd sglang-cluster
kubectl apply -f sglang.yaml

  1. 服务启动成功后,在终端页面执行如下命令查看服务运行情况,所有Pod运行状态均为“Running”,如下图所示,表示资源可正常使用。

    alt text

kubectl get pod -n deepseek

外部访问配置

在弹性容器集群中,对于需要外部访问的服务,我们可以使用ServiceExporterServiceExporter是弹性容器集群中用于将服务暴露到外部的组件,将其与需要对外提供服务的Service绑定,为用户提供外部访问的地址。获取访问地址的步骤如下所示。

  1. 在上一章节所用的同一终端页面中,执行如下命令创建ServiceExporter资源。
kubectl apply -f sglang-svcExporter-chat.yaml

  1. 资源创建成功后,请在终端页面执行以下命令,以查看“deepseek”命名空间中运行的所有服务列表,并获取SGlang的服务名称。本实践名称为“sglangcluster-head-svc”。

    alt text

kubectl describe serviceExporter sglangcluster-head-svc  -n deepseek

提示

用户在实际的应用中,需要将“sglangcluster-head-svc”替换为实际使用的SGlang服务名称。

在终端页面查看 ServiceExporter的信息获取服务访问的地址。通过 ServiceExporter方式暴露的服务端口均为“22443”。

alt text

 用户在实际的应用中,需要将本实践中的参数替换为实际的参数,以上图中高亮的URL地址为例,其组成有如下几个部分。

属性参数说明参数示例
Service Name已创建ServiceExporter服务的名称sglangcluster-head-svc
NameSpace名称部署ServiceExporter服务的NameSpace名称deepseek
VKSID已开通弹性容器集群的ID,用户可通过以下命令查看集群IDvcrbcqtyxxxx

不同操作系统获取VKSID的命令行如下所示。

  • Windows
  • Linux
  kubectl cluster-info | ForEach-Object { ($_ -split '/')[-1] } | Select-Object -First 1

部署DeepSeek-R1模型

  1. SGlang服务启动成功后,在上一章节所用终端页面执行如下命令进入SGlang服务的其中一个容器,如下图所示。

    alt text

 kubectl get pod -n deepseek
 kubectl exec -it pod/sglangcluster-head-9rq7q bash -n deepseek

提示

执行上述操作时,用户需将“sglangcluster-workergroup-worker-g2qbq”替换为实际的Pod名称,填写以“sglangcluster”开头的Pod名称。

  1. 执行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步中也需要进行同样的替换。

  1. 重新开启一个终端页面,执行如下命令连接弹性容器集群。
$env:KUBECONFIG="D:/DeepSeek-R1/bj-test1"
kubectl cluster-info

提示

执行上述操作时,用户需将“D:/DeepSeek-R1/bj-test1”替换为实际的环境变量。

  1. 集群服务连接成功后,在上述终端页面进入SGlang服务的另一个Pod,Pod名称可从本章节第1步中获取。
 kubectl exec -it sglangcluster-workergroup-worker-g2qbq bash -n deepseek

提示

执行上述操作时,用户需将“sglangcluster-workergroup-worker-g2qbq”替换为实际的目标 Pod 名称。。

  1. 执行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

  1. 在本章节第2步的终端页面查看模型部署进度,部署页面如下图所示。

    alt text

访问模型

🎉️ 模型部署成功后,用户在终端管理页面可使用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": "写一首诗,主题是湖水"}
        ]
    }'

alt text

服务响应输出

   
{"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应用的规模化实施。

### 如何在本地环境中使用 OpenWebUI 实现 DeepSeek 部署 #### 创建并激活 Python 虚拟环境 为了确保项目依赖项隔离,在开始之前应创建一个新的 Conda 环境名为 `open-webui`。这可以通过运行以下命令来完成: ```bash conda create -n open-webui python=3.11 ``` 之后,通过下面的指令激活该虚拟环境[^1]。 ```bash conda activate open-webui ``` #### 安装必要的软件包和工具 一旦进入新创建的虚拟环境中,则可以继续安装所需的Python库和其他资源。通常情况下,这些需求会被记录在一个文件里(比如 requirements.txt),可以直接利用 pip 来批量安装它们。如果官方文档提供了这样的列表链接,应当按照指示下载并执行相应的安装脚本。 对于特定于 DeepSeek 和 OpenWebUI 的集成部分,建议访问官方网站获取最新的设置说明以及任何可能存在的预构建镜像或容器化解决方案,以便简化配置过程[^2]。 #### 注册与配置服务接口 由于涉及到外部API调用,因此需要先前往指定网址注册一个正式的服务提供商账号,并取得必要的认证凭证用于后续开发工作中的身份验证环节。注意区分此步骤所涉及的身份信息同前面提到过的本地测试用途的不同之处。 #### 启动应用程序 当所有的准备工作都完成后,就可以尝试启动应用服务器了。一般而言,开发者会提供一种简便的方式来进行这项操作——可能是简单的命令行输入或者是图形界面下的按钮点击事件触发机制。具体细节还是要参照官方给出的操作手册为准。 #### 测试连接性和功能完整性 最后一步是要确认整个系统的正常运作状态。打开浏览器指向本地主机地址加上适当端口号查看是否能够成功加载网页前端页面;同时也要检验后端逻辑处理能力,即能否顺利发起请求并与远程数据源交互从而返回预期的结果集给到客户端显示出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值