04-19 周四 GitHub CI 方案设计
时间 | 版本 | 修改人 | 描述 |
---|---|---|---|
2024年4月19日14:44:23 | V0.1 | 宋全恒 | 新建文档 |
2024年4月19日17:22:57 | V1.0 | 宋全恒 | 完成部署拓扑结构的绘制和文档撰写 |
简介
需求
由于团队最近把代码托管在GitHub上,为解决推理、应用的自动化CI的需要,调研了GitHub自带的CI基础设施,基本上需要满足如下的需求:
- 由于大模型需要GPU,因此CI时需要使用GPU来运行,由于一台服务器有多个GPU卡,因此,保证灵活性的同时,需要为每个仓库的CI程序自定义需要的GPU。
- 部署简单,能够实现一台服务器,如8C A100的,同时对4个仓库进行CI作业的运行,而不互相影响。
关联的文档如下所示:
- 04-15 周一 GitHub仓库CI服务器配置过程与workflow配置文件解析文档.md
- 04-18 周四 为LLM_inference项目配置GitHub CI过程记录.md
仓库
当前的仓库主要是为了如下的项目而设置。
GitHub仓库主要是包括四个私有仓库
仓库 | 项目简介 | 标签分配 | GPU分配 |
---|---|---|---|
LLMChat | 主要是大模型RAG,解决大模型知识时效问题 | A100, gpu, application | 3,4 |
LLMs_Inference | 主要是依托于vLLM,解决高效推理问题 | gpu, a100, inference | 7号A100 |
注,由于大模型精调和训练组当前还不需要CI,因此未对其进行配置CI。
方案设计
GitHub actions Runner
GitHub Actions Runner 是 GitHub Actions 的一部分,它允许你在自己的硬件、虚拟机或云实例上托管和运行自定义的工作流程。Runner 可以与 GitHub 上的仓库关联,以便在触发事件(如 push、pull request 等)发生时执行工作流程中的任务。

以下是 GitHub Actions Runner 的一些重要特点和功能:
- 灵活性: 可以在自己的环境中托管 Runner,这意味着你可以在自己的硬件、虚拟机或云实例上运行工作流程。这为你提供了更大的灵活性和控制权,以满足特定的需求和安全要求。
- 跨平台支持: Runner 支持多种操作系统和平台,包括 Windows、Linux 和 macOS。这意味着你可以在不同的操作系统上运行工作流程,并且可以根据需要选择合适的平台。
- 自动化: Runner 可以自动更新到最新版本,并且可以自动重新连接到 GitHub 服务器以接收新的工作。这简化了 Runner 的管理和维护,并确保了其与 GitHub 平台的兼容性。
- 安全性: Runner 可以配置为在受限的环境中运行,以确保工作流程中的敏感数据和操作受到保护。此外,Runner 还支持身份验证和令牌以与 GitHub 服务器进行安全通信。
- 自定义性: 你可以自定义 Runner 的配置和行为,以满足特定的需求。例如,你可以配置 Runner 的标签以限制工作流程在特定 Runner 上运行,也可以配置 Runner 的执行器以添加额外的功能和工具。

总的来说,GitHub Actions Runner 提供了一个灵活、强大和可扩展的平台,用于在你自己的环境中托管和运行 GitHub Actions 工作流程,从而实现自动化和持续集成/持续部署 (CI/CD)。
注,由于需要使用GPU完成大模型相关的作业,测试,因此无法使用GitHub提供的GitHub-hosted runner,主要是部署self-hosted runner。
GitHub actions-runner 也为托管在GitHub上的仓库,仓库地址,在使用时,采用Client-Server的方式进行作业的分发和处理。
CI服务器
当前用于CI的是包含8张A100卡的42服务器,其操作系统细节如下:
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.6 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.6 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
注,由于当前的宿主机为Ubuntu 20.04,因此在CI时在使用自定义的镜像启动容器进行单元测试等工作时,强烈建议采用Ubuntu 20.04的Pytorch镜像,以防止出现类似GLIBC的问题。
注,建议在镜像中,不要再次使用conda进行环境管理。
部署拓扑
为满足多个仓库在同一台服务器使用GPU进行CI作业的需求,因此,我们需要部署多个actions-runner实例与github server进行交互,具体的部署结果如下图所示:
经过调研,采用的是多用户多个actions-runner实例的部署,具体如下图所示:

注,在使用多actions-runner实例时,尝试过了如下的方案:
- 在42服务器上采用虚拟化,即Docker容器中包含actions-runner服务,可以注册但执行CI会报错。
- 在42服务器上,采用单用户部署多个实例(部署更加简单),但直接报错,无法配置。
Docker中包含actions-runner,报错,Docker in Docker这个特征当前还不支持。

单用户部署多个actions-runner实例,报错:

所以,最终选择了为每个仓库新建一个用户,在该用户的目录下运行该实例。
GPU资源限额
CI解释
由于在运行actions-runner实例,并没有划分GPU,即确定在作业分发时使用的GPU,这部分工作,是由self-hosted Runner的在容器中运行作业来指定的。也就是在不同的仓库执行CI作业时,有各自的CI工作流要执行:

这些工作流是由workflow的配置文件定义的,即.github/workflows/*.yaml定义的。
换句话说,即使用那个镜像启动容器,以什么方式启动容器,在容器中执行那些过程,都是由这个配置文件决定的。
使用7号gpu卡进行CI作业的工作流配置文件
# 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-pythonname: LLM_Inference CIon:push:branches: [ "features-ci-songquanheng" ]pull_request:branches: [ "main" ]permissions:contents: readjobs: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-py3options: --runtime nvidia --shm-size=32gbcredentials:username: adminpassword: admin@ZJ2023env: NVIDIA_VISIBLE_DEVICES: 7volumes:- /home/yangfei/:/home/yangfeiports:- 22steps: - name: show pyhon versionrun: |python --version- name: show the gpus availablerun: |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 Codecovuses: codecov/codecov-action@v4with:token: ${{ secrets.CODECOV_TOKEN }}file: coverage.xmlverbose: true
上述配置文件限定了为ci容器使用的gpu资源。具体关于该配置文件的解析,可以参见
-
[04-15 周一 GitHub仓库CI服务器配置过程与workflow配置文件解析文档.md](D:\400-工作\440-中心\443-高效能计算中心\04-15 周一 GitHub仓库CI服务器配置过程与workflow配置文件解析文档.md)
不再赘述
总结
本文主要描述了在42服务器上为多个仓库部署actions-runner实例的CI 部署方案,具体包含如下内容:
- 42CI服务器的详情
- 团队代码仓库的标签划分
- 部署拓扑结构
- GPU限定使用的实现。
通过这样的部署方式,就可以灵活的为多个代码仓库的自动化CI实现各种自定义的功能,以满足特定的要求和实现。
相关文章:

04-19 周四 GitHub CI 方案设计
04-19 周四 GitHub CI 方案设计 时间版本修改人描述2024年4月19日14:44:23V0.1宋全恒新建文档2024年4月19日17:22:57V1.0宋全恒完成部署拓扑结构的绘制和文档撰写 简介 需求 由于团队最近把代码托管在GitHub上,为解决推理、应用的自动化CI的需要,调研了…...
java日常选择题
题目来自牛客网 1.以下哪个接口的定义是正确的?() A interface B { void print() {} ;} B interface B { static void print();} C.abstract interface B extends A1, A2 //A1、A2为已定义的接口 {abstract void print(){};} D.interface B { void print(); 选D,因…...
安卓串口通訊三
核心代碼如下: package com.example.comandroid;import static android.content.ContentValues.TAG;import android.graphics.Color; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView;import…...
嵌入式交叉编译:Unable to find arm_neon.h
找到文件 搜索了一下,具体目录是: /opt/linux/x86-arm/aarch64-mix210-linux/lib/gcc/aarch64-linux-gnu/7.3.0/include/arm_neon.h 解决办法 INC_ARM/opt/linux/x86-arm/aarch64-mix210-linux/lib/gcc/aarch64-linux-gnu/7.3.0/include./configure …...
Linux下工具tc详细讲解及限制IP和端口实例
首先纠正某一篇博客,TC并不是只管发包不管收包,之前我也很纳闷 知道最后看到了14年前一位大佬的帖子。是ingress! 这里有个非常重要的点就是ingress,如果父类不是他的话是完不成限制源IP的,这个关键词表明你正在添加一个入口队列规…...

Java | Leetcode Java题解之第73题矩阵置零
题目: 题解: class Solution {public void setZeroes(int[][] matrix) {int m matrix.length, n matrix[0].length;boolean flagCol0 false;for (int i 0; i < m; i) {if (matrix[i][0] 0) {flagCol0 true;}for (int j 1; j < n; j) {if (…...

MySQL#MySql表的操作
目录 一、创建表 二、查看表结构 三、修改表 1.修改表的名字 2.新增一个列 3.修改列 4.删除列 5.修改列的名称 四、删除表 一、创建表 语法: CREATE TABLE table_name (field1 datatype,field2 datatype,field3 datatype ) character set 字符集 collate 校…...
git修改版本发布时间
一、场景 发现git版本发布时,服务器时间有误,需要修改。 二、解决 (1)准备 时间戳转换网址:http://shijianchuo.wiicha.com/ (2)SQLite 数据库 连接到安装git的服务器,修改版本表…...

【NodeMCU实时天气时钟温湿度项目 1】连接点亮SPI-TFT屏幕和UI布局设计
前言 从今天开始,我们详解介绍制作实时天气时钟项目的方法步骤,主要分以下几个专题分别进行:(1)连接点亮SPI-TFT屏幕和UI布局设计;(2)NodeMCU的WIFI模式设置及连接;&…...

国内首发 | CSA大中华区启动《AI安全产业图谱(2024)》调研
在人工智能(AI)技术的快速发展浪潮中,AI安全已成为全球关注的焦点。为应对AI安全带来的挑战,确保AI技术的健康发展,全球范围内的研究机构、企业和技术社区都在积极探索解决方案。 在这一背景下,CSA大中华区…...
web页面与原生android通信,调用原生android方法
注册初始化方法JsBridge //JS注册事件监听 function connectWebViewJavascriptBridge(callback) {if (window.WebViewJavascriptBridge) {callback(WebViewJavascriptBridge)} else {document.addEventListener(WebViewJavascriptBridgeReady,function() {callback(WebViewJav…...

Linux的编译器
程序编译的过程 程序的编译过程是将源代码转换为可执行文件的一系列步骤。这个过程涉及多个阶段,主要包括预处理、编译、汇编和链接。下面详细介绍每个阶段: 1. 预处理(Preprocessing) 在实际编译之前,源代码文件首…...

redis--安装
简介 官网:RedisInsight - The Best Redis GUI 各个版本官网下载地址:http://download.redis.io/releases/ Redis和Memcached是非关系型数据库也称为NoSQL数据库,MySQL、Mariadb、SQL Server、PostgreSQL Oracle 数据库属于关系型数据 应用…...

魔法程序员的奥妙指南:Java基本语法
作为一名魔法程序员,精通Java语言是至关重要的。Java作为一种强大的编程语言,在编写优质代码和开发强大应用程序时发挥着重要作用。让我们深入探讨Java基本语法的关键要点,从注释到变量,无所不包! Java基本语法的神秘魔…...

SpringMVC传递参数
1.RequestMapping RequestMapping本身可以处理,get或post,指定了get或post之后,就只能处理对应的请求。 RequestMapping(value{"haihiyo","goodMoring"},methodRequestMethod.POST)2.RestFul风格 RestFul是一种风格 比如:网站的访…...

【Scala---04】函数式编程 『 函数 vs 方法 | 函数至简原则 | 函数式编程』
文章目录 1. 函数 vs 方法1.1 方法(1) 定义方法(2) 运算符即方法 1.2 函数(1) 定义函数(2) 匿名函数 1.3 方法转为函数1.4 可变参数&默认参数 2. 函数至简原则3. 函数式编程3.1 函数式编程思想3.3 函数柯里化&闭包3.5 递归 & 尾递归 4. 补充4.1 访问元祖元素4.2 &g…...

[华为OD] B卷 树状结构查询 200
题目: 通常使用多行的节点、父节点表示一棵树,比如 西安 陕西 陕西 中国 江西 中国 中国 亚洲 泰国 亚洲 输入一个节点之后,请打印出来树中他的所有下层节点 输入描述 第一行输入行数,下面是多行数据,每行以空…...

基于机器学习的学生学习行为自主评价设计与实现
管理员功能: a)学生学习数据管理:可查看学生学习的详情,编辑学生学习的内容,删除和添加学生学习,设置学生学习库存。 b)角色管理:增加删除学生用户,分配学生用户权限,查看学生用户…...
toml与json联系对比
前言 本文简单介绍toml;并且和json转化做对比,以及我对toml设计的理解。 参考: TOML: 简体中文 v1.0.0 json和toml转化工具 在线JSON转toml-toml转JSON - bejson在线工具 正文 数组 说白了,就是一个变量名,有多个…...

(已解决)org.springframework.amqp.rabbit.support.ListenerExecutionFailedException
报错截图 解决方案 1、登录rabbitMQ网址,删除所有队列 2、重启rabbitMQ 亲测有效!!!亲测有效!!!亲测有效!!!...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...