Cách chia phân vùng GPU trên Proxmox: Chia sẻ một card NVIDIA cho nhiều VM

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

Vấn đề: Một GPU, quá nhiều tác vụ

Chắc hẳn chúng ta đều đã từng gặp tình cảnh này. Bạn vừa chi ra 400 USD cho một chiếc card NVIDIA RTX xịn xò, chỉ để nhận ra nó bị khóa chặt vào một máy ảo Windows duy nhất. Bạn muốn chiếc card đó vừa có thể xử lý gaming trên Windows, vừa chạy server AI với Ollama, lại vừa gánh cả Plex media server để transcode phần cứng—tất cả cùng một lúc.

Thông thường, chúng ta dựa vào PCIe Passthrough. Cách này cấp 100% sức mạnh phần cứng cho một máy ảo (VM), nhưng nó lại ngăn cản tất cả các máy ảo khác truy cập. Nếu VM Windows của bạn đang ở trạng thái nghỉ, sức mạnh GPU đó coi như bỏ phí và chỉ làm tốn điện. Phân vùng (Partitioning) thay đổi hoàn toàn cuộc chơi bằng cách cho phép bạn chia một card vật lý thành nhiều card ảo, giúp HomeLab của bạn hoạt động hiệu quả hơn đáng kể.

So sánh các phương pháp: Passthrough vs. Partitioning

Việc chọn phương pháp phù hợp tùy thuộc vào việc bạn coi trọng sức mạnh thô hay khả năng tận dụng tối đa phần cứng. Dưới đây là bảng so sánh hai công nghệ này trong môi trường Proxmox thực tế.

PCIe Passthrough (Phương pháp 1:1)

  • Cách hoạt động: Hệ điều hành host hoàn toàn bỏ qua GPU và giao toàn bộ địa chỉ PCI cho một VM duy nhất.
  • Hiệu năng: Bạn đạt được khoảng 98% tốc độ so với chạy trực tiếp trên phần cứng (bare-metal).
  • Hạn chế: Đây là lựa chọn “được ăn cả ngã về không”. Chỉ một VM có thể truy cập phần cứng.

vGPU Partitioning (Phương pháp 1:N)

  • Cách hoạt động: Một driver chuyên dụng sẽ chia GPU thành nhiều “Mediated Devices” (mdev). Mỗi VM sẽ nhìn thấy một card NVIDIA nhỏ hơn với lượng VRAM chuyên dụng riêng.
  • Hiệu năng: Được chia sẻ dựa trên profile của bạn. Ví dụ, bạn có thể chia một chiếc RTX 3060 12GB thành ba thực thể 4GB.
  • Hạn chế: Việc cài đặt đòi hỏi can thiệp thủ công nhiều hơn và cần phải vượt qua các giới hạn phần mềm của NVIDIA trên các dòng card phổ thông.

Ưu và nhược điểm của phân vùng vGPU

Trước khi bắt tay vào dòng lệnh, hãy cân nhắc xem lợi ích có xứng đáng với công sức bảo trì cho hệ thống của bạn hay không.

Ưu điểm:

  • Hiệu quả đầu tư (ROI) tốt hơn: Chạy đồng thời một máy tính Windows và một server AI không giao diện trên cùng một card.
  • Hóa đơn tiền điện thấp hơn: Một GPU chạy ba tác vụ tiêu thụ ít điện năng hơn nhiều so với việc chạy ba card riêng biệt ở chế độ nghỉ.
  • Khả năng mở rộng linh hoạt: Bạn có thể gán một profile 2GB nhỏ cho Linux container và một profile 8GB lớn hơn cho VM gaming.

Nhược điểm:

  • Rào cản cài đặt: Bạn phải patch kernel và sử dụng các script cộng đồng để “đánh lừa” driver phổ thông kích hoạt các tính năng dành cho doanh nghiệp.
  • Tính kém ổn định: Các bản cập nhật kernel của Proxmox đôi khi có thể làm hỏng ánh xạ vGPU, yêu cầu phải cài đặt lại driver.

Phần cứng khuyến nghị và điều kiện tiên quyết

Các dòng card doanh nghiệp như Tesla P4 hoặc T4 hỗ trợ tính năng này ngay từ đầu. Tuy nhiên, hầu hết người dùng thích sử dụng card RTX hoặc GTX mà họ đã có sẵn. Hướng dẫn này tập trung vào các kiến trúc NVIDIA như Pascal, Turing và Ampere.

  • Host: Proxmox VE 8.x (đảm bảo bạn đang sử dụng kernel ổn định).
  • GPU: NVIDIA GTX series 10, RTX series 20/30/40, hoặc Tesla P4/P40.
  • BIOS: Kích hoạt VT-d (Intel) hoặc AMD-Vi (AMD) cùng với Above 4G DecodingSR-IOV.

Triển khai từng bước

Làm theo các bước sau để biến chiếc card RTX tiêu chuẩn của bạn thành một cỗ máy đa nhiệm mạnh mẽ.

1. Chuẩn bị Proxmox Host

Để bắt đầu, chúng ta cần kích hoạt IOMMU và yêu cầu kernel tải các module VFIO. Mở cấu hình GRUB của bạn:

nano /etc/default/grub

Sửa dòng GRUB_CMDLINE_LINUX_DEFAULT. Đối với người dùng Intel, nó sẽ trông như thế này:

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"

Áp dụng các thay đổi và thêm các module vào cấu hình hệ thống của bạn:

update-grub
echo "vfio" >> /etc/modules
echo "vfio_iommu_type1" >> /etc/modules
echo "vfio_pci" >> /etc/modules
echo "vfio_virqfd" >> /etc/modules

2. Cài đặt các gói phụ thuộc và vGPU Unlocker

NVIDIA thường giới hạn tính năng vGPU cho các dòng card Quadro và Tesla đắt tiền. Để vượt qua giới hạn này trên card GeForce, chúng ta sử dụng các script vGPU-ProxMox. Những công cụ này cho phép card phổ thông tự nhận diện là dòng card doanh nghiệp.

Cài đặt các công cụ build và headers cụ thể cho kernel Proxmox của bạn:

apt update
apt install -y build-essential dkms pve-headers-$(uname -r) git

Clone công cụ unlocker do cộng đồng duy trì. Hãy luôn kiểm tra repository để biết các lưu ý về khả năng tương thích mới nhất với Proxmox 8:

git clone https://github.com/it-proste/vGPU-ProxMox.git
# Làm theo hướng dẫn của script để chuẩn bị môi trường host

3. Cài đặt NVIDIA vGPU Manager

Bạn sẽ cần một phiên bản driver NVIDIA vGPU Manager cụ thể. Mặc dù chúng thường được tìm thấy trong cổng thông tin NVIDIA Enterprise, nhiều người dùng tìm thấy các file .run cần thiết thông qua các nguồn chia sẻ của cộng đồng.

Cài đặt driver trên host khi unlocker đang hoạt động:

chmod +x NVIDIA-Linux-x86_64-xxx.xx-vgpu-kvm.run
./NVIDIA-Linux-x86_64-xxx.xx-vgpu-kvm.run --dkms

Khởi động lại máy và chạy lệnh nvidia-smi. Nếu driver hoạt động, bạn sẽ thấy thông tin chi tiết về GPU của mình. Tiếp theo, kiểm tra xem các profile ảo đã sẵn sàng chưa:

ls /sys/class/mdev_bus/0000:01:00.0/mdev_supported_types/

Lưu ý: Thay thế 0000:01:00.0 bằng PCI ID thực tế của GPU bạn tìm thấy qua lệnh lspci.

4. Gán vGPU cho VM Windows

Bây giờ host đã sẵn sàng, hãy truy cập giao diện Web Proxmox để cấu hình VM của bạn:

  1. Đi tới VM Windows của bạn và chọn Hardware.
  2. Nhấn Add -> PCI Device.
  3. Chọn GPU của bạn và chọn một MDev Type. Một profile như nvidia-259 thường cung cấp framebuffer 2GB.
  4. Tích chọn Primary GPU nếu bạn dự định sử dụng máy này để chơi game hoặc dùng remote desktop.

Điều quan trọng là bạn phải cài đặt NVIDIA vGPU Guest Driver bên trong VM Windows. Các driver GeForce tiêu chuẩn sẽ không thể khởi tạo được. Phiên bản driver trên máy khách phải khớp hoàn toàn với phiên bản manager trên host.

5. Thiết lập AI Server (VM Linux)

Thêm khả năng xử lý AI cũng đơn giản không kém. Gán một profile vGPU cho VM Linux của bạn (Ubuntu 22.04 hoạt động tốt nhất). Bên trong máy khách, cài đặt tiện ích NVIDIA và Container Toolkit:

# Thực hiện bên trong máy ảo Linux
sudo apt install nvidia-utils-xxx
sudo apt install nvidia-docker2
sudo systemctl restart docker

Điều này cho phép bạn chạy một mô hình ngôn ngữ lớn (LLM) trong Docker container trong khi VM Windows của bạn vẫn đang đồng thời xử lý xuất video nặng.

Lời kết về vGPU

Mặc dù việc thiết lập không đơn giản theo kiểu “một cú nhấp chuột”, nhưng hiệu quả mang lại là rất lớn. HomeLab của riêng tôi đã giảm từ ba chiếc GPU ngốn điện xuống chỉ còn một chiếc RTX 3060 duy nhất. Chiếc card này hiện đang gánh vác máy trạm Windows hàng ngày, một lab stable diffusion và media server của tôi mà không hề gặp khó khăn gì.

Nếu VM của bạn không khởi động được với lỗi “MDEV”, hãy kiểm tra xem driver nouveau đã được đưa vào danh sách đen (blacklist) trên host chưa. Ngoài ra, hãy đảm bảo kernel headers không bị lệch so với phiên bản đang chạy. Một khi bạn đã vận hành thành công, bạn sẽ không bao giờ muốn quay lại những hạn chế của passthrough truyền thống nữa.

Share: