vllm部署优化策略+在线推理应用

127 阅读4分钟

vllm离线部署-离线推理服务的大模型生命周期

仅当发生实际的调用请求时,大模型资源才会被加载到显存中,当调用请求结束,大模型会立即被卸载。这种模式会导致每产生一轮新的调用都会重新加载大模型、产生非常大的响应延迟。

离线推理通常用于非实时性任务,比如数据预处理、批量文本生成、模型评估等不要求实时返回响应结果,但需要高吞吐量的场景

vllm在线部署-服务器参数

image.png

vllm在线部署-服务启动参数

b0cee52a-d5f5-4463-8335-8269380ad780.png

  • 只需要关注--host 指定服务器的主机地址 和 --port 指定服务器的端口号
  • 在autodl云服务器上部署,需要开放端口,如下命令(包含启动命令)
  • 注意: 一定要在Qwen2.5-7B文件夹下运行
vllm serve Qwen2.5-7B --served-model-name qwen2.5-7b --api_key muyu --host 0.0.0.0 --port 6006 --trust_remote_code --tensor_parallel_size 2

vllm serve <模型名称> --served-model-name <模型别名> --api_key <API密钥> --host <服务器地址> --port <端口号> --trust_remote_code --tensor_parallel_size <张量并行组数量> 

image.png image.png

  1. HTTP服务器启动后,首先可以访问http://localhost:6006/docs 来看"Swagger UI"

image.png

vllm模型推理参数

  1. 单卡3090(24G显存) 启动失败

错误信息:大模型最大序列长度131072,所需kv缓存内存7GB,可用kv缓存内存5.49GB。显存不足,无法加载模型权重

image.png

2.缓存优化算法

在传统KV缓存管理中,系统需要为每个输入序列预先分配一块连续的内存空间,用于存储该序列生成的所有键值张量。由于序列长度是动态变化的(例如用户可能输入1个token或1000个token),系统为了保证内存足够,通常会按最大可能长度预留内存(例如为每个序列预留支持2048 token的内存)。当多个序列的内存块被频繁分配和释放后,内存中会出现许多不连续的小块空闲内存。尽管这些碎片的总和可能足够大,但它们无法被合并用于存储较大的新序列,导致内存利用率进一步下降。

2.1. PagedAttention算法

需要理解的是:PagedAttention 背后的想法是创建映射到GPU内存中物理块的连续虚拟块,通过虚拟内存管理来解决GPU内存碎片化的问题。它把键值对分成固定大小的块,这些块在虚拟地址空间中是连续的,但物理内存中可以分散。这样在推理时,只需要按需加载需要的块,减少内存浪费,提高效率。

图解算法:zhuanlan.zhihu.com/p/691038809

3.max_model_len 参数

max_model_len的值不能超过训练过程中设置的max_position_embeddings的值的,否则会报错;其次需要逐步降低max_model_len的值,可以使kv的内存需求降低

3.1. max_model_len 设置150000 报错

max_model_len 超过 config.json中的max_position_embeddings

image.png

image.png

3.2. max_model_len 设置90000 启动成功

image.png

4.max_num_seqs参数

该参数用来指定并发请求上限:max_num_seqs 会限制AsyncLLMEngine引擎同时处理的请求数量(即 batch_size 的最大值)。 其底层的执行逻辑是:AsyncLLMEngine 会根据 max_num_seqs 将多个请求动态合并为一个批处理(如 4 个请求合并为 1 个 batch),但总序列数不能超过此值。 当进行高并发时,超过 max_num_seqs 会被阻塞(排队等待),直到有槽位释放

所以,如果我们把max_model_len 设置的很大,比如 100000,那么 max_num_seqs 就需要降低(默认是256),可以这样设置

max_num_seqs 默认值是256。取值越大,能处理的请求数量就会越大,但提升也会有上限

vllm serve Qwen2.5-7B --max_model_len 100000 --served-model-name qwen2.5-7b-131072 --gpu_memory_utilization 0.90 --max_num_seqs 16 --tensor-parall
el-size 1 --api_key muyu --host 0.0.0.0 --port 6006 --trust_remote_code

image.png

推理类模型在线推理

vLLM 框架支持 DeepSeek R1系列、Qwen QwQ模型和IBM Granite 3.2 language models 的推理类模型接口的兼容。但是注意:只有QWQ模型目前支持Function Calling功能。与对话类模型不同,推理类模型因存在思考过程,所以在启动推理模型时,需要按照vLLM的规范指定--enable-reasoning--reasoning-parser deepseek_r1 参数。完整命令如下所示: --enable-reasoning 在更高的vllm版本中,该参数可被省略,目前博主使用的是0.11.0

vllm serve DeepSeek-R1-Distill-Qwen-7B --max_model_len 50000 --served-model-name deepseek-r1:7b --gpu_memory_utilization 0.90 --tensor-parallel-size 1 --api_key muyu --host 0.0.0.0 --port 6006 --trust_remote_code --reasoning-parser deepseek_r1 --enable-reasoning