最近在倒腾“AI大模型基础设施”, 宏观目标是做一个基于云原生的AI算力平台,目前因公司隐私暂不能公开宏观背景和技术方案, 姑且记录实践中遇到的一些技能点。

前文已经记录了第1步: 使用arena 提交训练任务的实践。

今天我们记录聊一聊平台侧另一个核心能力:

动态纳管云原生k8s集群,并监听AI/ML训练任务的状态变化。也就是上图的第4步。


作为面向算法开发者的云原生saas平台,平台在界面上提供了纳管集群的交互入口,平台启动后会去监听pytorch,mpi训练任务的状态变更,并回显到界面(并给开发者发送飞书变更通知)。

本文核心关注:

  • 如何动态纳管k8s集群
  • 如何重建k8s informer监听

这里我提供我的实践, 请看下图:

  1. 程序启动,加载初始k8s集群,informer监听训练任务状态,并绑定informer停止信号(stopCh)、重建信号(rebuildCh)
package main

import "k8s.io/client-go/rest"

type StartInformerFunc func(clusterId string, restConf *rest.Config) (stopCh chan struct{}, err error)
type InformerManager struct {
clusterConfigs map[string]string
gvr map[string]StartInformerFunc
stopCh chan struct{} // informer 需要用到
rebuildCh chan struct{}
} var InformerManagerInstance *InformerManager func NewInFormerManager() *InformerManager {
InformerManagerInstance = &InformerManager{
clusterConfigs: map[string]string{
"id1": "kubeconfig1",
"id2": "kubeconfig2",
},
gvr: map[string]StartInformerFunc{
"pytorchjob": startPytorchjobInformer,
"mpijob": startMpijobInformer,
"job": startRawjobInformer,
},
stopCh: make(chan struct{}),
rebuildCh: make(chan struct{}, 1),
}
return InformerManagerInstance
}
  1. 开协程定时任务去轮循落盘的待纳管k8s集群记录
  2. 考虑纳管的k8s集群数据可控,变更时机可控,采用md5校验的方式判断是否发生集群变更

下面的k8s.CheckClusterChanged(mgr.clusterConfigs) 是利用对kube-configs做md5, 前后对比判断集群是否发生变更。

func (mgr *InformerManager) monitorcLusterChanged() bool {
ticker := time.NewTicker(30 * time.Second)
defer ticker.Stop()
for {
select {
case <-ticker.C:
if k8s.CheckClusterChanged(mgr.clusterConfigs) {
fmt.Println("cluster changed")
mgr.rebuildCh <- struct{}{}
} else {
fmt.Println("cluster no change")
}
case <-mgr.rebuildCh:
fmt.Println("rebuild informer")
mgr.clusterConfigs = k8s.GetInitclusters()
for k, v := range mgr.clusterConfigs {
rc, err := k8s.ConvertToRestConfig([]byte(v))
if err != nil {
fmt.Println("convert to rest config failed")
continue
}
for gvr, StartInformerFunc := range mgr.gvr {
go func(k string, rc *rest.Config) {
newStopch, err := StartInformerFunc(k, rc)
if err != nil {
return
}
if mgr.stopCh != nil {
close(mgr.stopCh)
}
mgr.stopCh = newStopch
fmt.Printf("%s informer started for cluster %s \n", gvr, k)
}(k, rc)
}
}
}
}
}
  1. 利用简单的链表指针,重置informer监听信道
func (mgr *InformerManager) Run() {
for k, v := range mgr.clusterConfigs {
rc, err := k8s.ConvertToRestConfig([]byte(v))
if err != nil {
fmt.Println("failed to convert kubeconfig to rest config")
continue
}
for gvr, StartInformerFunc := range mgr.gvr {
go func(k string, rc *rest.Config) {
newStopch, err := StartInformerFunc(k, rc)
if err != nil {
return
}
if mgr.stopCh != nil {
close(mgr.stopCh)
}
mgr.stopCh = newStopch
fmt.Printf("start %s informer for cluster %s \n", gvr,k)
}(k, rc)
}
go mgr.monitorClusterChanged()
}
}

本文记录了使用定时任务感知资源变更,并利用golang信道作为变更信号的姿势,可作为golang中动态感知资源变化的常规技能实践。

Go动态感知资源变更的技术实践,你指定用过!的更多相关文章

  1. 腾讯技术分享:GIF动图技术详解及手机QQ动态表情压缩技术实践

    本文来自腾讯前端开发工程师“ wendygogogo”的技术分享,作者自评:“在Web前端摸爬滚打的码农一枚,对技术充满热情的菜鸟,致力为手Q的建设添砖加瓦.” 1.GIF格式的历史 GIF ( Gr ...

  2. 让互联网更快:新一代QUIC协议在腾讯的技术实践分享

    本文来自腾讯资深研发工程师罗成在InfoQ的技术分享. 1.前言 如果:你的 App,在不需要任何修改的情况下就能提升 15% 以上的访问速度,特别是弱网络的时候能够提升 20% 以上的访问速度. 如 ...

  3. IPv6技术详解:基本概念、应用现状、技术实践(下篇)

    本文来自微信技术架构部的原创技术分享. 1.前言 在上篇<IPv6技术详解:基本概念.应用现状.技术实践(上篇)>,我们讲解了IPV6的基本概念. 本篇将继续从以下方面展开对IPV6的讲解 ...

  4. 技术沙龙|京东云DevOps自动化运维技术实践

    自动化测试体系不完善.缺少自助式的持续交付平台.系统间耦合度高服务拆分难度大.成熟的DevOps工程师稀缺,缺少敏捷文化--这些都是DevOps 在落地过程中,或多或少会碰到的问题,DevOps发展任 ...

  5. 阿里巴巴微服务与配置中心技术实践之道 配置推送 ConfigurationManagement ConfigDrivenAnyting

    阿里巴巴微服务与配置中心技术实践之道 原创: 坤宇 InfoQ 2018-02-08 在面向分布式的微服务系统中,如何通过更高效的配置管理方式,帮助微服务系统架构持续"无痛"的演进 ...

  6. fir.im 持续集成技术实践

    互联网时代,人人都在追求产品的快速响应.快速迭代和快速验证.不论是创业团队还是大中型企业,都在探索属于自己的敏捷开发.持续交付之道.fir.im 团队也在全面实施敏捷,并推出新持续集成服务 - flo ...

  7. iBatis.net技术实践

    随着大数据技术的兴起和快速发展,人们更多的开始关注HDFS.HBase.Hive等技术.但是谈到强一致性,我们又不得不回归现实,只能继续沿用RDBMS存储强一致性的数据.我们日常接触到的绝大多数的应用 ...

  8. 【公开课】【阿里在线技术峰会】魏鹏:基于Java容器的多应用部署技术实践

    对于公开课,可能目前用不上这些,但是往往能在以后想解决方案的时候帮助到我.以下是阿里对公开课的整理 摘要: 在首届阿里巴巴在线峰会上,阿里巴巴中间件技术部专家魏鹏为大家带来了题为<基于Java容 ...

  9. Redis数据库云端最佳技术实践

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB发表于云+社区专栏 邹鹏,腾讯高级工程师,腾讯云数据库Redis负责人,多年数据库.网络安全研发经验. ...

  10. 从游击队到正规军(三):基于Go的马蜂窝旅游网分布式IM系统技术实践

    本文由马蜂窝技术团队电商交易基础平台研发工程师"Anti Walker"原创分享. 一.引言 即时通讯(IM)功能对于电商平台来说非常重要,特别是旅游电商. 从商品复杂性来看,一个 ...

随机推荐

  1. 基于预生成 QA 对的 RAG 知识库解决方案

    核心价值 QA 预生成技术 采用创新的问答对生成方法,相比传统文本切片技术,能够更精准的构建知识库,显著提升检索与问答效果. 企业级场景验证 已在真实业务场景中落地应用,实现从传统搜索到智能搜索的无缝 ...

  2. K8s新手系列之CronJob

    概述 官方文档:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/cron-jobs/ CronJob控制器以 Job控制 ...

  3. ArrayList与LinkedList的增删改查

    ArrayList: 1 package com.lv.study.am.first; 2 3 //ArrayList 有下标 可重复 有序(添加到集合里面的顺序)不等于排序 4 5 6 import ...

  4. FFmpeg开发笔记(六十五)Linux给FFmpeg集成LC3音频的编码器liblc3

    ​<FFmpeg开发实战:从零基础到短视频上线>一书的第五章介绍了FFmpeg如何处理常见的MP3音频和AAC音频,其中MP3格式常用于音乐文件,而AAC格式常用于视频文件. 除此以外,近 ...

  5. php 读取文件,批量构造sql语句写入数据库

    需求读取文件,构造sql,批量写入数据库,批量是构建设置 $num 值的大小进行批量构建sql语句 test.txt 文件内容为 1 2 3 4 5 6 7 8 9 10 <?php class ...

  6. K8s v1.31 新特性:ImageVolume,允许将镜像作为 Volume 进行挂载

    本文主要分享一个 K8s 1.31 增加的一个新 Feature:ImageVolume.允许直接将 OCI 镜像作为 Volume 进行挂载,加速 artifact 分发. 1.背景 Kuberne ...

  7. Kong入门学习实践(1)基础概念快览

    最近在学习Kong网关,因此根据老习惯,我会将我的学习过程记录下来,一来体系化整理,二来作为笔记供将来翻看.由于我司会直接使用Kong企业版,学习过程中我会使用Kong开源版. 什么是Kong? Ko ...

  8. 在.Net Core类库中引入System.Windows.Forms,报错问题

    https://blog.rayfalling.com/2020/04/%e5%9c%a8-net-core%e4%b8%ad%e5%bc%95%e5%85%a5system-windows-form ...

  9. Atcoders [ARC133B] Dividing Subsequence 题解

    AT_arc133_b [ARC133B] Dividing Subsequence 模拟赛原题,来写篇题解. 只考虑匹配的状态,根据调和级数的数学知识,匹配的状态数不多,为 \(O(n\log n) ...

  10. Ansys 圣维南原理

    简介 圣维南原理 分布于弹性体上一小块面积(或体积)内的荷载所引起的物体中的应力,在离 荷载作用区稍远的地方,基本上只同荷载的合力和合力矩有关:荷载的具体分布只 影响荷载作用区附近的应力分布.还有一种 ...