Golang 文本模板,你指定没用过
最近在倒腾“AI大模型基础设施”, 宏观目标是做一个基于云原生的AI算力平台,目前因公司隐私暂不能公开宏观背景和技术方案, 姑且记录实践中遇到的一些技能点。
Arena是阿里云开源的命令行工具,帮助算法开发者和数据科学家,在无需云原生技能的前提下,提交训练和评测任务、管控模型, 现在已经捐赠给kubeflow社区。
提交一个pytorchjob微调训练模型的姿势如下, 具体的请参考官网。
arena submit pytorchjob \
--name=bloom-sft \
--gpus=1 \
--image=registry.cn-hangzhou.aliyuncs.com/acs/deepspeed:v0.9.0-chat \
--data=training-data:/model \
--tensorboard \
--logdir=/model/logs \
--config test_ac.yaml
"cd /model/DeepSpeedExamples/applications/DeepSpeed-Chat/training/step1_supervised_finetuning && bash training_scripts/other_language/run_chinese.sh /model/bloom-560m-sft"
Arena将应用层的行为动作抽象为cli参数,渲染为helm的应用模板, 使用helm创建云原生机器学习任务。
Arena有golang、python、java sdk, 早期我们尝试使用Arena sdk提交训练任务, 后面发现这个工具截止1.4.2版本时依旧是只支持单用户, 那么在用户粒度上使用该sdk就会有线程安全问题, 这个二开的话改动还挺大。
基于对平台客户和并发度的分析, 我们认为可以采用Arena子进程的方式规避这个问题。
于是问题就变成了在web后端进程启动Arena子进程来完成动作,同时我们发现Arena cli底层是将cli参数渲染进helm模板,于是我们借葫芦画瓢也可以利用golang text template将saas前端的内容渲染进arena cli参数。
1. 准备text template,产生需要渲染的Arena Cli参数字符串。
新建一个golang模板文件tmpl.go,下面是提交训练任务的golang text template,
var submitTmplStr string = `arena submit pytorchjob
--name. {[.Name}]
--workers={{.Workers}}
--image={{.Image}}
{{if .RDMA}}
--rdma
{{end}}
--retry {{.Retry}}
--gpus {{.RequestGPUs}}
--memory [{.RequestMemory}}
--cpu {{.RequestCPUs}}
--share-memory {{.RequestShareMemory}}
-n {{.BelongTenantId}}
--selector {[.ResourceSpec}}
-l kueue.x-k8s.io/queue-name={{.BelongTenantId}}-local-queue
-e TZ=Asia/Shanghai
{{ range $key,$value :=.Ants}} -a {{$key}}={{$value}} {{end}}
{{ range .Data}} --data {{.}} {{end}}
--config {[.KubeConfig}}
--loglevel=info
{{ .Command}}
golang text template使用{{ }}作为占位符,支持if/else、 foreach, 渲染格式对于开发者友好,后期也很容易定位问题。
这里还有个小技巧, 如果你模板内容很长(还要求是一个紧凑的字符串),模板中的cli参数之间可使用\n\t来间隔,渲染完成后自行去掉即可。
产生渲染文本:
tmpl, err := template.New("submitArgs").Parse(submitTmplStr)
if err != nil {
zap.L().Error("parse submit template failure", zap.Error(err)〕
return err
}
var buf bytes.Buffer
err = tmpl.Execute(&buf, ja) // 产出渲染文本
if err != nil {
zap.L().Error("execute submit template failure", zap.Error(err)〕
return err
}
submitStr := buf.String()
replacer := strings.NewReplacer("\n","","\t","") // 移除模板中插入的\n\t
submitStr = replacer.Replace(submitStr)
2. web后端启动Arena子进程,加载参数,提交训练任务。
env:= os.Environ()
cmd:= exec.Command("sh","-c",submitStr)
cmd.Env= env
by,err := cmd.CombinedOutput()
if err != nil {
// ...
}
return nil
理论上还有另外一种启动子进程的方式:
exec.Command("arena",args...), args 是参数切片,或者叫不定长参数,但是我们已经用模板字符串了,所以这里使用sh来启动子进程并自行解释arena参数比较合适。
That's All 本文记录了在实践【云原生算力平台】时用到的两个通用技能点, 后期我会持续记录本项目实践中遇到的挑战,并适时给出整个架构的宏观全貌和设计考量。
Golang 文本模板,你指定没用过的更多相关文章
- 使用 T4 文本模板生成设计时代码
使用设计时 T4 文本模板,您可以在 Visual Studio 项目中生成程序代码和其他文件. 通常,您编写一些模板,以便它们根据来自模型的数据来改变所生成的代码. 模型是包含有关应用程序要求的 ...
- T4文本模板
<#...#> 可以包含语句 <#=...#> 用于表达式,提供“输出”操作 <#+ ...> 使用类功能控制块向文本模板添加方法.属性.字段,必须作为文件中最后 ...
- 编写 T4 文本模板
文本模板由以下部件组成: 1)指令 - 控制模板处理方式的元素. 2)文本块 - 直接复制到输出的内容. 3)控制块 - 向文本插入可变值并控制文本的条件或重复部件的程序代码. 指令: 指令是控制模板 ...
- T4文本模板转换过程
T4文本模板转换过程将文本模板文件作为输入,生成一个新的文本文件作为输出. 例如,可以使用文本模板生成 Visual Basic 或 C# 代码,还可以生成 HTML 报告. 有三个组件参与这一过程: ...
- 关于C#中文本模板(.tt)的简单应用
这两天做项目突遇 .tt文件,之前没有接触过,so查询学习做笔记,帮助记忆和后来者. 在项目添加中点击选择文本模板 下面贴出代码,做了简单的注释 <#@ template debug=" ...
- T4 文本模板编写准则
如果要在 Visual Studio 中生成程序代码或其他应用程序资源,遵守以下一般准则可能非常有帮助. 它们并不是一成不变的规则. 设计时 T4 模板准则 设计时 T4 模板是在设计时在 Visua ...
- 转:JS在文本域鼠标指定位置插入文本-柯乐义
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- C#中文本模板(.tt)
关于C#中文本模板(.tt)的简单应用 这两天做项目突遇 .tt文件,之前没有接触过,so查询学习做笔记,帮助记忆和后来者. 在项目添加中点击选择文本模板 下面贴出代码,做了简单的注释 1 2 3 4 ...
- C#代码生成工具:文本模板初体验 使用T4批量修改实体框架(Entity Framework)的类名
转自:http://www.cnblogs.com/huangcong/archive/2011/07/20/1931107.html 在之前的文本模板(T4)初体验中我们已经知道了T4的用处,下面就 ...
- jquery操作select下拉框的各种方法,获取选中项的值或文本,根据指定的值或文本选中select的option项等
简介jquery里对select进行各种操作的方法,如联动.取值.根据值或文本来选中指定的select下拉框指定的option选项,读取select选中项的值和文本等. 这一章,站长总结一下jquer ...
随机推荐
- ASP.NET Core中对开放泛型(Open Generic)的依赖注入
public interface IRepository<T> { void Add(T entity); List<T> Get(); } public class Repo ...
- Github Copilot 实战: 从零开始用AI写一个OCR工具 (3)
源码 https://github.com/densen2014/Blazor100/tree/master/AI/MiOcr 添加一个屏幕截图功能,显示截图起始点,结束点,截图区域,按键ESC取消截 ...
- HarmonyNEXT手动申请权限以及使用系统控件获取地址坐标的案例(区别)
一.手动申请位置权限 1.1.申请位置权限 申请ohos.permission.LOCATION.ohos.permission.APPROXIMATELY_LOCATION权限. "req ...
- C#学习:构建一个更真实的基于LLM的简历评估系统
前言 昨天的Demo以txt文件为例进行说明,并且评估标准写死了,跟真实的简历评估系统差别太大了.今天分享的是经过改进后更加真实的基于LLM的简历评估系统. 使用AI生成了5份不同的简历,如下所示: ...
- 在Ubuntu上使用Let's Encrypt配置Nginx SSL证书并自动更新
在Ubuntu上使用Let's Encrypt配置Nginx SSL证书并自动更新 绪言 这篇文章其实内容不多,难度不大,只是自己记录一下. Arisu拷打了我几次我在阿里云上花钱购买SSL证书一事. ...
- manim边做边学--参数化曲线
在数学可视化领域,参数方程提供了一种灵活描述曲线的方式. Manim库中的ParametricFunction类正是为此而生,它允许用户通过参数方程创建各种复杂的二维和三维曲线. Parametric ...
- HashSet的泛型应用
1 package com.lv.study.pm.first; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 //无序不可重复 ...
- ChatMoney智能占星师:不一样的AI工具
本文由 ChatMoney团队出品 在科技的前沿领域,诞生了一位独特的存在--AI占星师.它并非传统意义上的占星师,而是融合了先进的人工智能技术与神秘的占星学知识. 这能够凭借其强大的数据分析能力和精 ...
- nginx代理https、wss配置、wss流式配置
使用nginx代理实现 https.wss的代理,对于nginx版本自行寻找对应的版本,有x86和arm的版本,但是配置文件是通用的,config目录下的nginx.conf 下面是简单对此conf文 ...
- DotTrace系列:7. 诊断 托管和非托管 内存暴涨
一:背景 1. 讲故事 分析托管和非托管内存暴涨,很多人潜意识里都会想到抓dump上windbg分析,但我说可以用dottrace同样分析出来,是不是听起来有点让人惊讶,哈哈,其实很正常,它是另辟蹊径 ...