04-18 周四 为LLM_inference项目配置GitHub CI过程记录
时间 | 版本 | 修改人 | 描述 |
---|---|---|---|
2024年4月18日10:30:13 | V0.1 | 宋全恒 | 新建文档 |
简介和相关文档
- 04-15 周一 GitHub仓库CI服务器配置过程文档
- actions-runner 是托管与GitHub上的仓库,下载最新的客户端程序即可。
- self hosted runner是github支持的ci特性,可以参见官网,了解具体内容。
- GitHub marketplace是GitHub CI的工作流需要使用的步骤的仓库,Find tools to improve your workflow
基本流程
# 前提
- CI服务器已经正确安装了Docker服务。一般docker组是存在的,关键是查看/var/run/docker.sock文件的属主。
- 在私仓上已经有了有了正确的镜像
- github账户拥有待配置的仓库
步骤
CI服务器配置
创建用户
注意,主要是创建用户,并为用户分配docker组,不然会没有权限
为大模型推理服务,创建相应的服务启动用户,如为LLM_inference配置zhangyi账户,首先查看账户存在与否,否则,创建账户,并设置密码
bash
sudo useradd -m -s /bin/bash -G docker zhangyi
echo "zhangyi:123456" | sudo chpasswd
可以使用id命令查看具体信息
bash
yangfei@ubuntu:~$ id zhangyi
uid=1033(zhangyi) gid=1033(zhangyi) groups=1033(zhangyi),998(docker)
解压actions-runner客户端压缩包
注意,主要是设置名称,标签和工作目录
然后我们在zhangyi用户目录下创建actions-ci目录,以保存actions-runner的客户端程序,仍然使用yangfei这个sudo的权限的用户
bash
sudo mkdir -p /home/zhangyi/actions-ci
sudo chown zhangyi:zhangyi /home/zhangyi/actions-ci
sudo cp /home/yangfei/actions-ci/actions-runner-linux-x64-2.315.0.tar.gz /home/zhangyi/actions-ci/
sudo chown -R zhangyi:zhangyi /home/zhangyi/actions-ci
sudo tar -xzvf /home/zhangyi/actions-ci/actions-runner-linux-x64-2.315.0.tar.gz -C /home/zhangyi/actions-ci/
sudo chown -R zhangyi:zhangyi /home/zhangyi/actions-ci
获取GitHUBURL,token,并配置客户端标签
注意,需要使用own仓库的github账户登录才可以查看这些信息
这一步,需要首先获取token,以及URL,和标签。
这个步骤可以参见 [04-15 周一 GitHub仓库CI服务器配置过程文档](D:\400-工作\440-中心\443-高效能计算中心\04-15 周一 GitHub仓库CI服务器配置过程文档.md)
在configure中,可以查看到这些重要的信息,
注意,配置的过程必须使用普通账户进行。即当前的zhangyi用户
bash
# Create the runner and start the configuration experience
$ ./config.sh --url https://github.com/CodexDive/LLMs_Inference --token BCTEUWKWB2VWIPORYECDC53GEDE4O# Last step, run it!
$ ./run.sh
上面的过程是手动的方式来配置这个客户端,需要传入组,runner名称,以及标签。可以采用编程的方式来实现这个过程:
bash
sudo -u yangfei -i
cd actions-ci
我们为这个runner设置名称42-reference-runner,标签设置为gpu,a100,inference,
bash
./config.sh --unattended --url https://github.com/CodexDive/LLMs_Inference --token BCTEUWKWB2VWIPORYECDC53GEDE4O --labels gpu,x64,linux,a100,inference --name 42-reference-runner
这个是为大模型应用配置的标签,不再赘述含义了。
bash
./config.sh --unattended --url https://github.com/CodexDive/LLMChat --token BCTEUWKOJA3QT5TMD4XWAZTGEDW6O --labels gpu,x64,linux,a100,application --name 42-application-runner
代码执行的结果如下:
bash
zhangyi@ubuntu:~/actions-ci$ ./config.sh --unattended --url https://github.com/CodexDive/LLMs_Inference --token BCTEUWKWB2VWIPORYECDC53GEDE4O --labels gpu,x64,linux,a100,inference --name 42-reference-runner
--------------------------------------------------------------------------------
| ____ _ _ _ _ _ _ _ _ |
| / ___(_) |_| | | |_ _| |__ / \ ___| |_(_) ___ _ __ ___ |
| | | _| | __| |_| | | | | '_ \ / _ \ / __| __| |/ _ \| '_ \/ __| |
| | |_| | | |_| _ | |_| | |_) | / ___ \ (__| |_| | (_) | | | \__ \ |
| \____|_|\__|_| |_|\__,_|_.__/ /_/ \_\___|\__|_|\___/|_| |_|___/ |
| |
| Self-hosted runner registration |
| |
--------------------------------------------------------------------------------
# Authentication
√ Connected to GitHub
# Runner Registration
√ Runner successfully added
# Runner settings
√ Settings Saved.
注意,我们可以使用./config.sh 重新修改名称,标签。
注意,一个runner仅仅可以配置在一个仓库中。对于组织级的用户,一个runner可以配置来运行组织的多个仓库。
仓库上验证runner配置
此时,我们就可以验证这个runner是否正确配置在我们的仓库上了。具体的过程如下:
由此,我们已经成功的配置了actions-runner客户端了。并且服务端收到了注册信息,可以看到标签和我们注册时填写的标签是一样的。因此注册过程是没有问题的。
将客户端注册为服务
注意,可以将自托管的运行器应用程序配置为服务,以在机器启动时自动启动运行器应用程序。
注意,默认使用systemd服务将actions-runner配置成服务。
注意,默认要使用具有sudo权限的用户来安装服务
注意,我们使用svc.sh来执行这个过程,需要使用sudo
因此,首先切换普通用户zhangyi成具有sudo权限的用户yangfei
bash
zhangyi@ubuntu:~/actions-ci$ ./svc.sh install zhangyi
Must run as sudo
# 切换为yangfei用户
zhangyi@ubuntu:~/actions-ci$ exit
logout
yangfei@ubuntu:/home/zhangyi/actions-ci$ ./svc.sh install zhangyi
Must run as sudo
yangfei@ubuntu:/home/zhangyi/actions-ci$ sudo ./svc.sh install zhangyi
Creating launch runner in /etc/systemd/system/actions.runner.CodexDive-LLMs_Inference.42-reference-runner.service
Run as user: zhangyi
Run as uid: 1033
gid: 1033
Created symlink /etc/systemd/system/multi-user.target.wants/actions.runner.CodexDive-LLMs_Inference.42-reference-runner.service → /etc/systemd/system/actions.runner.CodexDive-LLMs_Inference.42-reference-runner.service.
从上面,我门可以看出,已经为actions-runner创建了服务,并且服务名称为
actions.runner.CodexDive-LLMs_Inference.42-reference-runner.service.
我们启动这个服务,防止服务器的开机和关机
bash
yangfei@ubuntu:/home/zhangyi/actions-ci$ sudo ./svc.sh start
/etc/systemd/system/actions.runner.CodexDive-LLMs_Inference.42-reference-runner.service
● actions.runner.CodexDive-LLMs_Inference.42-reference-runner.service - GitHub Actions Runner (CodexDive-LLMs_Inference.42-reference-runner)
Loaded: loaded (/etc/systemd/system/actions.runner.CodexDive-LLMs_Inference.42-reference-runner.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2024-04-18 07:09:29 UTC; 26ms ago
Main PID: 3665246 (runsvc.sh)
Tasks: 1 (limit: 629145)
Memory: 956.0K
CGroup: /system.slice/actions.runner.CodexDive-LLMs_Inference.42-reference-runner.service
├─3665246 /bin/bash /home/zhangyi/actions-ci/runsvc.sh
└─3665255 [node]
Apr 18 07:09:29 ubuntu systemd[1]: Started GitHub Actions Runner (CodexDive-LLMs_Inference.42-reference-runner).
Apr 18 07:09:29 ubuntu runsvc.sh[3665246]: .path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
yangfei@ubuntu:/home/zhangyi/actions-ci$
将actions-runner配置成服务之后,我们再次查看网页,self-hosted runner应该变为idle表明客户端-server通信连接已经建立了。
我们也可以使用svc.sh这个工具来实现做服务的管理,诸如启动,停止,查看,卸载,如下图所示:
也可以浏览官网查看具体的详情。
配置docker registry
注意,主要是配置私有仓库,因为CI过程中需要使用自定义镜像,因此需要配置docker的配置文件
注意,这个过程不一定是必须得,如果不使用自定义的镜像,而使用GitHub-hosted的vm进行CI,则该步骤需要进行。
配置docker registry的过程,相当于配置私有镜像仓库,也即在daemon.json中配置。
具体可以参见之前撰写的文档
- [03-01 周五 计算应用组基础环境使用](D:\400-工作\440-中心\443-高效能计算中心\03-01 周五 计算应用组基础环境使用.md)
注意,修改了docker之后,记得重启验证,建议也重启一下actions-runner服务。
添加工作流配置文件
注意,由其控制CI工作流的具体过程细节。
关于工作流配置文件的组成和解析,参见文档
- [04-15 周一 GitHub仓库CI服务器配置过程与workflow配置文件解析文档](D:\400-工作\440-中心\443-高效能计算中心\04-15 周一 GitHub仓库CI服务器配置过程与workflow配置文件解析文档.md)
我们需要了解的是,每个仓库需要的CI过程不一样,CI一般的包含单元测试的执行和覆盖率的上传,但也有许多特定的步骤。如拷贝CI过程中的文件,自动构建镜像并推送Harbor,自动将镜像部署成服务,多种多样,不一而足。
我们演示一个经典的,并且包含了GPU使用的过程。由于LLM_inference是一个大模型推理的仓库,因此在单元测试执行过程中,需要调用GPU的资源。由于42服务器,有8张A100,我们为推理分配一张A100来进行CI。CI的过程包含
- 拉取镜像
- 检出代码
- 准备环境
- 执行单元测试
- 推送测试覆盖率结果
注意,需要将工作流配置文件放置在.github/workflows/目录下
yaml
# This workflow will install Python dependencies, run tests and lint with a single version of Python
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python
name: LLM_Inference CI
on:
push:
branches: [ "features-ci-songquanheng" ]
pull_request:
branches: [ "main" ]
permissions:
contents: read
jobs:
llm-inference-ci:
runs-on: [self-hosted, linux, x64, a100, inference]
defaults:
run:
shell: bash -l {0}
container:
image: nvcr.io/nvidia/pytorch:22.12-py3
options: --runtime nvidia --shm-size=32gb
credentials:
username: admin
password: admin@ZJ2023
env:
NVIDIA_VISIBLE_DEVICES: 7
volumes:
- /home/yangfei/:/home/yangfei
ports:
- 22
steps:
- name: show pyhon version
run: |
python --version
- name: show the gpus available
run: |
nvidia-smi
- name: install necessary pip dependencies
run: |
pip install vllm --index-url https://pypi.tuna.tsinghua.edu.cn/simple
- name: Test with pytest and generate coverage report
run: |
pytest --cov=tests --cov-report=xml
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
file: coverage.xml
verbose: true
注意,上面的on确定了CI触发的时机。当在分支上产生push,或者main分支产生pr时,均会产生CI
web查看ci过程
我们在分支features-ci-songquanheng产生一次一次推送,然后观察仓库,可以看到actions目录下有了如下的workflow输出,表明CI已经正确的运行了。
总结
本文以LLM_Inference为例,使用shell详细描述了为一个仓库配置actions-runner的过程,具体包括如下内容:
- 配置CI服务器中actions-runner客户端
- 配置workflow工作流
通过上述的配置,可以为仓库创建self-hosted-runner,并且使用self-hosted-host可以方便的使用gpu,而且工作流配置可以灵活的使用actions marketplace中的组件方便我们进行集成需要的功能。