最近在倒腾“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. Number of Digit One——LeetCode⑩

    //原题链接https://leetcode.com/problems/number-of-digit-one/ 题目描述 Given an integer n, count the total nu ...

  2. Java 异常处理try、catch、finally和return执行顺序

    目录 问题背景 finally语句一定执行吗 finally语句与return的执行顺序 问题分析 1. finally语句在f()执行之后.y返回之前执行 2. finally块中的return语句 ...

  3. 「Note」树论方向

    1. 重链剖分 1.1. 简介 重链剖分将树分割成若干链维护信息,将树的结构转换为线性结构,然后可用其他数据结构维护. 定义以下概念: 重子节点 轻子节点 重边 轻边 重链 某节点的子节点中子树大小最 ...

  4. uniCloud云函数结合nodemailer发送邮件的方法

    使用uniCloud云函数结合nodemailer发送邮件的时候,在本地调试可以发送成功,但是当我把云函数上传后,就不能发送到邮件了,但是云函数依旧执行了.开始我以为是node.js版本的原因,但是经 ...

  5. 🚀 开源提示词优化神器来了!一键优化Function Calling和MCP提示词,让你的AI应用性能飞跃

    还在为Function Calling调用不准确而头疼?MCP提示词写得不够规范?今天给大家推荐一个开源的提示词优化平台,专门解决这些痛点! 背景:为什么需要专业的提示词优化? 在AI应用开发中,我们 ...

  6. AOP的介绍以及在springboot中的简单使用

    Aop Aop的介绍 什么是Aop Aop面向切面编程,是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行 ...

  7. Spring的DI依赖注入

    xml中依赖注入bean bean标签下 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE b ...

  8. 大湿的超神之路第1期——同时学习6种计算机语言的我已经无敌了(1)——使用5种语言书写Fuck you the world!

    为了成为物联网全寨式工程师,我决定要开始我的逆天之旅.有几种开发过程中很重要的语言,C还有java还有python还有javascript是我的重点对象,然后因为还想学C#写一点桌面小程序所以就骚一波 ...

  9. 快来玩玩便捷、高效的Demo练习场

    Demo练习场 Vonajs 提供了一个 Demo 练习场的功能,允许我们非常方便.快捷的对代码做测试,对想法做验证 步骤 简而言之,Demo练习场的使用只需两步:第一步写代码,第二步执行终端命令.具 ...

  10. 对称分组加密—DES算法原理

    目录 一些基础概念 时序图 步骤拆分 Reference 本文只关注一个核心任务 -- 如何把 64 位的明文,用 64 位的密钥,加密成 64 位的密文,并执行解密,需要理解这个过程. DES已经很 ...