# 使用sglang+docker多机多卡手动部署DeepSeek-R1/V3模型（Linux）
#### 应用场景
DeepSeek-V3和DeepSeek-R1是深度求索（DeepSeek）推出的两款高性能大语言模型，其中推理专用模型，专为数学、代码生成和复杂逻辑推理任务设计，通过大规模强化学习（RL）提升推理能力。DeepSeek-V3是通用型模型，专注于自然语言处理、知识问答、内容创作等通用任务，目标是实现高性能与低成本的平衡，适用于智能客服、个性化推荐系统等场景。华为云为用户提供使用sglang来部署DeepSeek-R1/V3模型的详细步骤，帮助客户快速部署。
#### 方案架构
本方案至少需要一台主节点和一台从节点。
图1基于sglang+docker多机多卡手动部署DeepSeek-R1/V3模型示意图（Linux）   
![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002641560006.png "点击放大")
#### 方案优势
基于sglang+docker多机多卡从0开始手动部署DeepSeek-R1/V3模型，深刻理解模型运行依赖，体验DeepSeek满血版模型带来的极致推理性能。sglang框架内置了数据并行路由器，可以在worker启动完成后自动将路由器连接到所有的worker，不需要借助外部的ray集群框架，操作起来更加简单方便。
#### 资源和成本规划
表1资源和成本规划 
| 资源       | 资源说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | 成本说明                                                                                                                                                                                                                                                                                                                                                          |
|:---|:---|:---|
| 虚拟私有云VPC | VPC网段：192.168.0.0/16                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | 免费                                                                                                                                                                                                                                                                                                                                                            |
| 虚拟私有云子网  | - 可用区：可用区1  - 子网网段：192.168.0.0/24                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | 免费                                                                                                                                                                                                                                                                                                                                                            |
| 安全组      | 入方向规则： - 优先级：1  - 策略：允许  - 类型：IPv4  - 协议端口：TCP: 80  - 源地址：0.0.0.0/0                                                                                                                                                                                                                                                                                                                                                                                   | 免费                                                                                                                                                                                                                                                                                                                                                            |
| 弹性云服务器   | - 计费模式：包年/包月  - 可用区：可用区1  - 规格：见[表2]  - 镜像：使用驱动为535，CUDA为12.2的镜像。  - 系统盘：200G  - 数据盘：1000G  - 弹性公网IP：现在购买  - 线路：全动态BGP  - 公网带宽：按流量计费  - 带宽大小：100 Mbit/s   | ECS涉及以下几项费用： - 云服务器  - 云硬盘  - 弹性公网IP   具体的计费方式及标准请参考[计费模式概述](https://support.huaweicloud.com/price-ecs/ecs_billing_2001.html)。 |
   
 表2蒸馏模型运行可选的GPU弹性云服务器规格 
| 编号 | 模型名称                                               | 最小所需规格         | GPU卡                 |
|:---|:---|:---|:---|
| 0  | DeepSeek-R1 DeepSeek-V3 | p2s.16xlarge.8 | V100(32G)\*8卡 \* 8台  |
| 0  | DeepSeek-R1 DeepSeek-V3 | p2v.16xlarge.8 | V100(16G)\*8卡 \* 16台 |
| 0  | DeepSeek-R1 DeepSeek-V3 | pi2.4xlarge.4  | T4(16G)\*8卡 \* 16台   |
   
#### 基于sglang+docker多机多卡手动部署DeepSeek-R1/V3模型步骤
Linux实例基于sglang+docker多机多卡手动部署DeepSeek-R1/V3模型操作步骤如下：
1. [创建GPU弹性云服务器。]
2. [驱动和CUDA的前置条件检查。]
3. [安装docker。]
4. [安装nvidia-container-toolkit。]
5. [安装modelscope等依赖包。]
6. [下载docker镜像。]
7. [下载DeepSeek-R1/V3模型文件。]
8. [启动sglang的主节点和全部从节点。]
9. [调用模型接口测试。]
 
#### 实施步骤
1. 创建GPU弹性云服务器。
   
   1. 镜像选择：建议选择华为云提供的GPU实例的未安装驱动的Huawei Cloud EulerOS 2.0/Ubuntu 22.04公共镜像，勾选自动安装GPU驱动，选择驱动版本535.161.08，CUDA版本12.2.0，以下一些依赖安装都是基于Ubuntu 22.04系统的，其他系统请自行参考安装，hopper系列的GPU卡可以按照更高版本的驱动550+，CUDA12.6+。
      图2GPU实例镜像选择和自动安装GPU驱动选择   
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002336618289.png "点击放大") 
   
   2. 需要创建EIP，方便依赖环境下载，方便调用模型接口进行推理。
   
   
   
   
2. 驱动和CUDA的前置条件检查。
   
   执行以下命令，查看显卡基本信息。
   ```
   nvidia-smi
   ```
   如果使用的不是推荐的镜像和驱动版本，请参考[手动安装GPU加速型ECS的Tesla驱动](https://support.huaweicloud.com/usermanual-ecs/ecs_03_0174.html)方法更新驱动到535版本，CUDA更新到12.2。
   
   
3. 安装docker。
   
   1. 执行以下命令，更新包索引并安装依赖项。
      ```
      apt-get update
      apt-get install -y ca-certificates curl gnupg lsb-release
      ```
      
   
   2. 执行以下命令，添加docker的官方GPG密钥。
      ```
      mkdir -p /etc/apt/keyrings
      curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
      ```
      
   
   3. 执行以下命令，设置Docker的APT源。
      ```
      echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
        $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
      ```
      
   
   4. 执行以下命令，安装docker引擎。
      ```
      apt update
      apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
      ```
      
   
   5. 执行以下命令，配置docker-hub。
      ```
      cat <<EOF > /etc/docker/daemon.json
      {
        "registry-mirrors": [
          "https://docker.m.daocloud.io",      
          "https://registry.cn-hangzhou.aliyuncs.com" 
        ]
      }
      EOF
      systemctl restart docker
      ```
      
   
   6. 执行以下命令，验证docker安装是否正常。
      ```
      docker --version
      ```
      
   
   
   
   
4. 安装nvidia-container-toolkit。
   
   1. 执行以下命令，添加nvidia的官方GPG密钥。
      ```
      curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
        && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
          sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
          sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
      ```
      
   
   2. 执行以下命令，设置NVIDIA Container Toolkit的APT源。
      ```
      sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list
      ```
      
   
   3. 执行以下命令，更新索引包并安装NVIDIA Container Toolkit。
      ```
      apt update
      apt install -y nvidia-container-toolkit
      ```
      
   
   4. 执行以下命令，配置docker以使用Nvidia Container Toolkit。
      ```
      nvidia-ctk runtime configure --runtime=docker
      systemctl restart docker
      ```
      
   
   
   
   
5. 安装modelscope等依赖包。
   
   1. 执行以下命令，更新升级pip。
      ```
      python -m pip install --upgrade pip -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
      ```
      
   
   2. 执行以下命令，安装[modelscope](https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple)。
      ```
      pip install modelscope -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
      ```
      ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
      modelscope是国内模型开源社区，国内下载会更快，如果在国外，请使用hugging Face进行下载。
      
   
   
   
   
6. 下载docker镜像。
   
   可以下载sglang提供的最新容器镜像，也可以下载华为云hgcs异构团队制作的镜像。
   1. 执行以下命令，下载sglang官网镜像。
      ```
      docker pull lmsysorg/sglang:latest
      ```
      
   
   2. 执行以下命令，下载hgcs团队制作的镜像。
      ```
      docker pull swr.cn-north-9.myhuaweicloud.com/hgcs/lmsysorg/sglang:latest
      ```
      
   
   
   
   
7. 下载DeepSeek-R1/V3模型文件。
   
   1. 执行以下命令，创建下载模型脚本。
      ```
      vim download_models.py
      ```
      插入以下内容：
      ```
      from modelscope import snapshot_download
      model_dir = snapshot_download('deepseek-ai/DeepSeek-R1', cache_dir='/root', revision='master')
      ```
      模型名称以*DeepSeek-R1* 为例，可切换成*DeepSeek-V3*，模型存储的本地路径以/root为例，可以更换自己的目录。
      
   
   2. 执行以下命令，下载模型。
      ```
      python3 download_models.py
      ```
      等待模型下载完成，模型总大小642G，和你的EIP带宽有关，下载时间最长可能超过24小时。
      
   
   
   
   
8. 启动sglang的主节点和全部从节点。
   
   **第一种情况：有roce网络。**
   1. 执行以下命令，启动sglang的主节点。
      节点node0：
      ```
      docker run --gpus all \ # 使用全部GPU卡。
             --shm-size 512g \  # 主机和容器的共享内存大小，根据服务器配置来设置。
             -e NCCL_IB_GID_INDEX=3 \ # 使用索引3，对应roce v2的路由
             -e NCCL_IB_HCA='^=mlx5_bond_0' \ # 指定roce通信的网卡
             -e NCCL_SOCKET_IFNAME=bond0  \  # NCCL指定 TCP/IP 通信的网卡（如 bond0），需与 IB 网卡分离以避免干扰
             -e GLOO_SOCKET_IFNAME=bond0  \ # GLOO指定 TCP/IP 通信的网卡（如 bond0），需与 IB 网卡分离以避免干扰
             -v /mnt/paas/models:/root/.cache/huggingface \ # 模型路径挂载点
             --ipc=host --network=host --privileged \ # 使用host网络
             swr.cn-north-9.myhuaweicloud.com/hgcs/lmsysorg/sglang:latest \ # 容器镜像名
             python3 -m sglang.launch_server --model /root/.cache/huggingface/DeepSeek-V3 \ # 指定模型路径
             --served-model-name deepseek-v3 \ # 指定模型名
             --tp 16 \ # 2台8卡H20，设置tp并行为16
             --nnodes 2 \ # 总节点数
             --node-rank 0 \ # 主节点设置为0，其他节点按顺序顺移动
             --host 0.0.0.0 --port 8000 \ # 设置当前节点IP和端口
             --dist-init-addr 192.168.1.143:30000 \ # 设置主节点IP和端口
             --trust-remote-code
      ```
      
   
   2. 执行以下命令，启动sglang的从节点。
      ```
      docker run --gpus all \ 
      --shm-size 512g \
      -e NCCL_IB_GID_INDEX=3 \
      -e NCCL_IB_HCA='^=mlx5_bond_0' \
      -e GLOO_SOCKET_IFNAME=bond0 \
      -v /mnt/paas/models:/root/.cache/huggingface \
      --ipc=host --network=host \
      --privileged swr.cn-north-9.myhuaweicloud.com/hgcs/lmsysorg/sglang:latest python3 -m sglang.launch_server \
      --model /root/.cache/huggingface/DeepSeek-V3 \
      --served-model-name deepseek-v3 \
      --tp 16 
      --nnodes 2 
      --node-rank 1 
      --host 0.0.0.0 --port 8000 
      --dist-init-addr 192.168.1.143:30000 
      --trust-remote-code
      ```
      
   
   3. 可以添加以下优化参数。
      - 显示指定FP8 --quantization fp8
        --kv-cache-dtype fp8_e5m2
        
      
      - 启用MLA优化 --enable-torch-compile # 启用PyTorch即时编译（JIT）优化
        --enable-flashinfer-mla # 启用FlashInfer MLA注意力加速
        
       
   
   
   **第二种情况：无roce网络。**
   1. 执行以下命令，启动sglang的主节点。 节点node0：
      ```
      docker run --gpus all \ # 使用全部GPU卡。
             --shm-size 512g \  # 主机和容器的共享内存大小，根据服务器配置来设置
             -e GLOO_SOCKET_IFNAME=eth0 \
             -v /mnt/paas/models:/root/.cache/huggingface \ # 模型路径挂载点
             --ipc=host --network=host   \ # 使用host网络
             swr.cn-north-9.myhuaweicloud.com/hgcs/lmsysorg/sglang:latest \ # 容器镜像名
             python3 -m sglang.launch_server --model /root/.cache/huggingface/DeepSeek-V3 \ # 指定模型路径
             --served-model-name deepseek-v3 \ # 指定模型名
             --tp 16 \ # 2台8卡H20，设置tp并行为16
             --nnodes 2 \ # 总节点数
             --node-rank 0 \ # 主节点设置为0，其他节点按顺序顺移动
             --host 0.0.0.0 --port 8000 \ # 设置当前节点IP和端口
             --dist-init-addr 192.168.1.143:30000 \ # 设置主节点IP和端口
             --trust-remote-code
      ```
      
   
   2. 执行以下命令，启动sglang的从节点。
      ```
      docker run --gpus all \ 
      --shm-size 512g \
      -e GLOO_SOCKET_IFNAME=eth0\
      -v /mnt/paas/models:/root/.cache/huggingface \
      --ipc=host --network=host \
      swr.cn-north-9.myhuaweicloud.com/hgcs/lmsysorg/sglang:latest 
      python3 -m sglang.launch_server \
      --model /root/.cache/huggingface/DeepSeek-V3 \
      --served-model-name deepseek-v3 \
      --tp 16 \
      --nnodes 2 \
      --node-rank 1 \
      --host 0.0.0.0 --port 8000 \
      --dist-init-addr 192.168.1.143:30000 \
      --trust-remote-code
      ```
      
   
   3. 可以添加以下优化参数。
      - 显示指定FP8 --quantization fp8
        --kv-cache-dtype fp8_e5m2
        
      
      - 启用MLA优化 --enable-torch-compile # 启用PyTorch即时编译（JIT）优化
        --enable-flashinfer-mla # 启用FlashInfer MLA注意力加速
        
       
   
   
   
   
9. 调用模型接口测试。
   
   1. 调用以下API进行聊天对话。
      ```
      curl http://localhost:8000/v1/chat/completions \
      -H "Content-Type: application/json" \
      -d '{
        "model": "DeepSeek-R1",
        "messages": [{"role": "user", "content": "hello\n"}]
      }'
      ```
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002302683782.png "点击放大")
      
   
   2. 如果需要流式对话，则需要加上stream参数。
      ```
      curl http://localhost:8000/v1/chat/completions \
      -H "Content-Type: application/json" \
      -d '{
        "model": "DeepSeek-R1",
        "messages": [{"role": "user", "content": "hello\n"}],
        "stream": true
      }'
      ```
      
   
   
   您可以在本地postman或者自己的服务里面使用EIP调用对应的API接口来对话。
   
   
 
#### 常见问题
问题描述：启动sglang的主节点时出现报错：SGLang only supports sm75 and above
![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002302526874.png "点击放大")
原因：GPU显卡计算能力不够，提示至少计算能力要SM7.5。
解决方案：换成计算能力大于等于SM7.5的GPU，例如T4。
