基于GPU实例单机部署满血版DeepSeek模型

更新时间:
复制 MD 格式

DeepSeek-V3/R1是拥有671B参数的专家混合(MoE)模型,且已开源其模型权重。本文将介绍如何利用SGLang作为DeepSeek模型的推理框架,在一台ebmgn8v实例上构建DeepSeek-V3/R1的推理服务。您无需进行额外配置,即可实现开箱即用。

核心工具介绍

  • NVIDIA GPU驱动:用来驱动NVIDIA GPU的程序,本文以Driver版本 550.127.08为例。

  • SGLang:是一个专为大型语言模型(LLM)和视觉语言模型(VLM)设计的高效服务框架,结合前端结构化编程语言与优化的后端推理引擎,能够实现复杂LLM工作负载的加速,本文以其v0.4.2.post1版本为例。

操作步骤

步骤一:准备环境

  1. 创建GPU实例并正确安装驱动。具体操作,请参见创建GPU实例。关键参数说明如下。

    • 实例规格:目前可选的实例规格为ecs.ebmgn8v.48xlarge(内存1024 GiB、GPU显存8*96 GB以及192 vCPU)。更多信息,请参见GPU计算型(gn/ebm/scc系列)

    • 镜像:选择公共镜像,本文以Alibaba Cloud Linux 3.2104 LTS 64位版本的镜像为例。

      GPU实例上部署DeepSeek-V3/R1模型,需要提前在该实例上安装GPU驱动且驱动版本应为550及以上版本,建议您通过ECS控制台购买GPU实例时,同步选中安装GPU驱动。实例创建完成后,会自动安装Tesla驱动、CUDA、cuDNN库等,相比手动安装方式更快捷。

      勾选安装 GPU 驱动后,系统显示将安装的版本为 CUDA 12.4.1 / Driver 550.127.08 / CUDNN 9.2.0.82。同时建议勾选免费安全加固

    • 系统盘:建议系统盘大小设置200 GiB以上。

    • 数据盘:由于模型体积较大,DeepSeek-R1模型和DeepSeek-V3模型的文件大小分别约为1.3 TiB。建议数据盘的大小预留为模型大小的1.5。因此,建议您单独购买用于存储下载模型的数据盘,推荐选择2 TiB以上的数据盘。

    • 公网IP:选中分配公网IPv4地址,带宽计费方式选择按使用流量,建议带宽峰值选择100 Mbps,以加快模型下载速度。

    • 安全组:开放22端口。

  2. 安装Docker。

    1. 远程连接GPU实例。

      具体操作,请参见使用Workbench登录Linux实例

    2. 执行以下命令,安装Docker环境。此处以Alibaba Cloud Linux 3系统为例,其他系统安装方式请参见安装并使用DockerDocker Compose

      #添加Docker软件包源
      sudo wget -O /etc/yum.repos.d/docker-ce.repo http://mirrors.cloud.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo
      sudo sed -i 's|https://mirrors.aliyun.com|http://mirrors.cloud.aliyuncs.com|g' /etc/yum.repos.d/docker-ce.repo
      #Alibaba Cloud Linux3专用的dnf源兼容插件
      sudo dnf -y install dnf-plugin-releasever-adapter --repo alinux3-plus
      #安装Docker社区版本,容器运行时containerd.io,以及Docker构建和Compose插件
      sudo dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
      #启动Docker
      sudo systemctl start docker
      #设置Docker守护进程在系统启动时自动启动
      sudo systemctl enable docker
    3. 启动Docker并设置开机自启。

      #启动Docker
      sudo systemctl start docker
      #设置Docker守护进程在系统启动时自动启动
      sudo systemctl enable docker
  3. 安装NVIDIA容器工具包。

    若安装失败,请参考解决方案

    Alibaba Cloud Linux/CentOS

    #配置生产存储库
    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
    #安装 NVIDIA Container Toolkit 软件包
    sudo yum install -y nvidia-container-toolkit
    #重启docker
    sudo systemctl restart docker

    Ubuntu/Debian

    #配置生产存储库
    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
    #从存储库更新软件包列表
    sudo apt-get update
    #安装 NVIDIA Container Toolkit 软件包
    sudo apt-get install -y nvidia-container-toolkit
    #重启docker
    sudo systemctl restart docker
  4. 执行以下命令,查看Docker是否已启动。

    sudo systemctl status docker

    如下回显所示,表示Docker已启动。

    $ sudo systemctl status docker
    ● docker.service - Docker Application Container Engine
         Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
         Active: active (running) since Tue 2024-07-09 16:37:54 CST; 2min 9s ago
    TriggeredBy: ● docker.socket
           Docs: https://docs.docker.com
       Main PID: 6987 (dockerd)
          Tasks: 20
         Memory: 31.9M
         CGroup: /system.slice/docker.service
                 └─6987 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
  5. 如果购买GPU实例时选择了添加数据盘,则您需要初始化数据盘,并将数据盘挂载到/mnt目录。

    1. 执行lsblk命令,查看数据盘的信息。

      [root@iZxxx ~]# lsblk
      NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
      vda    253:0    0   200G  0 disk
      ├─vda1 253:1    0     2M  0 part
      ├─vda2 253:2    0   200M  0 part /boot/efi
      └─vda3 253:3    0 199.8G  0 part /
      vdb    253:16   0     2T  0 disk
    2. 执行以下命令,创建并挂载文件系统至/mnt目录下。

      sudo mkfs.ext4 /dev/vdb
      sudo mount /dev/vdb /mnt
    3. 执行lsblk命令,查看数据盘已挂载至/mnt目录下。

      [root@iZu1xxxZ ~]# lsblk
      NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
      vda    253:0    0   200G  0 disk
      ├─vda1 253:1    0     2M  0 part
      ├─vda2 253:2    0   200M  0 part /boot/efi
      └─vda3 253:3    0 199.8G  0 part /
      vdb    253:16   0     2T  0 disk /mnt
  6. 如果购买GPU实例时未选择添加数据盘,您需要购买数据盘并完成挂载。

    由于模型体积较大,DeepSeek-R1模型和DeepSeek-V3模型的文件大小分别约为1.3 TiB。建议数据盘的大小预留为模型大小的1.5。因此,建议您单独购买用于存储下载模型的数据盘,推荐选择2 TiB以上的数据盘,并以/mnt作为挂载点。具体操作,请参见挂载数据盘

步骤二:部署和运行DeepSeek模型

  1. 执行以下命令,拉取推理镜像。

    sudo docker pull egslingjun-registry.cn-wulanchabu.cr.aliyuncs.com/egslingjun/inference-nv-pytorch:preview-25.02-vllm0.6.4.post1-sglang0.4.2.post1-pytorch2.5-cuda12.4-20250207
  2. 下载模型文件,您可以访问阿里云魔搭社区Modelscope选择模型,在模型详情页获取名称。

    # 定义要下载的模型名称。MODEL_NAME需要访问Modelscope选择模型,在模型详情页获取名称,脚本以DeepSeek-V3为例
    MODEL_NAME="DeepSeek-V3"
    # 设置本地存储路径。确保该路径有足够的空间来存放模型文件(建议预留模型大小的1.5倍空间),此处以/mnt/V3为例
    LOCAL_SAVE_PATH="/mnt/V3"
    # 如果/mnt/V3目录不存在,则创建它
    sudo mkdir -p ${LOCAL_SAVE_PATH}
    # 确保当前用户对该目录有写权限,根据实际情况调整权限
    sudo chmod ugo+rw ${LOCAL_SAVE_PATH}
    # 启动下载,下载完成后自动销毁
    sudo docker run -d -t --network=host --rm --name download \
    -v ${LOCAL_SAVE_PATH}:/data \
    egslingjun-registry.cn-wulanchabu.cr.aliyuncs.com/egslingjun/inference-nv-pytorch:preview-25.02-vllm0.6.4.post1-sglang0.4.2.post1-pytorch2.5-cuda12.4-20250207 \
    /bin/bash -c "git-lfs clone https://www.modelscope.cn/models/deepseek-ai/${MODEL_NAME}.git /data"
  3. 执行以下命令,实时监控下载进度,等待下载结束。

    sudo docker logs -f download

    下载模型耗时较长,请您耐心等待。当下载任务完成后,会停止输出新的日志,您可以随时按下Ctrl+C退出,这不会影响容器的运行,即使退出终端也不会中断下载。

  4. 启动模型推理服务。

    # 定义要下载的模型名称。MODEL_NAME需要访问Modelscope选择模型,在模型详情页获取名称,脚本以DeepSeek-V3为例
    MODEL_NAME="DeepSeek-V3"
    # 设置本地存储路径。确保该路径有足够的空间来存放模型文件,此处以/mnt/V3为例
    LOCAL_SAVE_PATH="/mnt/V3"
    # 定义服务运行时监听的端口号。可以根据实际需求进行调整,默认使用30000端口
    PORT="30000"
    # 定义使用的GPU数量。这取决于实例上可用的GPU数量,可以通过nvidia-smi -L命令查询
    # 这里假设使用8GPU
    TENSOR_PARALLEL_SIZE="8"
    # 确保当前用户对该目录有读写权限,根据实际情况调整权限
    sudo chmod ugo+rw ${LOCAL_SAVE_PATH}
    # 启动Docker容器并运行服务
    sudo docker run -d -t --network=host --gpus all \
        --privileged \
        --ipc=host \
        --cap-add=SYS_PTRACE \
        --name ${MODEL_NAME} \
        --ulimit memlock=-1 \
        --ulimit stack=67108864 \
        -v ${LOCAL_SAVE_PATH}:/data \
        egslingjun-registry.cn-wulanchabu.cr.aliyuncs.com/egslingjun/inference-nv-pytorch:preview-25.02-vllm0.6.4.post1-sglang0.4.2.post1-pytorch2.5-cuda12.4-20250207 \
        /bin/bash -c "python3 -m sglang.launch_server \
            --port ${PORT} \
            --model-path /data \
            --mem-fraction-static 0.8 \
            --tp ${TENSOR_PARALLEL_SIZE} \
            --trust-remote-code"
  5. 运行以下命令,检查服务是否正常启动。

    sudo docker logs ${MODEL_NAME}

    在日志输出中寻找类似以下的消息,表示服务已经成功启动并在端口30000上监听。

    INFO:     Uvicorn running on http://0.0.0.0:30000 (Press CTRL+C to quit)

步骤三:推理测试验证

执行以下命令,发送推理请求并验证模型的推理结果。

curl http://localhost:30000/generate \
 -H "Content-Type: application/json" \
 -d '{
  "text": "deepseek中有几个e?",
  "sampling_params": {
  "max_new_tokens": 3000,
  "temperature": 0
 }
}'
{"text":"请一步一步仔细思考后再回答。\n\ndeepseek\n\n好的,我现在要解决的问题是:在单词“deepseek”中有几个字母e?让我仔细思考一下,确保自己正确回答这个问题。\n\n首先,我需要明确题目要求。题目问的是在“deepseek”这个单词中,字母e出现了多少次。我的任务就是数清楚这个单词中每个字母,并统计e的数量。\n\n接下来,我需要正确拼写这个单词,确保自己没有看错或者拼错。单词是“deepseek”,由d、e、e、p、s、e、e、k这几个字母组成?让我再确认一下。可能有时候容易拼错,所以我要仔细检查每个字母的位置。\n\n让我把单词分解成单个字母,逐个检查:\n\nd - 第一个字母是d,不是e。\ne - 第二个字母是e,计数加1。\ne - 第三个字母还是e,计数加2。\np - 第四个字母是p,不是e。\ns - 第五个字母是s,不是e。\ne - 第六个字母是e,计数加3。\ne - 第七个字母是e,计数加4。\nk - 第八个字母是k,不是e。\n\n所以,分解后的字母顺序是:d, e, e, p, s, e, e, k。总共有8个字母。其中,e出现在第2、3、6、7位,共4次。\n\n不过,我是不是哪里数错了?让我再数一遍,确保正确。有时候重复数或者漏数会导致错误。\n\n再次分解:\n\n1. d → 不是e\n2. e → 1\n3. e → 2\n4. p → 不是\n5. s → 不是\n6. e → 3\n7. e → 4\n8. k → 不是\n\n是的,确实是4个e。不过,可能有人会认为单词拼写是否有误,比如是否中间有其他字母,但根据题目给出的单词是“deepseek”,所以应该没错。\n\n另外,有没有可能大小写的问题?比如,题目中的单词是否全小写,或者有大写字母?但题目里写的是“deepseek”,看起来都是小写,所以不影响统计。\n\n总结一下,经过两次仔细检查,确认在“deepseek”中有4个字母e。\n</think>\n\n在单词“deepseek”中,字母 **e** 出现了 **4次**。具体分布如下:\n\n1. **d**(第1位)→非e \n2. **e**(第2位)→第1个e \n3. **e**..."}