当前位置: 首页 > news >正文

深入解析 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.dtcms.com/a/286214.html

相关文章:

  • ChatBot 还能记住我是谁?深度解析对话系统中的记忆机制
  • 一文通晓25G多模光模块:SFP-25G-SR和SFP-25G-ESR的区别
  • 机器学习基础:线性回归算法详解(原理+代码+实战)
  • 视频讲解:XGBoost梯度提升树原理及用Python对房价等数据集多案例应用分析
  • 网络(TCP)
  • 百炼MCP与IoT实战(三):手搓自定义MCP Server与阿里云FC配置
  • CMU-15445(2024fall)——PROJECT#0
  • iOS 文件深度调试实战 查看用户文件 App 沙盒 系统文件与日志全指南
  • 【橘子分布式】gRPC(编程篇-上)
  • vue2 面试题及详细答案150道(91 - 100)
  • 人工智能概念之九:深度学习概述
  • kafka 单机部署指南(KRaft 版本)
  • 基于MATLAB的GA遗传算法优化BP神经网络的数据分类预测方法应用
  • 在ComfyUI中CLIP Text Encode (Prompt)和CLIPTextEncodeFlux的区别
  • docker gitlab 备份 恢复 版本升级(16.1.1到18.2.0)
  • SpringAI核心特性与Prompt工程
  • 六个直播回放的功能,助力在线教育蓬勃发展!
  • AR技术重塑电力巡检:效率提升与智能升级
  • Kubernetes (k8s)、Rancher 和 Podman 的异同点分析
  • 题解:CF1617C Paprika and Permutation
  • Redis学习其二(事务,SpringBoot整合,持久化RDB和AOF)
  • MySQL查询优化与事务实战指南
  • 【PTA数据结构 | C语言版】我爱背单词
  • 前端埋坑之element Ui 组件el-progress display:flex后不显示进度条解决方案
  • Java实战:实时聊天应用开发(附GitHub链接)
  • http性能测试命令ab
  • IntelliJ IDEA大括号格式设置:换行改行尾
  • Java 核心工具类 API 详解(一):从 Math 到 Runtime 的实用指南
  • 【AI News | 20250717】每日AI进展
  • 【解码文本世界的“隐形分界线”:Windows与Linux回车换行之谜】