跳到主要内容
技术指南

HAMi源码解析:设备管理与调度系统的实现原理

睿思智联
2025/3/26
HAMi源码解析:设备管理与调度系统的实现原理

项目简介

HAMi (Heterogeneous AI Computing Virtualization Middleware) 是一个用于管理Kubernetes集群中异构设备的中间件。它提供了一套完整的解决方案,用于在Kubernetes环境中管理和调度GPU、FPGA等异构加速设备。详细介绍 Project-HAMi

项目架构

HAMi 的代码主要构成:

1. 命令行组件 (cmd/)

cmd/
├── device-plugin/     # 设备插件组件
   ├── main.go       # 入口文件
   └── nvidia/       # NVIDIA设备插件实现

├── scheduler/        # 调度器组件
   ├── main.go      # 调度器入口
   └── metrics.go   # 监控指标实现 

└── vGPUmonitor/     # GPU监控组件
    ├── main.go      # 监控服务入口
    ├── metrics.go   # 指标定义和收集
    ├── feedback.go  # 反馈机制实现
    ├── validation.go # 验证逻辑
    ├── build.sh     # 构建脚本
    ├── noderpc/     # 节点RPC通信
    └── testcollector/ # 测试收集器

2. 核心库 (pkg/)

pkg/
├── device/          # 设备管理核心
   ├── devices.go        # 统一设备接口定义
   ├── devices_test.go   # 设备接口测试
   ├── nvidia/          # NVIDIA GPU实现
   ├── cambricon/       # 寒武纪设备实现
   ├── ascend/         # 华为昇腾设备实现
   ├── hygon/          # 海光设备实现
   ├── iluvatar/       # 天数智芯设备实现
   ├── metax/          # 沐曦智能设备实现
   └── mthreads/       # 摩尔线程设备实现

├── scheduler/       # 调度系统实现
   ├── config/         # 配置管理
   ├── policy/         # 调度策略
   ├── routes/         # 路由规则
   ├── scheduler.go    # 调度器核心
   ├── nodes.go        # 节点管理
   ├── pods.go         # Pod管理
   ├── score.go        # 评分系统
   ├── event.go        # 事件处理
   ├── webhook.go      # Webhook集成
   └── *_test.go      # 对应的测试文件

├── device-plugin/   # 设备插件实现
├── k8sutil/        # Kubernetes工具集
├── monitor/        # 监控系统
├── oci/            # OCI运行时集成
├── util/           # 通用工具库
└── version/        # 版本信息管理

核心功能模块

1. 设备管理 (pkg/device)

1.1 统一设备接口

// pkg/device/devices.go
type Devices interface {
    CommonWord() string
    GetNodeDevices(n corev1.Node) ([]*util.DeviceInfo, error)
    CheckHealth(devType string, n *corev1.Node) (bool, bool)
    GenerateResourceRequests(ctr *corev1.Container) util.ContainerDeviceRequest
    LockNode(n *corev1.Node, p *corev1.Pod) error
    ReleaseNodeLock(n *corev1.Node, p *corev1.Pod) error
    ScoreNode(node *corev1.Node, podDevices util.PodSingleDevice, policy string) float32
    CustomFilterRule(...) bool
}

1.2 设备类型实现

NVIDIA GPU
// pkg/device/nvidia/device.go
type NvidiaDevices struct {
    resourceName string
}

func (dev *NvidiaDevices) GetNodeDevices(n corev1.Node) ([]*util.DeviceInfo, error) {
    // 实现NVIDIA设备发现
}
Metax设备
// pkg/device/metax/device.go
type MetaxDevices struct {}

const (
    MetaxGPUDevice  = "Metax"
    MetaxSGPUDevice = "Metax-SGPU"
)

func (dev *MetaxDevices) GetNodeDevices(n corev1.Node) ([]*util.DeviceInfo, error) {
    // 实现Metax设备发现
}

2. 设备插件 (pkg/device-plugin)

2.1 插件接口实现

// pkg/device-plugin/server/server.go
type DevicePluginServer struct {
    devicePlugin v1beta1.DevicePluginServer
}

func (s *DevicePluginServer) ListAndWatch(empty *pluginapi.Empty, stream pluginapi.DevicePlugin_ListAndWatchServer) error {
    // 实现设备监控和更新
}

2.2 NVIDIA插件示例

// pkg/device-plugin/nvidia/plugin.go
type NvidiaDevicePlugin struct {
    devices []*pluginapi.Device
    server  *grpc.Server
}

func (p *NvidiaDevicePlugin) Allocate(ctx context.Context, reqs *pluginapi.AllocateRequest) (*pluginapi.AllocateResponse, error) {
    // 实现设备分配逻辑
}

3. 调度器 (pkg/scheduler)

3.1 调度策略

// pkg/scheduler/policy/policy.go
type SchedulerPolicy interface {
    Filter(pod *corev1.Pod, node *corev1.Node) bool
    Score(pod *corev1.Pod, node *corev1.Node) int64
}

// pkg/scheduler/policy/binpack.go
type BinpackPolicy struct{}

func (p *BinpackPolicy) Score(pod *corev1.Pod, node *corev1.Node) int64 {
    // 实现Binpack策略评分
}

3.2 节点管理

// pkg/scheduler/nodes.go
type NodeManager struct {
    nodes map[string]*NodeInfo
}

func (nm *NodeManager) UpdateNode(node *corev1.Node) {
    // 实现节点状态更新
}

4. 监控系统 (pkg/monitor)

4.1 设备监控接口

// pkg/monitor/monitor.go
type DeviceMonitor interface {
    GetMetrics() (*DeviceMetrics, error)
    WatchDevices() (<-chan *DeviceEvent, error)
}

4.2 NVIDIA监控实现

// pkg/monitor/nvidia/monitor.go
type NvidiaMonitor struct {
    devices []*nvml.Device
}

func (m *NvidiaMonitor) GetMetrics() (*DeviceMetrics, error) {
    // 实现NVIDIA设备指标收集
}

5. OCI运行时集成 (pkg/oci)

5.1 运行时接口

// pkg/oci/runtime.go
type Runtime interface {
    CreateContainer(config *RuntimeConfig) error
    StartContainer(id string) error
    StopContainer(id string) error
}

5.2 设备挂载

// pkg/oci/device.go
func ConfigureDeviceMounts(spec *specs.Spec, devices []string) error {
    // 实现设备挂载配置
}

6. Kubernetes工具 (pkg/k8sutil)

6.1 Pod操作

// pkg/k8sutil/pod.go
func UpdatePodStatus(client kubernetes.Interface, pod *corev1.Pod) error {
    // 实现Pod状态更新
}

6.2 资源管理

// pkg/k8sutil/resource.go
func ValidateResourceRequirements(pod *corev1.Pod) error {
    // 实现资源验证
}

7. 通用工具 (pkg/util)

7.1 资源锁定

// pkg/util/nodelock/lock.go
type NodeLock struct {
    name      string
    namespace string
}

func (l *NodeLock) Lock() error {
    // 实现分布式锁
}

7.2 配置管理

// pkg/util/flag/flag.go
func ParseFlags() (*Config, error) {
    // 实现配置解析
}

测试覆盖率

项目的主要测试文件分布:

pkg/
├── device/
   └── devices_test.go      # 设备管理测试
├── scheduler/
   └── scheduler_test.go    # 调度器测试
├── monitor/
   └── monitor_test.go      # 监控系统测试
└── util/
    └── util_test.go         # 工具函数测试

项目依赖

核心依赖配置:

// go.mod
module github.com/Project-HAMi/HAMi

require (
    k8s.io/api v0.24.0
    k8s.io/apimachinery v0.24.0
    k8s.io/client-go v0.24.0
    k8s.io/klog/v2 v2.60.1
)

当前开发状态

Next Version: v2.6.0

关于我们最新的发布和功能,请查看:

Tasks:

  • 支持昆仑芯 sGPU /assign @ouyangluwei163
  • 支持沐曦智能 sGPU
  • 支持燧原科技 sGPU
  • 优化调度器事件
  • 网站优化 /assign @ouyangluwei163 @Nimbus318
  • 添加沐曦智能到网站
  • 支持驱动 570+CUDA 12.8 /assign @archlitchi
  • DRA 设计 /assign @Shouren
  • 支持多种寒武纪型号 (370,590等)

详细参考:HAMi RoadMap

想要了解更多?

点击下方按钮,直接与我们的专家团队建立联系