vllm离线部署-离线推理服务的大模型生命周期
仅当发生实际的调用请求时,大模型资源才会被加载到显存中,当调用请求结束,大模型会立即被卸载。这种模式会导致每产生一轮新的调用都会重新加载大模型、产生非常大的响应延迟。
离线推理通常用于非实时性任务,比如数据预处理、批量文本生成、模型评估等不要求实时返回响应结果,但需要高吞吐量的场景
vllm在线部署-服务器参数
vllm在线部署-服务启动参数
- 只需要关注--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 <张量并行组数量>
- HTTP服务器启动后,首先可以访问http://localhost:6006/docs 来看"Swagger UI"
vllm模型推理参数
- 单卡3090(24G显存) 启动失败
错误信息:大模型最大序列长度131072,所需kv缓存内存7GB,可用kv缓存内存5.49GB。显存不足,无法加载模型权重
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
3.2. max_model_len 设置90000 启动成功
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
推理类模型在线推理
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