【vLLM 学习】Distributed

【vLLM 学习】Distributed

💡 原文中文,约3000字,阅读约需7分钟。
📝

内容提要

本文介绍vLLM框架及其Helm图表部署方法,并展示一个使用Ray Data进行多节点分布式离线批处理推理的Python示例。示例通过LLMPredictor类调用Llama-2模型,配置采样参数、张量并行和实例数,从S3读取文本数据,批量生成文本并输出结果。

🔎

延伸解读

vLLM 的 KV 缓存优化

vLLM 的核心优势在于其 KV 缓存管理,通过 PagedAttention 等技术实现近乎零浪费的内存使用,解决了大模型推理中的内存瓶颈。这直接提升了吞吐量,使得在相同硬件上可以处理更多并发请求。对于部署者而言,理解这一机制有助于预估资源需求,尤其是在高并发场景下,vLLM 的内存效率能显著降低每请求的显存占用。

Ray Data 与 vLLM 的集成

示例展示了如何将 vLLM 与 Ray Data 结合,实现多节点分布式离线批处理推理。Ray Data 负责从云存储(如 S3)读取数据、进行分布式任务调度,而 vLLM 则专注于模型推理。这种集成使得大规模数据处理和推理可以无缝衔接,用户只需定义预测器类并调用 map_batches,即可自动并行处理数据,无需手动管理分布式细节。

张量并行与资源调度

代码中通过 tensor_parallel_size 控制每个实例使用的 GPU 数量,并针对不同情况设置资源参数。当张量并行度大于 1 时,需要创建放置组(placement group)来确保每个 worker 获得必要的 GPU 资源。这提醒用户,在配置多 GPU 推理时,需仔细规划资源分配,避免因资源竞争导致性能下降或任务失败。

部署与扩展注意事项

文章提到 Helm 图表用于部署 vLLM 应用,包含自动扩缩容和资源管理配置。这意味着在生产环境中,用户可以利用 Kubernetes 的弹性伸缩能力,根据负载动态调整实例数量。但需注意,扩缩容策略应与推理任务的特性匹配,例如批处理任务可能更适合固定资源,而在线服务则需更灵敏的响应。

Q&A

vLLM 是什么?它解决了什么问题?

vLLM 是一款专为大语言模型推理加速而设计的框架,实现了 KV 缓存内存几乎零浪费,解决了内存管理瓶颈问题。

如何使用 Helm 图表部署 vLLM 应用?

vLLM 提供了 Helm 图表,包含部署配置、自动扩缩容、资源管理及其他相关配置项,可用于部署 vLLM 应用。

vLLM 分布式离线批处理推理示例中,如何设置张量并行和实例数?

在示例中,通过设置 tensor_parallel_size 变量来指定每个实例的张量并行度,通过 num_instances 变量来设置实例数量。每个实例将使用 tensor_parallel_size 个 GPU。

在 vLLM 分布式推理中,为什么需要为每个实例创建放置组?

当 tensor_parallel_size > 1 时,需要为 vLLM 创建放置组,以确保每个张量并行 worker 拥有自己的资源。放置组通过 ray.util.placement_group 创建,并使用 PlacementGroupSchedulingStrategy 进行调度。

vLLM 分布式推理示例中,如何从 S3 读取数据?

示例使用 ray.data.read_text 从 S3 读取文本文件,例如:ds = ray.data.read_text("s3://anonymous@air-example-data/prompts.txt")。Ray Data 支持从云存储读取多种格式,如 JSONL、Parquet、CSV 和二进制格式。

vLLM 分布式推理示例中,如何设置推理的批次大小和并发度?

在 map_batches 调用中,通过 batch_size 参数指定批次大小(示例中为 32),通过 concurrency 参数设置并发度(即 LLM 实例的数量,示例中为 num_instances)。

vLLM 分布式推理示例中,如何输出推理结果?

示例中先使用 ds.take(limit=10) 查看前 10 个结果用于调试,生产环境建议使用 ds.write_parquet("s3://<your-output-bucket>") 将结果写入 S3,输出为 Parquet 格式。

🏷️

标签

➡️

继续阅读