文章目录
前言
你是否还在为out of memory而苦恼?VLLM的各种优化参数帮你实现愿望!本文将详细介绍如何通过参数调优,让普通显卡也能流畅运行大语言模型。
VLLM vs Ollama:为什么选择VLLM?
性能对比
- VLLM采用PagedAttention技术,推理速度比Ollama快2-5倍
- 更高效的显存利用率,同样配置下可以加载更大的模型
- 支持批量推理,适合生产环境
功能对比
- 支持更多开源模型
- 提供REST API接口,方便集成
- 可自定义KV cache大小,更灵活
快速开始
1. 安装VLLM
pip install vllm
2. 下载模型
# 使用huggingface-cli下载
huggingface-cli download Qwen/Qwen-7B-Chat
# 或使用git-lfs下载
git lfs install
git clone https://huggingface.co/Qwen/Qwen-7B-Chat
3. 启动服务
# 基础启动命令
vllm --model /path/to/model
# 指定GPU和端口
vllm --model /path/to/model --gpu-memory-utilization 0.8 --port 8000
进阶配置
参数名称 | 示例 | 说明 | 推荐设置 |
---|---|---|---|
--allow-credentials | 无 | 允许凭证。 | 根据安全需求启用或禁用。默认禁用。 |
--allowed-headers | Content-Type,Authorization | 允许的 HTTP 头。 | 根据 API 需求设置。例如:Content-Type,Authorization 。 |
--allowed-local-media-path | /path/to/media | 允许 API 请求从指定的服务器文件系统目录读取本地图片或视频。这是安全风险,仅应在受信任的环境中启用。 | 仅在受信任的环境中启用,并设置为实际路径。 |
--allowed-methods | GET,POST | 允许的方法。 | 根据 API 需求设置。例如:GET,POST 。 |
--allowed-origins | http://example.com,https://example.com | 允许的来源。 | 根据 API 需求设置。例如:http://example.com,https://example.com 。 |
--api-key | your_api_key | 如果提供,服务器将要求在头部中呈现此密钥。 | 为了安全性,建议设置一个 API 密钥。 |
--block-size | 32 | Token 块大小。 | 对于 CUDA 设备,建议设置为 16 或 32。对于 HPU 设备,默认为 128。 |
--calculate-kv-scales | 无 | 启用动态计算 k_scale 和 v_scale。 | 如果使用 FP8 kv-cache-dtype,建议启用。 |
--chat-template | path/to/chat_template.txt | 聊天模板的文件路径或单行形式。 | 根据模型需求设置。 |
--chat-template-content-format | auto | 渲染聊天模板中的消息内容格式。 | 默认为 auto ,根据需求选择 string 或 openai 。 |
--code-revision | main | 模型代码在 Hugging Face Hub 上的具体版本。 | 使用默认版本或根据需要设置特定版本。 |
--collect-detailed-traces | model | 收集详细跟踪信息。 | 仅在需要调试时启用。 |
--compilation-config | -O3 | torch.compile 配置。 | 生产环境建议使用 -O3 。 |
--config | path/to/config.yaml | 从配置文件读取 CLI 选项。 | 根据需要设置配置文件路径。 |
--config-format | auto | 模型配置的加载格式。 | 默认为 auto ,根据需求选择 hf 或 mistral 。 |
--cpu-offload-gb | 45 | 每 GPU 的 CPU offloading 空间(GiB)。 | 根据可用系统内存设置,例如 45GB。 |
--device | cuda | 执行设备类型。 | 根据硬件配置选择,通常为 cuda 。 |
--disable-async-output-proc | 无 | 禁用异步输出处理。 | 除非有性能问题,否则不建议禁用。 |
--disable-custom-all-reduce | 无 | 禁用自定义 all-reduce。 | 根据并行配置需求设置。 |
--disable-fastapi-docs | 无 | 禁用 FastAPI 的 OpenAPI 文档。 | 根据需求禁用。 |
--disable-frontend-multiprocessing | 无 | 在同一进程中运行 OpenAI 前端服务器。 | 除非有特殊需求,否则不建议启用。 |
--disable-log-requests | 无 | 禁用请求日志。 | 除非不需要日志,否则不建议禁用。 |
--disable-log-stats | 无 | 禁用统计日志。 | 除非不需要日志,否则不建议禁用。 |
--disable-logprobs-during-spec-decoding | True | 在投机解码期间禁用 token log 概率。 | 默认为 True ,根据需求设置。 |
--disable-mm-preprocessor-cache | 无 | 禁用多模态预处理器缓存。 | 不建议启用。 |
--disable-sliding-window | 无 | 禁用滑动窗口。 | 除非有特殊需求,否则不建议启用。 |
--distributed-executor-backend | ray | 分布式模型 worker 的后端。 | 根据硬件配置选择,通常为 ray 或 mp 。 |
--download-dir | path/to/download_dir | 下载和加载权重的目录。 | 使用默认值或根据需要设置。 |
--dtype | auto | 模型权重和激活的数据类型。 | 默认为 auto ,根据需求选择 half , float16 , bfloat16 , float 或 float32 。 |
--enable-auto-tool-choice | 无 | 启用自动工具选择。 | 根据需求启用。 |
--enable-chunked-prefill | 无 | 启用 chunked prefill。 | 根据需求启用。 |
--enable-lora | 无 | 启用 LoRA 适配器。 | 根据需求启用。 |
--enable-lora-bias | 无 | 启用 LoRA 适配器偏置。 | 根据需求启用。 |
--enable-prefix-caching | 无 | 启用前缀缓存。 | 默认启用,根据需求禁用。 |
--enable-prompt-adapter | 无 | 启用 PromptAdapters。 | 根据需求启用。 |
--enable-prompt-tokens-details | 无 | 启用 prompt_tokens_details。 | 根据需求启用。 |
--enable-reasoning | 无 | 启用推理内容。 | 根据需求启用。 |
--enable-request-id-headers | 无 | 启用 X-Request-Id 头。 | 根据需求启用,注意高 QPS 时可能影响性能。 |
--enable-sleep-mode | 无 | 启用睡眠模式。 | 仅在 CUDA 平台上支持,根据需求启用。 |
--enforce-eager | 无 | 总是使用 eager-mode PyTorch。 | 默认为混合模式,根据需求启用。 |
--fully-sharded-loras | 无 | 启用完全分片的 LoRA 层。 | 在高序列长度、最大秩或张量并行大小时启用。 |
--generation-config | path/to/generation_config | 生成配置的文件夹路径。 | 使用默认值或根据需要设置。 |
--gpu-memory-utilization | 0.9 | GPU 内存利用率。 | 通常设置为 0.9 或更低。 |
--guided-decoding-backend | outlines | 用于引导解码的引擎。 | 根据需求选择 outlines , lm-format-enforcer 或 xgrammar 。 |
--hf-overrides | {"key": "value"} | HuggingFace 配置的额外参数。 | 根据需求设置 JSON 字符串。 |
--host | 0.0.0.0 | 主机名。 | 通常设置为 0.0.0.0 。 |
--ignore-patterns | original/**/* | 加载模型时忽略的模式。 | 默认为 original/**/* 。 |
--kv-cache-dtype | auto | kv 缓存存储的数据类型。 | 默认为 auto ,根据需求选择 fp8 , fp8_e5m2 或 fp8_e4m3 。 |
--kv-transfer-config | {"key": "value"} | 分布式 KV 缓存传输的配置。 | 根据需求设置 JSON 字符串。 |
--limit-mm-per-prompt | image=16,video=2 | 每个提示的最大多模态输入实例数。 | 根据需求设置,例如 image=16,video=2 。 |
--load-format | auto | 模型权重的加载格式。 | 默认为 auto ,根据需求选择 pt , safetensors 等。 |
--logits-processor-pattern | .* | 有效的 logits 处理器正则表达式。 | 根据需求设置。 |
--long-lora-scaling-factors | 1.0,2.0 | 指定多个缩放因子。 | 根据需求设置。 |
--lora-dtype | auto | LoRA 的数据类型。 | 默认为 auto ,根据需求选择 float16 或 bfloat16 。 |
--lora-extra-vocab-size | 1000 | LoRA 适配器的最大额外词汇量。 | 根据需求设置。 |
--lora-modules | name=path | LoRA 模块配置。 | 根据需求设置。 |
--max-cpu-loras | 10 | 存储在 CPU 内存中的最大 LoRA 数量。 | 根据需求设置,必须大于等于 max_loras 。 |
--max-log-len | 1000 | 日志中的最大提示字符数或提示 ID 数。 | 根据需求设置。 |
--max-logprobs | 5 | 最大对数概率数量。 | 根据需求设置。 |
--max-lora-rank | 16 | 最大 LoRA 秩。 | 根据需求设置。 |
--max-loras | 10 | 单批次中的最大 LoRA 数量。 | 根据需求设置。 |
--max-model-len | 51200 | 模型上下文长度。 | 根据模型配置设置。 |
--max-num-batched-tokens | 8192 | 每次迭代的最大批量 token 数。 | 根据 GPU 显存和模型大小设置。 |
--max-num-seqs | 256 | 每次迭代的最大序列数。 | 根据 GPU 显存和模型大小设置。 |
--max-parallel-loading-workers | 4 | 并行加载工作线程的最大数量。 | 根据硬件配置设置。 |
--max-prompt-adapter-token | 100 | 最大 PromptAdapters token 数量。 | 根据需求设置。 |
--max-prompt-adapters | 10 | 单批次中的最大 PromptAdapters 数量。 | 根据需求设置。 |
--max-seq-len-to-capture | 1024 | 由 CUDA 图覆盖的最大序列长度。 | 根据需求设置。 |
--middleware | path.to.middleware | 额外的 ASGI 中间件。 | 根据需求设置。 |
--mm-processor-kwargs | {"num_crops": 4} | 多模态输入映射/处理的覆盖。 | 根据需求设置。 |
--model | DeepSeek-R1-Distill-Qwen-32B | HuggingFace 模型的名称或路径。 | 设置为实际模型名称或路径。 |
--model-impl | auto | 模型实现的选择。 | 默认为 auto ,根据需求选择 vllm 或 transformers 。 |
--model-loader-extra-config | {"key": "value"} | 模型加载器的额外配置。 | 根据需求设置 JSON 字符串。 |
--multi-step-stream-outputs | 无 | 多步骤流输出。 | 根据需求启用或禁用。 |
--ngram-prompt-lookup-max | 10 | ngram 提示查找的最大窗口大小。 | 根据需求设置。 |
--ngram-prompt-lookup-min | 5 | ngram 提示查找的最小窗口大小。 | 根据需求设置。 |
--num-gpu-blocks-override | 10 | 覆盖 GPU 块的数量。 | 用于测试抢占。 |
--num-lookahead-slots | 10 | 投机解码的实验性调度配置。 | 根据需求设置。 |
--num-scheduler-steps | 10 | 每次调度调用的最大前进步数。 | 根据需求设置。 |
--num-speculative-tokens | 10 | 投机解码的推测 token 数量。 | 根据需求设置。 |
--otlp-traces-endpoint | http://otel-collector:4317 | OpenTelemetry 追踪的目标 URL。 | 根据需求设置。 |
--override-generation-config | {"temperature": 0.5} | 覆盖或设置生成配置。 | 根据需求设置 JSON 字符串。 |
--override-neuron-config | {"cast_logits_dtype": "bloat16"} | 覆盖或设置神经元设备配置。 | 根据需求设置 JSON 字符串。 |
--override-pooler-config | {"pooling_type": "mean", "normalize": false} | 覆盖或设置池化方法。 | 根据需求设置 JSON 字符串。 |
--pipeline-parallel-size | 2 | 管道阶段数量。 | 根据 GPU 数量和模型大小设置。 |
--port | 8000 | 端口号。 | 根据需求设置。 |
--preemption-mode | recompute | 预占模式。 | 选择 recompute 或 swap 。 |
--prompt-adapters | name=path | 提示适配器配置。 | 根据需求设置。 |
--qlora-adapter-name-or-path | path/to/qlora_adapter | QLoRA 适配器的名称或路径。 | 根据需求设置。 |
--quantization | awq | 权重量化方法。 | 根据需求选择 awq , deepspeedfp , tpu_int8 等。 |
--ray-workers-use-nsight | 无 | 使用 nsight 来分析 Ray workers。 | 仅在需要分析时启用。 |
--reasoning-parser | deepseek_r1 | 选择推理解析器。 | 根据使用的模型选择。 |
--response-role | assistant | 返回的角色名称。 | 根据需求设置。 |
--return-tokens-as-token-ids | 无 | 将 token 表示为 token_id。 | 根据需求启用。 |
--revision | main | 模型的具体版本。 | 使用默认版本或根据需要设置。 |
--root-path | /api | FastAPI 的根路径。 | 根据需求设置。 |
--rope-scaling | {"rope_type": "dynamic", "factor": 2.0} | RoPE 缩放配置。 | 根据需求设置 JSON 字符串。 |
--rope-theta | 10000.0 | RoPE theta。 | 根据需求设置。 |
--scheduler-delay-factor | 1.0 | 应用延迟因子。 | 根据需求设置。 |
--scheduling-policy | fcfs | 调度策略。 | 选择 fcfs 或 priority 。 |
--seed | 42 | 随机种子。 | 根据需求设置。 |
--served-model-name | my_model | API 中使用的模型名称。 | 根据需求设置。 |
--skip-tokenizer-init | 无 | 跳过 tokenizer 初始化。 | 除非有特殊需求,否则不建议启用。 |
--spec-decoding-acceptance-method | rejection_sampler | 投机解码的接受方法。 | 选择 rejection_sampler 或 typical_acceptance_sampler 。 |
--speculative-disable-by-batch-size | 10 | 当队列请求数量超过此值时禁用投机解码。 | 根据需求设置。 |
--speculative-disable-mqa-scorer | 无 | 禁用 MQA 评分器。 | 根据需求启用。 |
--speculative-draft-tensor-parallel-size | 2 | 投机解码草案模型的张量并行副本数量。 | 根据需求设置。 |
--speculative-max-model-len | 51200 | 草案模型支持的最大序列长度。 | 根据需求设置。 |
--speculative-model | draft_model | 用于投机解码的草案模型名称。 | 根据需求设置。 |
--speculative-model-quantization | awq | 投机模型的权重量化方法。 | 根据需求选择 awq , deepspeedfp , tpu_int8 等。 |
--ssl-ca-certs | path/to/ca_certs.pem | CA 证书文件。 | 根据需求设置。 |
--ssl-cert-reqs | CERT_REQUIRED | 是否需要客户端证书。 | 根据需求设置。 |
--ssl-certfile | path/to/cert.pem | SSL 证书文件。 | 根据需求设置。 |
--ssl-keyfile | path/to/key.pem | SSL 密钥文件。 | 根据需求设置。 |
--swap-space | 16 | 每 GPU 的 CPU 交换空间大小(GiB)。 | 根据系统内存大小和 GPU 显存压力设置。 |
--task | generate | 模型的任务。 | 选择 generate , embedding , classify 等。 |
--tensor-parallel-size | 2 | 张量并行副本数量。 | 根据 GPU 数量和模型大小设置。 |
--tokenizer | DeepSeek-R1-Distill-Qwen-32B | HuggingFace tokenizer 的名称或路径。 | 设置为实际 tokenizer 名称或路径。 |
--tokenizer-mode | auto | tokenizer 模式。 | 默认为 auto ,根据需求选择 slow 或 mistral 。 |
--tokenizer-pool-extra-config | {"key": "value"} | tokenizer 池的额外配置。 | 根据需求设置 JSON 字符串。 |
--tokenizer-pool-size | 4 | 用于异步分词的 tokenizer 池大小。 | 根据需求设置。 |
--tokenizer-pool-type | process | tokenizer 池的类型。 | 根据需求设置。 |
--tokenizer-revision | main | tokenizer 的具体版本。 | 使用默认版本或根据需要设置。 |
--tool-call-parser | granite-20b-fc | 工具调用解析器。 | 根据使用的模型选择。 |
--tool-parser-plugin | path.to.plugin | 工具解析插件。 | 根据需求设置。 |
--trust-remote-code | 无 | 信任来自 HuggingFace 的远程代码。 | 仅在受信任的环境中启用。 |
--typical-acceptance-sampler-posterior-alpha | 0.3 | TypicalAcceptanceSampler 的熵阈值缩放因子。 | 通常设置为 0.3 。 |
--typical-acceptance-sampler-posterior-threshold | 0.09 | TypicalAcceptanceSampler 的后验概率阈值。 | 通常设置为 0.09 。 |
--use-v2-block-manager | 无 | [已弃用] 使用 v2 块管理器。 | 不再需要设置。 |
--uvicorn-log-level | info | Uvicorn 的日志级别。 | 选择 debug , info , warning , error , critical 或 trace 。 |
--worker-cls | path.to.worker_cls | 用于分布式执行的 worker 类。 | 根据需求设置。 |
显存优化方案
基础优化配置
vllm --model /path/to/model \
--gpu-memory-utilization 0.8 \ # 控制显存使用率
--max-num-batched-tokens 2048 \ # 减少每批次token数
--max-num-seqs 8 \ # 限制并发序列数
--quantization awq \ # 使用AWQ量化
--dtype bfloat16 # 使用bf16精度
进阶优化方案
- 显存控制参数
--gpu-memory-utilization
: 建议设置0.7-0.8,预留部分显存--max-model-len
: 可以适当降低,如设置为4096--max-num-batched-tokens
: 8GB显卡建议设置2048以下--max-num-seqs
: 建议设置4-8之间
- 性能优化参数
--block-size
: 设置为16可减少显存占用--swap-space
: 设置16-32之间,利用CPU内存--cpu-offload-gb
: 设置20-30之间,部分数据放入内存
- 量化相关参数
--quantization
: 推荐使用awq或int8--dtype
: 使用bfloat16或float16--kv-cache-dtype
: 使用fp8_e5m2减少KV Cache占用
显存优化组合推荐
方案1: 极限压缩
vllm --model /path/to/model \
--gpu-memory-utilization 0.7 \
--max-num-batched-tokens 1024 \
--max-num-seqs 4 \
--quantization awq \
--block-size 16 \
--max-model-len 2048
方案2: 均衡模式
vllm --model /path/to/model \
--gpu-memory-utilization 0.8 \
--max-num-batched-tokens 2048 \
--max-num-seqs 8 \
--quantization int8 \
--dtype bfloat16 \
--swap-space 16
方案3: CPU辅助模式
vllm --model /path/to/model \
--gpu-memory-utilization 0.9 \
--cpu-offload-gb 30 \
--swap-space 32 \
--max-num-seqs 16 \
--quantization awq
优化建议
-
显存不足时的优化顺序
- 先尝试开启量化
- 然后降低batch相关参数
- 最后考虑使用CPU辅助
-
性能与显存的平衡
- 并发需求高时增加max-num-seqs
- 响应速度要求高时增加max-num-batched-tokens
- 长文本场景下调整max-model-len
-
稳定性保证
- 预留10-20%显存给系统
- 开启swap-space作为缓冲
- 适当使用cpu-offload分担压力
常见问题
Q1: 显存不足怎么办?
- 降低batch size
- 减小max_num_batched_tokens
- 使用量化模型(如int8/int4)
Q2: 如何提高并发性能?
- 增加max_num_seqs
- 调整gpu_memory_utilization
- 使用tensor parallel
生产环境建议
- 使用supervisor管理进程
- 配置健康检查接口
- 添加访问认证
- 设置请求超时时间
结语
通过本文的介绍,相信你已经掌握了VLLM的部署要点。如果觉得本地部署过于麻烦,推荐使用硅基云的API服务,新用户可享2000万token免费额度,即开即用!
参考资料
- VLLM官方文档
- HuggingFace模型下载指南
- 显存优化最佳实践
转载请注明出处。