Bỏ qua điều hướng
CÔNG TY CỔ PHẦN GIẢI PHÁP CÔNG NGHỆ HQG
Giai đoạn 3 · Môi trườngCơ bản

Docker Engine + NVIDIA Container Toolkit: chạy container dùng GPU

Cài Docker Engine từ kho chính chủ, cài NVIDIA Container Toolkit, chạy container với --gpus all, dùng image PyTorch của NGC và khai báo GPU trong docker compose.

Khoảng 4 phút đọcCập nhật: 09/20266 bước
Mục tiêu

Chạy được container thấy GPU, có sẵn image PyTorch của NVIDIA NGC và một file docker compose mẫu để cả nhóm dùng chung môi trường.

Dành cho ai
  • Kỹ sư AI muốn môi trường tái lập được
  • Kỹ sư hệ thống phục vụ nhiều nhóm trên cùng máy chủ
Yêu cầu
  • Máy đã cài driver NVIDIA và nvidia-smi chạy được
  • Dung lượng ổ đủ cho image (image NGC khá nặng)
  • Hoàn thành bài cài Ubuntu, driver & CUDA
Mục lục bài

Vì sao nên chạy AI trong container

  • Mỗi dự án ghim phiên bản CUDA runtime, PyTorch, thư viện riêng — không phá nhau.
  • Máy chủ chỉ cần driver NVIDIA; CUDA runtime nằm trong image.
  • Chuyển từ máy thử nghiệm sang máy chủ sản xuất bằng cùng một image.

Lưu ý: Container vẫn dùng driver của máy chủ. Image cần CUDA runtime mới hơn khả năng của driver sẽ không chạy — xem bảng tương thích trong ghi chú phát hành CUDA.

Các bước thực hiện

Tiến độ của bạn
0/6

Tiến độ chỉ lưu trên trình duyệt này.

  1. Bước 1: Gỡ các gói Docker không chính chủ

    Bash
    for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
      sudo apt-get remove -y $pkg
    done

    Lệnh báo gói chưa cài là bình thường. Dữ liệu trong /var/lib/docker không bị xoá.

  2. Bước 2: Cài Docker Engine từ kho của Docker

    Bash
    sudo apt-get update
    sudo apt-get install -y ca-certificates curl
    sudo install -m 0755 -d /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    sudo chmod a+r /etc/apt/keyrings/docker.asc
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    sudo apt-get update
    sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    sudo docker run --rm hello-world

    Cảnh báo: Thêm người dùng vào nhóm docker (sudo usermod -aG docker $USER) tiện nhưng tương đương cấp quyền root trên máy. Chỉ thêm người thật sự quản trị máy.

  3. Bước 3: Cài NVIDIA Container Toolkit

    Bash
    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
    sudo nvidia-ctk runtime configure --runtime=docker
    sudo systemctl restart docker

    nvidia-ctk runtime configure ghi runtime NVIDIA vào /etc/docker/daemon.json. Nếu file đó đã có cấu hình khác, sao lưu trước khi chạy.

  4. Bước 4: Chạy container với --gpus

    Bash
    # Tất cả GPU
    sudo docker run --rm --gpus all ubuntu nvidia-smi
    
    # Chỉ GPU 0 và 1
    sudo docker run --rm --gpus '"device=0,1"' ubuntu nvidia-smi

    Toolkit tự gắn nvidia-smi và thư viện driver vào container, nên image ubuntu trống vẫn gọi được nvidia-smi.

  5. Bước 5: Chạy image PyTorch của NVIDIA NGC

    Image NGC đóng gói sẵn PyTorch, CUDA, cuDNN, NCCL đã được NVIDIA kiểm thử cùng nhau. Chọn tag trên trang NGC Catalog, đối chiếu yêu cầu driver trong ghi chú phát hành của tag đó.

    Bash
    # Lấy tag cụ thể từ NGC Catalog; 25.08-py3 chỉ là ví dụ định dạng
    NGC_TAG=25.08-py3
    mkdir -p ~/workspace
    sudo docker run --rm -it --gpus all \
      --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 \
      -v ~/workspace:/workspace \
      nvcr.io/nvidia/pytorch:$NGC_TAG \
      python -c "import torch; print(torch.__version__, torch.cuda.device_count())"

    Mẹo: --ipc=host (hoặc --shm-size đủ lớn) tránh lỗi bộ nhớ chia sẻ khi DataLoader dùng nhiều worker.

  6. Bước 6: Khai báo GPU trong docker compose

    compose.yaml
    services:
      trainer:
        image: nvcr.io/nvidia/pytorch:25.08-py3   # ghim tag bạn đã chọn
        ipc: host
        ulimits:
          memlock: -1
          stack: 67108864
        working_dir: /workspace
        volumes:
          - ./workspace:/workspace
          - hf-cache:/root/.cache/huggingface
        command: python -c "import torch; print(torch.cuda.device_count())"
        deploy:
          resources:
            reservations:
              devices:
                - driver: nvidia
                  count: all          # hoặc device_ids: ["0", "1"]
                  capabilities: [gpu]
    
    volumes:
      hf-cache:
    Bash
    sudo docker compose up
    sudo docker compose run --rm trainer nvidia-smi

Kiểm tra thành công

Bash
sudo docker run --rm --gpus all ubuntu nvidia-smi -L
sudo docker compose run --rm trainer python -c "import torch; assert torch.cuda.is_available(); print('OK', torch.cuda.device_count())"

Thành công khi container liệt kê đúng số GPU và lệnh Python in OK kèm số GPU.

Lỗi thường gặp & cách sửa

could not select device driver "" with capabilities: [[gpu]]

Nguyên nhân thường gặp: Chưa cài NVIDIA Container Toolkit hoặc chưa cấu hình runtime rồi khởi động lại Docker.

Bash
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
cat /etc/docker/daemon.json
Container đang chạy bỗng báo Failed to initialize NVML: Unknown Error

Nguyên nhân thường gặp: Thường gặp khi systemd nạp lại cấu hình cgroup và container mất quyền truy cập thiết bị GPU.

Khởi động lại container để lấy lại thiết bị. Về lâu dài, cập nhật Container Toolkit và cân nhắc dùng CDI theo hướng dẫn của NVIDIA:

Bash
sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml
nvidia-ctk cdi list
DataLoader worker bị kill, lỗi bus error hoặc shared memory

Nguyên nhân thường gặp: Container mặc định có /dev/shm rất nhỏ.

Thêm --ipc=host hoặc --shm-size=16g (chỉnh theo RAM máy); trong compose dùng ipc: host hoặc shm_size.

CUDA driver version is insufficient for CUDA runtime version

Nguyên nhân thường gặp: Image dùng CUDA runtime mới hơn khả năng của driver trên máy chủ.

Chọn tag image cũ hơn phù hợp driver, hoặc nâng driver theo bài cài driver & CUDA.

Bước tiếp theo

Nguồn chính chủ

Lệnh, tên gói và tham số thay đổi theo phiên bản. Trước khi chạy trên máy thật, hãy kiểm tra phiên bản mới nhất tại trang chính chủ:

Giới hạn của bài

  • Tag image 25.08-py3 chỉ minh hoạ định dạng; hãy chọn tag theo driver và nhu cầu của bạn.
  • Bài không đề cập Kubernetes/GPU Operator và Docker rootless.
Cần người dựng hệ thống cùng?

Kỹ sư HQG khảo sát, lên cấu hình, lắp đặt và bàn giao hạ tầng AI chạy được thật.