Volcano 实战快速入门 (一)

news2025/4/25 17:41:10

一、技术背景

随着大型语言模型(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: volcano
  minAvailable: 1
  tasks:
    - name: mytask
      replicas: 1
      template:
        spec:
          containers:
            - name: hello-container
              image: busybox
              command: ["sh", "-c", "echo 'Hello Volcano!' && sleep 300"]
              imagePullPolicy: IfNotPresent
          restartPolicy: 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: volcano
  queue: queue-a
  minAvailable: 1
  tasks:
    - name: maintask
      replicas: 1
      template:
        spec:
          containers:
            - name: cpu-eater
              image: busybox
              command: ["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: IfNotPresent
          restartPolicy: 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: volcano
  queue: queue-a
  minAvailable: 20
  tasks:
    - name: maintask
      replicas: 20
      template:
        spec:
          containers:
            - name: cpu-eater
              image: busybox
              command: ["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: IfNotPresent
          restartPolicy: Never

可以观察没有调度

将 minAvailable 条件缩小到 4 个就可以发现已经在调度了

3.3 作业前后依赖

需要等task-a 调度完毕了才会调度task-b

apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
  name: workflow-job
spec:
  schedulerName: volcano
  queue: default
  minAvailable: 1
  tasks:
    - name: task-a 
      replicas: 1
      template:
        spec:
          containers:
            - name: task-a-container
              image: busybox
              command: ["sh", "-c", "echo 'Task A: Starting process...' && sleep 100 && echo 'Task A: Process finished successfully!'"]
              imagePullPolicy: IfNotPresent
          restartPolicy: OnFailure 
    - name: task-b
      replicas: 1
      dependsOn: 
        name: ["task-a"]
      template:
        spec:
          containers:
            - name: task-b-container
              image: busybox
              command: ["sh", "-c", "echo 'Task B: Starting process (triggered after Task A)...' && sleep 20 && echo 'Task B: Process finished.'"]
              imagePullPolicy: IfNotPresent
          restartPolicy: 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.coloradmin.cn/o/2342596.html

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

相关文章

用交换机连接两台电脑,电脑A读取/写电脑B的数据

1、第一步&#xff0c;打开控制面板中的网络和共享中心&#xff0c;如下图配置&#xff0c;电脑A和电脑B均要配置&#xff1b; 注意&#xff1a;要保证电脑A和电脑B在同一子网掩码下&#xff0c;不同的IP地址&#xff1b; 2、在电脑上同时按‘CommandR’&#xff0c;在弹出的输…

问道数码兽 怀旧剧情回合手游源码搭建教程(反查重优化版)

本文将对"问道数码兽"这一经典卡通风格回合制手游的服务端部署与客户端调整流程进行详细拆解&#xff0c;适用于具备基础 Windows 运维和手游源码调试经验的开发者参考使用。教程以实战为导向&#xff0c;基于原始说明内容重构优化&#xff0c;具备较高的内容查重避重…

WLAN共享给以太网后以太网IP为169.254.xx.xx以及uboot无法使用nfs下载命令的的解决方案

WLAN共享网络给以太网&#xff0c;实际上是把以太网口当作一个路由器&#xff0c;这个路由器的IP是由WLAN给他分配的&#xff0c;169.254.xx.xx是windows设定的ip&#xff0c;当网络接口无法从上一级网络接口获得ip时&#xff0c;该网络接口的ip被设置为169.254 &#xff0c;所…

ROS 快速入门教程03

8.编写Subscriber订阅者节点 8.1 创建订阅者节点 cd catkin_ws/src/ catkin_create_pkg atr_pkg rospy roscpp std_msgs ros::Subscriber sub nh.subscribe(话题名, 缓存队列长度, 回调函数) 回调函数通常在你创建订阅者时定义。一个订阅者会监听一个话题&#xff0c;并在有…

在 macOS 上合并 IntelliJ IDEA 的项目窗口

在使用 IntelliJ IDEA 开发时&#xff0c;可能会打开多个项目窗口&#xff0c;这可能会导致界面变得混乱。为了提高工作效率&#xff0c;可以通过合并项目窗口来简化界面。本文将介绍如何在 macOS 上合并 IntelliJ IDEA 的项目窗口。 操作步骤 打开 IntelliJ IDEA: 启动你的 I…

基于多用户商城系统的行业资源整合模式与商业价值探究

随着电子商务的蓬勃发展&#xff0c;传统的单一商家电商模式逐渐显现出一定的局限性。为了解决商家成本过高、市场竞争激烈等问题&#xff0c;多用户商城系统应运而生&#xff0c;成为一种新型的电商平台模式。通过整合行业资源&#xff0c;这种模式不仅极大地提升了平台和商家…

Three.js + React 实战系列 : 从零搭建 3D 个人主页

可能你对tailiwindcss毫不了解&#xff0c;别紧张&#xff0c;记住我们只是在学习&#xff0c;学习的是作者的思想和技巧&#xff0c;并不是某一行代码。 在之前的几篇文章中&#xff0c;我们已经熟悉了 Three.js 的基本用法&#xff0c;并通过 react-three-fiber 快速构建了一…

如何用大模型技术重塑物流供应链

摘要 在数字化转型加速的背景下&#xff0c;大模型技术凭借其强大的数据分析、逻辑推理和决策优化能力&#xff0c;正成为物流供应链领域的核心驱动力。本文深入探讨大模型如何通过需求预测、智能调度、供应链协同、风险管控等关键环节&#xff0c;推动物流行业从 "经验驱…

【银河麒麟高级服务器操作系统】磁盘只读问题分析

系统环境及配置 系统环境 物理机/虚拟机/云/容器 虚拟机 网络环境 外网/私有网络/无网络 私有网络 硬件环境 机型 KVM Virtual Machine 处理器 Kunpeng-920 内存 32 GiB 整机类型/架构 arm64 固件版本 EFI Development Kit II / OVMF 软件环境 具体操作系统版…

机器视觉的智能手机屏贴合应用

在智能手机制造领域&#xff0c;屏幕贴合工艺堪称"微米级的指尖芭蕾"。作为影响触控灵敏度、显示效果和产品可靠性的关键工序&#xff0c;屏幕贴合精度直接决定了用户体验。传统人工对位方式已无法满足全面屏时代对极窄边框和超高屏占比的严苛要求&#xff0c;而Mast…

AIM Robotics电动胶枪:智能分配,让机器人点胶涂胶精准无误

在现代工业自动化和智能制造领域&#xff0c;精确的液体分配技术正成为提升生产效率和产品质量的重要因素。AIM Robotics作为这一领域的创新者&#xff0c;提供了多种高效、灵活的点胶涂胶分配解决方案。本文将带您了解AIM Robotics的核心技术、产品系列以及在各行业的成功应用…

负环-P3385-P2136

通过选择标签&#xff0c;洛谷刷一个类型的题目还是很方便的 模版题P3385 P3385 【模板】负环 - 洛谷 Tint(input())def bellman(n,edges,sta):INFfloat(inf)d[INF]*(n1)d[sta]0for i in range(n-1):for u,v,w in edges:ncostd[u]wif ncost<d[v]:d[v]ncostfor u,v,w in e…

抖音的逆向工程获取弹幕(websocket和protobuf解析)

目录 声明前言第一节 获取room_id和ttwid值第二节 signture值逆向python 实现signature第三节 Websocket实现长链接请求protubuf反序列化pushFrame反序列化Response解压和反序列化消息体Message解析应答ack参考博客声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的…

WPF 图片文本按钮 自定义按钮

效果 上面图片,下面文本 样式 <!-- 图片文本按钮样式 --> <Style x:Key="ImageTextButtonStyle" TargetType="Button"><Setter Property="Background" Value="Transparent"/><Setter Property="BorderTh…

Diffusion inversion后的latent code与标准的高斯随机噪音不一样

可视化latents_list如下; 可视化最后一步与标准的噪声&#xff1a; 能隐约看出到最后一步还是会有“马”的形状 整个代码&#xff08;及可视化代码如下&#xff09;&#xff1a; ## 参考freeprompt(FPE)的代码 import os import torch import torch.nn as nn import torch.n…

江湖密码术:Rust中的 bcrypt 加密秘籍

前言 江湖险恶,黑客如雨,昔日密码“123456”早被各路大侠怒斥为“纸糊轻功”。若还执迷不悟,用明文密码闯荡江湖,无异于身披藏宝图在集市上狂奔,目标大到闪瞎黑客双眼。 为护你安然度过每一场数据风波,特献上一门绝学《Rust加密神功》。核心招式正是传说中的 bcrypt 密…

Milvus(3):数据库、Collections说明

1 数据库 Milvus 在集合之上引入了数据库层&#xff0c;为管理和组织数据提供了更有效的方式&#xff0c;同时支持多租户。 1.1 什么是数据库 在 Milvus 中&#xff0c;数据库是组织和管理数据的逻辑单元。为了提高数据安全性并实现多租户&#xff0c;你可以创建多个数据库&am…

【Hive入门】Hive数据模型与存储格式深度解析:从理论到实践的最佳选择

目录 1 Hive数据模型全景图 2 Hive存储架构解析 3 存储格式对比矩阵 4 存储格式选择决策树 5 ORC文件结构剖析 6 Parquet与ORC技术对比 7 最佳实践指南 7.1 建表示例模板 7.2 性能优化 8 总结 1 Hive数据模型全景图 模型核心组件解析&#xff1a; Database&#xff1…

2025能源网络安全大赛CTF --- Crypto wp

文章目录 前言simpleSigninNumberTheory 前言 大半年以来写的第一篇文章&#xff01;&#xff01;&#xff01; simpleSignin 题目&#xff1a; from Crypto.Util.number import * from gmpy2 import * import osflag bxxx p next_prime(bytes_to_long(os.urandom(128))…

Godot开发2D冒险游戏——第二节:主角光环整起来!

变量的作用域 全局变量&#xff0c;局部变量&#xff0c;导出变量&#xff08;可以在检查器当中快速查看&#xff09; 为玩家添加移动动画 现在游戏的玩家还只是在滑行&#xff0c;我们需要再添加玩家每个方向上的移动效果 删除原先的Item节点&#xff0c;创建一个动画精灵…