AI Hunter
Member
Trong ngành phần mềm, câu nói đáng sợ nhất không phải là "Server sập rồi", mà là: "Ủa, trên máy em chạy bình thường mà?" (It works on my machine).
Đặc biệt với AI, điều này càng kinh khủng:
* Không có Docker: Bạn ném lộn xộn quần áo, bát đĩa, tivi lên xe tải. Rất dễ vỡ và khó xếp.
* Có Docker: Bạn xếp mọi thứ vào một thùng Container tiêu chuẩn. Xe tải (Server) chỉ việc cẩu cái thùng đó lên và chạy.
Tạo một file tên là `Dockerfile` (không có đuôi .txt) trong thư mục dự án của bạn:
Tại sao bước 3 lại quan trọng?
Docker xây dựng theo từng lớp (Layers). Nếu bạn sửa code ở `main.py`, Docker sẽ dùng lại lớp `pip install` cũ (Cache), giúp việc build lại chỉ mất 1 giây thay vì 10 phút ngồi chờ cài lại PyTorch.
Hậu quả: Image nặng 10GB. Mỗi lần update code, bạn phải upload/download lại cục 10GB đó.
Giải pháp: Dùng Volumes (Ổ cứng gắn ngoài)
Đừng nhét model vào Container. Hãy để model ở máy chủ, và "map" (ánh xạ) nó vào trong Container khi chạy.
Lúc này, Container rất nhẹ (chỉ chứa Code), còn dữ liệu nặng thì nằm ở ổ cứng Server.
Để train/inference AI bằng Card rời, bạn cần cài NVIDIA Container Toolkit trên máy chủ, và thêm cờ `--gpus all`.
Thay vì chạy 3 lệnh `docker run`, hãy dùng `docker-compose.yaml`.
Chỉ cần gõ 1 lệnh duy nhất: `docker-compose up -d`, cả hệ thống sẽ tự động dựng lên, kết nối với nhau.
Biết Docker, bạn có thể tự tin nói: "Code này chạy được trên máy anh, máy em, máy chủ Amazon, và cả cái máy nướng bánh mì thông minh... miễn là có Docker."
Đặc biệt với AI, điều này càng kinh khủng:
- Máy bạn dùng Python 3.10, Server dùng 3.8 -> Lỗi.
- Bạn dùng PyTorch bản Cuda 11.8, Server cài Cuda 12.1 -> Lỗi.
- Thư viện `pandas` của bạn bản mới, của Server bản cũ -> Lỗi.
1. Tư duy Docker: Cái vỏ tàu hàng
Hãy tưởng tượng code của bạn là hàng hóa.* Không có Docker: Bạn ném lộn xộn quần áo, bát đĩa, tivi lên xe tải. Rất dễ vỡ và khó xếp.
* Có Docker: Bạn xếp mọi thứ vào một thùng Container tiêu chuẩn. Xe tải (Server) chỉ việc cẩu cái thùng đó lên và chạy.
2. Viết Dockerfile cho ứng dụng AI (Python)
File `Dockerfile` là bản thiết kế để xây dựng nên cái thùng Container.Tạo một file tên là `Dockerfile` (không có đuôi .txt) trong thư mục dự án của bạn:
Mã:
# 1. Chọn nền móng (Base Image)
# Dùng bản slim cho nhẹ (nhưng với AI nên dùng bản đầy đủ hoặc bản hỗ trợ CUDA)
FROM python:3.10-slim
# 2. Thiết lập thư mục làm việc bên trong Container
WORKDIR /app
# 3. Mẹo tối ưu Cache (QUAN TRỌNG)
# Copy file thư viện trước để cài đặt
COPY requirements.txt .
# 4. Cài đặt thư viện
# --no-cache-dir để giảm dung lượng Image
RUN pip install --no-cache-dir -r requirements.txt
# 5. Copy toàn bộ code còn lại vào
COPY . .
# 6. Khai báo lệnh chạy mặc định
# Ví dụ chạy file main.py
CMD ["python", "main.py"]
Tại sao bước 3 lại quan trọng?
Docker xây dựng theo từng lớp (Layers). Nếu bạn sửa code ở `main.py`, Docker sẽ dùng lại lớp `pip install` cũ (Cache), giúp việc build lại chỉ mất 1 giây thay vì 10 phút ngồi chờ cài lại PyTorch.
3. Xử lý Model nặng (HuggingFace / ChromaDB)
Sai lầm lớn nhất của Newbie: Copy file model (vài GB) vào trong Docker Image.Hậu quả: Image nặng 10GB. Mỗi lần update code, bạn phải upload/download lại cục 10GB đó.
Giải pháp: Dùng Volumes (Ổ cứng gắn ngoài)
Đừng nhét model vào Container. Hãy để model ở máy chủ, và "map" (ánh xạ) nó vào trong Container khi chạy.
Bash:
# Lệnh chạy Container thông minh
docker run -d \
--name my-ai-bot \
-v ./models:/app/models \ # <--- Đây là phép màu (Mount thư mục models ở ngoài vào trong)
-p 8000:8000 \ # Mở cổng web
my-ai-image:latest
4. Kích hoạt GPU (NVIDIA Docker)
Mặc định Docker không nhìn thấy GPU của bạn. Nó chỉ dùng CPU.Để train/inference AI bằng Card rời, bạn cần cài NVIDIA Container Toolkit trên máy chủ, và thêm cờ `--gpus all`.
Bash:
docker run --gpus all my-ai-image
5. Docker Compose: Quản lý cả đội quân
Dự án của bạn thường không đi một mình. Nó gồm: 1 con Bot AI + 1 cái ChromaDB + 1 cái Redis.Thay vì chạy 3 lệnh `docker run`, hãy dùng `docker-compose.yaml`.
YAML:
version: '3.8'
services:
# Con AI của bạn
ai-bot:
build: .
ports:
- "8000:8000"
volumes:
- ./models:/app/models
environment:
- OPENAI_API_KEY=${OPENAI_API_KEY}
depends_on:
- vector-db
# Cơ sở dữ liệu Vector
vector-db:
image: chromadb/chroma
ports:
- "8000:8000"
volumes:
- ./chroma_data:/chroma/chroma
Kết luận
Docker là kỹ năng phân biệt giữa một "người biết code" và một "kỹ sư phần mềm".Biết Docker, bạn có thể tự tin nói: "Code này chạy được trên máy anh, máy em, máy chủ Amazon, và cả cái máy nướng bánh mì thông minh... miễn là có Docker."
Bài viết liên quan