Gitlab Ci train a DeepLearning Model

Author : 张一极

Date time :20221002-16:30

说在前面:最近在折腾关于gitlab ci 的整体pipeline适配,发现ci是一个可以跟深度学习完美融合的一个工具,并且调研了现有的mlops,没有发现一个比较简洁有效,且可追溯完整的系统,后来想着,既然ci可以做持续集成和测试,那么也可以用以尝试训练模型和算法,所以才有了这篇文章做的事情,我把ci和DeepLearning进行了一个融合,做了一个简易版本的mlops。

安装

from docker 安装

注册

获取runner信息,在gitlab页面对应ci/cd位置获取token:

后按照文档注册:

https://docs.gitlab.com/runner/register/

来自ci文档

将准备好的镜像注册成runner,在起runner的时候顺便把nvdia对应组件包裹进docker,同时设置挂载路径就可以开始编写训练脚本。

yaml

进入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 | 指定映像拉取策略:neverif-not-presentalways(默认);请参阅pull策略文档 |     | sysctls | 指定sysctl选项 |     | helper_image | (高级)覆盖用于克隆repos和上传工件的默认 helper 映像 |

from https://www.cnblogs.com/wu-wu/p/13269950.html

然后在你的训练.gitlab-ci.yml,yml关键词参考:

https://docs.gitlab.cn/jh/ci/yaml/index.html

你可以选择把超参数config文件挂载到repo里面,每一次push的时候添加commit message的信息中包含某个关键词就执行训练脚本,然后在yml中把训练参数变量化,就可以得到一个完整的训练流程。

体验

当你提交一个新的commit message 带有某个关键词的时候,他就会在gitlab runner中以docker in docker 的形式自动拉起一个新的你预先配置好环境的docker,放进你的repo和挂载数据进行训练,同时你可以在gitlab的ci/cd 中看到实时的日志内容和相应的产物产出,(前提是你做好产物定义,具体可以看一下文档内部说明)

最后,整体pipeline就是:

提交 -》自动训练 -》使用自定义超参 -》结束 -》产物下载(模型,结果)

以上

YES