04-18 周四 为LLM_inference项目配置GitHub CI过程记录

04-18 周四 为LLM_inference项目配置GitHub CI过程记录

时间 版本 修改人 描述
2024年4月18日10:30:13 V0.1 宋全恒 新建文档

简介和相关文档

基本流程

# 前提

  • 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中配置。

 具体可以参见之前撰写的文档

注意,修改了docker之后,记得重启验证,建议也重启一下actions-runner服务。

添加工作流配置文件

注意,由其控制CI工作流的具体过程细节。

 关于工作流配置文件的组成和解析,参见文档

 我们需要了解的是,每个仓库需要的CI过程不一样,CI一般的包含单元测试的执行和覆盖率的上传,但也有许多特定的步骤。如拷贝CI过程中的文件,自动构建镜像并推送Harbor,自动将镜像部署成服务,多种多样,不一而足。

 我们演示一个经典的,并且包含了GPU使用的过程。由于LLM_inference是一个大模型推理的仓库,因此在单元测试执行过程中,需要调用GPU的资源。由于42服务器,有8张A100,我们为推理分配一张A100来进行CI。CI的过程包含

  1. 拉取镜像
  2. 检出代码
  3. 准备环境
  4. 执行单元测试
  5. 推送测试覆盖率结果

注意,需要将工作流配置文件放置在.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的过程,具体包括如下内容:

  1. 配置CI服务器中actions-runner客户端
  2. 配置workflow工作流

 通过上述的配置,可以为仓库创建self-hosted-runner,并且使用self-hosted-host可以方便的使用gpu,而且工作流配置可以灵活的使用actions marketplace中的组件方便我们进行集成需要的功能。

相关推荐
今夕资源网1 小时前
一只鹈鹕骑着单车闯海岛:开源 3D 网页游戏《鹈鹕骑车》体验与部署教程 github开源
开源·github·ai智能测试题·ai智能测试
沙蒿同学2 小时前
我把架构约定编译成了会变红的测试:Wails v2 + Go + Vue3 桌面脚手架实战
前端·后端·github
落魄大学生之流水线上谋生计3 小时前
幻境相机 Mirage Camera
github
wangruofeng4 小时前
从一个 10 万星 AI Agent 项目里,能学到什么真正的软件工程
github·agent·ai编程
子林super4 小时前
复杂JSON Schema结构与输出校验
github
子林super4 小时前
结构化输出解析失败处理策略
github
怕浪猫5 小时前
拆解 Google《AI Agent Handbook》:企业级 Agent 的六层架构与产品矩阵
面试·github·agent
kali-Myon5 小时前
分享一个网络安全 AI 工具导航项目 SecSkills
安全·ai·github·ctf
峰向AI15 小时前
Kage: 一个 244KB 文件,做出百万级视觉效果
github
m4Rk_19 小时前
【论文阅读】Agent 记忆机制(74):CompassMem——从相似度检索走向事件图上的记忆导航
论文阅读·人工智能·学习·开源·github