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

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

相关文章:

Volcano 实战快速入门 (一)

一、技术背景 随着大型语言模型&#xff08;LLM&#xff09;的蓬勃发展&#xff0c;其在 Kubernetes (K8s) 环境下的训练和推理对资源调度与管理提出了前所未有的挑战。这些挑战主要源于 LLM 对计算资源&#xff08;尤其是 GPU&#xff09;的巨大需求、分布式任务固有的复杂依…...

快速体验tftp文件传输(嵌入式设备)

一、参考资料 Linux tftp 命令 | 菜鸟教程 Ubuntu最新版本(Ubuntu22.04LTS)安装Tftp服务及其使用教程-CSDN博客 Windows下的Tftpd32(Tftpd64)软件下载和使用教程-集成了Tftp服务器、客户端-CSDN博客 tftpd32 tftpd64文件传输安装和使用教程【图文并茂】-CSDN博客 二、快速…...

用交换机连接两台电脑,电脑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;所…...

Gazebo 仿真环境系列教程(一):环境安装与基础使用

文章目录 一、版本说明与技术背景1.1 Gazebo 版本分支1.2 版本选择建议 二、系统环境准备2.1 硬件要求2.2 软件依赖 三、Gazebo Garden 安装流程3.1 添加官方软件源3.2 执行安装命令3.3 环境验证 四、Gazebo Classic 安装方法4.1 添加软件仓库4.2 安装核心组件4.3 验证安装 五、…...

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…...

SEO(Search Engine Optimization,搜索引擎优化)相关知识点

SEO&#xff08;Search Engine Optimization&#xff09;是指搜索引擎优化&#xff0c;是计算机领域中通过技术手段和内容策略&#xff0c;提升网站在搜索引擎&#xff08;如Google、Bing、百度&#xff09;中自然&#xff08;非付费&#xff09;排名的系统性方法。是一种通过优…...

C#森林中的兔子(力扣题目)

C#森林中的兔子(力扣题目) 题目介绍 森林中有未知数量的兔子。提问其中若干只兔子 “还有多少只兔子与你&#xff08;指被提问的兔子&#xff09;颜色相同?” &#xff0c;将答案收集到一个整数数组 answers 中&#xff0c;其中 answers[i] 是第 i 只兔子的回答。 给你数组…...

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

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

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

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

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

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

敏捷开发管理流程

以下是敏捷开发管理流程的详细说明&#xff0c;包含流程框架、关键步骤及案例示例&#xff1a; 敏捷开发管理流程 1. 敏捷核心原则 迭代交付&#xff1a;分小周期&#xff08;Sprint&#xff09;交付可工作的软件&#xff0c;通常2~4周为一个迭代。用户需求驱动&#xff1a;以…...

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

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

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

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

ETL 数据集成都包含哪些?

一、ETL 数据集成都包含哪些&#xff1f; 数字化时代数据已成为企业最为宝贵的资产之一。然而&#xff0c;企业的数据往往分散在多个不同的系统和平台中&#xff0c;如关系型数据库、文件系统、API 等。为了将这些分散的数据整合起来&#xff0c;为企业决策提供全面、准确的支…...

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参考博客声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的…...

点云配准算法之NDT算法原理详解

一、算法概述 NDT&#xff08;Normal Distributions Transform&#xff09;最初用于2D激光雷达地图构建&#xff08;Biber & Straer, 2003&#xff09;&#xff0c;后扩展为3D点云配准。它将点云数据空间划分为网格单元&#xff08;Voxel&#xff09;&#xff0c;在每个体…...

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))…...

【网络安全】网络钓鱼的类型

1. 网络钓鱼简介 网络钓鱼是最常见的社会工程学类型之一&#xff0c;它是一种利用人为错误来获取私人信息、访问权限或贵重物品的操纵技术。之前&#xff0c;您学习了网络钓鱼是如何利用数字通信诱骗人们泄露敏感数据或部署恶意软件的。 有时&#xff0c;网络钓鱼攻击会伪装成…...

Android学习总结之扩展基础篇(一)

一、IdleHandler工作原理 1. IdleHandler 接口定义 IdleHandler 是 MessageQueue 类中的一个接口&#xff0c;定义如下&#xff1a; public static interface IdleHandler {/*** 当消息队列空闲时会调用此方法。* return 如果返回 true&#xff0c;则该 IdleHandler 会保留在…...

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

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