Volcano 實戰快速入門 (一)

一、技術背景

隨著大型語言模型(LLM)的蓬勃發展,其在 Kubernetes (K8s) 環境下的訓練和推理對資源調度與管理提出了前所未有的挑戰。這些挑戰主要源于 LLM 對計算資源(尤其是 GPU)的巨大需求、分布式任務固有的復雜依賴性、多租戶環境下的公平性保障以及對資源利用率(特別是昂貴的 GPU 資源)的極致追求。標準的 Kubernetes 調度器 kube-scheduler 主要面向無狀態服務設計,在處理大規模、緊密耦合、資源密集型的批處理工作負載(如 LLM 訓練)時顯得力不從心。

Volcano 作為云原生計算基金會(CNCF)的首個也是目前唯一的容器批量計算項目,旨在彌補 Kubernetes 在批處理和高性能計算(HPC)領域的短板。它不僅僅是一個調度器,更是一個完整的批處理系統,引入了如 VolcanoJobPodGroup 等關鍵抽象。Volcano 通過提供 Gang Scheduling(成組調度)、多種 Fair-share(公平共享)策略、先進的隊列管理(包括分層隊列和彈性隊列)、拓撲感知(網絡拓撲和 NUMA)以及優先級與搶占等核心功能,直接應對 LLM 場景下的資源管理難題。

1.1 Kubernetes 管理大模型(LLM)資源面臨的核心挑戰

  • 極端規模與動態需求 (Extreme Scale & Dynamic Needs): LLM 的訓練和推理需要海量的計算(數千 GPU/TPU)、存儲(TB 級數據)資源,且需求波動巨大。這超出了傳統 Kubernetes 資源管理和彈性伸縮的常規能力范圍。

  • 缺乏原子性調度 (Lack of Atomic Scheduling / Gang Scheduling): 分布式訓練任務(如參數服務器和 Worker 組)要求所有組件同時啟動(All-or-Nothing)。Kubernetes 默認以 Pod 為單位調度,缺乏對“任務組”的原生支持,易導致部分 Pod 啟動后等待,造成資源死鎖和 GPU 等昂貴資源的閑置浪費。

  • 多租戶公平性 (Multi-Tenant Fairness): 在共享集群中,如何在多個用戶、團隊或不同優先級任務間公平分配稀缺資源(尤其是 GPU)是一個難題。默認調度機制簡單,易導致資源分配不均和“資源饑餓”現象。

  • GPU 利用率低下與碎片化 (GPU Underutilization & Fragmentation): 最大化昂貴的 GPU 利用率至關重要。靜態分配、I/O 等待以及調度不當導致的 GPU 碎片化(集群總 GPU 充足但單個節點不足)普遍存在,難以維持高資源利用率。管理異構 GPU 增加了復雜性。

  • 網絡瓶頸與拓撲感知缺失 (Network Bottlenecks & Lack of Topology Awareness): 分布式訓練對節點間通信帶寬和延遲高度敏感。默認調度器通常不感知網絡拓撲,可能將需要頻繁通信的 Pod 分散部署,導致通信開銷劇增,嚴重影響訓練效率。

  • 推理延遲 (Inference Latency): 滿足 LLM 實時推理的低延遲要求,在 Kubernetes 的網絡和服務抽象層下存在挑戰,需要高效的路由和可能的邊緣部署策略。

這些挑戰主要源于 Kubernetes 默認調度器的設計側重:它為微服務(數量多、相對獨立、長周期)而非 LLM 類批處理任務(規模大、強依賴、資源密集、周期相對短)優化。其以 Pod 為中心、缺乏作業整體性和拓撲感知的調度邏輯難以滿足 LLM 需求。

解決這些問題不僅關乎技術效率,更具經濟與戰略價值。提升 GPU 利用率、縮短訓練時間、實現公平共享,能顯著降低 AI 成本、加速創新并提升投資回報

因此,LLM 的興起迫切需要超越 K8s 默認能力的云原生批處理調度方案,這推動了 Volcano、YuniKorn、Koordinator 等旨在彌補 K8s 在高性能計算與大數據處理方面短板的項目的發展。

1.2. Volcano 簡介

Volcano是CNCF 下首個也是唯一的基于Kubernetes的容器批量計算平臺,主要用于高性能計算場景。它提供了Kubernetes目前缺 少的一套機制,這些機制通常是機器學習大數據應用、科學計算、特效渲染等多種高性能工作負載所需的。作為一個通用批處理平臺,Volcano與幾乎所有的主流計算框 架無縫對接,如Spark 、TensorFlow 、PyTorch 、 Flink 、Argo 、MindSpore 、 PaddlePaddle,Ray等。它還提供了包括異構設備調度,網絡拓撲感知調度,多集群調度,在離線混部調度等多種調度能力。Volcano的設計 理念建立在15年來多種系統和平臺大規模運行各種高性能工作負載的使用經驗之上,并結合來自開源社區的最佳思想和實踐。

a) 基礎概念

VolcanoJob (vcjob): 是Volcano自定義的Job資源類型。區別于Kubernetes Job,vcjob提供了更多高級功能,如可指定調度器、支持最小運行pod數、 支持task、支持生命周期管理、支持指定隊列、支持優先級調度等。Volcano Job更加適用于機器學習、大數據、科學計算等高性能計算場景

PodGroup: 一組強關聯pod的集合,主要用于批處理工作負載場景,比如Tensorflow中的一組ps和worker。它是volcano自定義資源類型。

Queue: 是容納一組podgroup的隊列,也是該組podgroup獲取集群資源的劃分依據

NetworkTopology : 允許描述集群的網絡結構,以支持網絡拓撲感知調度,優化分布式任務的通信效率

b) 關鍵特性概覽: Volcano 提供了一系列針對批處理和高性能計算優化的核心特性,主要包括:

1.3 生態支持:

二、環境搭建

2.1 基礎環境

k3d 搭建輕量化k8s環境。當前也可以采用 kind,minkube 等等。這個就看個人習慣了。

mac 和 windows 都是可以的。不過前提安裝好容器環境,windows11 提前配置好 wsl ubuntu22.04虛擬化環境。如果要測試大模型并行訓練則需要帶 GPU 的k8s環境

## 安裝k3d
brew install k3d
## k3d 創建k8s
k3d cluster create k8s-volcano \--servers 1 \--agents 2 \--k3s-arg "--disable=traefik@server:0" \--port "8080:80@loadbalancer" \--port "8443:443@loadbalancer" \--api-port 6550
# 查看當前的k8s集群
k3d cluster list# 刪除指定的k8s集群
k3d cluster delete k8s-***

2.2 Volcano部署

## 直接安裝
kubectl apply -f https://raw.githubusercontent.com/volcano-sh/volcano/master/installer/volcano-development.yaml
## 或者 通過helm安裝
helm repo add volcano-sh https://volcano-sh.github.io/helm-charts
helm repo update
helm install volcano volcano-sh/volcano -n volcano-system --create-namespace

2.3 安裝volcano-dashboard

### 直接安裝
kubectl apply -f https://raw.githubusercontent.com/volcano-sh/dashboard/main/deployment/volcano-dashboard.yaml

通過 nodeport 方式暴露服務?

2.4 簡單運行 demojob

cat <<EOF | kubectl apply -f -
apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:name: hello-volcano-job
spec:schedulerName: volcanominAvailable: 1tasks:- name: mytaskreplicas: 1template:spec:containers:- name: hello-containerimage: busyboxcommand: ["sh", "-c", "echo 'Hello Volcano!' && sleep 300"]imagePullPolicy: IfNotPresentrestartPolicy: Never
EOF

schedulerName: volcano

調度器指定volcano,這樣在調度 job 的 Pod 時會使用volcano而不是默認的 Kubernetes 的調度器。

## 刪除 job
kubectl get vcjob -A 
kubectl delete vcjob hello-volcano-job 

三、Volcano 基礎功能實戰

3.1 queue 資源管理

a) 部署兩個不同權重隊列

cat <<EOF | kubectl apply -f -
apiVersion: scheduling.volcano.sh/v1beta1
kind: Queue
metadata:name: queue-a
spec:weight: 1
--- 
apiVersion: scheduling.volcano.sh/v1beta1
kind: Queue
metadata:name: queue-b
spec:weight: 2
EOF
kubectl get queues

b) 部署job觀察調度

# weight-test-job-template.yaml
apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:name: job-a-1
spec:schedulerName: volcanoqueue: queue-aminAvailable: 1tasks:- name: maintaskreplicas: 1template:spec:containers:- name: cpu-eaterimage: busyboxcommand: ["sh", "-c", "echo 'Starting CPU load...'; i=0; while [ $i -lt 300 ]; do i=$((i+1)); : ; done & PID=$!; sleep 300; kill $PID; echo 'Finished.'"]resources:requests:cpu: "500m" memory: "100Mi" imagePullPolicy: IfNotPresentrestartPolicy: Never
## 按照上述模型創建job 觀察資源 調度優先級。
queue-a [job-a-1,job-a-2,job-a-3,job-a-4,job-a-5,job-a-6]
queue-b [job-b-1,job-b-2,job-b-3,job-b-4,job-b-5,job-b-6]

queue-b應該會優先獲得資源。不過需要多觀察一些時間。

3.2 Gang Scheduling 調度

嘗試調度配置(min=20)

apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:name: job-a-1
spec:schedulerName: volcanoqueue: queue-aminAvailable: 20tasks:- name: maintaskreplicas: 20template:spec:containers:- name: cpu-eaterimage: busyboxcommand: ["sh", "-c", "echo 'Starting CPU load...'; i=0; while [ $i -lt 300 ]; do i=$((i+1)); : ; done & PID=$!; sleep 300; kill $PID; echo 'Finished.'"]resources:requests:cpu: "4" imagePullPolicy: IfNotPresentrestartPolicy: Never

可以觀察沒有調度

將 minAvailable 條件縮小到 4 個就可以發現已經在調度了

3.3?作業前后依賴

需要等task-a 調度完畢了才會調度task-b

apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:name: workflow-job
spec:schedulerName: volcanoqueue: defaultminAvailable: 1tasks:- name: task-a replicas: 1template:spec:containers:- name: task-a-containerimage: busyboxcommand: ["sh", "-c", "echo 'Task A: Starting process...' && sleep 100 && echo 'Task A: Process finished successfully!'"]imagePullPolicy: IfNotPresentrestartPolicy: OnFailure - name: task-breplicas: 1dependsOn: name: ["task-a"]template:spec:containers:- name: task-b-containerimage: busyboxcommand: ["sh", "-c", "echo 'Task B: Starting process (triggered after Task A)...' && sleep 20 && echo 'Task B: Process finished.'"]imagePullPolicy: IfNotPresentrestartPolicy: OnFailure

如果想要嘗試高級 flow 調度需要再額外安裝 flowjob 組件才可以實現更多 靈活 精細的 flow 策略

四、Volcano 進階功能實戰

這部分內容放到第二篇

4.1?MPI分布式訓練

4.2?網絡拓撲感知調度

4.3?負載感知調度

4.4?離線混部調度

4.5?多集群調度

4.6?多種策略綜合調度

五、小結

volcano 使用起來復雜度不高,只要實現有想要調度的策略目標找到對應的文檔配置即可。不過當前只是簡單場景的復刻測試。復雜的生產項目不知道會不會別的坑或者問題。下篇 測試網絡拓撲調度,負載感知重調度,多集群調度等。

參考:

Volcanohttps://volcano.sh/zh/

https://github.com/volcano-sh/volcanohttps://github.com/volcano-sh/volcanohttps://github.com/kubeflow/mpi-operatorhttps://github.com/kubeflow/mpi-operator

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

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

相關文章

Qwen2.5簡要全流程以及QA

1 輸入prompt 得到input id input id&#xff1a; [B,L] # batch size , lenth 2 embeding之后得到 input_embeds: [B,L,D] # demensions 3 進入Transformer層 先通過linear層得到shape不變的 QKV 多頭注意力 分割Dimension &#xff0c; kv變成 [B,H,L,head_dim] h是…

爬蟲學習——Item封裝數據與Item Pipeline處理數據

一、Item封裝數據 對于有字段的數據&#xff0c;最好的數據結構維護方法為字典類型(dict)&#xff0c;但是由于字典不便于攜帶元數據和傳遞給其他組件使用&#xff0c;故可以使用Item類封裝爬取到的數據。 這里涉及兩個類&#xff1a;Item基類和Field類 兩者的使用關系如下&…

【React】狀態管理 Context API \ MobX \ Redux

Context APIMobXRedux React有自己狀態管理&#xff0c;周邊生態也有很多狀態管理 Context API 直接從react中引入并調用即可&#xff0c;context包含兩個東西&#xff1a; Provider&#xff1a;提供商&#xff08;翻譯&#xff09;&#xff0c;提供數據&#xff1b;屬性&…

RK3588上編譯opencv 及基于c++實現圖像的讀入

參考博文&#xff1a; https://blog.csdn.net/qq_47432746/article/details/147203889 一、安裝依賴包 sudo apt install build-essential cmake git pkg-config libgtk-3-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libjpe…

MATLAB 訓練CNN模型 yolo v4

學生對小車控制提出了更好的要求&#xff0c;能否加入深度學習模型。 考慮到小車用matlab來做&#xff0c;yolo v5及以上版本都需要在pytorch下訓練&#xff0c;還是用早期版本來演示。 1 yolov4 調用 參考 trainYOLOv4ObjectDetector (mathworks.com) name "tiny-yo…

Windows下使用 VS Code + g++ 開發 Qt GUI 項目的完整指南

&#x1f680; 使用 VS Code g 開發 Qt GUI 項目的完整指南&#xff08;Windows MSYS2&#xff09; 本指南幫助你在 Windows 下使用 VS Code g CMake Qt6 快速搭建 Qt GUI 項目&#xff0c;適合熟悉 Visual Studio 的開發者向跨平臺 VS Code 工具鏈遷移。 &#x1f6e0;?…

開源漏洞掃描器:OpenVAS

一、OpenVAS介紹 OpenVAS (Open Vulnerability Assessment System) 是一款功能強大的開源漏洞掃描器。它由 Greenbone Networks 開發和維護&#xff0c;是 Greenbone 安全管理器 (GSM) 產品的基礎&#xff0c;同時也有免費的社區版本&#xff08;Greenbone Community Edition&…

Redis Pipeline 詳解

Redis Pipeline 詳解 Redis 無 Pipeline 耗時情況 : #mermaid-svg-8RIiJyeBO0uIrWjr {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8RIiJyeBO0uIrWjr .error-icon{fill:#552222;}#mermaid-svg-8RIiJyeBO0uIrWjr .…

2025.04.24【3D】3D繪圖入門指南

Nifty graph A contribution by Matt Asher. 3D animation A 3D animated scatterplot made with R and rgl. 文章目錄 Nifty graph3D animation 2025.04.24【3D】| 3D繪圖入門指南什么是3D繪圖&#xff1f;為什么使用3D繪圖&#xff1f;如何在R中進行3D繪圖&#xff1f;安裝…

[特殊字符] 分布式事務中,@GlobalTransactional 與 @Transactional 到底怎么配合用?

在微服務架構中&#xff0c;隨著系統模塊的拆分&#xff0c;單體應用中的本地事務已經無法滿足跨服務的數據一致性需求。此時&#xff0c;我們就需要引入分布式事務解決方案&#xff0c;比如 Seata。在使用 Seata 的過程中&#xff0c;很多人會遇到一個常見的疑問&#xff1a; …

TDengine 集群高可用方案設計(二)

四、TDengine 集群高可用方案設計 4.1 硬件與網絡架構設計 服務器選型&#xff1a;選擇配置高、穩定性強的服務器&#xff0c;如戴爾 PowerEdge R740xd、華為 RH2288H V5 等。以戴爾 PowerEdge R740xd 為例&#xff0c;它配備英特爾至強可擴展處理器&#xff0c;具備高性能計…

從對數變換到深度框架:邏輯回歸與交叉熵的數學原理及PyTorch實戰

目錄 前言 一、連乘變連加二、最小化損失函數2.1交叉熵2.2 二分類交叉熵2.3 多分類交叉熵三、邏輯回歸與二分類3.1 邏輯回歸與二分類算法理論講解3.1.1 散點輸入3.1.2 前向計算3.1.3 Sigmoid函數引入3.1.4 參數初始化3.1.5 損失函數3.1.6 開始迭代3.1.7 梯度下降顯示四、基于框…

高企復審獎補!2025年合肥市高新技術企業重新認定獎勵補貼政策及申報條件

一、合肥市高新技術企業重新認定獎勵補貼政策 &#xff08;一&#xff09;高新區高新技術企業重新認定復審補貼獎勵 重新認定為國家高新技術企業的給予5萬元一次性獎勵。 &#xff08;二&#xff09;經開區高新技術企業重新認定復審補貼獎勵 對重新認定的企業&#xff0c;給…

Spring Boot 中配置線程池時優化 `ThreadPoolTaskExecutor` 的配置總結

在 Spring Boot 中配置線程池時&#xff0c;可以通過以下方式進一步優化 ThreadPoolTaskExecutor 的配置&#xff0c;提升性能、靈活性和可靠性&#xff1a; 優化點 1&#xff1a;合理設置線程池參數 關鍵參數調整 Bean(name "taskExecutor") public Executor tas…

opencv 圖像的旋轉

圖像的旋轉 1 單點旋轉2. 圖片旋轉&#xff08;cv2.getRotationMatrix2D&#xff09;3. 插值方法3.1 最近鄰插值(cv2.INTER_NEAREST)3.2 雙線性插值(cv2.INTER_LINEAR)3.3 像素區域插值&#xff08;cv2.INTER_AREA&#xff09;3.4 雙三次插值&#xff08;cv2.INTER_CUBIC&#…

如何在 Odoo 18 中配置自動化動作

如何在 Odoo 18 中配置自動化動作 Odoo是一款多功能的業務管理平臺&#xff0c;旨在幫助各種規模的企業更高效地處理日常運營。憑借其涵蓋銷售、庫存、客戶關系管理&#xff08;CRM&#xff09;、會計和人力資源等領域的多樣化模塊&#xff0c;Odoo 簡化了業務流程&#xff0c…

每日兩道leetcode

345. 反轉字符串中的元音字母 - 力扣&#xff08;LeetCode&#xff09; 題目 給你一個字符串 s &#xff0c;僅反轉字符串中的所有元音字母&#xff0c;并返回結果字符串。 元音字母包括 a、e、i、o、u&#xff0c;且可能以大小寫兩種形式出現不止一次。 示例 1&#xff1a;…

【SQL 基礎入門 1. -- SQL 基本語法詳解及舉例】

文章目錄 SQL 數據庫創建及使用刪除數據庫SQL 查看數據空中有哪些表格SQL 創建表格SQL 修改表格列數據格式SQL 表格插入數據SQL 查看表格類型組成SQL 查看表格中的內容 SQL 查詢語句SQL 查看指定列SQL 選擇指定列SQL 按指定列進行升序排序SQL 平均值/求和/最大值/最小值 SQL 數…

PostgreSQL 分區表——范圍分區SQL實踐

PostgreSQL 分區表——范圍分區SQL實踐 1、環境準備1-1、新增原始表1-2、執行腳本新增2400w行1-3、創建pg分區表-分區鍵為創建時間1-4、創建24年所有分區1-5、設置默認分區&#xff08;兜底用&#xff09;1-6、遷移數據1-7、創建分區表索引 2、SQL增刪改查測試2-1、查詢速度對比…

Apache Flink 深度解析:流處理引擎的核心原理與生產實踐指南

Apache Flink 深度解析&#xff1a;流處理引擎的核心原理與生產實踐指南 引言&#xff1a;實時計算的范式革命 2023年雙十一期間&#xff0c;某頭部電商平臺基于Flink構建的實時風控系統成功攔截了每秒超過120萬次的異常交易請求。這背后是Apache Flink作為第四代計算引擎的強…