Author : 张一极
Date time :20221002-16:30
说在前面:最近在折腾关于gitlab ci 的整体pipeline适配,发现ci是一个可以跟深度学习完美融合的一个工具,并且调研了现有的mlops,没有发现一个比较简洁有效,且可追溯完整的系统,后来想着,既然ci可以做持续集成和测试,那么也可以用以尝试训练模型和算法,所以才有了这篇文章做的事情,我把ci和DeepLearning进行了一个融合,做了一个简易版本的mlops。
21mkdir ~/data/gitlab-runner/config
2docker run --rm -t -id -v ~/data/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner:v12.9.0
from docker 安装
获取runner信息,在gitlab页面对应ci/cd位置获取token:
runner类型
runner状态
后按照文档注册:
https://docs.gitlab.com/runner/register/
将准备好的镜像注册成runner,在起runner的时候顺便把nvdia对应组件包裹进docker,同时设置挂载路径就可以开始编写训练脚本。
进入gitlab runner 的docker后:
cat /data/etc/gitlab-runner/config.toml
[runners.docker]
| host | 指定自定义Docker端点,默认使用DOCKER_HOST
环境或 unix:///var/run/docker.sock |
| hostname | 为Docker容器指定自定义主机名 |
| runtime | 为Docker容器指定一个运行时 |
| tls_cert_path | 设置时将使用ca.pem、cert.pem和key。从该文件夹中的pem建立到Docker的安全TLS连接(在boot2docker中非常有用) |
| tls_verify | 启用或禁用连接到Docker守护进程的TLS验证。默认情况下禁用。 |
| image | 使用此映像运行构建 |
| memory | 包含内存限制的字符串值 |
| memory_swap | 包含总内存限制的字符串值 |
| memory_reservation | 包含内存软限制的字符串值 |
| oom_kill_disable | 如果发生内存不足(OOM)错误,不要杀死容器中的进程 |
| oom_score_adjust | OOM分数调整,正意味着杀得早 |
| cpuset_cpus | 包含要使用的cgroups cpusetcpu的字符串值 |
| cpu_shares | 用于设置相对CPU使用量的CPU共享数量,默认为1024 |
| cpus | cpu数量的字符串值(在docker 1.13或更高版本中可用) |
| dns | 容器要使用的DNS服务器的列表 |
| dns_search | DNS搜索域的列表 |
| privileged | 使容器以特权模式运行(不安全) |
| disable_entrypoint_overwrite | 禁用映像 entrypoint 覆盖 |
| userns_mode | 当启用usernamespace重新映射选项时,为容器设置usernamespace模式。(可在docker1.10或更高版本中获得) |
| cap_add | 向容器添加额外的Linux功能 |
| cap_drop | 从容器中删除额外的Linux功能 |
| security_opt | 设置安全选项(-security-opt in docker run),获取':'分隔键/值的列表 |
| devices | 与容器共享其他主机设备 |
| cache_dir | 指定Docker缓存应该存储在哪里(可以是绝对的,也可以是相对于当前工作目录的)。有关更多信息,请参见disable_cache。 |
| disable_cache | Docker执行器有两层缓存:全局缓存(与任何其他执行器一样)和基于Docker卷的本地缓存。此配置标志仅作用于禁止使用自动创建(未映射到主机目录)缓存卷的本地缓存卷。换句话说,它只阻止创建保存构建的临时文件的容器,如果运行器配置为分布式缓存模式,它不会禁用缓存。 |
| network_mode | 将容器添加到自定义网络 |
| wait_for_services_timeout | 指定等待docker服务的时间,设置为0禁用,默认为30 |
| volumes | 指定应该挂载的其他卷(与Docker的-v标志相同的语法) |
| extra_hosts | 指定应该在容器环境中定义的主机 |
| shm_size | 为映像指定共享内存大小(以字节为单位) |
| volumes_from | 以<container name>[:<ro|rw>]
的形式指定要从另一个容器继承的卷的列表。访问级别默认为读写,但可以手动设置为ro(只读)或rw(读写)。 |
| volume_driver | 指定容器使用的卷驱动程序 |
| links | 指定应该与构建容器链接的容器 |
| allowed_images | 指定可以在.gitlab-ci.yml中指定的图像的通配符列表。如果不提供所有映像,则允许(相当于["*/*:*"]
) |
| allowed_services | 指定可以在.gitlab-ci.yml中指定的通配符服务列表。如果不提供所有映像,则允许(相当于["*/*:*"]
) |
| pull_policy | 指定映像拉取策略:never
,if-not-present
或 always
(默认);请参阅pull策略文档 |
| sysctls | 指定sysctl选项 |
| helper_image | (高级)覆盖用于克隆repos和上传工件的默认 helper 映像
|
然后在你的训练.gitlab-ci.yml,yml关键词参考:
你可以选择把超参数config文件挂载到repo里面,每一次push的时候添加commit message的信息中包含某个关键词就执行训练脚本,然后在yml中把训练参数变量化,就可以得到一个完整的训练流程。
当你提交一个新的commit message 带有某个关键词的时候,他就会在gitlab runner中以docker in docker 的形式自动拉起一个新的你预先配置好环境的docker,放进你的repo和挂载数据进行训练,同时你可以在gitlab的ci/cd 中看到实时的日志内容和相应的产物产出,(前提是你做好产物定义,具体可以看一下文档内部说明)
最后,整体pipeline就是:
提交 -》自动训练 -》使用自定义超参 -》结束 -》产物下载(模型,结果)
YES