深入解析 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
英文地址,請注明出處:http://en.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…