大模型实践:vLLM部署llm

vLLM介绍

在这里插入图片描述

在大模型部署这个领域,其实已经形成了相对清晰的生态分工。之前我们接触过llama.cpp和Ollama,它们各自有明确的定位:

llama.cpp主要面向资源受限的环境,比如个人电脑、边缘设备等。它的优势在于对硬件要求低,能够在CPU上运行大模型,对于个人开发者和小型应用来说非常友好。

Ollama可以理解为LlamaCPP的用户友好版本,提供了更简洁的API和更便捷的模型管理,但本质上还是基于LlamaCPP的核心。

然而,这两个方案都有一个共同的局限性:在大规模并发场景下表现不佳。当面临数百个用户同时访问,或者需要在多GPU环境下发挥最大性能时,它们就显得力不从心了。

VLLM正是为了填补这个空白。它从设计之初就瞄准了多GPU、高并发的应用场景。这不是简单的性能优化,而是架构层面的重新设计。现在流行的所有量化或加速技术,vLLM几乎都由集成,比如:

  • 使用 PagedAttention 实现动态kv cache(核心)
  • 量化:GPTQ、AWQ、INT4、INT8 和 FP8
  • 优化 CUDA 内核,包括与 FlashAttention 和 FlashInfer 的集成
  • 最先进的服务吞吐量

vLLM核心优化

kv cache问题

我们之前文章有讲到kv cache的技术原理
但是在kv cache方案中采用的是连续内存存储,
系统会按模型最大上下文长度分配内存,导致短序列也占用大量永远用不到的空间。这导致了空间浪费。
由于KV cache的存储效率低下,原本可以并行处理多个请求的显存,现在只能处理单个或少数几个请求。这就像停车场里每个车位都被过度预留空间,导致实际能停的车辆大大减少。

vLLM解决方案:PagedAttention

PagedAttention的核心思想是将每个序列的键值缓存划分成更小、更易于管理的“页面”或块。每个块包含固定数量标记的键值向量。这样,在注意力机制计算过程中,键值缓存的加载和访问效率更高。

PagedAttention的核心是以下两个工作,让我用"我爱大模型"这个具体例子来详细解释每个环节是如何工作的。

1. 分块:几乎零浪费的KV缓存

PagedAttention将这个缓存按固定大小划分成多个"页面"或"块"。

具体实现: 假设我们设置每个页面可以存储3个token的KV缓存,那么生成"我爱大模型"的过程中会这样分配:

  • Page 0:存储"我"、“爱”、"大"三个token的Key和Value向量
  • Page 1:存储"模"、"型"两个token的KV缓存,第3个位置暂时空闲

每个页面实际存储的不是字符本身,而是对应的高维向量。比如"我"这个token会产生一个512维的Key向量和一个512维的Value向量

对比kv cache,若我们的设定的允许输入1024个token,我爱大模型会一次性分配1024个空间,从而有1019个空间的浪费。PagedAttention这种方式只需要6个空间即可存储
在这里插入图片描述

2. 内存共享:高效利用KV缓存

当两个用户同时发起相似的生成请求时:

  • 用户A:要生成"我爱大模型,它很强大"
  • 用户B:要生成"我爱大模型,它很智能"

假设没有使用前缀匹配算法,那么"我爱大模型它"这个共同前缀被存储两次,造成明显的内存浪费。

而PagedAttention通过 前缀匹配检测实现智能共享,即:
系统自动识别不同请求间的相同token序列。在我们的例子中,"我爱大模型它"这5个token在两个请求中完全相同,可以共享存储。
在这里插入图片描述

使用vLLM

环境配置

项目演示在autoDL

  • GPU:至少RTX 3090(24GB)或A100(40GB/80GB)
  • Linux
  • Python 3.9 – 3.12
  • CUDA 12.1

pytorch版本之类可以先随便选一个,保证CUDA版本即可

在这里插入图片描述
成功租用后点击JupyterLab
在这里插入图片描述

安装环境

打开终端,输入命令行

conda create -n myenv python=3.12 -y
conda activate myenv
pip install vllm
# 模型下载,以QWEN为例
pip install modelscope
modelscope download --model Qwen/Qwen3-8B

从下图中我们也可以得知模型保存在了/root/.cache/modelscope/hub/models/Qwen/Qwen3-8B
在这里插入图片描述

使用方法1:作为 Python 包使用-离线推理

只需要提供 Hugging Face 的模型名称,就可以像调用函数一样进行批量推理。这对于需要进行大量离线推理的 NLP 研究人员和企业来说特别实用。

在这里插入图片描述

import vllm
llm = vllm.LLM(model="meta-llama/Meta-Llama-3.1-8B")
output = llm.generate("Tell me a story")
print(output)

使用方法2:服务器-客户端模式

第二种是通过命令行启动兼容 OpenAI API 的服务。这样就可以无缝从 OpenAI 的 API 迁移到自己的集群上,既保障了数据隐私,又可以进行各种定制化操作。

在生产环境中更为常用,允许多个并发客户端同时向端点发送请求
在这里插入图片描述

<think>好的,用户想了解如何使用vLLM部署大模型,我需要根据提供的引用和之前的回答来整理步骤和方法。首先,我得先回顾用户提供的引用内容,引用[1]提到了安装vLLM、加载模型、API部署、容器化部署以及监控优化。引用[2]则更详细地描述了在Linux环境下使用Docker进行部署的步骤,包括系统准备、Docker安装、下载模型和配置vLLM。 用户之前的问题是关于模型训练后的部署,我的回答里提到了vLLM的显存优化、动态批处理等,现在用户具体想了解vLLM部署方法。需要结合引用中的步骤,同时参考之前的回答中的工具链对比和性能优化部分,比如PagedAttention和Triton的使用。 接下来要组织步骤:首先系统准备,安装依赖,然后安装vLLM,加载模型部署服务(API),容器化部署,最后监控优化。需要确保每一步都清晰,并加入代码示例或命令,比如Docker的pull命令,Python代码示例。另外,可能要注意是否需要区分本地部署和生产环境部署的不同步骤,用户提到Docker和Kubernetes,所以需要包含这些内容。 还需要检查是否有遗漏的步骤,比如模型转换或者量化,但根据引用内容,vLLM部署可能直接加载预训练模型,所以可能不需要转换。不过之前的回答提到ONNX转换,但这里可能不需要,除非用户有特别需求。此外,要强调监控和性能优化,比如使用Prometheus和Grafana,或者vLLM自带的监控工具。 最后,确保语言简洁,步骤明确,并且参考了提供的引用和之前的回答中的相关信息。可能需要加入注意事项,比如硬件要求,常见问题解决等,以帮助用户避免常见陷阱。</think>以下是使用vLLM部署大模型的完整方法和步骤,结合工业级实践与性能优化策略: --- ### 一、**环境准备** 1. **硬件要求** - **GPU**:推荐NVIDIA A100/A800(支持FP16/INT8加速) - **显存**:模型参数量×显存系数(如LLaMA-7B需$7 \times 2.5 = 17.5$GB显存)[^1] - **存储**:预留模型文件体积的3倍空间(用于缓存和分片) 2. **软件依赖** ```bash # 基础环境 sudo apt-get install -y docker.io nvidia-container-toolkit pip install "vllm>=0.3.0" fastapi uvicorn # 验证CUDA兼容性 nvidia-smi --query-gpu=compute_cap --format=csv ``` --- ### 二、**模型部署全流程** #### **步骤1:模型加载与转换** 1. **下载HuggingFace模型** ```bash # 下载LLaMA-7B示例 git lfs install git clone https://huggingface.co/meta-llama/Llama-2-7b-chat-hf ``` 2. **vLLM模型加载** ```python from vllm import LLM, SamplingParams # 启用PagedAttention显存优化 llm = LLM( model="/path/to/Llama-2-7b-chat-hf", tensor_parallel_size=2, # 多GPU并行 gpu_memory_utilization=0.9, # 显存利用率上限 enforce_eager=True # 禁用CUDA图捕获(兼容性模式) ) ``` #### **步骤2:服务化部署** 1. **启动REST API服务** ```bash # 单节点启动(自动启用动态批处理) python -m vllm.entrypoints.api_server \ --model meta-llama/Llama-2-7b-chat-hf \ --tensor-parallel-size 2 \ --port 8000 ``` 2. **生产级部署(Docker+K8s)** ```dockerfile # Dockerfile示例 FROM nvidia/cuda:12.1.0-base RUN pip install vllm CMD ["python", "-m", "vllm.entrypoints.api_server", "--model", "meta-llama/Llama-2-7b-chat-hf"] ``` ```bash # Kubernetes部署 kubectl create deployment vllm --image=your-registry/vllm-service \ --env="MODEL_NAME=meta-llama/Llama-2-7b-chat-hf" \ --limits=nvidia.com/gpu=2 ``` #### **步骤3:性能调优** 1. **动态批处理配置** ```python # 调整批处理策略 llm = LLM( ..., max_num_seqs=256, # 最大并发请求数 max_num_batched_tokens=4096, # 单批最大token数 block_size=16 # KV缓存块大小(影响显存碎片) ) ``` 2. **监控指标采集** ```bash # Prometheus监控配置 vllm_metrics_port=8001 # 默认指标暴露端口 curl http://localhost:8001/metrics ``` - **关键指标**: - `vllm_running_requests`:实时并发请求数 - `vllm_gpu_utilization`:GPU利用率 - `vllm_pending_requests`:队列等待请求数[^1] --- ### 三、**高阶优化技巧** 1. **混合精度推理** ```python # 启用FP16量化(显存减少50%) llm = LLM( model=model_path, dtype="half", # float16精度 quantization="awq" # 激活感知权重量化(需GPU支持) ) ``` 2. **连续批处理优化** ```python # 自定义调度策略 from vllm.engine.arg_utils import AsyncEngineArgs engine_args = AsyncEngineArgs( worker_use_ray=True, # 分布式推理 disable_log_stats=False, max_parallel_loading_workers=4 ) ``` 3. **显存碎片治理** ```bash # 启用内存池优化 export VLLM_USE_MEMORY_POOL=1 export VLLM_MEMORY_POOL_SIZE=20 # 单位GB ``` --- ### 四、**客户端调用示例** ```python import requests payload = { "prompt": "中国的首都是哪里?", "max_tokens": 128, "temperature": 0.7 } response = requests.post( "http://localhost:8000/generate", headers={"Content-Type": "application/json"}, json=payload ) print(response.json()["text"]) ``` --- ### 五、**常见问题解决** 1. **OOM错误** - 降低`gpu_memory_utilization`参数(默认0.9→0.8) - 启用`VLLM_USE_MEMORY_POOL`显存池[^1] 2. **长尾延迟** - 设置`max_num_batched_tokens=2048`限制单批规模 - 增加`--max-parallel-loading-workers`提升加载并行度 3. **多GPU负载不均** - 使用`--tensor-parallel-size`匹配实际GPU数量 - 检查NCCL通信配置(`NCCL_DEBUG=INFO`) --- ### 选型建议 - **中小规模部署**:直接使用vLLM原生API Server - **企业级集群**:结合Kubernetes + Istio实现流量管理 - **超大规模模型**:集成Megatron-LM进行混合并行 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非常大模型

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值