Giới thiệu
Trong thời đại công nghệ hiện nay, việc phát triển các mô hình Machine Learning (ML) ngày càng trở nên phổ biến. Tuy nhiên, nhiều mô hình ML thường chỉ tồn tại trong môi trường phát triển và không được triển khai một cách hiệu quả. Bài viết này sẽ hướng dẫn bạn xây dựng một mô hình ML tự cập nhật, có khả năng mở rộng để phục vụ hàng trăm người dùng, cùng với việc triển khai nhanh chóng thông qua AWS, Docker và CI/CD.
Nội dung chính
- Phần 1: Huấn luyện Mô Hình XGBoost với Optuna
- Phần 2: Chiến lược Container Tùy Chỉnh
- Phần 3: Hạ Tầng AWS Dưới Dạng Mã
- Phần 4: Pipeline CI/CD cho Cập Nhật Mô Hình Động
- Phần 5: Kiểm tra API
Phần 1: Huấn luyện Mô Hình XGBoost với Optuna
Mô hình ML mà chúng ta sẽ xây dựng trong dự án này sử dụng thuật toán XGBoost, một trong những thuật toán nổi bật trong việc xử lý dữ liệu dạng bảng. Chúng ta sẽ sử dụng thư viện Optuna để tối ưu hóa các tham số của mô hình. Để bắt đầu, bạn cần chuẩn bị những điều kiện sau:
- Docker
- Python
- Pipeline CI/CD
- Sử dụng cơ bản GitHub
- Kiến thức cơ bản về các dịch vụ của AWS
Dữ liệu Huấn luyện
Dữ liệu cho mô hình này được lấy từ một tập dữ liệu trên Kaggle, thích hợp cho bài toán hồi quy. Tập dữ liệu này có các đặc điểm rõ ràng và đã sẵn sàng để sử dụng cho việc huấn luyện mô hình ML. Mô hình XGBoost được lựa chọn vì:
- Nó thường vượt trội hơn các mô hình deep learning trên dữ liệu dạng bảng với số liệu thống kê cho thấy nó đã chiến thắng nhiều thử thách Kaggle năm 2015.
- XGBoost hỗ trợ L1 và L2 regularization, giúp giảm thiểu overfitting.
Tối ưu hóa Tham số
Sử dụng thư viện Optuna, chúng ta sẽ tối ưu hóa các tham số của mô hình để đảm bảo hiệu suất tối ưu. Kết thúc quá trình huấn luyện, chúng ta sẽ tạo ra hai tệp tin: final_model.pkl và label_encoders.pkl, sau đó nén chúng và tải lên S3.
Phần 2: Chiến lược Container Tùy Chỉnh
Để triển khai mô hình, chúng ta sẽ sử dụng container Docker tùy chỉnh thay vì các hình ảnh Docker mặc định của AWS. Việc này cho phép chúng ta sử dụng các thư viện mới nhất mà không bị giới hạn bởi các thư viện cũ trong các container được xây dựng trước. Mặc dù việc sử dụng container tùy chỉnh làm tăng độ phức tạp của dự án, nhưng nó cũng cho phép chúng ta kiểm tra mô hình tại chỗ, tăng cường khả năng tái sản xuất môi trường.
Dockerfile
Dưới đây là mã cho Dockerfile:
dockerfile
# Đặt nền tảng cho Docker Image
ARG TARGETPLATFORM=linux/amd64
FROM --platform=$TARGETPLATFORM python:3.12-slim
# Thiết lập thư mục làm việc trong container
WORKDIR /app
# Sao chép file dependencies vào thư mục làm việc
COPY requirements.txt .
# Cài đặt các dependencies của Python
RUN pip install --no-cache-dir -r requirements.txt
# Sao chép mã ứng dụng Flask vào container
COPY . .
# Đặt biến môi trường cho thư mục mô hình SageMaker
ENV SM_MODEL_DIR=/opt/ml/model
# Mở cổng 8080 để cho phép truy cập bên ngoài
EXPOSE 8080
# Định nghĩa điểm vào cho ứng dụng Flask
ENTRYPOINT ["gunicorn", "-b", "0.0.0.0:8080", "app:app"]
Lệnh xây dựng và chạy mô hình
Bạn cần chạy các lệnh sau trong thư mục aws để xây dựng hình ảnh và chạy mô hình ML:
bash
cd aws/docker
docker build -t sagemaker-demo .
docker run -p 8080:8080 -v ./model.tar.gz:/opt/ml/model/model.tar.gz sagemaker-demo
Phần 3: Hạ Tầng AWS Dưới Dạng Mã
Sử dụng AWS CDK, chúng ta có thể tự động tạo các tài nguyên hạ tầng cần thiết và xử lý các phụ thuộc phức tạp. Điều này giúp giảm thiểu lỗi và tiết kiệm thời gian khi triển khai. Dưới đây là các tài nguyên cần tạo:
- AWS Lambda để tiếp nhận yêu cầu và chuyển tiếp đến mô hình.
- API Gateway để mở rộng Lambda ra Internet.
- Tài sản hình ảnh Docker và các artifacts huấn luyện mô hình.
- Mô hình SageMaker và Endpoint sử dụng hình ảnh Docker và artifacts mô hình.
Tạo Tài Nguyên
Ví dụ mã để tạo một mô hình SageMaker:
python
sm_model = sagemaker.CfnModel(
self,
"XGBModelResource",
execution_role_arn=role.role_arn,
primary_container=sagemaker.CfnModel.ContainerDefinitionProperty(
image=image_asset.image_uri,
model_data_url=model_asset.s3_object_url,
),
)
Phần 4: Pipeline CI/CD cho Cập Nhật Mô Hình Động
Chúng ta sẽ triển khai một pipeline CI/CD sử dụng GitHub Actions để tự động hóa quy trình huấn luyện khi có thay đổi trong tập dữ liệu. Điều này giúp cập nhật mô hình trên SageMaker một cách nhanh chóng và hiệu quả.
Kết Nối với AWS
Để kết nối pipeline với AWS, bạn cần tạo một IAM role mà pipeline sẽ sử dụng. Điều này có thể được thực hiện bằng cách sử dụng script deploy_bootstrap.py trong thư mục aws/bootstrap.
Cấu hình Pipeline
Định nghĩa cấu hình pipeline trong file YAML:
yaml
name: Train Model
on:
push:
paths:
- 'data/**'
branches: [main]
workflow_dispatch:
inputs:
model_version:
description: 'Model version tag (optional)'
required: false
default: 'latest'
type: string
Phần 5: Kiểm tra API
Cuối cùng, chúng ta sẽ kiểm tra API đã triển khai bằng Postman. Sử dụng 30 người dùng ảo để kiểm tra hiệu suất của API và ghi chép lại kết quả. Các chỉ số như độ trễ và tỷ lệ lỗi sẽ giúp đánh giá khả năng xử lý của hệ thống.
Kết luận
Bài viết này đã cung cấp hướng dẫn chi tiết để xây dựng một mô hình ML tự cập nhật. Qua đó, bạn sẽ học được nhiều kỹ năng hữu ích trong việc phát triển và triển khai mô hình ML trên hạ tầng AWS. Hãy bắt đầu thực hành và tối ưu hóa mô hình của bạn ngay hôm nay!