






















准备python环境,Index of /archive
bash https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh conda -V conda create -n vllm python=3.12 -y conda activate vllm
模型地址:https://www.modelscope.cn/home
安装ModelScope 下载工具 pip install modelscope #DeepSeekm模型 modelscope download --model deepseek-ai/DeepSeek-R1-Distill-Qwen-32B --local_dir /mnt/sda/model/DeepSeek-R1-Distill-Qwen-32B-AWQ/ #qwen模型 modelscope download --model Qwen/Qwen3-32B-AWQ --local_dir /mnt/sda/model/Qwen/Qwen3-32B-AWQ #向量模型 modelscope download --model BAAI/bge-base-zh-v1.5 --local_dir /mnt/sda/model/BAAI/bge-base-zh-v1.5 #重排模型 modelscope download --model BAAI/bge-reranker-base --local_dir /opt/models/BAAI/bge-reranker-v2-m3
下载 modelscope download --model BAAI/bge-reranker-v2-m3 默认路径 ~/.cache/modelscope/hub/BAAI/bge-reranker-v2-m3/
# 然后到PyTorch 官网(https://pytorch.org/get-started/locally/)查看相符的安装命令,执行 pip install torch==2.1.2 torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple --extra-index-url https://download.pytorch.org/whl/cu118 # 安装成功后,验证PyTorch 是否正确调用 GPU python -c "import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))" # 返回类似True NVIDIA GeForce RTX 4090就代表安装成功了 #安装显卡状态查看工具nvitop pip install nvitop nvitop
#安装vllm, pip install "vllm[triton]" 命令中的[triton]代表我们要安装VLLM的可选组件triton。它是OpenAI 开源的深度学习算子编译框架,vLLM 使用它来实现高性能的「Token 并行生成机制」,使VLLM在运行时性能会得到显著提升,推荐安装 pip install vllm -i https://pypi.tuna.tsinghua.edu.cn/simple # 验证是否安装成功 python -c "import vllm; print(vllm.__version__)" #如果打印出VLLM相关的东西,则代表安装成功了
推荐使用OpenAI API 格式服务启动。因为OpenAI API 格式几乎成为所有AI通用格式,能兼容绝大多数的服务与接口请求
vllm启动参数可参考:引擎参数 — vLLM 文档
模型启动示例
python -m vllm.entrypoints.openai.api_server --model /path/to/model --port 8000 # 模型参数详解 python -m vllm.entrypoints.openai.api_server #启动 vLLM 的 OpenAI API 服务接口,符合 OpenAI API 格式的调用方式 --model /home/xx/model/deepseek # 模型路径,可以使用本地路径,或 huggingface 等远程路径。必填 --model-name mydeepseek # 最定义模型名称。用户或客户端需要指定模型名,所以你必须提前定义清楚它叫什么。非必填(默认为模型自己的名称) --tokenizer /home/xx/model/deepseek # 指定分词器的位置或名称,模型文件结构规范的情况下可以不填。它的作用是防止模型文件夹结构不规范导致报错。日常不需要使用 --dtype float16 # 张量精度。支持auto(默认值。vLLM 会根据模型配置自动判断 dtype)、float32(单精度浮点数,最精确但显存占用大)、float16(半精度浮点数,推理快,占用小,当前主流推荐)等等参数。非必填(默认auto) --port 8088 # 指定模型启动时占用的端口。最好必填 --host 0.0.0.0 # 指定模型启动时的地址,设为 0.0.0.0 允许所有 IP 访问。最好必填 --max-model-len 4068 # 最大输入 + 输出 token 长度。需模型支持。非必填。默认为模型的默认值 --gpu-memory-utilization 0.8 # 使用 GPU 显存的比例。0为最小,1为最大。(1.0=100%,0.1=%10)。调小可以保留一部分显存给系统或其他程序,防止OOM(Out Of Memory显存溢出)。非必填(默认0.9) --tensor-parallel-size 2 # 用于多 GPU 并行推理。1 表示单卡运行(比如我的机器有2张显卡,就可以设置为2)。非必填(默认为1) --swap-space 4 # 为内存不足时预留的 swap 空间(“交换空间”Swap Space)(单位 GB),在显存爆掉时能缓解崩溃。非必填(默认为4) --disable-log-requests False # 是否禁用日志输出请求内容(保护隐私时可加)。非必填(默认为False) --max-num-batched-tokens 4068 # 每一批请求最多允许的 token 总数。这个数越大,吞吐量高但延迟可能变大;越小,响应快但效率低。非必填(默认为自动) --max-num-seqs 6 # 最大同时处理的请求数量,用于多并发的情况。非必填(默认为自动) --seed 42 # 控制生成内容的一致性,设置固定值可复现生成(同样输入,生成的输出可能会不一样。但是如果设置了比如--seed 42,则会出现回答与之前完全一致的情况出现)。非必填(默认为随机) --trust-remote-code False # 如果你从 HuggingFace 加载模型并需要运行自定义模型代码(如 LLaVA),必须加此参数。非必填(默认为False)
注意:我们是用VLLM 把模型部署成 openai API server 形式
vllm serve是vLLM提供的命令行工具,用于快速部署兼容OpenAl API的HTTP服务器。它是对python -m vllm.entrypoints.api_server的封装,语法更简洁。
nohup python -m vllm.entrypoints.openai.api_server \ --model /mnt/nvme01/models/deepseek671 \ --served-model-name deepseek14 \ --dtype float16 \ --port 8000 \ --host 0.0.0.0 \ --max-model-len 4068 \ --gpu-memory-utilization 0.8 \ --tensor-parallel-size 8 \ --swap-space 8 \ --max-num-batched-tokens 4068 \ --max-num-seqs 6 & nohup python -m vllm.entrypoints.openai.api_server \ --model="/mnt/nvme01/models/DeepSeek-R1-Distill-Qwen-32B" \ --tensor-parallel-size 4 \ --gpu-memory-utilization 0.88 \ --dtype half \ --served-model-name "DeepSeek-R1-Distill-Qwen-32B" \ --host 0.0.0.0 \ --port 8000 --max-model-len 20480 \ --chat-template /root/soft/deepseek_r1.jinja &
编写启动脚本vi start-deepseek.sh
#!/bin/bash nohup /mnt/sda/python/vllm/bin/vllm serve /mnt/sda/model/Valdemardi/DeepSeek-R1-Distill-Qwen-32B-AWQ/ \ --host 0.0.0.0 \ --port 8000 \ --tensor-parallel-size 2 \ --trust-remote-code \ --dtype float16 \ --max-model-len 32678 \ --quantization awq_marlin \ --gpu-memory-utilization 0.8 \ --served-model-name deepseek-r1:32b \ >ds.log&
2、vllm启动Qwen
#下载模型 modelscope download --model Qwen/Qwen3-235B-A22B --local_dir /mnt/nvme02/models/Qwen3-235B-A22B #启动模型 nohup python -m vllm.entrypoints.openai.api_server \ --model /mnt/nvme02/models/Qwen3-235B-A22B \ --served-model-name qwen3 \ --tensor_parallel_size 8 \ --host 0.0.0.0 \ --port 8004 \ --gpu-memory-utilization 0.8 \ --max-num-seqs 16 \ --enable-expert-parallel \ --max-model-len 4096 \ --enable-reasoning \ --reasoning-parser deepseek_r1 &
编写启动脚本vi start-qwen.sh
#!/bin/bash nohup /mnt/sda/python/vllm/bin/vllm serve /mnt/sda/model/Qwen/Qwen3-32B-AWQ/ \ --host 0.0.0.0 \ --port 8000 \ --tensor-parallel-size 2 \ --trust-remote-code \ --dtype float16 \ --max-model-len 40960 \ --quantization awq_marlin \ --gpu-memory-utilization 0.7 \ --served-model-name qwen3:32b \ >qwen.log&
CUDA_VISIBLE_DEVICES=0 nohup python -m vllm.entrypoints.openai.api_server \ --model="/mnt/nvme01/models/bge-m3" \ --tensor-parallel-size 1 \ --gpu-memory-utilization 0.1 \ --dtype half \ --served-model-name "bge-m3" \ --host 0.0.0.0 \ --port 8001 --max-model-len 4096 &
编写启动脚本vi start-bge.sh
#!/bin/bash nohup /mnt/sda/python/vllm/bin/vllm serve /mnt/sda/model/BAAI/bge-base-zh-v1.5 \ --host 0.0.0.0 \ --port 8001 \ --dtype float16 \ --tensor-parallel-size 1 \ --gpu-memory-utilization 0.05 \ >bge.log&
CUDA_VISIBLE_DEVICES=1 nohup python -m vllm.entrypoints.openai.api_server \ --model="/mnt/nvme01/models/bge-reranker-base" \ --tensor-parallel-size 1 \ --gpu-memory-utilization 0.1 \ --dtype half \ --served-model-name "bge-reranker-base" \ --host 0.0.0.0 \ --port 8002 &
编写启动脚本vi start-reranker.sh
#!/bin/bash nohup /mnt/sda/iot/python/vllm/bin/vllm serve /opt/models/BAAI/bge-reranker-v2-m3 \ --host 0.0.0.0 \ --port 8003 \ --task embed \ --dtype float16 \ --tensor-parallel-size 1 \ --gpu-memory-utilization 0.1\ >reranker.log&
参数说明: - --task embed:表示作为嵌入/重排序模型运行 - --port 8083:设置监听端口 - nohup ... &:后台运行,防止终端关闭中断服务 - 日志输出至 reranker.log
三、基准测试
方案1:使用随机生成的数据集
#运行性能基准测试 方案1:使用随机生成的数据集 #高负载 /mnt/sda/iot/python/vllm/bin/vllm bench serve \ --base-url http://localhost:8000 \ --model qwen3:32b \ --tokenizer /mnt/sda/iot/model/Qwen/Qwen3-32B-AWQ \ --dataset-name random \ --random-input-len 2048 \ --random-output-len 128 \ --num-prompts 128 \ --max-concurrency 10 #低负载 /mnt/sda/iot/python/vllm/bin/vllm bench serve \ --base-url http://localhost:8000 \ --model qwen3:32b \ --tokenizer /mnt/sda/iot/model/Qwen/Qwen3-32B-AWQ \ --dataset-name random \ --random-input-len 2048 \ --random-output-len 128 \ --num-prompts 10 \ --max-concurrency 1 方案2:使用自定义数据集文件 /mnt/sda/iot/python/vllm/bin/vllm bench serve \ --base-url http://localhost:8000 \ --model qwen3:32b \ --tokenizer /mnt/sda/iot/model/Qwen/Qwen3-32B-AWQ \ --dataset-name custom \ --dataset-path /mnt/sda/iot/code/vllm/test.jsonl \ --num-prompts 128 \ --max-concurrency 30
使用随机生成的数据集参数说明
vllm bench serve \ --base-url http://localhost:8000 \ # 指定 vLLM 服务器的基础 URL 地址 --model qwen3:32b \ # 要基准测试的模型名称或路径 --tokenizer /mnt/sda/iot/model/Qwen/Qwen3-32B-AWQ \ # tokenizer 的本地路径 --dataset-name random \ # 使用的数据集类型,'random' 表示随机生成文本 --random-input-len 2048 \ # 随机生成的输入序列长度(token 数量) --random-output-len 128 \ # 随机生成的输出序列长度(token 数量) --num-prompts 128 \ # 用于测试的提示(prompts)总数 --max-concurrency 1 \ # 最大并发请求数 --trust-remote-code \ # 允许执行远程代码,对自定义模型架构必需 --dtype float16 \ # 模型数据类型(float16, bfloat16, float32) --tensor-parallel-size 1 \ # 张量并行度,通常等于 GPU 数量 --gpu-memory-utilization 0.9 \ # GPU 内存利用率(0-1),控制 vLLM 使用的 GPU 内存比例 --quantization awq \ # 量化方法(awq, gptq, squeezellm, none) --max-model-len 4096 \ # 模型支持的最大上下文长度 --seed 0 \ # 随机种子,确保测试结果可重现 --request-rate 1.0 \ # 每秒请求数(RPS),设为 inf 表示尽可能快 --output-file benchmark_results.json \ # 保存基准测试结果的文件路径 --disable-tqdm \ # 禁用进度条显示 --profile \ # 启用性能分析,生成详细性能报告 --log-level info \ # 日志级别(debug, info, warning, error) --warmup 5 # 预热请求数量,在正式测试前执行
--port 8000: 指定服务器监听端口--host 0.0.0.0: 指定服务器绑定的主机地址--enforce-eager: 强制使用 eager 模式,不使用 CUDA 图优化--num-scheduler-steps 1: PagedAttention 调度器的步数--use-v2-block-manager: 使用 v2 块管理器,提供更好的性能--download-dir /path/to/cache: 指定模型下载缓存目录--max-num-batched-tokens 2048: 一次批处理中最大 token 数量--max-num-seqs 256: 一次批处理中最大序列数--batch-size 1: 每个请求的批处理大小方案2:使用自定义数据集文件
方案2:使用自定义数据集文件 /mnt/sda/iot/python/vllm/bin/vllm bench serve \ --base-url http://localhost:8000 \ --model qwen3:32b \ --tokenizer /mnt/sda/iot/model/Qwen/Qwen3-32B-AWQ \ --dataset-name custom \ --dataset-path /mnt/sda/iot/code/vllm/test.jsonl \ --num-prompts 128 \ --max-concurrency 30
使用自定义数据集文件参数说明:
/mnt/sda/iot/python/vllm/bin/vllm bench serve \ --base-url http://localhost:8000 \ # 指定API服务器地址,用于发送请求 --model qwen3:32b \ # 指定要测试的模型名称/标识符 --tokenizer /mnt/sda/iot/model/Qwen/Qwen3-32B-AWQ \ # 指定tokenizer路径,用于文本编码 --dataset-name custom \ # 指定数据集类型,这里使用自定义数据集 --dataset-path /mnt/sda/iot/code/vllm/test.jsonl \ # 指定自定义数据集文件路径 --num-prompts 128 \ # 要使用的提示数量,影响测试规模 --max-concurrency 30 \ # 最大并发请求数,控制负载强度 --backend vllm \ # 指定后端类型(vllm, openai, trt-llm等) --request-rate 10.0 \ # 每秒请求数,与max-concurrency二选一使用 --temperature 0.8 \ # 采样温度,控制输出随机性(0.0-1.0) --top-p 0.95 \ # 核心采样概率,控制输出多样性 --max-output-len 256 \ # 生成文本的最大长度(tokens) --min-output-len 64 \ # 生成文本的最小长度(tokens) --trust-remote-code \ # 允许执行远程代码,加载自定义模型时需要 --dtype float16 \ # 模型数据类型(float16, bfloat16, float32) --quantization awq \ # 量化方法(awq, gptq, squeezellm, auto等) --gpu-memory-utilization 0.9 \ # GPU内存利用率(0.0-1.0),控制显存使用 --tensor-parallel-size 4 \ # 张量并行度,通常等于GPU数量 --max-model-len 4096 \ # 模型支持的最大序列长度(tokens) --enable-prefix-caching \ # 启用前缀缓存,提高相同前缀请求的处理效率 --disable-log-requests \ # 禁用请求日志,减少日志输出 --seed 0 \ # 随机种子,确保结果可重现 --log-results \ # 记录并保存基准测试结果 --timeout 300 # 请求超时时间(秒),防止长时间阻塞
vllm bench serve 命令通过向已运行的服务器发送请求来测试推理性能--max-concurrency 和 --num-prompts 可帮助找到系统最佳负载点--quantization awq--gpu-memory-utilization 控制显存占用,过高可能导致OOM错误--max-output-len 和 --min-output-len 影响吞吐量和延迟测试结果--enable-prefix-caching 适合测试有共享前缀的提示,可显著提升性能测试结果:

测试结果说明:
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。