docker + vllm 从零开始快速上手, 以部署DeepSeek-R1-Distill-Qwen-7B为例

在开始之前,请确认已准备好以下环境

  • Linux操作系统

  • Nvidia 显卡, 在shell中执行nvidia-smi以确认驱动正确安装, 并且cuda的版本 >= 12.4
    在这里插入图片描述

  • docker 以及 nvidia-docker (点击此处查看安装教程)

注意:本文不包含任何vllm原理解析,请放心阅读 😎

vllm

目前关于DeepSeek-R1部署的教程大多数都是使用ollama进行部署,其方便程度确实是不可否认的,但是对于专业用户如后端开发、运维来说,我们希望获得更高的并发,更高的吞吐,那vllm就是最合适的选择了,特别是v0.7之后vllm迎来了重大的更新, 获得了更高的吞吐速度。

当然sglang也是个不错的选择

首先,拉取vllm的镜像,在shell中执行如下命令

sudo docker pull vllm/vllm-openai:v0.7.1

该镜像在模型部署之后,可直接间使用openai的sdk进行对接,特别方便

镜像拉取完成之后,我们进入模型下载的操作

下载 DeepSeek-R1-Distill-Qwen-7B

从HF上下载模型DeepSeek-R1-Distill-Qwen-7B , 下载地址 点击下载

如果速度较慢可以配置加速地址,操作方法如下

export HF_ENDPOINT=https://hf-mirror.com

之后直接clone repo

git lfs install
git clone https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B

也可直接从MdoelScope 上下载,点击前往

部署 DeepSeek-R1-Distill-Qwen-7B

由于财力限制,本文选择以 DeepSeek-R1-Distill-Qwen-7B 为例来说明如何使用vllm部署R1系统的蒸馏模型,如果参数量大于7B则调整对应的显卡数量以及-tp参数即可。

为了方便运维,本文使用docker compose 进行部署,部署的yaml文件如下:

  vllm:
    container_name: vllm
    restart: no
    image: vllm/vllm-openai:v0.7.1
    ipc: host
    volumes:
      - ./models:/models
    command: ["--model", "/models/DeepSeek-R1-Distill-Qwen-7B", "--served-model-name", "r1", "--max-model-len", "8912", "--max-num-seqs", "32", "--gpu-memory-utilization", "0.90"]
    ports:
      - 8000:8000
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

接下来本文将分块对该部署文件的内容进行说明


1. 服务名称与容器名

vllm:
  container_name: vllm
  • vllm: 定义了一个名为 vllm 的服务。
  • container_name: vllm: 指定了运行时容器的名字为 vllm,方便通过该名字管理容器。

举例:查看日志时执行sudo docker logs -f vllm 即可


2. 自动重启策略

restart: no
  • restart: no: 表示容器不会在崩溃或主机重启后自动重启。

如果是生产环境建议为: always, 以确保在爆显存的时候自动重启容器以便恢复服务


3. 镜像信息

image: vllm/vllm-openai:v0.7.1
  • image: vllm/vllm-openai:v0.7.1: 使用了来自 Docker Hub 的镜像 vllm/vllm-openai,版本为 v0.7.1
    • vllm 是一个高性能的大语言模型推理引擎,支持 OpenAI 兼容接口。
    • 版本号 v0.7.1 确保使用的是特定版本的镜像,避免因镜像更新导致的行为变化。

4. IPC 命名空间共享

ipc: host
  • ipc: host: 容器将与主机共享 IPC(进程间通信)命名空间。
    • 这通常用于需要高性能通信的场景,例如 GPU 加速任务。
    • 注意:此配置可能会影响隔离性,需谨慎使用。

5. 卷挂载

volumes:
  - ./models:/models
  • volumes: 定义了卷挂载,将主机目录 ./models 挂载到容器内的 /models 路径。
    • 用途: 容器可以访问主机上的模型文件夹,确保模型数据可以在主机和容器之间共享。
    • 注意: 确保 ./models 目录存在,并包含所需的模型文件, 将下载好的 DeepSeek-R1-Distill-Qwen-7B模型保存到此目录中

6. 启动命令

command: ["--model", "/models/DeepSeek-R1-Distill-Qwen-7B", "--served-model-name", "r1", "--max-model-len", "8912", "--max-num-seqs", "32", "--gpu-memory-utilization", "0.90"]
  • command: 定义了容器启动时执行的命令及其参数。
    • --model /models/DeepSeek-R1-Distill-Qwen-7B: 指定加载的模型路径为 /models/DeepSeek-R1-Distill-Qwen-7B
    • --served-model-name r1: 设置服务端暴露的模型名称为 r1,客户端可以通过该名称调用模型。
    • --max-model-len 8912: 设置模型最大输入长度为 8912 个 token。
    • --max-num-seqs 32: 设置最大并发序列数为 32。
    • --gpu-memory-utilization 0.90: 设置 GPU 内存利用率为目标值的 90%。

请根据实际情况对 max-model-len 以及 max-num-seqs 、gpu-memory-utilization 这三个参数进行调整,上下文越长占用的显存越多同时需要对max-num-seqs进行下调,否则会爆显存


7. 端口映射

ports:
  - 8000:8000
  • ports: 定义了端口映射规则。
    • 8000:8000: 将容器的 8000 端口映射到主机的 8000 端口。
    • 用途: 允许外部通过主机的 8000 端口访问容器中的服务。

8. GPU 资源分配

deploy:
  resources:
    reservations:
      devices:
        - driver: nvidia
          count: all
          capabilities: [gpu]
  • deploy: 定义了部署资源限制。

    • resources.reservations.devices: 指定需要的设备资源。
      • driver: nvidia: 使用 NVIDIA GPU 驱动。
      • count: all: 分配所有可用的 GPU。(也可以为[0]因为本机只有一张显卡, 如果需要指定GPU,则填入对应的序号即可如[3,4] 则指定使用3,4号显卡)
      • capabilities: [gpu]: 请求 GPU 计算能力。
  • 用途: 将主机上的GPU资源全部映射到容器中,以便vllm容器可以使用宿主机上的GPU资源

R1, 启动!

在docker-compose.yaml 文件所在目录中执行以下命令

sudo docker compose up -d

执行, 查看vllm日志, 发现vllm已启动完成并且在8000端口监听

sudo docker logs -f vllm

在这里插入图片描述
使用OpenAI SDK 调用

from openai import OpenAI

vllm_client = OpenAI(
    # 由于我们启动vllm时未配置key, 因此此处可随意填写
    api_key="NOT_NEED",
    # 改成实际部署的IP
    base_url="http://127.0.0.1:8000/v1",
)

response = vllm_client.chat.completions.create(
    # 对应served_model_name
    model='r1',
    messages=[
        {'role': 'user', 'content': '你好'}
    ]
)

print(response.choices[0].message.content)

关注我,将持续分享AGI生产级别的实践

<think>嗯,用户想用Docker安装VLLMQwen-VL的环境。首先,我需要回忆一下相关的步骤和可能遇到的问题。根据引用内容,用户之前可能遇到了路径问题,导致构建镜像失败,所以路径对齐是关键。 首先,用户需要准备Dockerfile,确保Dockerfile所在的目录和模型路径一致,或者正确指定上下文。在示中,用户把Dockerfile放在模型同级目录下解决了问题。所以,我应该建议用户先创建一个专门的项目目录,把Dockerfile和模型都放在里面,或者在构建时指定正确的路径。 接下来,Dockerfile的内容应该基于vLLM官方镜像,可能还需要安装一些依赖,比如git-lfs来下载模型。引用中提到使用镜像站替换HuggingFace的URL,比如用hf-mirror.com,这样可以加速下载。所以Dockerfile里可能需要添加安装git-lfs的步骤,并在克隆模型时使用镜像站的地址。 然后是构建镜像的命令,用户需要运行docker build时指定正确的上下文路径,也就是当前目录,这样Docker才能访问到模型文件。如果模型太大,可能需要调整.dockerignore文件,排除不必要的文件,减少构建上下文的大小,避免构建过程过慢或失败。 接下来是运行容器,可能需要映射端口,比如8000用于API访问,以及挂载模型目录。用户需要注意模型路径是否正确,尤其是在容器内部和宿主机之间的路径映射。 另外,用户可能需要测试服务是否正常运行,比如发送curl请求或者使用Python客户端调用API。这部分需要给出示命令,确保用户能够验证安装是否成功。 最后,常见问题部分要提醒用户注意路径问题、镜像站的使用以及构建上下文的大小。这些都是用户之前遇到的痛点,需要重点强调。 总结一下,步骤应该是:准备目录和模型、编写Dockerfile、构建镜像、运行容器、测试服务。过程中需要确保路径正确,使用镜像站加速下载,并处理可能的大文件问题。同时,引用中的解决方法要整合到回答里,帮助用户避免之前的错误。</think>### 分步说明:使用Docker安装vLLMQwen-VL环境 #### 步骤1:准备项目目录结构 ```bash mkdir vllm_qwen_project cd vllm_qwen_project # 创建以下目录结构 # ├── Dockerfile # ├── models/ # │ └── Qwen2.5-VL-7B-Instruct/ # 通过git-lfs下载的模型文件 ``` #### 步骤2:编写Dockerfile(注意路径对齐) ```dockerfile FROM nvidia/cuda:12.1.0-devel-ubuntu22.04 # 安装基础依赖 RUN apt-get update && apt-get install -y \ python3-pip \ git \ git-lfs \ && rm -rf /var/lib/apt/lists/* # 使用镜像站加速安装 RUN pip3 install vllm==0.4.1 -i https://pypi.tuna.tsinghua.edu.cn/simple # 克隆模型(使用镜像站) WORKDIR /app RUN git clone https://hf-mirror.com/Qwen/Qwen2.5-VL-7B-Instruct models/Qwen2.5-VL-7B-Instruct RUN cd models/Qwen2.5-VL-7B-Instruct && git lfs pull # 暴露API端口 EXPOSE 8000 # 启动命令 CMD ["python3", "-m", "vllm.entrypoints.openai.api_server", \ "--model", "/app/models/Qwen2.5-VL-7B-Instruct", \ "--served-model-name", "qwen-vl"] ``` #### 步骤3:构建Docker镜像 ```bash # 确保在项目根目录执行(包含Dockerfile和models目录) docker build -t vllm_qwen:1.0 . ``` 注意:构建时间可能较长,建议使用国内镜像站加速[^2] #### 步骤4:运行容器 ```bash docker run -d --gpus all \ -p 8000:8000 \ -v $(pwd)/models:/app/models \ --name vllm_qwen_container \ vllm_qwen:1.0 ``` #### 步骤5:验证服务 ```python # 测试Python客户端 from vllm import LLM llm = LLM(model="qwen-vl") output = llm.generate("解释量子纠缠现象") print(output) ``` ### 关键配置说明 1. **路径对齐原则**:Dockerfile中`/app/models`路径需与挂载的宿主机路径一致[^1] 2. **GPU支持**:必须添加`--gpus all`参数启用GPU加速 3. **模型加载**:若使用本地已有模型,可直接挂载目录: ```bash -v /host/path/Qwen2.5-VL-7B-Instruct:/app/models/Qwen2.5-VL-7B-Instruct ``` ### 常见问题处理 1. **路径不存在错误**:确保`docker build`执行时当前目录包含Dockerfile和模型目录[^1] 2. **大文件下载失败**:在Dockerfile中添加`RUN git lfs install`初始化LFS 3. **构建上下文过大**:添加`.dockerignore`文件排除非必要文件 ``` **/*.bin **/*.zip **/dataset/ ``` ### 性能优化建议 $$ \text{推理速度} = \frac{\text{GPU显存带宽}}{\text{模型参数量} \times \text{数据类型大小}} $$ 可通过量化技术降低数据类型大小提升速度,如使用FP16代替FP32: ```python llm = LLM(model="qwen-vl", dtype="float16") ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值