Đừng để CUDA làm “nát” máy: Cách Dockerize JupyterLab để làm Data Science chuyên nghiệp

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

Nỗi ám ảnh mang tên “Cài đặt CUDA trên máy Host”

Bạn đã bao giờ thức đến 2 giờ sáng chỉ để loay hoay với mớ driver CUDA chưa? Mình thì rồi. Hồi mới tập tành Deep Learning, mình từng cài nát cái Ubuntu đang dùng chỉ vì cố nâng cấp từ CUDA 11.2 lên 12.0 để chạy thử mấy model LLM mới. Kết quả là lỗi xung đột driver, màn hình đen thui (Black screen of death), và mình mất trắng nguyên ngày Chủ nhật để cài lại toàn bộ hệ điều hành.

Sau 6 tháng đưa toàn bộ workspace vào Docker, mình nhận ra đây là quyết định đúng đắn nhất. Docker không chỉ bảo vệ máy tính của bạn. Nó còn là “vũ khí” tối thượng để đồng nhất môi trường từ máy cá nhân lên Server công ty hay các Cloud Instance như AWS EC2. Dưới đây là cách mình dựng một container JupyterLab hỗ trợ GPU cực kỳ tinh gọn.

Quick Start: Chạy JupyterLab CUDA trong 5 phút

Nếu đã có Docker và NVIDIA Container Toolkit, hãy thử ngay file docker-compose.yml này. Bạn sẽ thấy sức mạnh của sự tiện lợi.

services:
  jupyterlab:
    image: nvidia/cuda:12.1.0-base-ubuntu22.04
    container_name: ds_workspace
    runtime: nvidia
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
    ports:
      - "8888:8888"
    volumes:
      - ./notebooks:/home/jovyan/work
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

Chỉ với lệnh docker compose up -d, bạn đã có một môi trường sạch. Tuy nhiên, để làm việc thực tế, chúng ta cần tùy chỉnh Dockerfile để cài thêm Python và các thư viện chuyên dụng.

Tại sao Data Science cần Docker?

Mình đã hoàn toàn từ bỏ việc cài thư viện Python trực tiếp lên máy Host. Có 3 lý do thực tế khiến mình thay đổi:

  • Quản lý xung đột: Dự án A cần PyTorch 1.10 cũ kỹ, dự án B lại đòi hỏi bản 2.1 mới nhất. Docker biến mỗi dự án thành một ốc đảo riêng biệt, không ai xâm phạm ai.
  • Tính nhất quán (Reproducibility): Khi đồng nghiệp git clone code về, họ chỉ cần chạy đúng một lệnh là có môi trường y hệt. Chấm dứt câu cửa miệng: “Máy em chạy được mà máy anh bị lỗi”.
  • Dọn dẹp thần tốc: Dự án kết thúc? Một lệnh docker rmi sẽ xóa sạch hàng GB thư viện rác, trả lại sự sạch sẽ cho ổ cứng.

Xây dựng Dockerfile tối ưu cho Machine Learning

Đừng dùng các image có sẵn quá cồng kềnh. Mình thường tự build dựa trên nền Ubuntu của NVIDIA để kiểm soát tốt dung lượng.

# Sử dụng image CUDA runtime để tối ưu dung lượng
FROM nvidia/cuda:12.1.1-cudnn8-runtime-ubuntu22.04

# Chặn các thông báo tương tác gây treo quá trình build
ENV DEBIAN_FRONTEND=noninteractive

# Cài đặt Python và công cụ hệ thống
RUN apt-get update && apt-get install -y \
    python3-pip python3-dev git wget \
    && rm -rf /var/lib/apt/lists/*

# Nâng cấp pip và cài các thư viện core
RUN pip3 install --no-cache-dir --upgrade pip
RUN pip3 install jupyterlab pandas scikit-learn matplotlib torch torchvision

WORKDIR /workspace

# Khởi động JupyterLab không cần mật khẩu để test nhanh
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root", "--NotebookApp.token=''"]

Những lưu ý kỹ thuật đắt giá:

  • Bản Runtime vs Devel: Bản runtime nhẹ hơn bản devel khoảng 1-2GB nhưng vẫn đủ để chạy training. Chỉ dùng devel nếu bạn cần biên dịch code C++ bằng NVCC.
  • Xóa cache apt: Lệnh rm -rf /var/lib/apt/lists/* rất quan trọng. Nó giúp giảm kích thước image của bạn đi vài trăm MB ngay lập tức.

Cấu hình Docker Compose: Đừng quên Shared Memory

Điểm mấu chốt khi làm Deep Learning với Docker nằm ở thông số shm_size. Nếu thiếu nó, bạn sẽ gặp lỗi cực kỳ khó chịu.

version: '3.8'
services:
  ml-env:
    build: .
    shm_size: '16gb' # Bí kíp để tránh lỗi Bus Error khi train PyTorch
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    volumes:
      - .:/workspace
    ports:
      - "8889:8888"

Tại sao cần 16GB SHM? PyTorch DataLoader sử dụng bộ nhớ chia sẻ để nạp dữ liệu. Mặc định Docker chỉ cấp 64MB, con số này quá thấp cho các task Computer Vision. Nếu không chỉnh lại, container của bạn sẽ bị văng (crash) ngay khi bắt đầu training.

Mẹo thực chiến sau nhiều dự án

Làm việc với Docker lâu ngày, mình rút ra được vài kinh nghiệm xương máu:

1. Kiểm tra GPU ngay lập tức

Đừng đợi đến lúc code lỗi mới kiểm tra. Ngay khi container chạy, hãy mở Terminal trong JupyterLab và gõ nvidia-smi. Nếu bảng thông số GPU hiện ra, bạn đã thành công 90% rồi.

2. Quản lý thư viện bằng requirements.txt

Thay vì cài lẻ tẻ, hãy gom tất cả vào file requirements.txt. Khi cần thêm thư viện mới, bạn chỉ việc sửa file và build lại image. Cách này giúp môi trường luôn được kiểm soát chặt chẽ.

3. Mount Volume thông minh

Luôn để dữ liệu nặng (dataset) ở một folder riêng và mount vào container. Đừng bao giờ copy dữ liệu trực tiếp vào Docker image vì nó sẽ làm file image phình to lên hàng chục GB, cực kỳ khó di chuyển.

Lời kết

Chuyển sang dùng Docker có thể khiến bạn hơi bỡ ngỡ lúc đầu. Tuy nhiên, sự ổn định mà nó mang lại cho hệ thống là vô giá. Bạn sẽ không còn lo sợ mỗi khi nhấn nút update driver hay cài đặt một thư viện mới. Chúc các bạn xây dựng được một workspace ưng ý và tập trung hoàn toàn vào việc huấn luyện mô hình!

Share: