持续集成(CI)和持续部署(CD)是软件开发中常用的实践,用于自动化集成代码变更、测试以及快速部署更新应用的流程。最初,这些实践面向传统软件应用而生,但如今在机器学习(ML)项目中同样日益关键。
在这份全面指南中,我们将了解面向机器学习的 CI/CD,并学习如何构建自己的机器学习流水线,以自动化训练、评估与部署模型的过程。
本指南通过一个简单项目,仅使用 GitHub Actions 来自动化整个流程。我们将讨论的大多数内容对机器学习工程师和数据科学家来说都很熟悉。这里他们将学习的,只有如何使用 GitHub Actions、Makefile、CML 和 Hugging Face CLI。
报名参加 MLOps Concepts 课程,学习如何将机器学习模型从本地笔记本迁移到能创造业务价值的生产模型。
为什么机器学习需要 CI/CD?
当您要将模型投入运营并用它来构建产品时,CI/CD 将带来颠覆性改变。简化自动化流程可以为您的 ML 项目提供无 Bug、快速且可扩展的方案,让您把精力更多放在改进模型上,而不是管理与部署。
具体而言,面向机器学习的 CI/CD 能带来以下帮助:
1. 自动化训练流水线
借助 CI/CD,您可以按固定节奏自动用新数据重训模型,相比手动触发重训可节省时间。
2. 及早发现错误
CI 工具会在每次提交时运行测试与检查,有助于捕捉缺陷、集成问题以及模型性能下降。
3. 可复现性
CI/CD 有助于确保模型能以完全相同的方式重建与重训,从而实现结果可复现。环境、模型与数据版本以及配置都被代码化管理。
4. 测试与监控
CI/CD 允许在部署前对新模型进行自动化测试以检查问题。它还可通过与监控工具集成,实现部署后的更佳监控。
5. 更快迭代
借助 CI/CD,可以自动化快速训练、测试和部署新的模型版本或实验,从而加速 ML 系统的开发与改进。
6. 可扩展性
随着 ML 项目规模和复杂度增长,手动管理整个生命周期将变得不可行。CI/CD 流水线提供可扩展方案,能够在保持效率与可靠性的同时,处理海量数据、众多模型以及多样依赖。
项目说明
在本指南中,我们将带您完成账号与环境搭建、创建 CI/CD 流水线以及优化整个流程。
我们将使用 scikit-learn 流水线来训练随机森林算法并构建一个药物分类器。训练完成后,我们将使用 CML 自动化评估流程。最后,我们会将 Web 应用构建并部署到 Hugging Face Hub。
从训练到评估,整个过程都将通过 GitHub Actions 自动化。您只需将代码推送到 GitHub 仓库,两分钟内,Hugging Face 上的应用、模型与结果都会完成更新。
如果您希望通过交互式练习深入学习,建议参加 DataCamp 的 CI/CD for Machine Learning 课程,使用 GitHub Actions 与数据版本控制提升您的机器学习开发能力。
环境搭建
本节我们将创建一个 GitHub 仓库、必要的文件与文件夹,并在 Hugging Face 上创建一个 Space。
GitHub 仓库
在 GitHub 主页面右上角点击“+”按钮,选择“New repository”。
添加仓库名称和描述,勾选 README 文件,并将 .gitignore 设置为 Python。
创建仓库后,我们需要复制其 URL。然后打开终端或 bash,导航到我们希望存放项目文件夹的目录。
最后,运行以下命令克隆仓库:
git clone https: // github. com/ kingabzpro/ CICD- for - Machine- Learning. git技术支持
开始上手时,请使用您偏好的 IDE 打开本地仓库。我们建议本项目使用 VSCode。启动 IDE 后,您会看到包含 README 和 LICENSE 等文件的 VSCode 工作区。
Hugging Face Spaces
接下来创建一个 Hugging Face Space,用于部署包含模型文件的应用。
1. 点击您的头像,选择 "New Space"。
2. 添加 Space 名称、许可协议、SDK 类型,并创建 Space。
3. 要编辑 README.md 文件,点击左上角的三个点,选择 Files,并进行必要的修改。
4. 我们将从 Space 的 README 文件复制元数据,并将其粘贴到本地 App 文件夹中的 README 文件中。
关键文件
在开始实验与构建流水线前,我们需要创建必要的文件夹和文件。这将帮助我们长期保持工作区整洁。
创建文件夹
App: 用于存放 Web 应用分类器文件、带元数据的应用 README 文件,以及用于安装必要包的 requirement.txt。
Data: 用于存放所有 CSV 文件。
Model: 用于存放训练后的模型文件。
Results: 用于将指标与结果保存为 PNG 文件。
App 文件夹
创建名为 drug_app.py 的 Python 文件,以及 README.md 和 requirements.txt 文件,并将这些文件移动到 App 文件夹。这将帮助我们更好地组织运行应用所需的全部文件。
接下来,请编辑 App 文件夹中的 README.md,确保已相应更新所有元数据版本信息。这样您可以轻松指定应用文件位置、更改配色、设置 SDK 版本并添加授权信息。
- - -
title: Drug Classification
emoji: 💊
colorFrom: yellow
colorTo: red
sdk: gradio
sdk_version: 4.16 .0
app_file: drug_app. py
pinned: false
license: apache- 2.0
- - - 技术支持
编辑 App 文件夹中的 requirement.txt,补全缺失的 Python 包:
scikit- learn
skops技术支持
注意: GitHub 仓库与 Hugging Face Space 的 requirement 与 README 文件会有所不同。
Data 文件夹
从 Kaggle 下载 Drug Classification 数据集,解压出 CSV 文件并移动到 Data 文件夹。
Model 与 Results 文件夹
Model 与 Results 文件夹将保持为空,它们会由我们运行的 Python 脚本自动填充。
仓库内文件
创建 Makefile,以便在 GitHub Action 工作流中简化脚本运行。
创建名为 notebook.ipynb 的 Jupyter Notebook。在该笔记本中我们将对算法与处理流水线进行实验。
创建名为 requirements.txt 的文件。它将在运行 CI 工作流任务时用于设置环境。
创建名为 train.py 的文件。用于编写加载与处理数据、训练与评估模型、保存模型与性能指标的 Python 代码。
目录应如下所示:
训练与评估药物分类模型
本部分我们将尝试编写用于处理数据并通过 scikit-learn 流水线训练模型的 Python 代码。随后对其进行评估,并保存结果与模型。
加载数据集
我们将使用 pandas 加载 CSV 文件,利用 sample 函数打乱数据,并展示前三行。
import pandas as pd
drug_df = pd. read_csv( "Data/drug.csv" )
drug_df = drug_df. sample( frac= 1 )
drug_df. head( 3 ) 技术支持
训练/测试集划分
创建因变量与自变量,然后将它们划分为训练集与测试集。这将帮助您评估模型表现。
from sklearn. model_selection import train_test_split
X = drug_df. drop( "Drug" , axis= 1 ) . values
y = drug_df. Drug. values
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size= 0.3 , random_state= 125
) 技术支持
机器学习流水线
我们将使用 ColumnTransformer 构建处理流水线,它会把分类型特征转换为数值、填补缺失值,并对数值列进行缩放。
之后,我们将创建训练流水线,使用转换后的数据来训练随机森林分类器。
最后,训练模型。
通过使用流水线,我们能确保代码的可复现性、模块化与清晰性。
from sklearn. compose import ColumnTransformer
from sklearn. ensemble import RandomForestClassifier
from sklearn. impute import SimpleImputer
from sklearn. pipeline import Pipeline
from sklearn. preprocessing import OrdinalEncoder, StandardScaler
cat_col = [ 1 , 2 , 3 ]
num_col = [ 0 , 4 ]
transform = ColumnTransformer(
[
( "encoder" , OrdinalEncoder( ) , cat_col) ,
( "num_imputer" , SimpleImputer( strategy= "median" ) , num_col) ,
( "num_scaler" , StandardScaler( ) , num_col) ,
]
)
pipe = Pipeline(
steps= [
( "preprocessing" , transform) ,
( "model" , RandomForestClassifier( n_estimators= 100 , random_state= 125 ) ) ,
]
)
pipe. fit( X_train, y_train) 技术支持
模型评估
通过计算准确率与 F1 分数来评估模型表现。
from sklearn. metrics import accuracy_score, f1_score
predictions = pipe. predict( X_test)
accuracy = accuracy_score( y_test, predictions)
f1 = f1_score( y_test, predictions, average= "macro" )
print ( "Accuracy:" , str ( round ( accuracy, 2 ) * 100 ) + "%" , "F1:" , round ( f1, 2 ) ) 技术支持
我们的模型表现非常出色。
Accuracy: 95.0 % F1: 0.91 技术支持
创建指标文件并将其保存在 Results 文件夹。
with open ( "Results/metrics.txt" , "w" ) as outfile:
outfile. write( f"\nAccuracy = { accuracy. round ( 2 ) } , F1 Score = { f1. round ( 2 ) } ." ) 技术支持
接着我们将创建 混淆矩阵 并将图片文件保存到 Results 文件夹。
import matplotlib. pyplot as plt
from sklearn. metrics import ConfusionMatrixDisplay, confusion_matrix
cm = confusion_matrix( y_test, predictions, labels= pipe. classes_)
disp = ConfusionMatrixDisplay( confusion_matrix= cm, display_labels= pipe. classes_)
disp. plot( )
plt. savefig( "Results/model_results.png" , dpi= 120 ) 技术支持
保存模型
我们将使用 skops Python 包保存模型。这将帮助我们同时保存 scikit-learn 流水线与模型。
import skops. io as sio
sio. dump( pipe, "Model/drug_pipeline.skops" ) 技术支持
您可以直接加载整个流水线,它无需额外处理数据或修改代码即可开箱即用。
sio. load( "Model/drug_pipeline.skops" , trusted= True ) 技术支持
将上述全部代码复制粘贴到“train.py”文件。这将成为标准化的训练脚本,只要数据或代码发生变化,CI 工作流就会运行它。
在开启您的 MLOps 工程生涯前,阅读 MLOps Roadmap: A Complete Career Guide 。
构建持续集成流水线的步骤
本节我们将介绍 CML、Makefile,以及如何设置 GitHub Action 工作流,以自动化项目的训练、评估与版本管理。
CI 流水线
CML
持续机器学习(CML )是一个开源库,可让您在机器学习项目中实现持续集成。我们将使用 "iterative/setup-cml " 这一 GitHub Action,它在工作流中调用 CML 函数以自动生成模型评估报告。
这意味着什么?每当您向 GitHub 推送变更,它都会在提交下生成一份报告,并通过邮件发送性能指标与混淆矩阵给您。
Makefile
Makefile 是由一组指令组成的文件,供 make 命令使用,以自动化诸如编译代码、运行测试、搭建环境、数据预处理、训练与评估模型、部署模型等各类任务。
我们可以使用 make 命令运行多个脚本,从而让 CI 工作流文件更简洁清晰。Makefile 包含命令集的名称以及运行这些命令所需的脚本。
以下是我们的 Makefile:
install:
pip install - - upgrade pip & & \
pip install - r requirements. txt
format :
black * . py
train:
python train. py
eval :
echo "## Model Metrics" > report. md
cat . / Results/ metrics. txt >> report. md
echo '\n## Confusion Matrix Plot' >> report. md
echo '' >> report. md
cml comment create report. md技术支持
我们包含用于安装 Python 包(install)、格式化代码(format)、训练脚本(train)以及生成 CML 报告(eval)的命令。
之后,我们将提交变更并推送到 GitHub 远程服务器。
git commit - am "new changes"
git push origin main技术支持
GitHub Actions
要自动化训练与评估,我们需要创建一个 GitHub Action 工作流。具体做法是,前往我们仓库 kingabzpro/CICD-for-Machine-Learning 的“Actions”标签页,点击蓝色文字“set up a workflow yourself.”
将 .yml 文件重命名为“ci”,并开始添加 GitHub Action 命令。
添加工作流名称。
设置触发条件,使工作流在推送到 main 分支、对 main 分支的拉取请求,或手动运行时触发。
为任务构建环境。我们将加载最新的 Linux 服务器。
启用我们将在工作流中使用的 GitHub Actions。
开始使用不同的 make 命令添加各个运行步骤。
通过提交变更触发工作流。GitHub Action 会按顺序运行流水线中的所有步骤。
在排查错误与语法问题时您可能会遇到失败情况,因此在上手 GitHub Action 之前,务必阅读 Workflow syntax for GitHub Actions 。
我们已成功修复工作流中的所有错误与问题,现在 `ci.yml` 的最终版本可以顺利运行。
如您所见,工作流会先搭建环境并加载必要的 actions。随后我们使用 make 命令逐步运行每个步骤,这些命令会在后端调用各种 Python 与 Bash 脚本。
不过,使用 CML actions 时有两点非常重要:首先,需要在开头设置 write 权限;其次,要为 CML 任务提供 GitHub token,我们可以通过 secrets 获取。
name: Continuous Integration
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
workflow_dispatch:
permissions: write- all
jobs:
build:
runs- on: ubuntu- latest
steps:
- uses: actions/ checkout@v3
- uses: iterative/ setup- cml@v2
- name: Install Packages
run: make install
- name: Format
run: make format
- name: Train
run: make train
- name: Evaluation
env:
REPO_TOKEN: ${ { secrets. GITHUB_TOKEN } }
run: make eval
技术支持
指标与结果会显示在提交信息 下方。
您也会收到包含结果的邮件。
在新分支中保存结果
我们已经生成了评估报告,但尚未对模型与结果进行版本管理。为保存这些变更,我们将创建名为“update”的新分支,并把更新后的模型与结果推送到该分支。
点击主分支按钮,输入“update”作为分支名,然后选择“create branch update from main”以创建“update”分支。
创建仓库 Secret
若要使用 Git 命令提交并推送变更,我们需要提供用户名与邮箱。您可以直接添加它们,但使用 GitHub secrets 是更好的方式。步骤如下:
进入设置并点击“Secrets and variables”。
选择“Actions”,点击绿色按钮“New repository secret”。
添加名称与值。这类似于在本地机器设置环境变量。
就这样!
更新 Makefile 与 ci.yml
要将变更自动保存至新分支,我们需要更新 Makefile 与 ci.yml。
Makefile:
我们将配置用户名与邮箱、提交变更,并将其保存到 update 分支。
update- branch:
git config - - global user. name $( USER_NAME)
git config - - global user. email $( USER_EMAIL)
git commit - am "Update with new results"
git push - - force origin HEAD: update
技术支持
ci.yml:
Makefile 使用环境变量来运行脚本。为此,我们需要先从 secrets 中提取环境变量值,然后在 make 命令末尾设置环境变量。
- name: Update Branch
env:
NAME: ${ { secrets. USER_NAME } }
EMAIL: ${ { secrets. USER_EMAIL } }
run: make update- branch USER_NAME= $NAME USER_EMAIL= $EMAIL
技术支持
更新文件并将变更推送到主分支后,您就能实时看到“魔法”上演。分析报告将被生成,同时更新后的模型也会在持续部署部分被部署到 Hugging Face。
构建持续部署流水线的步骤
在持续部署部分,我们将了解如何自动化部署模型与应用。这包括从 `update` 分支拉取更新后的模型与应用文件、使用 token 登录 Hugging Face CLI、推送模型与应用文件,并最终部署应用。
构建 Gradio 应用
为了部署并访问我们的模型,我们需要创建一个 Gradio 应用。该应用将包含:
加载 scikit-learn 流水线与模型。
基于用户输入预测药物标签的 Python 函数。
使用 Gradio 滑块创建浮点输入,用 Gradio 单选创建分类型输入的界面。
创建示例输入,便于快速测试模型。
提供应用标题、功能与特性的简要描述,以及包含相关信息的页脚。
将以上变量与预测函数传给 Gradio 的 Interface 函数并启动。
为使 Web 应用外观更现代,我们将使用默认的 soft 主题。
import gradio as gr
import skops. io as sio
pipe = sio. load( "./Model/drug_pipeline.skops" , trusted= True )
def predict_drug ( age, sex, blood_pressure, cholesterol, na_to_k_ratio) :
"" Predict drugs based on patient features.
Args:
age ( int ) : Age of patient
sex ( str ) : Sex of patient
blood_pressure ( str ) : Blood pressure level
cholesterol ( str ) : Cholesterol level
na_to_k_ratio ( float ) : Ratio of sodium to potassium in blood
Returns:
str : Predicted drug label
"" "
features = [ age, sex, blood_pressure, cholesterol, na_to_k_ratio]
predicted_drug = pipe. predict( [ features] ) [ 0 ]
label = f"Predicted Drug: { predicted_drug} "
return label
inputs = [
gr. Slider( 15 , 74 , step= 1 , label= "Age" ) ,
gr. Radio( [ "M" , "F" ] , label= "Sex" ) ,
gr. Radio( [ "HIGH" , "LOW" , "NORMAL" ] , label= "Blood Pressure" ) ,
gr. Radio( [ "HIGH" , "NORMAL" ] , label= "Cholesterol" ) ,
gr. Slider( 6.2 , 38.2 , step= 0.1 , label= "Na_to_K" ) ,
]
outputs = [ gr. Label( num_top_classes= 5 ) ]
examples = [
[ 30 , "M" , "HIGH" , "NORMAL" , 15.4 ] ,
[ 35 , "F" , "LOW" , "NORMAL" , 8 ] ,
[ 50 , "M" , "HIGH" , "HIGH" , 34 ] ,
]
title = "Drug Classification"
description = "Enter the details to correctly identify Drug type?"
article = "This app is a part of the Beginner's Guide to CI/CD for Machine Learning. It teaches how to automate training, evaluation, and deployment of models to Hugging Face using GitHub Actions."
gr. Interface(
fn= predict_drug,
inputs= inputs,
outputs= outputs,
examples= examples,
title= title,
description= description,
article= article,
theme= gr. themes. Soft( ) ,
) . launch( )
技术支持
打开终端,本地运行应用,在推送变更到远端仓库之前先修复问题。
python . / App/ drug_app. py 技术支持
Running on local URL: http: // 127.0 .0 .1 : 7860
To create a public link, set `share= True ` in `launch( ) `. 技术支持
设置 Hugging Face Token
接下来我们将生成 Hugging Face token,并将其提供给 Makefile 脚本。但必须确保 token 保密不外泄。为此,我们将使用 GitHub secrets。
首先点击您的 Hugging Face 头像并选择设置。接着选择“Access Tokens”,点击“New Token”生成 token。生成时请确保赋予写入权限。
复制该 token,并像设置用户名与邮箱那样创建一个 Repository secret。
CD 工作流
本节我们将新增三条命令以创建文件,并创建另一个名为“Continuous Deployment”的 GitHub 工作流。该工作流将帮助自动化拉取与部署文件。
Makefile
从 update 分支拉取更新后的模型与结果文件,并切换到 update 分支。
在登录前,我们需要安装 Hugging Face CLI,然后使用 token 登录。
我们会将 App 文件夹推送到 Space 根目录,这样它就包含 Python 文件、README 和 requirement.txt,以便构建环境并运行应用。
我们还会上传 Model 与 Results 文件夹。
deploy 命令会先运行 hf-login,随后运行 push-hub。
hf- login:
git pull origin update
git switch update
pip install - U "huggingface_hub[cli]"
huggingface- cli login - - token $( HF) - - add- to- git- credential
push- hub:
huggingface- cli upload kingabzpro/ Drug- Classification . / App - - repo- type = space - - commit- message= "Sync App files"
huggingface- cli upload kingabzpro/ Drug- Classification . / Model / Model - - repo- type = space - - commit- message= "Sync Model"
huggingface- cli upload kingabzpro/ Drug- Classification . / Results / Metrics - - repo- type = space - - commit- message= "Sync Model"
deploy: hf- login push- hub技术支持
我们的应用将能访问更新后的模型、应用文件与结果,从而在 Hugging Face Space 中持续跟踪变更。
cd.yml
为了让我们的工作流真正实现 CI/CD,我们需要创建另一个名为 cd.yml 的文件,结构与 ci.yml 相似。当 CI 流水线完成后,它将使用 on 参数与 workflow_run 触发 cd.yml 工作流。
该工作流将搭建环境,并使用 Hugging Face token 执行 make deploy 命令,将最新变更部署到 Hugging Face Hub。
name: Continuous Deployment
on:
workflow_run:
workflows: [ "Continuous Integration" ]
types:
- completed
workflow_dispatch:
jobs:
build:
runs- on: ubuntu- latest
steps:
- uses: actions/ checkout@v3
- name: Deployment To Hugging Face
env:
HF: ${ { secrets. HF } }
run: make deploy HF= $HF技术支持
当我们将变更推送到主分支时,会先启动 CI 工作流。
CI 工作流完成后,CD 工作流将随之开始,如下所示。
在工作流构建中选择对应运行项,即可查看每个函数的实时日志。我们的文件已成功上传至 Hugging Face 服务器。
接收更新文件后,Hugging Face Space 将开始构建环境,几秒钟后应用即可运行。
我们的 Drug Classification 应用运行顺畅,界面美观。
尝试输入不同数据,体验模型表现。
图片 来源
结语
本指南介绍了如何将训练、评估、版本管理与部署流程实现自动化,确保数据或算法的任何变化都能自动触发该流程且无错误。这一方法有助于我们构建快速、可扩展且可直接投产的应用。
请注意,在真实项目中我们会使用多种 MLOps 工具来编排、版本管理、部署与监控机器学习应用。若想进一步了解这些工具,请查看 Top MLOps Tools You Need to Know ,其中概述了大厂用于简化机器学习应用的热门技术。
要优化您的 CI/CD 流水线,学习 Docker、Kubernetes、Azure Cloud 以及其他 MLOps 技术至关重要。请参考 Machine Learning, Pipelines, Deployment, and MLOps 教程,熟悉行业标准做法并开展进阶项目。
项目资源
持续集成(CI)和持续部署(CD)是软件开发中常用的实践,用于自动化集成代码变更、测试以及快速部署更新应用的流程。最初,这些实践面向传统软件应用而生,但如今在机器学习(ML)项目中同样日益关键。
在这份全面指南中,我们将了解面向机器学习的 CI/CD,并学习如何构建自己的机器学习流水线,以自动化训练、评估与部署模型的过程。
本指南通过一个简单项目,仅使用 GitHub Actions 来自动化整个流程。我们将讨论的大多数内容对机器学习工程师和数据科学家来说都很熟悉。这里他们将学习的,只有如何使用 GitHub Actions、Makefile、CML 和 Hugging Face CLI。
报名参加 MLOps Concepts 课程,学习如何将机器学习模型从本地笔记本迁移到能创造业务价值的生产模型。
为什么机器学习需要 CI/CD?
当您要将模型投入运营并用它来构建产品时,CI/CD 将带来颠覆性改变。简化自动化流程可以为您的 ML 项目提供无 Bug、快速且可扩展的方案,让您把精力更多放在改进模型上,而不是管理与部署。
具体而言,面向机器学习的 CI/CD 能带来以下帮助:
1. 自动化训练流水线
借助 CI/CD,您可以按固定节奏自动用新数据重训模型,相比手动触发重训可节省时间。
2. 及早发现错误
CI 工具会在每次提交时运行测试与检查,有助于捕捉缺陷、集成问题以及模型性能下降。
3. 可复现性
CI/CD 有助于确保模型能以完全相同的方式重建与重训,从而实现结果可复现。环境、模型与数据版本以及配置都被代码化管理。
4. 测试与监控
CI/CD 允许在部署前对新模型进行自动化测试以检查问题。它还可通过与监控工具集成,实现部署后的更佳监控。
5. 更快迭代
借助 CI/CD,可以自动化快速训练、测试和部署新的模型版本或实验,从而加速 ML 系统的开发与改进。
6. 可扩展性
随着 ML 项目规模和复杂度增长,手动管理整个生命周期将变得不可行。CI/CD 流水线提供可扩展方案,能够在保持效率与可靠性的同时,处理海量数据、众多模型以及多样依赖。
项目说明
在本指南中,我们将带您完成账号与环境搭建、创建 CI/CD 流水线以及优化整个流程。
我们将使用 scikit-learn 流水线来训练随机森林算法并构建一个药物分类器。训练完成后,我们将使用 CML 自动化评估流程。最后,我们会将 Web 应用构建并部署到 Hugging Face Hub。
从训练到评估,整个过程都将通过 GitHub Actions 自动化。您只需将代码推送到 GitHub 仓库,两分钟内,Hugging Face 上的应用、模型与结果都会完成更新。
如果您希望通过交互式练习深入学习,建议参加 DataCamp 的 CI/CD for Machine Learning 课程,使用 GitHub Actions 与数据版本控制提升您的机器学习开发能力。
环境搭建
本节我们将创建一个 GitHub 仓库、必要的文件与文件夹,并在 Hugging Face 上创建一个 Space。
GitHub 仓库
在 GitHub 主页面右上角点击“+”按钮,选择“New repository”。
添加仓库名称和描述,勾选 README 文件,并将 .gitignore 设置为 Python。
创建仓库后,我们需要复制其 URL。然后打开终端或 bash,导航到我们希望存放项目文件夹的目录。
最后,运行以下命令克隆仓库:
开始上手时,请使用您偏好的 IDE 打开本地仓库。我们建议本项目使用 VSCode。启动 IDE 后,您会看到包含 README 和 LICENSE 等文件的 VSCode 工作区。
Hugging Face Spaces
接下来创建一个 Hugging Face Space,用于部署包含模型文件的应用。
1. 点击您的头像,选择 "New Space"。
2. 添加 Space 名称、许可协议、SDK 类型,并创建 Space。
3. 要编辑 README.md 文件,点击左上角的三个点,选择 Files,并进行必要的修改。
4. 我们将从 Space 的 README 文件复制元数据,并将其粘贴到本地 App 文件夹中的 README 文件中。
关键文件
在开始实验与构建流水线前,我们需要创建必要的文件夹和文件。这将帮助我们长期保持工作区整洁。
创建文件夹
App 文件夹
创建名为
drug_app.py的 Python 文件,以及 README.md 和 requirements.txt 文件,并将这些文件移动到 App 文件夹。这将帮助我们更好地组织运行应用所需的全部文件。接下来,请编辑 App 文件夹中的 README.md,确保已相应更新所有元数据版本信息。这样您可以轻松指定应用文件位置、更改配色、设置 SDK 版本并添加授权信息。
编辑 App 文件夹中的 requirement.txt,补全缺失的 Python 包:
注意:GitHub 仓库与 Hugging Face Space 的 requirement 与 README 文件会有所不同。
Data 文件夹
从 Kaggle 下载 Drug Classification 数据集,解压出 CSV 文件并移动到 Data 文件夹。
Model 与 Results 文件夹
Model 与 Results 文件夹将保持为空,它们会由我们运行的 Python 脚本自动填充。
仓库内文件
Makefile,以便在 GitHub Action 工作流中简化脚本运行。notebook.ipynb的 Jupyter Notebook。在该笔记本中我们将对算法与处理流水线进行实验。requirements.txt的文件。它将在运行 CI 工作流任务时用于设置环境。train.py的文件。用于编写加载与处理数据、训练与评估模型、保存模型与性能指标的 Python 代码。目录应如下所示:
训练与评估药物分类模型
本部分我们将尝试编写用于处理数据并通过 scikit-learn 流水线训练模型的 Python 代码。随后对其进行评估,并保存结果与模型。
加载数据集
我们将使用 pandas 加载 CSV 文件,利用
sample函数打乱数据,并展示前三行。训练/测试集划分
创建因变量与自变量,然后将它们划分为训练集与测试集。这将帮助您评估模型表现。
机器学习流水线
我们将使用 ColumnTransformer 构建处理流水线,它会把分类型特征转换为数值、填补缺失值,并对数值列进行缩放。
之后,我们将创建训练流水线,使用转换后的数据来训练随机森林分类器。
最后,训练模型。
通过使用流水线,我们能确保代码的可复现性、模块化与清晰性。
模型评估
通过计算准确率与 F1 分数来评估模型表现。
我们的模型表现非常出色。
创建指标文件并将其保存在 Results 文件夹。
接着我们将创建 混淆矩阵 并将图片文件保存到 Results 文件夹。
保存模型
我们将使用 skops Python 包保存模型。这将帮助我们同时保存 scikit-learn 流水线与模型。
您可以直接加载整个流水线,它无需额外处理数据或修改代码即可开箱即用。
将上述全部代码复制粘贴到“train.py”文件。这将成为标准化的训练脚本,只要数据或代码发生变化,CI 工作流就会运行它。
在开启您的 MLOps 工程生涯前,阅读 MLOps Roadmap: A Complete Career Guide。
构建持续集成流水线的步骤
本节我们将介绍 CML、Makefile,以及如何设置 GitHub Action 工作流,以自动化项目的训练、评估与版本管理。
CI 流水线
CML
持续机器学习(CML)是一个开源库,可让您在机器学习项目中实现持续集成。我们将使用 "iterative/setup-cml" 这一 GitHub Action,它在工作流中调用 CML 函数以自动生成模型评估报告。
这意味着什么?每当您向 GitHub 推送变更,它都会在提交下生成一份报告,并通过邮件发送性能指标与混淆矩阵给您。
Makefile
Makefile 是由一组指令组成的文件,供
make命令使用,以自动化诸如编译代码、运行测试、搭建环境、数据预处理、训练与评估模型、部署模型等各类任务。我们可以使用
make命令运行多个脚本,从而让 CI 工作流文件更简洁清晰。Makefile 包含命令集的名称以及运行这些命令所需的脚本。以下是我们的 Makefile:
我们包含用于安装 Python 包(install)、格式化代码(format)、训练脚本(train)以及生成 CML 报告(eval)的命令。
之后,我们将提交变更并推送到 GitHub 远程服务器。
GitHub Actions
要自动化训练与评估,我们需要创建一个 GitHub Action 工作流。具体做法是,前往我们仓库 kingabzpro/CICD-for-Machine-Learning 的“Actions”标签页,点击蓝色文字“set up a workflow yourself.”
将 .yml 文件重命名为“ci”,并开始添加 GitHub Action 命令。
在排查错误与语法问题时您可能会遇到失败情况,因此在上手 GitHub Action 之前,务必阅读 Workflow syntax for GitHub Actions。
我们已成功修复工作流中的所有错误与问题,现在 `ci.yml` 的最终版本可以顺利运行。
如您所见,工作流会先搭建环境并加载必要的 actions。随后我们使用 make 命令逐步运行每个步骤,这些命令会在后端调用各种 Python 与 Bash 脚本。
不过,使用 CML actions 时有两点非常重要:首先,需要在开头设置 write 权限;其次,要为 CML 任务提供 GitHub token,我们可以通过 secrets 获取。
指标与结果会显示在提交信息下方。
您也会收到包含结果的邮件。
在新分支中保存结果
我们已经生成了评估报告,但尚未对模型与结果进行版本管理。为保存这些变更,我们将创建名为“update”的新分支,并把更新后的模型与结果推送到该分支。
点击主分支按钮,输入“update”作为分支名,然后选择“create branch update from main”以创建“update”分支。
创建仓库 Secret
若要使用 Git 命令提交并推送变更,我们需要提供用户名与邮箱。您可以直接添加它们,但使用 GitHub secrets 是更好的方式。步骤如下:
就这样!
更新 Makefile 与 ci.yml
要将变更自动保存至新分支,我们需要更新
Makefile与ci.yml。Makefile:
我们将配置用户名与邮箱、提交变更,并将其保存到
update分支。ci.yml:
Makefile 使用环境变量来运行脚本。为此,我们需要先从 secrets 中提取环境变量值,然后在 make 命令末尾设置环境变量。
更新文件并将变更推送到主分支后,您就能实时看到“魔法”上演。分析报告将被生成,同时更新后的模型也会在持续部署部分被部署到 Hugging Face。
构建持续部署流水线的步骤
在持续部署部分,我们将了解如何自动化部署模型与应用。这包括从 `update` 分支拉取更新后的模型与应用文件、使用 token 登录 Hugging Face CLI、推送模型与应用文件,并最终部署应用。
构建 Gradio 应用
为了部署并访问我们的模型,我们需要创建一个 Gradio 应用。该应用将包含:
Interface函数并启动。打开终端,本地运行应用,在推送变更到远端仓库之前先修复问题。
设置 Hugging Face Token
接下来我们将生成 Hugging Face token,并将其提供给 Makefile 脚本。但必须确保 token 保密不外泄。为此,我们将使用 GitHub secrets。
首先点击您的 Hugging Face 头像并选择设置。接着选择“Access Tokens”,点击“New Token”生成 token。生成时请确保赋予写入权限。
复制该 token,并像设置用户名与邮箱那样创建一个 Repository secret。
CD 工作流
本节我们将新增三条命令以创建文件,并创建另一个名为“Continuous Deployment”的 GitHub 工作流。该工作流将帮助自动化拉取与部署文件。
Makefile
update分支拉取更新后的模型与结果文件,并切换到update分支。deploy命令会先运行hf-login,随后运行push-hub。我们的应用将能访问更新后的模型、应用文件与结果,从而在 Hugging Face Space 中持续跟踪变更。
cd.yml
为了让我们的工作流真正实现 CI/CD,我们需要创建另一个名为
cd.yml的文件,结构与ci.yml相似。当 CI 流水线完成后,它将使用on参数与workflow_run触发cd.yml工作流。该工作流将搭建环境,并使用 Hugging Face token 执行
make deploy命令,将最新变更部署到 Hugging Face Hub。当我们将变更推送到主分支时,会先启动 CI 工作流。
CI 工作流完成后,CD 工作流将随之开始,如下所示。
在工作流构建中选择对应运行项,即可查看每个函数的实时日志。我们的文件已成功上传至 Hugging Face 服务器。
接收更新文件后,Hugging Face Space 将开始构建环境,几秒钟后应用即可运行。
我们的 Drug Classification 应用运行顺畅,界面美观。
尝试输入不同数据,体验模型表现。
图片 来源
结语
本指南介绍了如何将训练、评估、版本管理与部署流程实现自动化,确保数据或算法的任何变化都能自动触发该流程且无错误。这一方法有助于我们构建快速、可扩展且可直接投产的应用。
请注意,在真实项目中我们会使用多种 MLOps 工具来编排、版本管理、部署与监控机器学习应用。若想进一步了解这些工具,请查看 Top MLOps Tools You Need to Know,其中概述了大厂用于简化机器学习应用的热门技术。
要优化您的 CI/CD 流水线,学习 Docker、Kubernetes、Azure Cloud 以及其他 MLOps 技术至关重要。请参考 Machine Learning, Pipelines, Deployment, and MLOps 教程,熟悉行业标准做法并开展进阶项目。
项目资源