显存不够也能跑DeepSeek!VLLM部署保姆级教程

前言

你是否还在为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-headersContent-Type,Authorization允许的 HTTP 头。根据 API 需求设置。例如:Content-Type,Authorization
--allowed-local-media-path/path/to/media允许 API 请求从指定的服务器文件系统目录读取本地图片或视频。这是安全风险,仅应在受信任的环境中启用。仅在受信任的环境中启用,并设置为实际路径。
--allowed-methodsGET,POST允许的方法。根据 API 需求设置。例如:GET,POST
--allowed-originshttp://example.com,https://example.com允许的来源。根据 API 需求设置。例如:http://example.com,https://example.com
--api-keyyour_api_key如果提供,服务器将要求在头部中呈现此密钥。为了安全性,建议设置一个 API 密钥。
--block-size32Token 块大小。对于 CUDA 设备,建议设置为 16 或 32。对于 HPU 设备,默认为 128。
--calculate-kv-scales启用动态计算 k_scale 和 v_scale。如果使用 FP8 kv-cache-dtype,建议启用。
--chat-templatepath/to/chat_template.txt聊天模板的文件路径或单行形式。根据模型需求设置。
--chat-template-content-formatauto渲染聊天模板中的消息内容格式。默认为 auto,根据需求选择 stringopenai
--code-revisionmain模型代码在 Hugging Face Hub 上的具体版本。使用默认版本或根据需要设置特定版本。
--collect-detailed-tracesmodel收集详细跟踪信息。仅在需要调试时启用。
--compilation-config-O3torch.compile 配置。生产环境建议使用 -O3
--configpath/to/config.yaml从配置文件读取 CLI 选项。根据需要设置配置文件路径。
--config-formatauto模型配置的加载格式。默认为 auto,根据需求选择 hfmistral
--cpu-offload-gb45每 GPU 的 CPU offloading 空间(GiB)。根据可用系统内存设置,例如 45GB。
--devicecuda执行设备类型。根据硬件配置选择,通常为 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-decodingTrue在投机解码期间禁用 token log 概率。默认为 True,根据需求设置。
--disable-mm-preprocessor-cache禁用多模态预处理器缓存。不建议启用。
--disable-sliding-window禁用滑动窗口。除非有特殊需求,否则不建议启用。
--distributed-executor-backendray分布式模型 worker 的后端。根据硬件配置选择,通常为 raymp
--download-dirpath/to/download_dir下载和加载权重的目录。使用默认值或根据需要设置。
--dtypeauto模型权重和激活的数据类型。默认为 auto,根据需求选择 half, float16, bfloat16, floatfloat32
--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-configpath/to/generation_config生成配置的文件夹路径。使用默认值或根据需要设置。
--gpu-memory-utilization0.9GPU 内存利用率。通常设置为 0.9 或更低。
--guided-decoding-backendoutlines用于引导解码的引擎。根据需求选择 outlines, lm-format-enforcerxgrammar
--hf-overrides{"key": "value"}HuggingFace 配置的额外参数。根据需求设置 JSON 字符串。
--host0.0.0.0主机名。通常设置为 0.0.0.0
--ignore-patternsoriginal/**/*加载模型时忽略的模式。默认为 original/**/*
--kv-cache-dtypeautokv 缓存存储的数据类型。默认为 auto,根据需求选择 fp8, fp8_e5m2fp8_e4m3
--kv-transfer-config{"key": "value"}分布式 KV 缓存传输的配置。根据需求设置 JSON 字符串。
--limit-mm-per-promptimage=16,video=2每个提示的最大多模态输入实例数。根据需求设置,例如 image=16,video=2
--load-formatauto模型权重的加载格式。默认为 auto,根据需求选择 pt, safetensors 等。
--logits-processor-pattern.*有效的 logits 处理器正则表达式。根据需求设置。
--long-lora-scaling-factors1.0,2.0指定多个缩放因子。根据需求设置。
--lora-dtypeautoLoRA 的数据类型。默认为 auto,根据需求选择 float16bfloat16
--lora-extra-vocab-size1000LoRA 适配器的最大额外词汇量。根据需求设置。
--lora-modulesname=pathLoRA 模块配置。根据需求设置。
--max-cpu-loras10存储在 CPU 内存中的最大 LoRA 数量。根据需求设置,必须大于等于 max_loras
--max-log-len1000日志中的最大提示字符数或提示 ID 数。根据需求设置。
--max-logprobs5最大对数概率数量。根据需求设置。
--max-lora-rank16最大 LoRA 秩。根据需求设置。
--max-loras10单批次中的最大 LoRA 数量。根据需求设置。
--max-model-len51200模型上下文长度。根据模型配置设置。
--max-num-batched-tokens8192每次迭代的最大批量 token 数。根据 GPU 显存和模型大小设置。
--max-num-seqs256每次迭代的最大序列数。根据 GPU 显存和模型大小设置。
--max-parallel-loading-workers4并行加载工作线程的最大数量。根据硬件配置设置。
--max-prompt-adapter-token100最大 PromptAdapters token 数量。根据需求设置。
--max-prompt-adapters10单批次中的最大 PromptAdapters 数量。根据需求设置。
--max-seq-len-to-capture1024由 CUDA 图覆盖的最大序列长度。根据需求设置。
--middlewarepath.to.middleware额外的 ASGI 中间件。根据需求设置。
--mm-processor-kwargs{"num_crops": 4}多模态输入映射/处理的覆盖。根据需求设置。
--modelDeepSeek-R1-Distill-Qwen-32BHuggingFace 模型的名称或路径。设置为实际模型名称或路径。
--model-implauto模型实现的选择。默认为 auto,根据需求选择 vllmtransformers
--model-loader-extra-config{"key": "value"}模型加载器的额外配置。根据需求设置 JSON 字符串。
--multi-step-stream-outputs多步骤流输出。根据需求启用或禁用。
--ngram-prompt-lookup-max10ngram 提示查找的最大窗口大小。根据需求设置。
--ngram-prompt-lookup-min5ngram 提示查找的最小窗口大小。根据需求设置。
--num-gpu-blocks-override10覆盖 GPU 块的数量。用于测试抢占。
--num-lookahead-slots10投机解码的实验性调度配置。根据需求设置。
--num-scheduler-steps10每次调度调用的最大前进步数。根据需求设置。
--num-speculative-tokens10投机解码的推测 token 数量。根据需求设置。
--otlp-traces-endpointhttp://otel-collector:4317OpenTelemetry 追踪的目标 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-size2管道阶段数量。根据 GPU 数量和模型大小设置。
--port8000端口号。根据需求设置。
--preemption-moderecompute预占模式。选择 recomputeswap
--prompt-adaptersname=path提示适配器配置。根据需求设置。
--qlora-adapter-name-or-pathpath/to/qlora_adapterQLoRA 适配器的名称或路径。根据需求设置。
--quantizationawq权重量化方法。根据需求选择 awq, deepspeedfp, tpu_int8 等。
--ray-workers-use-nsight使用 nsight 来分析 Ray workers。仅在需要分析时启用。
--reasoning-parserdeepseek_r1选择推理解析器。根据使用的模型选择。
--response-roleassistant返回的角色名称。根据需求设置。
--return-tokens-as-token-ids将 token 表示为 token_id。根据需求启用。
--revisionmain模型的具体版本。使用默认版本或根据需要设置。
--root-path/apiFastAPI 的根路径。根据需求设置。
--rope-scaling{"rope_type": "dynamic", "factor": 2.0}RoPE 缩放配置。根据需求设置 JSON 字符串。
--rope-theta10000.0RoPE theta。根据需求设置。
--scheduler-delay-factor1.0应用延迟因子。根据需求设置。
--scheduling-policyfcfs调度策略。选择 fcfspriority
--seed42随机种子。根据需求设置。
--served-model-namemy_modelAPI 中使用的模型名称。根据需求设置。
--skip-tokenizer-init跳过 tokenizer 初始化。除非有特殊需求,否则不建议启用。
--spec-decoding-acceptance-methodrejection_sampler投机解码的接受方法。选择 rejection_samplertypical_acceptance_sampler
--speculative-disable-by-batch-size10当队列请求数量超过此值时禁用投机解码。根据需求设置。
--speculative-disable-mqa-scorer禁用 MQA 评分器。根据需求启用。
--speculative-draft-tensor-parallel-size2投机解码草案模型的张量并行副本数量。根据需求设置。
--speculative-max-model-len51200草案模型支持的最大序列长度。根据需求设置。
--speculative-modeldraft_model用于投机解码的草案模型名称。根据需求设置。
--speculative-model-quantizationawq投机模型的权重量化方法。根据需求选择 awq, deepspeedfp, tpu_int8 等。
--ssl-ca-certspath/to/ca_certs.pemCA 证书文件。根据需求设置。
--ssl-cert-reqsCERT_REQUIRED是否需要客户端证书。根据需求设置。
--ssl-certfilepath/to/cert.pemSSL 证书文件。根据需求设置。
--ssl-keyfilepath/to/key.pemSSL 密钥文件。根据需求设置。
--swap-space16每 GPU 的 CPU 交换空间大小(GiB)。根据系统内存大小和 GPU 显存压力设置。
--taskgenerate模型的任务。选择 generate, embedding, classify 等。
--tensor-parallel-size2张量并行副本数量。根据 GPU 数量和模型大小设置。
--tokenizerDeepSeek-R1-Distill-Qwen-32BHuggingFace tokenizer 的名称或路径。设置为实际 tokenizer 名称或路径。
--tokenizer-modeautotokenizer 模式。默认为 auto,根据需求选择 slowmistral
--tokenizer-pool-extra-config{"key": "value"}tokenizer 池的额外配置。根据需求设置 JSON 字符串。
--tokenizer-pool-size4用于异步分词的 tokenizer 池大小。根据需求设置。
--tokenizer-pool-typeprocesstokenizer 池的类型。根据需求设置。
--tokenizer-revisionmaintokenizer 的具体版本。使用默认版本或根据需要设置。
--tool-call-parsergranite-20b-fc工具调用解析器。根据使用的模型选择。
--tool-parser-pluginpath.to.plugin工具解析插件。根据需求设置。
--trust-remote-code信任来自 HuggingFace 的远程代码。仅在受信任的环境中启用。
--typical-acceptance-sampler-posterior-alpha0.3TypicalAcceptanceSampler 的熵阈值缩放因子。通常设置为 0.3
--typical-acceptance-sampler-posterior-threshold0.09TypicalAcceptanceSampler 的后验概率阈值。通常设置为 0.09
--use-v2-block-manager[已弃用] 使用 v2 块管理器。不再需要设置。
--uvicorn-log-levelinfoUvicorn 的日志级别。选择 debug, info, warning, error, criticaltrace
--worker-clspath.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精度

进阶优化方案

  1. 显存控制参数
  • --gpu-memory-utilization: 建议设置0.7-0.8,预留部分显存
  • --max-model-len: 可以适当降低,如设置为4096
  • --max-num-batched-tokens: 8GB显卡建议设置2048以下
  • --max-num-seqs: 建议设置4-8之间
  1. 性能优化参数
  • --block-size: 设置为16可减少显存占用
  • --swap-space: 设置16-32之间,利用CPU内存
  • --cpu-offload-gb: 设置20-30之间,部分数据放入内存
  1. 量化相关参数
  • --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

优化建议

  1. 显存不足时的优化顺序

    • 先尝试开启量化
    • 然后降低batch相关参数
    • 最后考虑使用CPU辅助
  2. 性能与显存的平衡

    • 并发需求高时增加max-num-seqs
    • 响应速度要求高时增加max-num-batched-tokens
    • 长文本场景下调整max-model-len
  3. 稳定性保证

    • 预留10-20%显存给系统
    • 开启swap-space作为缓冲
    • 适当使用cpu-offload分担压力

常见问题

Q1: 显存不足怎么办?

  • 降低batch size
  • 减小max_num_batched_tokens
  • 使用量化模型(如int8/int4)

Q2: 如何提高并发性能?

  • 增加max_num_seqs
  • 调整gpu_memory_utilization
  • 使用tensor parallel

生产环境建议

  1. 使用supervisor管理进程
  2. 配置健康检查接口
  3. 添加访问认证
  4. 设置请求超时时间

结语

通过本文的介绍,相信你已经掌握了VLLM的部署要点。如果觉得本地部署过于麻烦,推荐使用硅基云的API服务,新用户可享2000万token免费额度,即开即用!

参考资料

  1. VLLM官方文档
  2. HuggingFace模型下载指南
  3. 显存优化最佳实践

转载请注明出处。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值