### 1. Tại sao cần CI/CD cho Machine Learning? Khác với phần mềm truyền thống, dự án ML còn phải quản lý dữ liệu, phiên bản mô hình và môi trường huấn luyện. Một pipeline CI/CD giúp: - Tự động kiểm tra chất lượng code và dữ liệu mỗi khi push. - Huấn luyện lại mô hình khi dữ liệu hoặc hyperparameter thay đổi. - Đóng gói mô hình và triển khai nhất quán sang môi trường staging hay production. ### 2. Các thành phần chính - **GitHub Actions**: chạy các job tự động trên mỗi sự kiện (push, pull request, schedule). - **DVC (Data Version Control)**: theo dõi phiên bản dữ liệu và mô hình, lưu trữ artifact trên remote storage (S3, GCS, Azure Blob). - **Docker**: đóng gói môi trường huấn luyện và serving thành image bất biến. - **MLflow** (tuỳ chọn): ghi log experiment, lưu metric và register model. ### 3. Cấu trúc thư mục mẫu ``` project/ ├─ .github/workflows/ci-cd.yml ├─ dvc.yaml ├─ params.yaml ├─ data/ # dữ liệu thô (tracked by DVC) ├─ src/ │ ├─ train.py │ ├─ evaluate.py │ └─ serve.py ├─ Dockerfile.train ├─ Dockerfile.serve └─ requirements.txt ``` ### 4. Ví dụ workflow GitHub Actions (ci-cd.yml) ```yaml name: ML CI/CD on: push: branches: [main] pull_request: branches: [main] jobs: lint-test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.11' - run: pip install -r requirements.txt - run: flake8 src/ - run: pytest tests/ train: needs: lint-test runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Pull DVC data run: | pip install dvc[s3] dvc pull - name: Build train image run: docker build -f Dockerfile.train -t ml-train . - name: Run training run: | docker run --rm -v $PWD:/workspace ml-train python src/train.py - name: Push model artifact run: dvc push deploy: needs: train runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Build serve image run: docker build -f Dockerfile.serve -t ml-serve . - name: Push to registry run: | echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin docker tag ml-serve myregistry/ml-serve:${{ github.sha }} docker push myregistry/ml-serve:${{ github.sha }} ``` ### 5. Mẹo thực tế - **Cache DVC cache** giữa các run bằng action `actions/cache` để tiết kiệm thời gian pull data. - **Tách stage**: chỉ chạy `train` khi file dữ liệu hoặc `params.yaml` thay đổi (dùng `paths` trong `on.push`). - **Sử dụng secret** cho credentials S3, Docker registry, MLflow tracking URI. - **Giám sát**: thêm step gửi metric lên Slack hoặc Prometheus sau khi evaluate. - **Rollback**: giữ nhiều version model trong DVC remote; khi deploy thất bại, chỉ cần `dvc checkout <tag>` và build lại image serve. ### 6. Kết luận Việc kết hợp GitHub Actions với DVC tạo ra một quy trình tự động hóa end‑to‑end: từ kiểm tra code, version dữ liệu, huấn luyện, đến đóng gói và triển khai. Áp dụng mẫu trên giúp đội ngũ ML giảm thiểu lỗi thủ công, tăng tốc độ lặp lại thử nghiệm và đảm bảo tính tái lập (reproducibility) cho mọi bản phát hành.