NVIDIA Container Toolkit: Cách chạy GPU trong Docker (Thực chiến từ Local đến Production)

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

Quick Start: Thông nòng GPU cho Docker trong 5 phút

Vừa nhận bàn giao một con server Ubuntu “mới coóng” để train model? Đừng sa đà vào lý thuyết suông. Hãy thực hiện ngay 3 bước dưới đây để Docker thực sự tận dụng được sức mạnh của card đồ họa.

1. Kiểm tra Driver trên máy Host

Trước khi đụng vào Docker, máy host phải nhận diện được phần cứng. Hãy gõ lệnh:

nvidia-smi

Nếu thấy bảng thông số GPU và phiên bản CUDA hiện ra, bạn đã xong 50% công việc. Nếu máy báo command not found, hãy cài driver bằng lệnh sudo apt install nvidia-driver-535 (hoặc bản mới nhất) trước khi tiếp tục.

2. Cài đặt NVIDIA Container Toolkit

NVIDIA đã đóng gói sẵn mọi thứ trong repo chính thức. Bạn chỉ cần chạy mớ lệnh này để thêm nguồn và cài đặt:

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

3. Cấu hình Docker Runtime và Test

Ở bước này, chúng ta cần đăng ký runtime nvidia với Docker engine. Thay vì sửa file JSON thủ công, hãy dùng lệnh chính chủ:

sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

Giờ là lúc kiểm chứng kết quả. Chạy thử một container mẫu của NVIDIA để check:

docker run --rm --gpus all nvidia/cuda:12.0.0-base-ubuntu22.04 nvidia-smi

Thấy bảng thông số GPU hiện ra bên trong container? Chúc mừng, hệ thống đã sẵn sàng cho các workload AI nặng đô.

Tại sao phải cần đến NVIDIA Container Toolkit?

Bản chất của Docker là cách ly tài nguyên. Một container mặc định sẽ hoàn toàn “mù tịt” về chiếc card đồ họa nghìn đô đang cắm trên mainboard của bạn.

GPU không giống như CPU. Nó đòi hỏi driver riêng ở tầng User-space để giao tiếp với phần cứng. Nếu bạn cố tình cài driver trực tiếp vào image, dung lượng file sẽ phình lên vài GB. Chưa kể, nó sẽ gây ra xung đột thảm khốc mỗi khi bạn cập nhật driver ở máy host.

NVIDIA Container Toolkit đóng vai trò như một chiếc cầu nối thông minh. Thay vì cài đè, nó chỉ ánh xạ (map) các file thư viện và binaries cần thiết từ máy host vào container lúc runtime. Cách làm này giúp image vừa nhẹ, vừa đảm bảo tính linh hoạt cao.

Xử lý lỗi “đau lòng” lúc 2 giờ sáng

Để mình kể bạn nghe một trải nghiệm xương máu. Có lần mình deploy microservice xử lý ảnh cho dự án e-commerce. Ở local dùng CPU thì chạy mượt, nhưng lên production có GPU thì container cứ crash liên tục với lỗi CUDA error: unknown error.

Sau 2 tiếng debug mệt mỏi, mình phát hiện ra nguyên nhân cực kỳ cơ bản: Phiên bản Driver trên host quá cũ so với yêu cầu của CUDA Toolkit trong image.

Hãy nhớ quy tắc sống còn này: Host Driver phải luôn mới hơn hoặc bằng phiên bản CUDA mà container yêu cầu. Bạn có thể chạy image CUDA 11 trên host cài Driver CUDA 12, nhưng chiều ngược lại chắc chắn sẽ thất bại.

Mẹo chia nhỏ GPU

Không phải lúc nào bạn cũng muốn một container “nuốt chửng” toàn bộ tài nguyên, nhất là khi chạy nhiều model nhỏ cùng lúc.

  • Chỉ định GPU cụ thể: Dùng --gpus '"device=0"' để chỉ dùng card số 0.
  • Kiểm soát tài nguyên: Kết hợp thêm flag --memory--cpus để tránh việc một container làm treo cả server.

Sử dụng với Docker Compose (Chuẩn Production)

Trên môi trường thực tế, việc gõ lệnh docker run thủ công là điều tối kỵ. Chúng ta sử dụng Docker Compose để quản lý. Tuy nhiên, syntax cho GPU trong Compose rất dễ viết sai thụt lề (indentation).

Đây là cấu hình docker-compose.yml chuẩn mà mình thường xuyên áp dụng:

services:
  ai-engine:
    image: vllm/vllm-openai:latest
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

Lưu ý: Cấu hình deploy.resources này chỉ hoạt động ổn định từ Docker Compose V2 trở đi. Nếu bạn vẫn dùng bản V1, hãy cân nhắc nâng cấp ngay để tránh các lỗi vặt không đáng có.

Tối ưu Image: Đừng để ổ cứng “kêu cứu”

Một sai lầm phổ biến là dùng image nvidia/cuda:devel cho môi trường chạy thực tế. Bản devel chứa đủ mọi thứ từ compiler đến header files, nặng tới 3-4GB.

Nếu chỉ cần chạy code, hãy chọn đúng phiên bản:

  • base: Siêu nhẹ (~150MB), chỉ có thư viện CUDA tối thiểu.
  • runtime: Phù hợp để chạy hầu hết các ứng dụng AI thông thường.
  • devel: Chỉ dành cho giai đoạn build code.

Kinh nghiệm của mình là luôn dùng Multi-stage build. Bạn build code trong môi trường devel, sau đó copy file thực thi sang image base. Kỹ thuật này giúp giảm dung lượng image từ 4GB xuống còn vài trăm MB, tăng tốc độ deploy lên gấp nhiều lần.

Lời kết

Cài đặt NVIDIA Container Toolkit là bước đầu tiên để bước vào thế giới AI/ML chuyên nghiệp. Hãy luôn chú trọng việc đồng bộ phiên bản driver và tối ưu dung lượng image ngay từ đầu. Nếu server báo lỗi GPU, hãy dùng lại lệnh thần thánh nvidia-smi bên trong container để xác định lỗi do hạ tầng hay do code. Chúc các bạn có những đêm ngon giấc thay vì phải thức trắng debug GPU!

Share: