Docker Tăng tốc GPU: Hướng dẫn Cài đặt NVIDIA Container Toolkit trên Ubuntu cho Môi trường Production

AI tutorial - IT technology blog
AI tutorial - IT technology blog

Cuộc gọi lúc 2 giờ sáng: Tại sao Container của bạn bị “mù”?

Slack bắt đầu “réo” liên hồi vào lúc 2:15 sáng thứ Ba. Chúng tôi đang triển khai một mô hình computer vision mới lên cụm staging chạy Ubuntu. CI/CD báo xanh, Docker image đã build xong, và Kubernetes thông báo deployment ổn định. Nhưng log lại kể một câu chuyện khác: RuntimeError: Found no NVIDIA driver on your system.

Trên máy chủ (host), lệnh nvidia-smi cho thấy 8 GPU A100 đang hoạt động hoàn hảo với driver phiên bản 535. Còn bên trong container? Một sự im lặng đáng sợ. Ứng dụng đang cố gắng xử lý các phép toán tensor nặng nề trên CPU, lết đi với tốc độ 3 vòng lặp mỗi giây trước khi bị timeout. Đây chính là lúc bạn nhận ra driver trên máy chủ là chưa đủ. Bạn cần một cầu nối. Bạn cần NVIDIA Container Toolkit.

Trong thực tế, đây là một kỹ năng không thể thiếu. Nếu bạn đang xây dựng các hệ thống AI hoặc Deep Learning, việc biết cách chia sẻ tài nguyên phần cứng cho một container cô lập chính là ranh giới giữa một sản phẩm hoạt động tốt và một hệ thống trị giá 30.000 USD đang đắp chiếu.

Kiến trúc: Tại sao Docker không nhìn thấy GPU của bạn?

Theo thiết kế, các container Docker độc lập với phần cứng. Chúng chia sẻ kernel của máy chủ nhưng sống trong một “bong bóng” riêng, tách biệt hoàn toàn với các driver phần cứng cụ thể. Nếu bạn cố gắng truyền GPU qua bằng cách ánh xạ thiết bị (device mapping) Linux tiêu chuẩn, bạn có thể sẽ gặp lỗi không tương thích thư viện. Những lỗi này là một cơn ác mộng khi cần debug ở quy mô lớn.

NVIDIA Container Toolkit (trước đây là nvidia-docker2) giải quyết vấn đề này bằng cách đóng vai trò như một runtime tùy chỉnh. Khi bạn khởi chạy một container với flag --gpus, bộ công cụ này sẽ xử lý ba tác vụ quan trọng:

  • Nó gắn (mount) các thư viện NVIDIA cần thiết ở tầng user vào môi trường container.
  • Nó ánh xạ các node thiết bị vật lý (như /dev/nvidia0) để container có thể truy cập.
  • Nó kiểm tra tính tương thích giữa driver kernel của máy chủ và phiên bản CUDA của container.

Nếu không có nó, về cơ bản bạn đang cố lái một chiếc xe từ trong một căn phòng khóa kín không cửa sổ. Bộ công cụ này cung cấp cả vô lăng lẫn tầm nhìn ra mặt đường.

Từng bước: Cài đặt bộ công cụ trên Ubuntu

Các điều kiện tiên quyết rất đơn giản: bạn phải cài đặt sẵn driver NVIDIA và Docker trên máy chủ Ubuntu. Nếu lệnh nvidia-smi thất bại ngay trên máy chủ, hãy dừng lại và xử lý driver trước. Khi nền tảng đã vững chắc, hãy làm theo các bước sau để thiết lập cầu nối.

1. Cấu hình Package Repository

NVIDIA có repository riêng. Chúng ta cần thêm GPG key và danh sách nguồn vào apt để hệ thống biết nơi tìm các file 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

2. Cài đặt bộ công cụ

Cập nhật chỉ mục local và cài đặt package. Đây là một bản cài đặt nhẹ (khoảng 15MB) và sẽ không ghi đè lên thiết lập Docker hiện tại của bạn; nó chỉ đơn thuần thêm các plugin cần thiết.

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

3. Cấu hình Docker Runtime

Các file thực thi đã có trên đĩa, nhưng Docker vẫn chưa sử dụng chúng. Chúng ta sử dụng lệnh nvidia-ctk để tự động chỉnh sửa file /etc/docker/daemon.json, giúp nvidia trở thành một runtime được công nhận.

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

Đừng bỏ qua bước khởi động lại. Tôi đã lãng phí hàng giờ để debug lỗi “GPU not found” chỉ để nhận ra rằng daemon vẫn đang chạy với cấu hình cũ. Một lệnh systemctl restart nhanh gọn chính là người bạn tốt nhất của bạn lúc này.

Xác minh: Kiểm tra quy trình

Hãy cùng xác nhận kết quả. Chúng ta sẽ tải một image CUDA nhẹ và chạy lệnh nvidia-smi từ *bên trong* container.

sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:12.0.1-base-ubuntu22.04 nvidia-smi

Nếu bảng trạng thái GPU xuất hiện trong terminal của bạn, bạn đã xuyên qua bức tường container thành công. Flag --gpus all sẽ cho phép sử dụng tất cả các card đồ họa. Nếu bạn đang quản lý một máy chủ có nhiều GPU và muốn cô lập các tác vụ, hãy sử dụng các ID cụ thể, ví dụ như --gpus "device=0,1".

Tránh các lỗi thường gặp trong môi trường Production

Ngay cả khi cài đặt sạch sẽ, môi trường production vẫn có thể nảy sinh vấn đề. Dưới đây là những gì thường xảy ra:

Bẫy tương thích CUDA

Sự sai lệch phiên bản là nguyên nhân phổ biến nhất gây lỗi. Nếu driver máy chủ là phiên bản 470.xx nhưng Docker image yêu cầu CUDA 12.x, nó sẽ thất bại ngay lập tức. Các driver mới thường tương thích ngược với các phiên bản CUDA cũ, nhưng điều ngược lại hiếm khi đúng. Hãy luôn kiểm tra Bảng tương thích của NVIDIA.

Vấn đề về quyền truy cập

Bạn đang chạy Docker ở chế độ rootless? Cách cài đặt sẽ hơi khác một chút và yêu cầu cấu hình thêm trong file config.toml của bộ công cụ. Đối với hầu hết các máy chủ production, việc thêm người dùng của bạn vào nhóm docker và sử dụng chế độ tiêu chuẩn là con đường ít trở ngại nhất.

Yêu cầu về Fabric Manager

Trên các hệ thống cao cấp như DGX hoặc máy chủ sử dụng GPU H100 với NVLink, bạn phải đảm bảo dịch vụ nvidia-fabricmanager đang hoạt động. Nếu không, giao tiếp đa GPU sẽ thất bại một cách âm thầm, ngay cả khi lệnh nvidia-smi trông có vẻ bình thường.

Lời kết

Việc kích hoạt hỗ trợ GPU trong Docker không chỉ đơn thuần là chạy các câu lệnh. Đó là sự hiểu biết về quá trình bàn giao giữa kernel Linux, driver NVIDIA và runtime. Làm chủ NVIDIA Container Toolkit cho phép bạn triển khai các mô hình ML phức tạp trên bất kỳ cơ sở hạ tầng Ubuntu nào một cách tự tin.

Lần tới khi bạn đối mặt với một lỗi deployment vào giữa đêm, hãy nhớ: kiểm tra driver máy chủ, xác minh cấu hình bộ công cụ và luôn khởi động lại daemon. Những bước cơ bản này giúp các hệ thống hiệu năng cao hoạt động trơn tru trong khi cả thế giới đang ngủ say.

Share: