Docker+vLLM内网离线部署Qwen3教程

发布于:2025-07-04 ⋅ 阅读:(16) ⋅ 点赞:(0)

一、Docker部署

vllm的优势

1. 环境隔离:Docker通过容器隔离技术为VLLM提供独立的运行环境,避免系统库版本冲突和依赖错误问题。

2. 便捷的跨平台迁移:使用Docker部署的VLLM容器可以轻松迁移到不同的服务器、数据中心或云平台上,大大降低了环境搭建和维护的成本。

3. 轻松扩展:借助容器化,VLLM可以轻松进行水平扩展,通过在多节点上运行多个容器实例实现高并发的推理服务。

4. 统一管理:容器化部署后,可以使用Docker Compose、Kubernetes等容器编排工具进行自动化管理,包括负载均衡、故障转移等操作,极大地简化了多实例部署的管理难度。

二、环境准备

    01.Nvidia显卡驱动、CUDA、nvidia-container安装

    参考文章:显卡驱动、CUDA、NVIDIA Container Toolkit内网安装教程

    02.Docker环境安装

    参考文章:Docker 和 Docker Compose 内网离线安装教程

    注意:在进行VLLM容器化部署之前,需要确保已在服务器上安装了Docker 和

    Nvidia显卡驱动、CUDA、nvidia-container。

    三、vllm内网离线部署Qwen3-32B

    系统环境:

    • 操作系统:Ubuntu22.04

    • Docker:28.0.4

    • Docker-Compose:v2.34.0

    • 显卡驱动:550.144.03

    • CUDA:12.4

    • 显卡:NVIDIA RTX A5000 * 4

    01.拉取vllm/vllm-openai镜像

    vllm官方地址:https://github.com/vllm-project/vllm.git

    在能联网的机器上拉取vllm/vllm-openai镜像,然后导出镜像,再导入到内网的服务器上,我导入的目录是 /data (根据个人习惯导入对应的目录即可),对应的操作命令如下:

    # 1. docker拉取vllm/vllm-openai镜像, 20G 需要等一会。docker pull vllm/vllm-openai# 2. 从联网的机器上导出镜像docker save -o vllm-openai-image.tar vllm/vllm-openai:latest# 3. 将压缩包vllm-openai-image.tar 上传到 /data 目录cd /data# 4. docker加载上传的本地镜像包docker load < vllm-openai-image.tar# 5. 查看docker 镜像docker images

    到这一步vllm/vllm-openai镜像就安装成功了。

    02.下载Qwen/Qwen3-32B模型文件

    常用模型下载地址:

    Hugging Face Hub:全球最大的开源模型和数据集托管平台,提供大量 GGUF 格式等多种类型的大模型下载。网址为https://huggingface.co/,国内镜像为https://hf-mirror.com/,访问镜像网站速度更快。

    ModelScope 魔搭社区:由阿里云开源的大模型社区,支持 GGUF 格式模型的下载和在线推理。网址是https://www.modelscope.cn/models,可通过 SDK 或 git 进行下载。

    GitCode:全新上线了国产模型专区,是国产大模型的汇聚地,为开发者提供便捷获取各类优质模型的途径,网址为https://gitcode.net/。

    我是在魔塔社区下载的模型源文件:

    下载命令:魔塔社区提供多种下载方式,我是用git下载的:

    #Git下载#请确保 lfs 已经被正确安装git lfs installgit clone https://www.modelscope.cn/Qwen/Qwen3-32B.git

    先在联网的电脑上把模型下载到本地,然后复制模型文件到内网的服务器的/data/目录中,如下:

    03.vllm内网部署Qwen/Qwen3-32B

    直接运行下面命令即可将Qwen/Qwen3-32B模型运行起来,注意模型文件的路径需要换成自己的,模型的参数根据自己的显卡情况进行调参。

    docker run -d --privileged --gpus all --restart unless-stopped --network host -v /data/Qwen3-32B:/app/model --shm-size 32G --name vllm-qwen3 vllm/vllm-openai:latest --model /app/model --served-model-name qwen3:32b --dtype half --kv-cache-dtype=fp8_e4m3 --calculate-kv-scales --port 8008 --tensor-parallel-size 4 --trust-remote-code --max-model-len 32000 --max-num-batched-tokens 64000 --max-num-seqs 4 --gpu-memory-utilization 0.95 --api-key OPENWEBUl123 --reasoning-parser deepseek_r1

    格式化后的脚本:​​​​​​​

    docker run -d --privileged --gpus all \--restart unless-stopped --network host \-v /data/DeepSeek-R1-Distill-Qwen-32B:/app/model \--shm-size 32G \--name vllm-deepseek vllm/vllm-openai:latest \--model /app/model \--served-model-name vllm-qwen3 \--dtype half \--kv-cache-dtype=fp8_e4m3 \--calculate-kv-scales \--port 8006 \--tensor-parallel-size 4 \--trust-remote-code \--max-model-len 16000 \--max-num-batched-tokens 32000 \--max-num-seqs 8 \--gpu-memory-utilization 0.85 \--api-key OPENWEBUl123 \--enable-reasoning \--reasoning-parser deepseek_r1

    运行成功后,查看容器日志(我这里用的是8008端口,APIKey用的是OPENWEBUl123,需要换成自己的:

    docker logs -f vllm-qwen3

    看见下面日志,则模型启动成功。

    docker run 命令中关于 vLLM 部署的各个参数:

    容器运行参数:

    1.-d:让容器在后台运行,也就是以守护进程模式启动。

    2.--privileged:赋予容器近乎宿主机的 root 权限,这样容器才能访问特殊设备,比如 GPU。

    3.--gpus all:使容器能够使用宿主机上的所有 GPU 资源。

    4.--restart unless-stopped:设定容器的重启策略,除非手动停止,否则容器会在各种情况下自动重启。

    5.--network host:容器会直接使用宿主机的网络栈,这样容器内的服务可以通过宿主机的 IP 地址直接访问。

    6.-v /data/Qwen3-32B:/app/model:将宿主机的/data/Qwen3-32B目录挂载到容器内的/app/model目录,方便容器读取模型文件。

    7.--shm-size 32G:把容器的共享内存大小增加到 32GB,这对多进程间的高效通信很有帮助。

    8.--name vllm-qwen3:给运行的容器命名为vllm-qwen3,便于后续的管理和操作。

    vLLM 服务参数:

    9.--model /app/model:指定容器内模型文件所在的路径,也就是之前挂载的目录。

    10.--served-model-name qwen3:32b:设置对外提供服务时模型的名称。

    11.--dtype half:将模型参数的数据类型设置为半精度浮点数(FP16),以此来减少内存占用。

    12.--kv-cache-dtype=fp8_e4m3:使用 E4M3 格式的 FP8 数据类型来存储键值缓存,进一步优化内存使用。

    13.--calculate-kv-scales:开启对键值缓存动态缩放因子的计算,有助于提升量化的精度。

    14.--port 8008:设置服务监听的端口为 8008。

    15.--tensor-parallel-size 4:将模型在 4 个 GPU 上进行张量并行处理,加快推理的速度。

    16.--trust-remote-code:允许执行模型附带的自定义代码,使用时需要注意安全问题。

    17.--max-model-len 32000:把模型支持的最大输入长度限制为16000 个 token。

    18.--max-num-batched-tokens 64000:设置批处理时允许的最大 token 数量为 32000,这影响着吞吐量。

    19.--max-num-seqs 8:限制同时处理的最大序列数为 8。

    20.--gpu-memory-utilization 0.95:将 GPU 内存的使用率上限设置为 95%,防止出现内存溢出的情况。

    21.--api-key OPENWEBUl123:设置 API 访问的密钥为OPENWEBUl123,用于身份验证。

    22.--enable-reasoning:开启推理功能,这可能涉及到多轮对话或者复杂问题的解决。

    23.--reasoning-parser deepseek_r1:指定使用 DeepSeek-R1 模型的推理解析器,用于处理特定格式的推理任务。

    其他vllm参数:

    1. 推理性能优化​​​​​​​
    # 启用 PagedAttention 优化内存碎片--swap-space 20  # 每个 GPU 分配 20GB 磁盘交换空间--gpu-memory-utilization 0.9  # 提高 GPU 内存使用率上限# 批处理优化--max-num-batched-tokens 64000  # 增大批处理 token 数量--max-num-seqs 16  # 增加并发处理的序列数--continuous-batching  # 启用连续批处理,动态调整批大小# 量化优化--quantization awq  # 使用 AWQ 量化进一步压缩模型--quantization int8  # 使用 INT8 量化替代 FP16
    2. 模型加载与初始化​​​​​​​
    # 模型加载优化--model-cache /cache/models  # 指定模型缓存路径,加速重启--download-dir /data/models  # 指定模型下载目录# 权重加载方式--load-format pt  # 直接加载 PyTorch 权重--load-format safetensors  # 加载 safetensors 格式权重(更快)
    3. 网络与 API 配置​​​​​​​
    # API 服务配置--host 0.0.0.0  # 监听所有网络接口--workers 2  # 启动多个工作进程(需配合 --no-huggingface-available)--timeout 300  # 设置请求超时时间(秒)# 安全增强--cors-allow-origins "*"  # 允许跨域请求--api-version 2  # 使用 OpenAI API v2 兼容模式
    4. 日志与监控​​​​​​​
    # 日志配置--log-level info  # 日志级别:debug, info, warning, error--log-file /var/log/vllm.log  # 日志输出文件# 性能监控--trace  # 启用性能追踪--trace-output /data/trace.json  # 输出追踪结果
    5. 特定模型优化​​​​​​​
    # DeepSeek 模型专用优化--disable-logits-warper  # 禁用 logits 调整(部分模型需要)--rope-scaling linear  # 启用 RoPE 缩放以支持更长上下文--rope-factor 2.0  # 设置 RoPE 缩放因子# 大模型优化--pipeline-parallel-size 2  # 结合张量并行与流水线并行
    API调用示例:

    vLLM 提供实现了 OpenAI  Completions API, Chat API 等接口的 HTTP 调用服务,调用服务时,可使用官方 OpenAI Python 客户端或任意 HTTP 客户端:​​​​​​​

    from openai import OpenAIclient = OpenAI(    base_url="http://ip:8008/v1",    api_key="OPENWEBUl123",)completion = client.chat.completions.create(  model="qwen3:32b",  messages=[    {"role": "user", "content": "你是谁?"}  ])print(completion.choices[0].message)

    提示:

    vLLM支持部分OpenAI未包含的参数(如top_k),可通过在请求的extra_body参数中传递,例如:extra_body={"top_k": 50}

    重要信息:

    默认情况下,服务器会加载 Hugging Face 模型仓库中的generation_config.json文件(若存在)。这意味着某些采样参数的默认值可能被模型创建者推荐的配置覆盖。如需禁用此行为,请在启动服务时添加--generation-config vllm参数。


    网站公告

    今日签到

    点亮在社区的每一天
    去签到