人工智能場景下的網絡負載均衡技術

    

06f3069acf2857ea62291e263a398a57.jpeg

AI技術驅動智能應用井噴,智能算力增速遠超通用算力。IDC預測,未來五年,我國智能算力規模年復合增長率將超50%,開啟數據中心算力新紀元。隨著需求激增,數據中心或智算網絡亟需擴容、增速、減時延,確保網絡穩定可靠,以應對不斷升級的智能時代挑戰。

數據中心與智算網絡,如Spine-Leaf架構,拓撲規整,選路簡易。然而,服務器間常存在多條并行路徑,如Fat tree網絡中的數十條。如何在這些路徑中實現負載均衡路由,成為數據中心網絡路由設計的核心挑戰。

傳統負載均衡用的比較多的是等價成本多路徑(ECMP),ECMP下一跳的路徑是通過對數據包字段進行哈希計算并對可用路徑數取模來選擇的,來自一個流的數據包總是映射到同一路徑,因此,這些數據包將按發送順序交付,也就是通常的基于流的負載均衡(Flow-based)。

然而,研究表明,在流量高度傾斜時,ECMP無法平均分配負載到不同的路徑,如大象流場景。特別是對于當前HPC和AI場景,普遍使用RDMA并且是大帶寬場景,這個時候傳統ECMP很容易導致鏈路Hash不均,進而導致某一個鏈路擁塞。在AI/ML的應用中,GPU或其他類型的AI/ML計算單元之間他們有著非常簡單的通訊關系(流的數量非常少),并且由于他們有著極高的計算能力,導致一對通訊單元間的數據吞吐極高(單個流很大,所需的網絡帶寬極大),這就導致在這樣的應用中存在極端的負載分擔不均衡,而且這種不均衡一旦引發網絡丟包,就會對整體AI/ML的任務完成時間帶來顯著的負面影響。

網絡擁塞分為端側和矩陣擁塞。端側擁塞常見于多對一場景,通過擁塞控制算法減緩發送端流量。而矩陣擁塞源于網絡Hash不均,其解決方案包括優化Hash算法、負載均衡等策略,以緩解網絡瓶頸,確保數據傳輸的高效與穩定。

  • 胖樹架構優化:提升匯聚鏈路帶寬,采用Fat tree設計,確保輸入輸出1:1的高效收斂比,實現網絡性能飛躍。
  • VoQ(Virtual Output Queueing)技術:是一種網絡擁塞管理技術,用于防止HoL阻塞的技術,在傳統的輸入緩沖區排隊方案中,數據包先進入輸入緩沖區,然后根據目的端口的可用性從中選擇出隊。然而,當多個數據包的目的端口相同時,輸入緩沖區排隊會導致阻塞和擁塞。VoQ技術通過為每個輸出端口創建虛擬的輸出隊列,將輸入數據包直接放入對應的虛擬輸出隊列中。這樣,在數據包進入路由器或交換機時就可以直接選擇適當的虛擬輸出隊列,而無需等待目的端口的可用性。因此,VoQ技術可以避免輸入緩沖區排隊可能引起的阻塞和擁塞問題,提高網絡的吞吐量和性能;
  • 負載均衡是提升系統性能的關鍵,不同路由策略對吞吐率影響顯著。流量負載均衡策略根據粒度劃分,包括基于流、基于包、基于流片和基于信元四種。本文將深入剖析這些策略,助您優化網絡性能,提升端到端傳輸效率。

基于流(Flow based)

流負載均衡路由精準分配流量至不同路徑。傳統ECMP路由雖用哈希選路,但大小流一視同仁,導致帶寬利用率不均,且哈希沖突影響負載均衡效果。實際應用中,這些問題亟待解決,以實現更高效的流量分配。

  • 流量分布均勻時,ECMP效果優異。但面對大象流與老鼠流共存,其性能受限。這種負載不均衡在AI/ML應用中尤為突出,一旦導致網絡丟包,將嚴重影響AI/ML任務完成時間,亟需優化處理。
  • ECMP通過哈希或輪詢實現負載均衡,卻難以感知鏈路擁塞。在擁堵鏈路上運用ECMP可能加劇擁塞,亟需優化策略以緩解網絡壓力,確保數據傳輸的高效與穩定。
  • ECMP難以應對非對稱網絡性能損失。數據中心網絡故障易引發非對稱結構,影響物理鏈路均衡分布,導致流量失衡,亟待解決。

ECMP作為負載均衡策略,雖簡單且避免亂序,但受限于其缺陷,未必適用于所有場景。為提升網絡性能與流量均衡,建議采用更復雜的策略或結合先進技術,實現更高效的負載均衡。

ECMP工程因其低復雜度與可接受性能,在數據中心網絡中仍廣泛運用。為提升性能,業界提出多種優化方案,如通過集中控制器優化大流路徑選擇(如Hedera、BurstBalancer),展現了ECMP的改進潛力。

基于包(Packet based)

隨機包噴灑(RPS)是高效的包級負載均衡策略。當交換機面對多條至同目的地的等價路徑時,RPS以單個數據包為單位進行智能分散,確保數據流暢通無阻。不同于ECMP,RPS以數據包為單位操作,將同一流內的數據包導向不同路徑,提升網絡效率和性能。

RPS憑借簡易實施與細粒度負載均衡,實現高效路由選擇,提升網絡吞吐率至90%以上鏈路利用率。然而,其潛在缺陷在于流包亂序,需妥善解決。英偉達以BlueField-3 DPU結合DDP技術,巧妙處理無序數據,構建完整端到端解決方案,確保數據穩定傳輸,為您的網絡架構提供卓越性能與可靠性。

基于流片(Flowlet)

Flowlet本質是利用TCP的流突發特性,根據設置一定間隔將流分割為一個個Burst子流,然后每次切換都是在這個間隔中間,從而避免亂序。但是這個方式也有局限性:首先,Flowlet無法應對短連接場景,試想如果一個Flow一共就一個Burst,那Flowlet必然無法產生效果;其次,Flowlet是針對TCP的特性設計的,而RDMA流量并不符合相關特征,因此,在上層應用為RoCE流量時,Flowlet基本沒有效果,這也是在AI/ML等場景中不使用Flowlet的原因。

Flowlet的實現原理揭示:盡管TCP Flow中Packet看似平滑發送,實際抓包和具體實現均顯示TCP Packet以Burst方式發送,如圖所展。這一發現對理解網絡傳輸具有重要意義。

Flowlet的實現原理在于將Flow細分為多個Flowlet,以此實現負載均衡。Flowlet是介于Packet與Flow之間的單位。對于Flowlet的定量切分,我們引入參數α。當α大于兩條鏈路延遲D1和D2的差值時,Flow即可通過α被精準切分為多個Flowlet,確保數據傳輸的高效與均衡。

基于信元(Cell based)

在信元交換的網絡負載均衡機制中,接收端將報文拆分為信元,根據調度信令選擇空閑鏈路轉發,最終在目的端重組為報文。此機制突破傳統流轉發的局限,允許動態調整,基于微觀負載實時均衡利用多路徑,實現更高效的網絡資源分配。

信元交換的粒度比基于包的負載均衡還要細,理論上,帶寬利用率可以更高。信元交換本身并不是一項嶄新的技術,在目前廣泛應用的框式設備中,線卡芯片與網板芯片之間的流量交換普遍都采用了信元交換的技術,以實現機框內無阻塞交換。

不過信元交換以前主要應用在框式設備系統內部,往往都是各個交換機設備廠商自定義的信元格式和調度機制,不具備跨廠商互通的能力,此項技術可以進一步擴展,應用到整個網絡上。2019年AT&T向OCP提交了基于商用芯片的盒式路由器規范,提出了DDC(Disaggregated Distributed Chassis)的概念,DDC使用的核心技術也是信元交換的方案。

AI/ML網絡支撐的業務其特征是流數量少,單條流的帶寬大,同時流量不均勻,經常出現多打一或者多打多的情況(All-to-All和All-Reduce)。

所以極易出現流量負載不均、鏈路利用率低、頻繁的流量擁塞導致的丟包等問題,無法充分釋放算力。信元交換將報文切片成Cells(對比Packet based的負載均衡方案,粒度更小),并根據可達信息采用輪詢機制發送,流量負載會較為均衡的分配到每一條鏈路,實現帶寬的充分利用,這樣可以解決中大小流的問題,仍然存在相當多的缺陷:

  • DDC的大緩存能力雖能緩存報文,但顯著增加了硬件轉發的靜態時延。信元交換過程亦導致轉發時延上升。測試顯示,DDC的轉發時延較ETH網高出1.4倍,顯然難以滿足AI計算網絡的實時性需求。
  • 硬件依賴特定芯片實現,封閉、專用;
  • 大緩存設計增加網絡成本;

經深入分析,各負載均衡方案各具特色。部署時,粒度由小至大依次為Cell based、Packet based、Flowlet、Flow based,帶寬利用率則反之。然而,Cell based因局限性在智算領域鮮有應用。選擇方案時,需權衡粒度與帶寬利用率,確保高效且實用。

高性能計算、分布式存儲、人工智能等應用借RoCEv2協議降低CPU處理時延,提升性能。但RoCEv2源于RDMA,缺乏完善的丟包保護,對網絡丟包敏感。雖借PFC、ECN等技術力求無損網絡,仍難應對大象流/老鼠流不均影響。實現網絡負載均衡,是提升性能的關鍵所在。

在這方面,各廠家也在做各種努力嘗試。

英偉達RoCE解決方案卓越,為RDMA和TCP流定制不同策略:TCP利用Flowlet,RDMA(RoCE)則選擇逐包負載均衡。Spectrum技術通過與網絡交換機和端側DPU的緊密聯動,實現ECMP鏈路物理帶寬與端口擁塞的實時動態監控,確保每個報文負載的精準分擔,確保高效傳輸。

Spectrum-4交換機負責選擇每個數據包基于最低擁塞端口,均勻分配數據傳輸。當同一流的不同數據包通過網絡的不同路徑傳輸時,它們可能以無序的方式到達目的地。BlueField-3 DPU通過DDP處理無序數據,避免了數據報文緩存和重組的困擾,通過上述方案,在超大規模系統和高負載場景下相對傳統RoCE方案性能提升明顯。

再比如,華為的智能無損網絡,通過ACC(Automatic ECN)動態調整每個交換機的標記閾值,以分布式方式工作,并結合離線和在線訓練以適應動態流量模式,ACC在線速率下實現了老鼠流和大象流的低流完成時間,優先調度小流的報文,從而保障小流的轉發時延,提升整體吞吐性能。

 c322a6efadb5c79c8f92609ec8694fce.jpeg

-對此,您有什么看法見解?-

-歡迎在評論區留言探討和分享。-

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/16448.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16448.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16448.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

rockylinux 利用nexus 搭建私服yum倉庫

簡單說下為啥弄這個私服,因為自己要學習一些東西,比如新版的k8s等,其中會涉及到一些yum的安裝,為了防止因網絡問題導致yum安裝失敗,和重復下載,所以弄個私服,當然也有為了意外保障的想法&#x…

【實戰JVM】-基礎篇-01-JVM通識-字節碼詳解

【實戰JVM】-基礎篇-01-JVM通識-字節碼詳解-類的聲明周期-加載器 1 初識JVM1.1 什么是JVM1.2 JVM的功能1.2.1 即時編譯 1.3 常見JVM 2 字節碼文件詳解2.1 Java虛擬機的組成2.2 字節碼文件的組成2.2.1 正確打開字節碼文件2.2.2 字節碼組成2.2.3 基礎信息2.2.3.1 魔數2.2.3.1 主副…

【C++】右值引用 移動語義

目錄 前言一、右值引用與移動語義1.1 左值引用和右值引用1.2 右值引用使用場景和意義1.3 右值引用引用左值及其一些更深入的使用場景分析1.3.1 完美轉發 二、新的類功能三、可變參數模板 前言 本篇文章我們繼續來聊聊C11新增的一些語法——右值引用,我們在之前就已…

進程間通信的方式中,socket和消息隊列的區別

進程間通信的方式中,socket和消息隊列的區別 進程間通信方式中,socket和消息隊列的主要區別在于通信的方式和跨機通信的能力。 socket是通過網絡傳輸的方式來實現進程間通信,并且可以跨主機;而消息隊列是通過內核提供的緩沖區進…

Flutter 中的 AbsorbPointer 小部件:全面指南

Flutter 中的 AbsorbPointer 小部件:全面指南 在Flutter中,AbsorbPointer是一個特殊的小部件,用于吸收(或“吞噬”)所有傳遞到其子組件的指針事件(如觸摸或鼠標點擊)。這在某些情況下非常有用&…

民國漫畫雜志《時代漫畫》第22期.PDF

時代漫畫22.PDF: https://url03.ctfile.com/f/1779803-1248634856-2c7010?p9586 (訪問密碼: 9586) 《時代漫畫》的雜志在1934年誕生了,截止1937年6月戰爭來臨被迫停刊共發行了39期。 ps: 資源來源網絡!

Typescript高級: 深入理解Extract類型

概述 在TypeScript這一逐漸成為前端開發首選的靜態類型檢查語言中&#xff0c;類型系統提供了豐富的工具來幫助開發者編寫更加健壯和可維護的代碼。其中&#xff0c;Extract<T, U>是一個強大的內置實用類型&#xff0c;用于從一個聯合類型T中提取出屬于另一個類型U的那些…

AIGC 006-textual-inversion使用文本反轉實現個性化文本到圖像生成!

AIGC 006-textual-inversion使用文本反轉實現個性化文本到圖像生成&#xff01; 文章目錄 0 論文工作1 論文方法2 效果 0 論文工作 這篇論文 (An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion) 提出了一種新穎的技術&#xff0c…

Modal.method() 不顯示頭部的問題

ant-design中的Modal組件有兩種用法&#xff1a; 第一種是用標簽&#xff1a;<a-modal></a-modal> 第二種是用Api&#xff1a;Modal.info、Modal.warning、Modal.confirm...... 一開始項目中這兩種用法是混用的&#xff0c;后面UI改造&#xff0c;需要統一樣式&…

一個程序員的牢獄生涯(37)任務

星期一 任 務 我走回大鐐面前后,把雙手抱著的衣服遞給大鐐,但我并沒有把手里的東西也遞給他。現在的大鐐坐著,我站著,這個時候要給大鐐的話,肯定能被身邊的棍子或六子看到,甚至被所有號子里的人都看到。因為此時,所有人的目光都盯著我手里的衣服,盯著我和大鐐看。 “鐐…

Shell字符串變量

目標 能夠使用字符串的3種方式 掌握Shell字符串拼接 掌握shell字符串截取的常用格式 能夠定義Shell索引數組和關聯數組 能夠使用內置命令alias,echo,read,exit,declare操作 掌握Shell的運算符操作 Shell字符串變量 介紹 字符串&#xff08;String&#xff09;就是一系…

使用LabVIEW時遇到VISA屬性錯誤 -1073807331的解決方案

在LabVIEW或VeriStand中使用VISA屬性時&#xff0c;可能會遇到錯誤 -1073807331。這一錯誤的具體描述如下&#xff1a; 解決方案 導致VISA屬性出現此錯誤的原因主要有以下四種&#xff1a; 屬性不被使用的串行總線支持 示例 A.1&#xff1a;Is Port Connected VISA屬性僅支持由…

React(四)memo、useCallback、useMemo Hook

目錄 (一)memo API 1.先想一個情景 2.用法 (1)props傳入普通數據類型的情況 (2)props傳入對象的情況 (3)props傳入函數的情況 (4)使用自定義比較函數 3.什么時候使用memo&#xff1f; (二)useMemo Hook 1.用法 2.useMemo實現組件記憶化 3.useMemo實現函數記憶化 …

如何停止 iPad 和 iPhone 之間共享短信,獨立接收和發送消息

概括 在當今高度互聯的數字世界中&#xff0c;Apple 設備之間的無縫連接性提供了極大的便利&#xff0c;尤其是在消息同步方面。iPhone 和 iPad 用戶通常可以享受到設備間短信的自動同步功能&#xff0c;這意味著無論是在哪個設備上&#xff0c;用戶都可以接收和回復消息。然而…

2024.5.26.python.exercise

# # 導入包 # from pyecharts.charts import Bar, Timeline # from pyecharts.options import LabelOpts, TitleOpts # from pyecharts.globals import ThemeType # # # 從文件中讀取信息 # GDP_file open("1960-2019全球GDP數據.csv", "r", encoding&quo…

A. Maximize?

time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You are given an integer x&#x1d465;. Your task is to find any integer y&#x1d466; (1≤y<x)(1≤&#x1d466;<&#x1d465;) su…

深入理解python列表與字典:數據結構的選擇與性能差異

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、列表與字典&#xff1a;基礎數據結構的對比 二、列表&#xff1a;逐個遍歷的查找方式 …

Ceres求解優化問題

1. 簡介 Ceres Solver是專門用于求解非線性最小二乘問題的C開源庫,研究SLAM方向不過濾波和優化兩個技術路線,因此常用Ceres庫解決實際項目中的優化問題,當然還有g2o同樣可用,但就說明文檔而言,Ceres對新用戶更友好,g2o提供不多的文檔,更多是需要參考其它開源項目使用,所以筆者…

【JAVA】接口

前面我們說了說抽象類相關內容&#xff0c;這篇我們主要聊聊接口相關內容&#xff0c;這部分很重要&#xff0c;大家引起關注。 1. 接口 1.1 接口的概念 接口就是公共的行為規范標準&#xff0c;大家在實現時&#xff0c;只要符合規范標準&#xff0c;就可以通用。在Java中&am…

力扣 739. 每日溫度 python AC

單調棧 class Solution:def dailyTemperatures(self, temperatures):size len(temperatures)ll []ans [0] * sizefor i in range(size - 1, -1, -1):while ll and temperatures[i] > temperatures[ll[-1]]:ll.pop()if ll:ans[i] ll[-1] - ill.append(i)return ans