深入解析 vLLM 分布式推理与部署策略

在当今人工智能快速发展的时代,大型语言模型(LLM)的推理和部署面临着诸多挑战,尤其是当模型规模日益庞大时,如何高效地利用硬件资源成为关键问题。vLLM 作为一种强大的工具,为分布式推理和部署提供了多种策略,本文将详细探讨其相关技术和应用场景,希望能对您提供有价值的参考。

分布式推理策略的选择

在开始分布式推理和部署之前,明确何时采用分布式推理以及可选的策略至关重要。

  1. 1. 单 GPU 推理 :如果模型能够在单个 GPU 内运行,那么无须使用分布式推理,直接利用单 GPU 进行推理即可,这是最简单且高效的方式。

  2. 2. 单节点多 GPU(张量并行推理) :当模型无法在单个 GPU 内运行,但可以在配备多个 GPU 的单个节点上容纳时,张量并行(tensor parallelism)技术就派上了用场。张量并行的大小即为该节点上参与计算的 GPU 数量。例如,拥有 4 个 GPU 的单节点,可将张量并行大小设为 4,让多个 GPU 协同工作完成推理任务。

  3. 3. 多节点多 GPU(张量并行与流水线并行相结合的推理) :若模型规模巨大,以至于单个节点的 GPU 资源都无法满足需求,此时需要利用张量并行与流水线并行(pipeline parallelism)的组合方案。张量并行大小对应每个节点上使用的 GPU 数量,流水线并行大小则是所用节点的数量。以 16 个 GPU 分布在 2 个节点(每个节点 8 个 GPU)为例,可将张量并行大小设为 8,流水线并行大小设为 2,从而在多个节点上高效地进行模型推理。

总的来说,应逐步增加 GPU 和节点的数量,直至 GPU 内存足以容纳模型。确定好张量并行和流水线并行的大小后,先运行 vLLM,其会输出类似 “# GPU blocks: 790” 的日志,将该数值乘以 16(块大小),可大致估算出当前配置下能够服务的最大 token 数。若此数值不理想,如期望更高的吞吐量,则可继续增加 GPU 或节点数量,直至块数量满足需求。

另外,还有一种特殊情况:如果模型可以容纳在单个节点的多个 GPU 中,但 GPU 数量无法整除模型大小,此时可以采用流水线并行。它沿着模型层进行分割,支持不均匀分割。在这种情况下,张量并行大小应为 1,流水线并行大小设为 GPU 的数量。

vLLM 在单节点上的运行

vLLM 支持分布式张量并行和流水线并行推理及服务。目前,其采用 Megatron-LM 的张量并行算法,并通过 Ray 或 Python 原生 multiprocessing 来管理分布式运行时。在单节点部署时,可使用 multiprocessing;而多节点推理目前需要 Ray。

默认情况下,当未在 Ray placement group 中运行且同一节点上有足够的 GPU 满足配置的 “tensor_parallel_size” 时,会使用 multiprocessing,也可以通过 “LLM” 类的 “distributed_executor_backend” 参数或 “--distributed-executor-backend” API 服务器参数来覆盖此默认设置,将其设为 “mp” 表示使用 multiprocessing,“ray” 表示使用 Ray,且在 multiprocessing 情况下无须安装 Ray。

  1. 1. 使用 LLM 类进行多 GPU 推理 :设置 “tensor_parallel_size” 参数为想要使用的 GPU 数量。例如,在 4 个 GPU 上运行推理:

from vllm import LLM
llm = LLM("facebook/opt-13b", tensor_parallel_size=4)
output = llm.generate("San Francisco is a")
  1. 2. 启动多 GPU 服务 :在启动服务器时传入 “--tensor-parallel-size” 参数。例如,在 4 个 GPU 上运行 API 服务器:

 vllm serve facebook/opt-13b \--tensor-parallel-size 4

此外,还可以通过指定 “--pipeline-parallel-size” 来启用流水线并行。例如,在 8 个 GPU 上同时使用流水线并行和张量并行运行 API 服务器:

 vllm serve gpt2 \--tensor-parallel-size 4 \--pipeline-parallel-size 2

vLLM 在多节点上的运行

当单个节点的 GPU 资源不足以运行模型时,可利用多个节点来进行模型运行。确保所有节点的执行环境相同,包括模型路径和 Python 环境至关重要。推荐使用 docker 镜像来保证环境一致性,并通过将主机映射到相同的 docker 配置来隐藏主机硬件的异构性。

  1. 1. 启动容器并组建集群 :vLLM  在github上,提供了示例脚本 examples/online_serving/run_cluster.sh 来启动集群。需注意,该脚本以非管理权限启动 docker,这在运行分析和跟踪工具时可能无法访问 GPU 性能计数器。若需此权限,可在 docker run 命令中使用 “--cap-add” 选项添加 “CAP_SYS_ADMIN” 权限。

选择一个节点作为主节点,运行以下命令:

bash run_cluster.sh \vllm/vllm-openai \ip_of_head_node \--head \/path/to/the/huggingface/home/in/this/node \-e VLLM_HOST_IP=ip_of_this_node

在其余的工作节点上,运行以下命令:

bash run_cluster.sh \vllm/vllm-openai \ip_of_head_node \--worker \/path/to/the/huggingface/home/in/this/node \-e VLLM_HOST_IP=ip_of_this_node

这样就形成了一个由容器组成的 Ray 集群。需要注意的是,运行这些命令的 shell 必须保持运行状态以维持集群,任何 shell 断开连接都会导致集群终止。此外,参数 “ip_of_head_node” 应为主节点的 IP 地址,且该 IP 地址必须能够被所有工作节点访问。每个工作节点的 IP 地址应通过 “VLLM_HOST_IP” 环境变量指定,并且各节点的 IP 地址必须不同。要确保集群中的节点可以通过指定的 IP 地址相互通信。

值得注意的是,出于安全和性能考虑,最好将 “VLLM_HOST_IP” 设置为私有网络段上的地址。因为通过此网络发送的流量未加密,且端点之间交换的数据格式如果被恶意方获取网络访问权限,可能存在执行任意代码的风险,所以必须确保该网络无法被任何不受信任的方访问。

注意:由于这是一个由容器组成的 Ray 集群,所有后续命令都应在容器内执行,否则会在主机上执行命令,而主机未连接到 Ray 集群。要进入容器,可以使用 “docker exec -it node /bin/bash” 命令。

进入容器后,可执行 “ray status” 和 “ray list nodes” 命令来检查 Ray 集群的状态,应能看到正确的节点数量和 GPU 数量。

  1. 2. 在集群中运行 vLLM :在任意节点再次进入容器后,像在单节点上运行 vLLM 一样,只需在该节点上运行 “vllm” 命令,即可利用 Ray 集群中所有节点的 GPU 资源。通常的做法是将张量并行大小设置为每个节点上的 GPU 数量,流水线并行大小设置为节点数量。例如,若拥有 16 个 GPU 分布在 2 个节点(每个节点 8 个 GPU),可设置张量并行大小为 8,流水线并行大小为 2:

 vllm serve /path/to/the/model/in/the/container \--tensor-parallel-size 8 \--pipeline-parallel-size 2

也可以仅使用张量并行而不使用流水线并行,只需将张量并行大小设置为集群中 GPU 的总数。例如,若 2 个节点(每个节点 8 个 GPU)共有 16 个 GPU,可设置张量并行大小为 16:

vllm serve /path/to/the/model/in/the/container \--tensor-parallel-size 16

为使张量并行性能优异,需确保节点间的通信高效,例如使用高速网卡(如 Infiniband)。要正确设置集群以使用 Infiniband,可在 “run_cluster.sh” 脚本中添加类似 “--privileged -e NCCL_IB_HCA=mlx5” 的额外参数。可咨询系统管理员以获取更多关于设置标志的信息。一种确认 Infiniband 是否正常工作的方法是运行带有 “NCCL_DEBUG=TRACE” 环境变量的 vLLM,例如 “NCCL_DEBUG=TRACE vllm serve ...”,然后查看日志中的 NCCL 版本和所用网络。如果日志中出现 “[send] via NET/Socket”,则表示 NCCL 使用原始 TCP Socket,这对于跨节点的张量并行来说效率不高;如果出现 “[send] via NET/IB/GDRDMA”,则表示 NCCL 使用了带 GPU-Direct RDMA 的 Infiniband,这是一种高效的通信方式。

注意:在启动 Ray 集群后,最好还检查节点间的 GPU - GPU 通信,这可能需要进行一些复杂的设置。可参考 sanity check 脚本来获取更多信息(https://docs.vllm.ai/en/latest/usage/troubleshooting.html#incorrect-hardwaredriver)。如果需要设置一些环境变量来配置通信,建议在创建集群时将它们添加到 “run_cluster.sh” 脚本中,例如 “-e NCCL_SOCKET_IFNAME=eth0”。因为仅在 shell 中设置环境变量(如 “NCCL_SOCKET_IFNAME=eth0 vllm serve ...”)仅对同一节点上的进程有效,而无法对其他节点上的进程生效。

另外,要确保在所有节点上下载了模型(路径相同),或者模型被下载到所有节点都可以访问的分布式文件系统中。当使用 huggingface 仓库 ID 来引用模型时,应在 “run_cluster.sh” 脚本中追加你的 huggingface 令牌,例如 “-e HF_TOKEN=” 。推荐的做法是先下载模型,然后使用路径来引用模型。

注意:如果在多节点推理时,尽管集群中有足够的 GPU,却一直收到 “Error: No available node types can fulfill resource request” 的错误消息,很可能是因为节点具有多个 IP 地址,而 vLLM 无法找到正确的 IP 地址。请确保 vLLM 和 Ray 使用相同的 IP 地址。可以在 “run_cluster.sh” 脚本中为每个节点正确设置 “VLLM_HOST_IP” 环境变量,并通过 “ray status” 和 “ray list nodes” 查看 Ray 使用的 IP 地址。

综上所述,vLLM 的分布式推理和部署策略为应对大型语言模型的运行挑战提供了灵活且高效的解决方案。无论是单节点多 GPU 还是多节点多 GPU 的场景,都能通过合理配置张量并行和流水线并行的大小,充分利用集群资源,实现高效的模型推理。在实际应用中,需根据具体硬件环境和模型规模,仔细调整相关参数,并注意各种潜在的问题和注意事项,以确保 vLLM 能够稳定、高效地运行,为人工智能领域的研究和应用提供有力支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915561.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL 终端命令详解及实际应用案例

PostgreSQL 作为一款功能强大的开源关系型数据库,其终端命令是数据库管理员、开发人员日常操作的核心工具。这些命令覆盖数据库连接、对象管理、数据操作、备份恢复、权限控制等多个维度,掌握其实际应用场景能显著提升工作效率。本文结合不同行业的实操案…

步进电机基础

1、ENABLE‾\overline{ENABLE}ENABLE 的意思: ENABLE上面的横线表示这是一个低电平有效的信号:当ENABLE信号为低电平(0V或逻辑0)时,芯片被使能(激活)当ENABLE信号为高电平(VDD或逻辑…

Redis进阶--缓存

目录 一、引言 二、介绍 1.为什么Mysql的速度慢呢? 2.缓存更新策略 1.定期生成 2.实时生成 3.redis的内存淘汰机制 4.注意事项 1.缓存预热 2.缓存穿透 3.缓存击穿 4.缓存雪崩 三、总结 一、引言 本篇文章将介绍Redis其中一个重要的作用,作为…

微软原版系统下载的几个好用网站

“不要因为走得太远,而忘记为什么出发。” 愿每一位Windows用户,都能在这份情怀中找到属于自己的小确幸!满满的情怀! 微软官方渠道 微软官网提供纯净的ISO镜像下载,适用于Windows 10/11等系统。访问Microsoft官网下…

kotlin Flow快速学习2025

其实,第一章节,只是让你了解下Flow的基本情况。我们开发中,基本很少使用这种模式。所以来讲,我们甚至可以直接使用StateFlow和SharedFlow才是正途。这是很多教程没有说明的点。所以第一章随便浏览下即可。日后再补充理解都是可以的…

【人工智能99问】什么是教师强制?(16/99)

文章目录什么是教师强制?教师强制(Teacher Forcing)的定义原比例(Original Proportion)教师强制的举例说明(一)教师强制的举例说明(二)优点和缺点解决曝光偏差的方法什么…

【WPF】WPF 自定义控件之依赖属性

📦 WPF 自定义控件之依赖属性 在开发 WPF 应用时,自定义控件能帮助我们复用逻辑和样式,但我很快会遇到一个问题:在控件内部如何支持数据绑定和属性变更通知?特别是我们继承自 Control 的时候,已经不能再继承…

DOM型XSS破坏

目录 首先 然后 第一种 第二种&#xff08;DOM&#xff09; HTMLCollection HTML Relationships Custom 解 首先 <script>//urlencode解码 //location接口的hash属性是一个字符串&#xff0c;包含一个“#”后跟位置URL的片段标识符。如果URL没有片段标识符&#…

Linux C 多线程基本操作

我们已经了解进程的基本概念&#xff1a;进程是正在执行的程序&#xff0c;并且是系统资源分配的基本单位。当用户需要在一台计算机上去完成多个独立的工作任务时&#xff0c;可以使用多进程的方式&#xff0c;为每个独立的工作任务分配一个进程。多进程的管理则由操作系统负责…

C语言基础:二维数组练习题

1. 一个二维数组赋了初值&#xff0c;用户输入一个数&#xff0c;在该二维数组中查找。找到则返回行列位置&#xff0c;没找到则提示。#include <stdio.h>int main() {int arr[3][3] {{1, 2, 3},{4, 5, 6},{7, 8, 9}};int t;printf("要查找的数&#xff1a;")…

Java面试题034:一文深入了解MySQL(6)

Java面试题029&#xff1a;一文深入了解MySQL&#xff08;1&#xff09; Java面试题030&#xff1a;一文深入了解MySQL&#xff08;2&#xff09; Java面试题031&#xff1a;一文深入了解MySQL&#xff08;3&#xff09; Java面试题032&#xff1a;一文深入了解MySQL&#x…

Java基础教程(011):面向对象中的构造方法

10-面向对象-构造方法 构造方法也叫做构造器、构造函数。 作用&#xff1a;在创建对象的时候给成员变量进行初始化的。 ✅ 一、构造方法的特点特点说明与类同名构造方法的名称必须与类名相同没有返回类型构造方法没有返回值&#xff0c;甚至不能写 void自动调用使用 new 创建对…

Adobe Photoshop:数字图像处理的终极工具指南

Hi&#xff0c;我是布兰妮甜 &#xff01;Adobe Photoshop自1990年问世以来&#xff0c;已经成为数字图像处理领域的标杆和代名词。这款强大的软件不仅彻底改变了摄影、设计和艺术创作的方式&#xff0c;还深刻影响了我们消费和感知视觉内容的文化方式。从专业摄影师到社交媒体…

本期来讲讲什么是LVS集群?

集群和分布式 集群&#xff08;Cluster&#xff09;&#xff0c;解决某个问题将多台计算机组合形成的系统群。 常见的集群类型&#xff1a; 负载均衡(LoadBalancing&#xff0c;简称LB)&#xff1a;由多个相同配置的主机组成&#xff0c;每个主机经过调度承担部分访问&#…

JVM 类加载过程笔记

一、概述 JVM&#xff08;Java Virtual Machine&#xff09;在运行 Java 程序时&#xff0c;需要将 .class 字节码文件加载到内存中&#xff0c;并转换成可以被 JVM 执行的数据结构&#xff0c;这一过程就是 类加载过程&#xff08;Class Loading Process&#xff09;。 JVM 的…

基于爬虫技术的电影数据可视化系统 Python+Django+Vue.js

本文项目编号 25002 &#xff0c;文末自助获取源码 \color{red}{25002&#xff0c;文末自助获取源码} 25002&#xff0c;文末自助获取源码 目录 一、系统介绍二、系统录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状 六、核心代码6.1 查询数据6.2 新…

如何用 LUKS 和 cryptsetup 为 Linux 配置加密

在信息安全愈发重要的今天&#xff0c;为 Linux 系统盘配置全盘加密已经成为很多企业和个人的选择。LUKS&#xff08;Linux Unified Key Setup&#xff09;配合工具 cryptsetup 可以在不牺牲性能的前提下实现高强度加密。本文将通过一个故事化的场景&#xff0c;介绍整个配置过…

VIVADO技巧_BUFGMUX时序优化

1.版本说明日期作者版本说明2025xxxx风释雪初始版本 2.概述 基于VIVADO时序约束&#xff0c;BUFGMUX多路时钟选择原语的设计3.原语介绍 7系列FPGA/UltraSCale/UltraSCaleBUFGMUX_CTRL BUFGMUX_CTRL_inst (.O(O), // 1-bit output: Clock output.I0(I0), // 1-bit input: Cloc…

服务器系统时间不准确怎么办?

服务器系统时间不准确可能会导致日志错乱、任务调度失败、SSL证书校验错误等问题。以下是解决办法&#xff1a;&#x1f310; 一、同步系统时间的方法1. 使用 timedatectl 命令&#xff08;适用于 systemd 系统&#xff09;timedatectl set-ntp true # 开启自动同步 timedatect…