一、多模态大模型下载

1. hf-mirror方法

  • hf-mirror.com用于镜像 huggingface.co 域名,致力于帮助国内AI开发者快速、稳定的下载模型、数据集
  • huggingface-cli 是 Hugging Face 官方提供的命令行工具

1.1 环境配置

# 安装依赖
pip install -U huggingface_hub
# Linux 设置环境变量,也可以写入 ~/.bashrc
export HF_ENDPOINT=https://hf-mirror.com
# Windows Powershell 设置环境变量
$env:HF_ENDPOINT = "https://hf-mirror.com"
# 确保 HF_HUB_OFFLINE 环境变量正确设置
# 允许网络请求以从 Hugging Face Hub 下载资源,请确保 HF_HUB_OFFLINE 环境变量未被设置为 1 或者任何非零值
unset HF_HUB_OFFLINE  # 清除环境变量
export HF_HUB_OFFLINE=0  # 显式设置为0,表示允许在线访问

1.2 模型下载

# 下载QQwen2.5-VL-72B-Instruct-AWQ模型
huggingface-cli download --resume-download Qwen/Qwen2.5-VL-72B-Instruct-AWQ --local-dir Qwen2.5-VL-72B-Instruct-AWQ

1.3 数据下载

# 下载wikitext数据集
huggingface-cli download --repo-type dataset --resume-download wikitext --local-dir wikitext

2. ModelScope方法

2.1 环境配置

# 安装依赖
pip install modelscope -i https://mirrors.aliyun.com/pypi/simple/

2.2 模型下载

2.2.1通过命令行下载
  • 在高带宽的机器上运行,推荐使用ModelScope命令行工具下载模型。该方法支持断点续传和模型高速下载
# 将Qwen2.5-VL-72B-Instruct-AWQ模型,下载到当前路径下的"model-dir"目录
modelscope download --model="Qwen/Qwen2.5-VL-72B-Instruct-AWQ" --local_dir ./model-dir
2.2.2通过SDK下载
  • 使用ModelScope Python SDK下载模型,该方法支持断点续传和模型高速下载
from modelscope import snapshot_download
# # 默认下载路径C:\Users\asialee\.cache\modelscope\hub\Qwen\Qwen-1_8B-Chat
model_dir = snapshot_download("Qwen/Qwen2.5-VL-72B-Instruct-AWQ")
# 从 ModelScope 下载模型至本地目录
model_dir = snapshot_download('qwen/Qwen/Qwen2.5-VL-72B-Instruct-AWQ', cache_dir='./weights')
2.2.3通过Git下载
  • 由于模型都是通过Git存储,所以也可以在安装Git LFS后,通过git clone的方式在本地下载模型
# 安装git-lfs便于下载大语言模型
apt-get install git-lfs
# 下载模型权重
git lfs install
git clone https://www.modelscope.cn/Qwen/Qwen2.5-VL-72B-Instruct-AWQ.git

二、VLLM部署多模态模型

1.准备工作

1.1获取vLLM镜像

# 拉取阿里云vLLM镜像(vLLM:0.8.2 Python:3.10 PyTorch:2.6.0 CUDA:12.4.1 基础镜像:Ubuntu 22.04)
docker pull egs-registry.cn-hangzhou.cr.aliyuncs.com/egs/vllm:0.8.2-pytorch2.6-cu124-20250328

1.2模型权重下载

# 下载modelscope格式的Qwen2.5-VL-7B-Instruct模型
git lfs clone https://www.modelscope.cn/Qwen/Qwen2.5-VL-7B-Instruct.git

# 下载modelscope格式的Qwen2.5-VL-72B-Instruct-AWQ模型
git lfs clone https://www.modelscope.cn/Qwen/Qwen2.5-VL-72B-Instruct-AWQ.git

2.使用 vLLM 部署和推理

2.1运行vLLM容器

docker run -d -t \                # 后台运行容器并分配一个伪终端
    --net=host \                  # 使用主机网络模式
    --gpus all \                  # 启用所有 GPU
    --privileged \                # 赋予容器特权模式(访问主机设备)
    --ipc=host \                  # 使用主机的 IPC 命名空间(共享内存)
    --name vllm \                 # 为容器指定名称
    -v /root:/root \              # 挂载主机的 /root 目录到容器的 /root 目录
    <vLLM镜像地址>                 # 替换为实际的 vLLM 镜像地址
docker run --gpus all --ipc=host --privileged --network=host -v /home:/home -v /longhorn_data:/longhorn_data --name vllm_qwen2.5_vl -it egs-registry.cn-hangzhou.cr.aliyuncs.com/egs/vllm:0.8.2-pytorch2.6-cu124-20250328 bash
  • 进入容器安装依赖
# 镜像已经安装了transformers和accelerate,此处无需再安装
pip install git+https://github.com/huggingface/transformers@f3f6c86582611976e72be054675e2bf0abb5f775
pip install accelerate

# 需要安装qwen-vl-utils
pip install qwen-vl-utils -i https://mirrors.aliyun.com/pypi/simple/
pip install qwen-vl-utils[decord] -i https://mirrors.aliyun.com/pypi/simple/

2.2启动OpenAI API服务

  • 启动vLLM的 OpenAI API 服务器,通过vLLM把本地大模型部署成 OpenAI API 服务
  • API 服务器会监听默认端口为8000,可通过 --port 参数设置服务端口;同时,可通过--host 参数设置服务地址
  • vLLM尝试使用 bfloat16 数据类型,但GPU(Tesla T4)不支持 bfloat16,主要支持 FP16、INT8、INT4 精度的矩阵运算
2.2.1部署Qwen2.5-VL-7B-Instruct
  • 常用部署参数说明
vllm serve Qwen/Qwen2.5-VL-7B-Instruct \  # 启动 vLLM 的 OpenAI API 服务器
--port 8000 \
--host 0.0.0.0 \    # 开放外部访问
--dtype float16 \   # 使用半精度推理(显存节省40-50%)
--limit-mm-per-prompt image=5,video=5  # 多模态资源限制,单prompt最多处理5张图片,单prompt最多处理5段视频

# 部署Qwen2.5-VL-7B-Instruct
vllm serve Qwen/Qwen2.5-VL-7B-Instruct \
--host 0.0.0.0 \
--port 8000 \
--tensor-parallel-size 2 \          # 启用2卡张量并行
--dtype auto \                      # 自动选择最优数据类型
--gpu-memory-utilization 0.85 \     # 显存利用率阈值,建议0.8~0.9(预留10%给预处理)
--limit-mm-per-prompt image=5,video=5 \
--max-num-batched-tokens 4096 \     # 批处理token上限,建议4096~8192,防止多模态特征爆炸
--max-model-len 4096 \              # 限制上下文长度
--max-num-seqs 16 \                 # 最大并发请求数
--enforce-eager \                   # 禁用CUDA图优化(提升多模态兼容性)
--trust-remote-code \               # 允许加载自定义代码
  • 双卡部署(2块 A10 24GB)
# 双卡部署(2*A10 24GB)
vllm serve Qwen/Qwen2.5-VL-7B-Instruct \
--tensor-parallel-size 2 \
--gpu-memory-utilization 0.9 \
--dtype bfloat16 \                # A10支持BF16
--limit-mm-per-prompt image=8,video=4 \
--max-num-batched-tokens 8192
  • 四卡部署(4块T4 16GB)
# 四卡部署(4*T4 16GB)
vllm serve Qwen/Qwen2.5-VL-7B-Instruct \
--tensor-parallel-size 4 \
--quantization awq \              # 启用4bit量化
--gpu-memory-utilization 0.85 \
--dtype float16 \
--limit-mm-per-prompt image=3,video=2
# 部署指令
CUDA_VISIBLE_DEVICES=0,1,2,3 vllm serve Qwen/Qwen2.5-VL-7B-Instruct --port 8000 --host 0.0.0.0 --dtype float16 --limit-mm-per-prompt image=3,video=2 --tensor-parallel-size 4 --gpu-memory-utilization 0.85  --max-num-seqs 16 --enforce-eager --trust-remote-code  --max-model-len 4096
2.2.2部署Qwen2.5-VL-72B-Instruct-AWQ
  • AWQ 量化将模型显存需求降低至约 1/4(72B FP16 需 144GB → AWQ 后约 36GB)
  • PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True允许动态扩展 CUDA 显存段,避免碎片化问题
# 部署Qwen2.5-VL-72B-Instruct-AWQ --quantization 量化方法(需模型支持)awq/gptq
PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True \  # 动态扩展显存段
vllm serve Qwen/Qwen2.5-VL-72B-Instruct-AWQ \
  --tensor-parallel-size 4 \          # 4卡张量并行(根据显存调整)
  --gpu-memory-utilization 0.85 \     # 显存利用率建议0.8-0.9
  --quantization awq \                # 启用AWQ量化(降低显存占用)
  --dtype float16 \                   # 半精度推理(需硬件支持)
  --max-model-len 8192 \              # 最大上下文长度(根据需求调整)
  --enforce-eager \                   # 禁用CUDA图优化(提升兼容性)可能牺牲部分性能
  --trust-remote-code \               # 允许加载自定义模型代码
  --host 0.0.0.0 \                    # 开放外部访问
  --port 8678 \                       # 服务端口
  --api-key xxx                       # 自定义API密钥(如 sk-123456789)
  • 4卡 A100 40GB
PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True \  # 动态扩展显存段
vllm serve Qwen/Qwen2.5-VL-72B-Instruct-AWQ \
--tensor-parallel-size 4 \
--gpu-memory-utilization 0.9 \
--max-model-len 16384 \    # 支持更长上下文
--limit-mm-per-prompt image=10,video=5  # 多模态输入限制:cite[5]
  • 8卡 T4 GPU(16GB显存)部署Qwen2.5-VL-72B-Instruct-AWQ 的优化配置方案
PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True \  # 动态显存管理
vllm serve Qwen/Qwen2.5-VL-72B-Instruct-AWQ \
  --tensor-parallel-size 8 \          # 8卡张量并行(关键参数)
  --quantization awq \                # 必须启用AWQ量化
  --gpu-memory-utilization 0.75 \     # 显存利用率严格限制
  --dtype float16 \                   # T4支持的最佳精度
  --max-model-len 4096 \              # 限制上下文长度
  --kv-cache-dtype fp8 \              # FP8键值缓存(显存减半)
  --enforce-eager \                   # 禁用CUDA图(规避T4兼容性问题)
  --trust-remote-code \               # 允许加载自定义模型
  --host 0.0.0.0 \                    # 开放访问
  --port 8678
# 部署指令
vllm serve Qwen/Qwen2.5-VL-72B-Instruct-AWQ --port 8000 --host 0.0.0.0 --dtype float16 --limit-mm-per-prompt image=3,video=2 --quantization awq --tensor-parallel-size 8 --gpu-memory-utilization 0.85  --max-num-seqs 16 --enforce-eager --trust-remote-code  --max-model-len 8192
  • 参数说明
  • –kv-cache-dtype fp8 将KV缓存从FP16转为FP8,显存需求降低50%(关键优化点)
  • –gpu-memory-utilization 0.75 T4显存带宽较低(320GB/s),需预留更多空间给数据传输
2.2.3CURL 命令验证服务
  • API 服务部署成功之后,可以通过 CURL 命令验证服务
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
    "model": "Qwen/Qwen2.5-VL-72B-Instruct-AWQ",
    "messages": [
    {"role": "system", "content": "你是个友善的AI助手。"},
    {"role": "user", "content": [{"type": "text", "text": "请介绍下多模态大模型"}]}
    ]}'
2.2.4通过 Python 客户端调用API 访问服务
from openai import OpenAI
# Set OpenAI's API key and API base to use vLLM's API server.
openai_api_key = "EMPTY"
openai_api_base = "http://localhost:8000/v1"
client = OpenAI(
    api_key=openai_api_key,
    base_url=openai_api_base,
)
chat_response = client.chat.completions.create(
    model="Qwen/Qwen2.5-VL-72B-Instruct-AWQ",
    messages=[
        {"role": "system", "content": "你是个友善的AI助手。"},
        {"role": "user", "content": [{"type": "text", "text": "请介绍下多模态大模型"}]},
    ],
    temperature=0.7,
    top_p=0.8,
    max_tokens=512,
    extra_body={
        "repetition_penalty": 1.05,
    },
)
print("Chat response:", chat_response)

3.使用预构建的docker镜像部署

3.1 运行docker容器

# Qwen2.5-VL-7B部署
docker run --gpus all --ipc=host --privileged --network=host -v /home:/home --name qwen2.5_vl -it qwenllm/qwenvl:2.5-cu121 bash

三、性能监控与常见问题解决

1.实时监控命令

# 显存监控
watch -n 1 "nvidia-smi --query-gpu=memory.used,memory.total --format=csv"
# 请求吞吐量监控
curl http://localhost:8000/metrics | grep "vllm:requests_processed_total"
# 实时监控脚本(保存到monitor.sh)
#!/bin/bash
while true; do
  nvidia-smi --query-gpu=index,name,memory.used,memory.total,utilization.gpu \
             --format=csv -l 1 | tee -a gpu_stats.csv
  echo "Throughput: $(curl -s http://localhost:8678/metrics | grep 'tokens_generated_per_second')"
done

2.OOM(显存不足)错误

  • 现象:CUDA out of memory
    • 降低 --gpu-memory-utilization (每次调整0.05)
    • 增加 --tensor-parallel-size
    • 添加 --quantization awq(需模型支持)
# 阶梯式调整参数
--gpu-memory-utilization 0.750.70.65
--max-model-len 40963072
--kv-cache-dtype fp8 → auto

3.多卡负载不均

# 检查各卡显存使用
nvitop -m full --colorful
# 解决方案:强制绑定设备
CUDA_VISIBLE_DEVICES=0,1 vllm serve... --tensor-parallel-size 2

4.多媒体处理超时

  • 降低 --limit-mm-per-prompt 数值
  • 添加视频预处理参数(如降帧率):
# 在模型加载时注入预处理配置
model.load_media_processor(
    video_config={"max_fps": 5, "resolution": 480}
)

四、大模型部署资源评估

1.显存计算

  • 总显存需求 = 模型参数显存 + KV缓存显存 + 多模态特征显存 + 安全余量(10-20%)

1.1模型参数显存计算

模型类型 计算公式 示例(Qwen2.5-VL-7B)
非量化模型(FP16) 参数量 × 2字节 7B × 2 = 14GB
AWQ量化模型(4bit) 参数量 × 0.5字节 72B × 0.5 = 36GB
多卡张量并行 总显存 ÷ 并行数 × 1.2(通信开销) 72B-AWQ用8卡:36÷8×1.2≈5.4GB/卡

1.2KV缓存显存计算

  • KV_cache_per_token = 2 × num_layers × hidden_size × num_heads_kv × bytes_per_param
    • Qwen2.5-VL-7B示例
      • 32层,hidden_size=4096,num_heads_kv=32
      • FP16时:2×32×4096×32×2B = 16MB/token
      • 若batch_size=4,seq_len=4096 → 4×4096×16MB ≈ 256GB(需张量并行分摊)

1.3多模态特征显存

媒体类型 特征计算公式 示例(512×512图像)
图像 分块数 × 特征维度 × dtype字节数 9块(3×3)× 512维 × 2B = 9KB/图
视频 关键帧数 × 图像特征 × 音频特征 24帧 × 9KB + 1MB音频 ≈ 217KB/视频

2.典型模型部署评估

2.1Qwen2.5-VL-7B-Instruct(非量化)

# 单卡部署场景(A10 24GB)
总显存需求 = 
  模型参数:14GB
+ KV缓存:batch_size=2, seq_len=4096 → 2×4096×16MB ≈ 128MB
+ 多模态:同时处理4图2视频 → (4×9KB)+(2×217KB) ≈ 0.5MB
+ 安全余量:14GB×20% = 2.8GB
≈ **16.9GB** < 24GB(可行)
# 多模态极限场景(处理10图5视频):
多模态显存增至:(10×9KB)+(5×217KB) ≈ 1.2MB → 总需求≈17.1GB

2.2Qwen2.5-VL-72B-Instruct-AWQ

# 8卡T4部署(16GB/卡)
单卡需求 = 
  模型参数:36GB÷8×1.2 = 5.4GB
+ KV缓存(FP8):batch_size=4, seq_len=4096 → 4×4096×(16MB/2)÷8 = 16MB
+ 多模态:2图1视频 → (2×9KB)+(1×217KB) ≈ 0.2MB
+ 安全余量:5.4GB×15% = 0.8GB
≈ **6.4GB** < 12GB(16GB×0.75利用率)
# 长上下文场景(seq_len=8192):
KV缓存显存翻倍 → 单卡需求≈6.4+16MB≈6.4GB(仍可行)

3.硬件选型参考表

模型 推荐配置 处理能力 成本估算(AWS)
Qwen2.5-VL-7B 1×A10G (24GB) 实时处理:4图+2视频@3s/req $1.008/hr(g5.xlarge)
Qwen2.5-VL-72B-AWQ 8×T4 (16GB) + 64vCPU 批量处理:16req/s@8图上限 $3.912/hr(g4dn.metal)
高并发生产环境 4×A100 80GB + NVLink 100+ req/s@混合媒体输入 $32.77/hr(p4d.24xlarge)

4.优化策略与参数调整

4.1显存压缩技术

# 启用混合精度(针对非量化模型)
--dtype bfloat16 \                # 保持精度同时减少显存占用
--kv-cache-dtype fp8 \            # KV缓存使用8bit
# 动态卸载策略(实验性)
--swap-space 16G \                # 使用SSD交换空间
--chunked-prefix-reserve-ratio 0.2

4.2多模态处理优化

# 图像分片策略优化示例(减少特征显存)
def adaptive_tiling(img_size, max_tiles=9):
    # 动态调整分片数量
    base_tile = 512 if img_size>1024 else 256
    rows = cols = int((img_size//base_tile)**0.5)
    return rows*cols

4.3负载均衡配置

# 多卡通信优化(针对T4 PCIe瓶颈)
export NCCL_ALGO=Ring              # 使用环形通信
export NCCL_P2P_DISABLE=1          # 关闭P2P通信
export CUDA_DEVICE_MAX_CONNECTIONS=1

5.模型部署评估

5.1大模型显存分析

# 使用vLLM内置分析工具
python -m vllm.model_analyzer \
  --model Qwen/Qwen2.5-VL-72B-Instruct-AWQ \
  --quantization awq \
  --tensor-parallel-size 8 \
  --profile memory \          # 显存分析模式
  --output csv \              # 输出格式
  --max-num-batched-tokens 4096  # 模拟实际负载
  
# 添加层级分解参数
--breakdown-by layer \        # 按神经网络层分解
--verbose 2                   # 显示详细日志

# 多卡分析配置,显式指定GPU设备(需与tensor-parallel-size匹配)
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
python -m vllm.model_analyzer \
  --tensor-parallel-size 8 \
  --profile memory

# 混合精度分析,测试不同数据类型的显存影响
--dtypes float16 bfloat16  # 对比两种精度

# 动态批处理模拟,模拟不同批处理大小的显存变化
--batch-sizes 1 4 8 16 \    # 测试多个batch_size
--concurrency 10 20         # 模拟并发请求

# 显存峰值预测,生成显存使用曲线预测
--plot-memory-usage \       # 生成PNG图表
--output-dir ./plots
  • 自动化分析脚本
#!/bin/bash
# 保存为 analyze_mem.sh
MODEL="Qwen/Qwen2.5-VL-72B-Instruct-AWQ"
TP_SIZE=8

python -m vllm.model_analyzer \
  --model $MODEL \
  --quantization awq \
  --tensor-parallel-size $TP_SIZE \
  --profile memory \
  --output markdown \         # 生成Markdown表格
  > memory_report.md

5.2多模态压力测试

# 模拟混合媒体请求(使用locust)
from locust import HttpUser, task
class MultimodalUser(HttpUser):
    @task
    def send_request(self):
        media_files = [
            {"type": "image", "size": "1024x1024"},
            {"type": "video", "duration": 30}
        ]
        self.client.post("/generate", json={"inputs": media_files})

5.3显存监控看板

拉取指标
Prometheus
Grafana
显存仪表盘
模型参数显存
KV缓存显存
多模态特征显存
系统预留显存
Logo

分享最新的 NVIDIA AI Software 资源以及活动/会议信息,精选收录AI相关技术内容,欢迎大家加入社区并参与讨论。

更多推荐