在机器学习工程化(MLOps)中,CI/CD 不仅仅涉及代码的构建与部署。一个完整的 AI 流水线必须包含三个核心维度的验证:代码逻辑、数据质量和模型性能。这种三位一体的测试方法能够有效防止因数据漂移或训练回归导致的生产事故。
1. 代码层:基础单元测试
这是最传统的部分,使用 pytest 确保数据处理逻辑和模型调用接口正常。
# tests/test_data_utils.py
import pytest
import numpy as np
from src.utils import normalize_features
def test_normalization_range():
data = np.array([[10, 20], [30, 40]])
normalized = normalize_features(data)
assert normalized.min() >= 0 and normalized.max() <= 1
2. 数据层:使用 Great Expectations 校验数据质量
在模型训练前,必须确保输入数据符合预期模式。Great Expectations 是一个强大的工具,可以将数据校验定义为测试断言。
# scripts/validate_data.py
import pandas as pd
import great_expectations as ge
def validate():
df = pd.read_csv("data/training_set.csv")
ge_df = ge.from_pandas(df)
# 验证关键字段不存在空值
res_null = ge_df.expect_column_values_to_not_be_null("user_id")
# 验证特征值分布在合理区间
res_range = ge_df.expect_column_values_to_be_between("age", 0, 120)
if not (res_null["success"] and res_range["success"]):
raise Exception("Data validation failed!")
if __name__ == "__main__":
validate()
3. 模型层:性能阈值与回归测试
在 CI 环节,我们通常使用一小部分金标准(Golden Dataset)来快速评估新模型是否发生了灾难性遗忘或精度大幅下降。
# scripts/evaluate_model.py
import json
def check_metrics(metric_path, threshold=0.85):
with open(metric_path, "r") as f:
metrics = json.load(f)
if metrics["f1_score"] < threshold:
print(f"Failure: F1-score {metrics['f1_score']} is below {threshold}")
exit(1)
print("Model performance evaluation passed.")
if __name__ == "__main__":
check_metrics("outputs/metrics.json")
4. 整合:GitHub Actions CI/CD 配置
将上述所有步骤串联在 .github/workflows/ml_pipeline.yml 中。每当有代码提交或数据配置更新时,流水线将自动运行。
name: AI-Infra-CI
on: [push, pull_request]
jobs:
ml-test-pipeline:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.9'
- name: Install Dependencies
run: pip install pytest great-expectations pandas numpy
- name: Run Unit Tests (Code)
run: pytest tests/
- name: Run Data Validation (Data)
run: python scripts/validate_data.py
- name: Model Training & Eval (Model)
run: |
# 模拟训练并生成指标
python src/train.py --quick-run
python scripts/evaluate_model.py
总结
将 AI 测试融入 CI/CD 的关键在于:
1. 解耦测试目标:将逻辑、数据特征和模型权重分开验证。
2. 快速反馈循环:CI 阶段的模型测试应使用子集,全量评估留给异步的 CD 任务。
3. 结果持久化:将测试报告(如 Great Expectations 生成的 HTML)作为 Artifacts 上传以便溯源。
汤不热吧