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

news2024/11/15 9:55:58
04-18 周四 为LLM_inference项目配置GitHub CI过程记录
时间版本修改人描述
2024年4月18日10:30:13V0.1宋全恒新建文档

简介和相关文档

  • 04-15 周一 GitHub仓库CI服务器配置过程文档
  • actions-runner 是托管与GitHub上的仓库,下载最新的客户端程序即可。
  • self hosted runner是github支持的ci特性,可以参见官网,了解具体内容。
  • GitHub marketplace是GitHub CI的工作流需要使用的步骤的仓库,Find tools to improve your workflow

基本流程

image-20240418173157368 # 前提
  • CI服务器已经正确安装了Docker服务。一般docker组是存在的,关键是查看/var/run/docker.sock文件的属主。
  • 在私仓上已经有了有了正确的镜像
  • github账户拥有待配置的仓库

步骤

CI服务器配置

创建用户

注意,主要是创建用户,并为用户分配docker组,不然会没有权限

 为大模型推理服务,创建相应的服务启动用户,如为LLM_inference配置zhangyi账户,首先查看账户存在与否,否则,创建账户,并设置密码

sudo useradd -m -s /bin/bash -G docker zhangyi
echo "zhangyi:123456" | sudo chpasswd

 可以使用id命令查看具体信息

yangfei@ubuntu:~$ id zhangyi
uid=1033(zhangyi) gid=1033(zhangyi) groups=1033(zhangyi),998(docker)

解压actions-runner客户端压缩包

注意,主要是设置名称,标签和工作目录

 然后我们在zhangyi用户目录下创建actions-ci目录,以保存actions-runner的客户端程序,仍然使用yangfei这个sudo的权限的用户

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,和标签。

image-20240418142134550

 这个步骤可以参见 [04-15 周一 GitHub仓库CI服务器配置过程文档](D:\400-工作\440-中心\443-高效能计算中心\04-15 周一 GitHub仓库CI服务器配置过程文档.md)

 在configure中,可以查看到这些重要的信息,

image-20240418142344391

注意,配置的过程必须使用普通账户进行。即当前的zhangyi用户

# 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名称,以及标签。可以采用编程的方式来实现这个过程:

sudo -u yangfei -i
cd actions-ci
image-20240418144038604

 我们为这个runner设置名称42-reference-runner,标签设置为gpu,a100,inference,


./config.sh --unattended --url https://github.com/CodexDive/LLMs_Inference --token BCTEUWKWB2VWIPORYECDC53GEDE4O --labels gpu,x64,linux,a100,inference --name 42-reference-runner

 这个是为大模型应用配置的标签,不再赘述含义了。

./config.sh --unattended --url https://github.com/CodexDive/LLMChat --token BCTEUWKOJA3QT5TMD4XWAZTGEDW6O --labels gpu,x64,linux,a100,application --name 42-application-runner

 代码执行的结果如下:

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是否正确配置在我们的仓库上了。具体的过程如下:

image-20240418145942656

 由此,我们已经成功的配置了actions-runner客户端了。并且服务端收到了注册信息,可以看到标签和我们注册时填写的标签是一样的。因此注册过程是没有问题的。

将客户端注册为服务

注意,可以将自托管的运行器应用程序配置为服务,以在机器启动时自动启动运行器应用程序。

注意,默认使用systemd服务将actions-runner配置成服务。

注意,默认要使用具有sudo权限的用户来安装服务

注意,我们使用svc.sh来执行这个过程,需要使用sudo

 因此,首先切换普通用户zhangyi成具有sudo权限的用户yangfei

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.

 我们启动这个服务,防止服务器的开机和关机

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通信连接已经建立了。

image-20240418151328066

 我们也可以使用svc.sh这个工具来实现做服务的管理,诸如启动,停止,查看,卸载,如下图所示:

image-20240418152107536

 也可以浏览官网查看具体的详情。

  • Configuring the self-hosted runner application as a service

配置docker registry

注意,主要是配置私有仓库,因为CI过程中需要使用自定义镜像,因此需要配置docker的配置文件

注意,这个过程不一定是必须得,如果不使用自定义的镜像,而使用GitHub-hosted的vm进行CI,则该步骤需要进行。

 配置docker registry的过程,相当于配置私有镜像仓库,也即在daemon.json中配置。

image-20240418151629171

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

  • [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的过程包含

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

注意,需要将工作流配置文件放置在.github/workflows/目录下

# 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已经正确的运行了。

image-20240418171556937

总结

 本文以LLM_Inference为例,使用shell详细描述了为一个仓库配置actions-runner的过程,具体包括如下内容:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1645863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring高级篇(十)

1、内嵌tomcat boot框架是默认内嵌tomcat的,不需要手动安装和配置外部的 Servlet 容器。 简单的介绍一下tomcat服务器的构成: Catalina: Catalina 是 Tomcat 的核心组件,负责处理 HTTP 请求、响应以及管理 Servlet 生命周期。它包…

考研数学|基础跟张宇,强化直接1000题还是先做660?

跟宇哥用1000题的,我愿称之为卷王之王!660对基础阶段是绝佳的查漏补缺,必做! 自我介绍一下:我21年一战数学83,总分没过线,22年二战143,逆袭上岸211!660是我的心头好&…

Python测试框架Pytest的参数化详解

上篇博文介绍过,Pytest是目前比较成熟功能齐全的测试框架,使用率肯定也不断攀升。 在实际工作中,许多测试用例都是类似的重复,一个个写最后代码会显得很冗余。这里,我们来了解一下pytest.mark.parametrize装饰器&…

【intro】图卷积神经网络(GCN)-续

本文为【intro】图卷积神经网络(GCN)-CSDN博客后续(因为经验告诉我超过2w字编辑器就会卡……) 第一部分还是进一步再看看GCN 图卷积神经网络GCN_哔哩哔哩_bilibili 回顾 图神经网络的基本原理就是把图中的节点编码映射成一个低…

4.堆_树(汇总版)

目录 1.树概念及结构 1.1树的概念 1.2 树的相关定义 1.3 树的表示 2.二叉树概念及结构 2.1概念 2.2现实中的二叉树 2.3 特殊的二叉树 2.4 二叉树的性质 2.5 二叉树的存储结构 3.二叉树的顺序结构及实现 3.1 二叉树的顺序结构--堆 3.2 堆的实现 3.2.1打印 3.2.2 …

怎么通过Java语言实现远程控制无人售货柜

怎么通过Java语言实现远程控制无人售货柜呢? 本文描述了使用Java语言调用HTTP接口,实现控制无人售货柜,独立控制售货柜、格子柜的柜门。 可选用产品:可根据实际场景需求,选择对应的规格 序号设备名称厂商1智能WiFi控…

CellMarker | 人骨骼肌组织细胞Marker大全!~(强烈建议火速收藏!)

1写在前面 分享一下最近看到的2篇paper关于骨骼肌组织的细胞Marker&#xff0c;绝对的Atlas级好东西。&#x1f44d; 希望做单细胞的小伙伴觉得有用哦。&#x1f60f; 2常用marker&#xff08;一&#xff09; general_mrkrs <- c( MYH7, TNNT1, TNNT3, MYH1, MYH2, "C…

2024.05.06作业

自由发挥应用场景&#xff0c;实现登录界面。 要求&#xff1a;尽量每行代码都有注释。 #include "yuanshen.h"yuanshen::yuanshen(QWidget *parent): QWidget(parent) {//窗口相关设置this->resize(1600,910);this->setFixedSize(1600,910);//窗口标题this-…

vue3中标签的ref属性

组合API-ref属性 在vue2.x中&#xff0c;可以通过给元素添加refxxx属性&#xff0c;然后在代码中通过this.$refs.xxx获取到对应的元素 然而在vue3中时没有$refs这个东西的&#xff0c;因此vue3中通过ref属性获取元素就不能按照vue2的方式来获取。 目标&#xff1a;掌握使用re…

java基础之Netty(主要用来开发像微信,qq等聊天软件)

一、Netty的定义 Netty是一个基于Java NIO的网络编程框架&#xff0c;提供了一套高效的、事件驱动的异步网络通信机制。简化了网络应用程序的开发过程&#xff0c;提供了可靠的、高性能的网络传输 二、Netty的特点是什么 异步和事件驱动&#xff1a;Netty使用异步的、非阻塞…

链表经典面试题01

目录 引言 面试题01:返回倒数第k个节点 题目描述: 思路分析: 代码展示: 面试题02:链表的回文结构 题目描述: 描述 思路分析: 代码展示: 面试题03:相交链表 题目描述: 思路分析: 代码展示: 小结: 引言 这次的题均来自力扣和牛客有关链表的经典面试题,代码只会展示…

【C++】命名空间namespace

为什么要有namespace&#xff1f; namespace是用来解决命名冲突&#xff08;名字污染&#xff09;的问题的。看看下面的代码&#xff1a; #include <cstdlib>int rand 10;int main() {return 0; }可以看到&#xff0c;这段代码什么都没干&#xff0c;就定义了一个全局…

[leetcode] 64. 最小路径和

文章目录 题目描述解题方法动态规划java代码复杂度分析 相似题目 题目描述 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例 1&#…

【字符串】Leetcode 43. 字符串相乘

题目讲解 43. 字符串相乘 算法讲解 class Solution { public:void AddZero(string& temp, int cnt) {while (cnt--) {temp 0;} }string Add(string num1, string num2) {string result;int carry 0;int i num1.size() - 1;int j num2.size() - 1;while (i > 0 ||…

制作微信在线答题步骤是什么

在信息爆炸的时代&#xff0c;学习不再只是书本和课堂的代名词。随着移动互联网的飞速发展&#xff0c;微信作为人们日常生活中不可或缺的沟通工具&#xff0c;也为我们提供了全新的学习平台。今天&#xff0c;就让我们一起探讨如何制作微信在线答题&#xff0c;让学习变得更加…

五种主流数据库:窗口函数

SQL 窗口函数为在线分析系统&#xff08;OLAP&#xff09;和商业智能&#xff08;BI&#xff09;提供了复杂分析和报表统计的功能&#xff0c;例如产品的累计销量统计、分类排名、同比/环比分析等。这些功能通常很难通过聚合函数和分组操作来实现。 本文比较了五种主流数据库实…

如何使用摇摆交易?fpmarkets实例讲解

各位投资者五一节后快乐&#xff01;祝愿投资者在接下来的日子里每次交易都以盈利结算。 五一节日也是劳动节&#xff0c;在这个特殊的日子里fpmarkets澳福和各位勤劳的投资者一起学习如何使用摇摆交易策略进行交易&#xff1f; 其实很简单&#xff0c;首先判断出买卖点&#x…

淡茶怎么泡?

很多人都知道喝浓茶对身体不好&#xff0c;但是怎么冲泡淡茶却一知半解。按照《品深淡茶冲泡标准》中对绿茶冲泡淡茶的规定&#xff0c;冲泡的茶汤中咖啡碱不得高于31.67mg/100mL&#xff0c;可可碱不得高于2.67mg/mL&#xff0c;茶碱不得高于1.50mg/100mL&#xff0c;茶多酚不…

无经验计科应届生前端面试遇到的问题整理

js数据类型有几种&#xff0c;分别是 原始数据类型&#xff08;Primitive data types&#xff09;: 字符串&#xff08;String&#xff09;: 用于表示文本数据&#xff0c;使用单引号&#xff08;‘’&#xff09;或双引号&#xff08;“”&#xff09;括起来。 数字&#xff…

高精地图是怎么构建的?方案有哪些?高精度语义地图构建的一点思考

高精地图是怎么构建的&#xff1f;方案有哪些&#xff1f;高精度语义地图构建的一点思考 高精度(High-Definition, HD)语义地图是目前自动驾驶领域的一个重要研究方向&#xff0c;近年随着Transformer和BEV的大火&#xff0c;很多大佬团队都开展了HD语义地图构建相关的工作。2…