Какой у вас опыт настройки CI/CD для ML или инфраструктурных проектов?

«Какой у вас опыт настройки CI/CD для ML или инфраструктурных проектов?» — вопрос из категории DevOps, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я настраивал CI/CD-пайплайны для ML-проектов, используя GitHub Actions. Основная цель — автоматизация тестирования, сборки Docker-образов и деплоя обновлений модели. Вот пример .github/workflows/ml-pipeline.yml для проекта на Python:

name: ML CI/CD Pipeline

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: '3.10'
    - name: Install dependencies
      run: |
        pip install -r requirements.txt
        pip install pytest pytest-cov
    - name: Run unit tests
      run: pytest tests/ --cov=src --cov-report=xml
    - name: Upload coverage to Codecov
      uses: codecov/codecov-action@v3
      with:
        file: ./coverage.xml

  build-and-push:
    needs: test
    if: github.event_name == 'push' && github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Build Docker image
      run: docker build -t my-ml-service:${{ github.sha }} .
    - name: Push to Container Registry
      run: |
        echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
        docker push my-ml-service:${{ github.sha }}

В этом пайплайне сначала запускаются юнит-тесты и проверка покрытия кода. Если пушается коммит в main, то после успешных тестов собирается Docker-образ с новой версией модели и отправляется в registry. Деплой на staging-окружение часто триггерился автоматически этим же образом, а на production — требовал мануального подтверждения через ревью.