Bật IOMMU và cấu hình GPU Passthrough cho VM Worker
Bước đầu tiên là kích hoạt nhóm thiết bị IOMMU (Input-Output Memory Management Unit) trên BIOS của máy chủ vật lý để cho phép chuyển quyền sở hữu GPU trực tiếp cho máy ảo.
Trên Proxmox, bạn cần thêm tham số khởi động vào GRUB để hệ điều hành nhận diện và sử dụng IOMMU. Điều này là bắt buộc để kernel Linux có thể thực hiện DMA (Direct Memory Access) an toàn cho GPU.
nano /etc/default/grub
Sửa dòng GRUB_CMDLINE_LINUX_DEFAULT để thêm intel_iommu=on (cho CPU Intel) hoặc amd_iommu=on (cho CPU AMD). Nội dung hoàn chỉnh trong file cần giống như sau:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=soft"
Sau khi lưu file, cần cập nhật cấu hình GRUB để thay đổi có hiệu lực. Kết quả mong đợi là không có lỗi báo cáo khi chạy lệnh cập nhật.
update-grub
Tiếp theo, bạn cần xác định ID của nhóm IOMMU chứa GPU NVIDIA để biết cần passthrough nhóm nào. Điều này giúp Proxmox biết thiết bị nào có thể tách ra độc lập.
lspci -tv
Trong đầu ra, tìm dòng có chứa tên GPU của bạn (ví dụ: "NVIDIA Corporation") và nhìn vào cột "Group" hoặc "Bus". Ghi nhớ số ID của nhóm đó (ví dụ: 0000:01:00.0).
Để kiểm tra nhanh hơn, bạn có thể dùng lệnh sau để liệt kê tất cả các nhóm IOMMU và thiết bị thuộc chúng:
for d in /sys/kernel/iommu_groups/*/devices/*; do n=$(basename $d); x=$(ls -l $d | awk '{print $NF}'); echo "$n: $x"; done
Kết quả mong đợi là danh sách các thiết bị được nhóm lại. GPU của bạn phải nằm trong một nhóm riêng biệt hoặc nhóm chỉ chứa GPU và các thiết bị phụ trợ (như audio card của GPU) để passthrough thành công.
Trên giao diện Proxmox, chọn VM chứa Kubernetes Worker, vào Hardware, nhấn Add và chọn PCI Device. Chọn đúng GPU từ danh sách.
Trong cửa sổ cấu hình PCI Device, bạn phải đánh dấu vào ô Primary GPU nếu đây là GPU duy nhất, và quan trọng nhất là đánh dấu vào ô Passthrough. Nếu không tick ô này, VM sẽ không nhận quyền điều khiển phần cứng.
Sau khi cấu hình xong, khởi động lại VM Worker. Kết quả mong đợi là VM khởi động thành công và khi login vào VM, lệnh nvidia-smi hiện thông tin GPU.
nvidia-smi
Cài đặt NVIDIA Container Toolkit và Driver trên Cluster
Khi GPU đã passthrough vào VM, bạn cần cài đặt driver NVIDIA lên hệ điều hành của VM đó để kernel có thể giao tiếp với phần cứng.
Trên các node Kubernetes Worker, trước tiên hãy thêm repository chính thức của NVIDIA cho Debian/Ubuntu (giả sử bạn dùng OS này cho VM).
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit.gpg
curl -s https://nvidia.github.io/libnvidia-container/deb/stable/distrib/gpgkey | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-stable.gpg
Tiếp theo, tạo file repository nguồn để apt có thể tải driver và toolkit. Đường dẫn file cấu hình là /etc/apt/sources.list.d/nvidia-docker.list.
cat > /etc/apt/sources.list.d/nvidia-docker.list
Cập nhật danh sách gói và cài đặt driver NVIDIA phù hợp với kiến trúc của bạn (ví dụ: cuda-drivers).
apt-get update && apt-get install -y cuda-drivers
Kết quả mong đợi là quá trình cài đặt hoàn tất và driver được tải về. Sau khi cài đặt xong, bạn cần khởi động lại VM Worker để module kernel của NVIDIA được tải vào.
reboot
Sau khi VM lên, xác nhận driver hoạt động bằng cách kiểm tra phiên bản driver.
nvidia-smi
Bây giờ, bạn cần cấu hình Docker (hoặc container runtime của Kubernetes) để có thể nhận diện và sử dụng GPU. Điều này được thực hiện bằng cách cài đặt nvidia-container-toolkit.
apt-get install -y nvidia-container-toolkit
Để áp dụng cấu hình cho Docker, bạn cần chạy lệnh cấu hình mặc định. Lệnh này sẽ cập nhật file cấu hình Docker daemon để thêm runtime NVIDIA.
nvidia-ctk runtime configure --runtime=docker
Kiểm tra file cấu hình Docker daemon tại /etc/docker/daemon.json. Nội dung file phải chứa phần runtimes trỏ đến nvidia.
cat /etc/docker/daemon.json
Kết quả mong đợi là thấy cấu trúc JSON như sau (có thể có thêm các key khác tùy hệ thống):
{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
Sau khi sửa cấu hình Docker, phải khởi động lại dịch vụ Docker để thay đổi có hiệu lực.
systemctl restart docker
Để xác minh toàn bộ quy trình cài đặt driver và toolkit, hãy chạy một container test có GPU. Nếu không có lỗi, bạn đã hoàn tất phần cài đặt trên OS.
docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi
Kết quả mong đợi là đầu ra của lệnh nvidia-smi hiển thị trong terminal, chứng tỏ container đã truy cập được GPU vật lý.
Xác định Device Plugin để Kubernetes nhận diện và phân bổ GPU
Để Kubernetes có thể nhận diện GPU và phân bổ tài nguyên cho các Pod (ví dụ: request 1 GPU cho training), bạn cần triển khai NVIDIA Device Plugin.
Device Plugin là một container chạy trên mỗi node có GPU, nó thông báo cho Kubernetes API Server về các tài nguyên GPU sẵn có trên node đó.
Cách tốt nhất để triển khai plugin này là dùng Helm chart chính thức của NVIDIA. Nếu chưa cài Helm, hãy cài đặt trước.
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
Thêm repository Helm của NVIDIA vào hệ thống của bạn.
helm repo add nvidia https://helm.nvidia.com/nvidia
helm repo update
Triển khai NVIDIA Device Plugin với cấu hình mặc định. Lệnh này sẽ tạo một DaemonSet trên cluster, đảm bảo plugin chạy trên mọi node có GPU.
helm install gpu-device-plugin nvidia/gpu-device-plugin --namespace nvidia-device-plugin --create-namespace
Kiểm tra xem các pod của plugin đã chạy chưa trên các node Worker của bạn.
kubectl get pods -n nvidia-device-plugin -o wide
Kết quả mong đợi là thấy các pod ở trạng thái Running và được schedule vào đúng các node Worker đã passthrough GPU.
Để chắc chắn plugin đã báo cáo tài nguyên thành công cho Kubernetes, hãy kiểm tra thông tin của node. Bạn sẽ thấy resource nvidia.com/gpu xuất hiện trong phần Allocatable.
kubectl describe node
Trong phần Allocable, bạn phải thấy dòng như sau:
Allocable:
...
nvidia.com/gpu: 1 (or more depending on your hardware)
...
Để kiểm tra tính năng phân bổ, tạo một Pod đơn giản yêu cầu 1 GPU. Nếu mọi thứ cấu hình đúng, Pod sẽ chuyển sang trạng thái Running và chạy trên node có GPU.
cat > /tmp/gpu-test-pod.yaml
kubectl apply -f /tmp/gpu-test-pod.yaml
Chờ vài giây rồi kiểm tra trạng thái Pod và xem nó đang chạy trên node nào.
kubectl get pod gpu-test-pod -o wide
Kiểm tra log của Pod để xác nhận GPU đã được nhận diện bên trong container.
kubectl logs gpu-test-pod
Kết quả mong đợi là Pod ở trạng thái Completed (vì lệnh nvidia-smi chạy xong và thoát) và log hiển thị thông tin GPU đầy đủ. Nếu Pod ở trạng thái Pending, hãy kiểm tra lại bước Device Plugin và tài nguyên node.
Sau khi xác minh thành công, xóa Pod test để giải phóng tài nguyên.
kubectl delete pod gpu-test-pod
Điều hướng series:
Mục lục: Series: Series: Xây dựng nền tảng AI Training phân tán với DeepSpeed, Ray và Kubernetes trên hạ tầng Proxmox
« Phần 2: Triển khai Kubernetes cluster trên Proxmox bằng Kubeadm
Phần 4: Triển khai Ray và DeepSpeed trên Kubernetes »