Trình điều khiển GPU Nvidia 4090 bị hack, kích hoạt P2P
(github.com/tinygrad)- Kho lưu trữ này là bản phát hành mã nguồn của NVIDIA Linux open GPU kernel modules, và theo README thì phiên bản là 565.57.01
- Các kernel module được build phải được dùng cùng với firmware GSP và các thành phần trình điều khiển NVIDIA GPU ở không gian người dùng của cùng bản phát hành driver 565.57.01
- Hỗ trợ x86_64 và aarch64, còn kernel Linux hỗ trợ cùng phạm vi với kernel module NVIDIA độc quyền, hiện tại là 4.15 trở lên
- Kernel module được chia thành thành phần độc lập với hệ điều hành và lớp giao diện kernel Linux, và cần build lớp giao diện kernel cho đúng kernel đích
- GPU tương thích là GPU từ Turing trở về sau, và trong bảng có liệt kê nhiều sản phẩm GeForce, RTX, dòng A/H/L cùng PCI ID, bao gồm cả NVIDIA GeForce RTX 4090
Bản phát hành và điều kiện build
- Kho lưu trữ này là bản phát hành mã nguồn của NVIDIA Linux open GPU kernel modules và phiên bản là 565.57.01
- Lệnh build cơ bản như sau
make modules -j$(nproc)
- Trước khi cài đặt cần gỡ các kernel module NVIDIA hiện có, sau đó chạy lệnh sau với quyền root
make modules_install -j$(nproc)
- Các kernel module được build ở đây cần firmware GSP và các thành phần trình điều khiển NVIDIA GPU ở không gian người dùng của bản phát hành driver 565.57.01 tương ứng
- Một ví dụ được đưa ra là cài file
.runcủa trình điều khiển NVIDIA GPU với tùy chọn--no-kernel-modules
- Một ví dụ được đưa ra là cài file
Kiến trúc hỗ trợ và toolchain
- Hiện tại kernel module có thể được build cho x86_64 hoặc aarch64
- Khi cross-compile, chỉ định
TARGET_ARCH=aarch64|x86_64cùng vớiCC,LD,AR,CXX,OBJCOPYtrên dòng lệnh make - Có thể build bằng các phiên bản tương đối mới của GCC hoặc Clang
- Lớp giao diện kernel của kernel module phải được build bằng đúng toolchain đã được dùng để build kernel đích
- Phiên bản kernel Linux được hỗ trợ giống với phạm vi mà kernel module NVIDIA độc quyền hỗ trợ, hiện tại là Linux kernel 4.15 trở lên
Tùy chọn build
NV_VERBOSE=1sẽ in ra toàn bộ các lệnh được thực thi- Ở mặc định chỉ in ra các dòng
CCngắn gọn
- Ở mặc định chỉ in ra các dòng
DEBUG=1biên dịch kernel module dưới dạng debug build- Bản build mặc định được biên dịch không kèm thông tin gỡ lỗi
- Tùy chọn này cũng kích hoạt nhiều thông báo log debug của kernel module
Cấu trúc kernel module
- Phần lớn kernel module của NVIDIA được chia thành hai thành phần
- Thành phần độc lập với hệ điều hành: phần không phụ thuộc vào hệ điều hành
- kernel interface layer: phần đặc thù theo phiên bản và cấu hình kernel Linux
- Trong gói cài đặt
.runcủa NVIDIA, thành phần độc lập với hệ điều hành được cung cấp ở dạng nhị phân- Thành phần này lớn và mất nhiều thời gian biên dịch, nên có sẵn bản build trước để người dùng không phải biên dịch lại mỗi lần cài driver
- Tên thành phần tương ứng trong
nvidia.kolànv-kernel.o_binary - Tên thành phần tương ứng trong
nvidia-modeset.kolànv-modeset-kernel.o_binary nvidia-drm.kovànvidia-uvm.kokhông có thành phần độc lập với hệ điều hành
- Lớp giao diện kernel của từng kernel module phải được build khớp với kernel đích
Cấu trúc thư mục và tích hợp Nouveau
- Vai trò của các thư mục chính như sau
kernel-open/: lớp giao diện kernelkernel-open/nvidia/: lớp giao diện kernel chonvidia.kokernel-open/nvidia-drm/: lớp giao diện kernel chonvidia-drm.kokernel-open/nvidia-modeset/: lớp giao diện kernel chonvidia-modeset.kokernel-open/nvidia-uvm/: lớp giao diện kernel chonvidia-uvm.kosrc/: mã độc lập với hệ điều hànhsrc/nvidia/: mã độc lập với hệ điều hành chonvidia.kosrc/nvidia-modeset/: mã độc lập với hệ điều hành chonvidia-modeset.kosrc/common/: mã tiện ích dùng trong một hoặc nhiều thành phần giữanvidia.kovànvidia-modeset.konouveau/: công cụ tích hợp với trình điều khiển thiết bị Nouveau
- Các script Python trong thư mục
nouveautrích xuất một số ảnh nhị phân firmware và dữ liệu liên quan được mã hóa trong mã nguồn rồi lưu thành các tệp riêng - Các tệp này được trình điều khiển thiết bị Nouveau dùng để nạp và giao tiếp với firmware GSP
- Bố cục tệp nhị phân được mô tả trong
nouveau_firmware_layout.ods, và tệp này ở định dạng OpenDocument Spreadsheet
Đóng góp và xử lý issue
- Việc đóng góp được thực hiện bằng cách tạo pull request trong kho
open-gpu-kernel-modulescủa NVIDIA - Khi gửi pull request, cần chấp nhận Contributor License Agreement
- Codebase này được chia sẻ với trình điều khiển độc quyền của NVIDIA, và mã nguồn công khai được tạo ra từ mã dùng chung sau nhiều bước xử lý
- Kho GitHub chủ yếu hoạt động như snapshot của từng bản phát hành driver
- Khó có thể kỳ vọng vào việc cung cấp revision history của từng thay đổi riêng lẻ được thực hiện trong codebase dùng chung của NVIDIA
- Mỗi bản phát hành driver nhiều khả năng chỉ có một git commit
- Các đóng góp riêng lẻ có thể không được phản ánh thành git commit riêng trong kho GitHub
- Do quy trình xử lý trước khi công khai, việc áp dụng đóng góp vào codebase dùng chung có thể cần merge thủ công
- Các đợt refactor lớn có thể khó merge và khó được chấp nhận, nên cần liên hệ và phối hợp trước
- Các vấn đề liên quan đến Open GPU Kernel Modules có thể được gửi qua Issues của kho NVIDIA, diễn đàn nhà phát triển NVIDIA, hoặc
linux-bugs@nvidia.com - Nếu phát hiện lỗ hổng bảo mật, cần xem tài liệu
SECURITY.mdriêng
Phạm vi GPU tương thích
- NVIDIA open kernel modules có thể dùng trên GPU từ Turing trở về sau
- Chi tiết về hỗ trợ tính năng và các giới hạn được hướng dẫn tham khảo tài liệu
kernel_open.htmltrong README dành cho người dùng cuối của NVIDIA GPU driver - Hỗ trợ vGPU cần tham khảo
README.vgpucó trong vGPU Host Package - Bảng GPU tương thích liệt kê tên sản phẩm cùng PCI ID
- Nếu có ba ID, ID đầu tiên là PCI Device ID, ID thứ hai là PCI Subsystem Vendor ID, và ID thứ ba là PCI Subsystem Device ID
- Bảng bao gồm nhiều sản phẩm như NVIDIA GeForce RTX 4090, NVIDIA GeForce RTX 4090 D, NVIDIA GeForce RTX 4080 SUPER, NVIDIA GeForce RTX 4070 Ti SUPER, NVIDIA H100, NVIDIA H200, NVIDIA GH200, NVIDIA L40S
1 bình luận
Ý kiến trên Hacker News
Ấn tượng thật. Tôi từng thắc mắc liệu việc này có khả thi không, và giờ thì thứ ngăn cản dàn 4x4090 cho LLM cục bộ chỉ còn là thời gian để chế tạo
Nếu tensor parallelism hoạt động, khi suy luận có lẽ sẽ rẻ hơn và nhanh hơn H100 SXM rất nhiều. Chỉ là tôi vẫn chưa hiểu vì sao tinybox lại chọn cấu hình 6 GPU. Nhiều tác vụ chỉ chạy tốt với 4 hoặc 8 GPU, nên hiện tại có vẻ như phải trả tiền cho 6 nhưng chỉ dùng 4, hoặc rơi vào một cấu hình lửng lơ không phải 8
Lý do chọn 6 là vì có 128 lane PCIe, tức 8 cổng x16. Dùng 1 cho NVMe, 1 cho mạng thì có thể kết nối 6 GPU thành full fabric. Nếu chỉ dùng 4 thì lãng phí PCIe, còn dùng 8 thì hầu như không còn chỗ cho kết nối bên ngoài ngoài vài cổng USB3
Mục tiêu cũng là chạy mô hình 70B FP16, cần khoảng 140GB VRAM. 6*24GB = 144GB nên vừa khớp
Ví dụ 4 ổ NVMe sẽ cần lane x16, mạng 10G lại cần thêm lane x4
NVIDIA SXM sau đó đã được cập nhật lên phiên bản 3, 4, và cấu hình này cũng không dựa trên nền đó, nhưng có thể còn lý do nào khác khiến 6-way là hợp lý
Đây thật sự là tin tốt. Vì ở trong giới học thuật, tôi biết vài phòng lab từng dựng máy với nhiều chiếc 4090 rồi mới phát hiện Nvidia đã chặn giao tiếp P2P giữa các card
Đó cũng là một trong những lý do tôi không mua 4090, dù với công việc của tôi thì nó rẻ hơn nhiều. Đây không phải NVLink, nhưng Nvidia gần như đã loại bỏ NVLink khỏi mọi card không phải dòng cao nhất, nên vẫn còn hơn không. Cuối năm ngoái tôi nhận báo giá cho 4 chiếc H100 có NVLink, thời gian giao hàng là 13 tháng; còn sản phẩm không có NVLink thì 4 tháng là nhận được. Hiện tại tôi đã mua 4 chiếc L40S để giữ cho phòng lab tiếp tục hoạt động, nhưng các vấn đề chuỗi cung ứng và mức tăng giá khủng khiếp đang khiến nghiên cứu rất khó khăn. Như vậy hoàn toàn không đủ để hỗ trợ 6 nghiên cứu sinh tiến sĩ và nhiều sinh viên đại học
Giai đoạn 2015–2018, ở trường đại học cũ, chúng tôi có thể dựng máy có 2 GPU kèm NVLink với giá 5.000 USD mỗi máy và đặt một chiếc dưới bàn cho từng sinh viên; thời đó dễ thở hơn nhiều
Từ góc nhìn phòng lab, tôi nghĩ lúc nào chúng tôi cũng sẽ chọn một card có MTBF chỉ bằng một nửa nhưng giá bằng 1/4
P2P ở đây nghĩa là gì? Tìm thử thì có vẻ là peer to peer, nhưng trong ngữ cảnh card đồ họa thì nó có nghĩa gì?
https://developer.nvidia.com/gpudirect
Ước gì nhiều công ty phần cứng công bố tài liệu hơn và để cộng đồng tự tìm hiểu phần còn lại
Nó giống những gì đã xảy ra với IBM VGA thời kỳ đầu. Chỉ cần tìm hiểu là ra “Mode X” hay các chế độ thực sự của phần cứng không qua BIOS, thậm chí cả 800x600x16. Đáng tiếc là phần lớn dường như thích kiểm soát chặt mọi khía cạnh sử dụng sản phẩm để vắt thêm tiền từ tập người dùng. Cá nhân tôi cho rằng giai đoạn PC đạt năng suất cao nhất cũng là giai đoạn cởi mở nhất
Khi đó giá sản phẩm đơn giản là sẽ đắt hơn
Khả năng tương tác đối kháng (adversarial interoperability) từng rất phổ biến, và dù nhà sản xuất có muốn hay không, người ta vẫn đảo ngược kỹ thuật để làm cho phần mềm chạy được. Thứ trước đây hiếm nhưng nay đã trở nên phổ biến là khóa phần mềm/phần cứng. Mật mã học lẽ ra phải là công nghệ trao quyền cho chúng ta, nhưng rốt cuộc lại được dùng để loại chúng ta khỏi chính cỗ máy của mình. Giờ chúng ta không còn ở ghế lái. Ngay cả hệ điều hành cũng không còn thật sự vận hành hệ thống. Kể cả một hệ thống Linux tự do cũng chỉ là “OS người dùng” bên trong một khối pha trộn giữa firmware độc quyền và silicon mà nhà sản xuất không thể biết hết; nó gần như chỉ là một bộ phận nhỏ bị sandbox khỏi hoạt động thực sự
Lý do ban đầu Nvidia đưa ra khi loại bỏ NVLink khỏi dòng sản phẩm tiêu dùng là PCIe 5 sẽ đủ nhanh
Nhưng dòng 40xx lại ra mắt mà không có PCIe 5, cũng không hỗ trợ P2P. Giờ ít nhất một nửa điều đó được bù lại thì cũng tốt, nhưng khó mà tưởng tượng họ sẽ tiếp tục cho phép việc này trong firmware thế hệ tiếp theo
Đây có phải là một trong những tính năng bị vô hiệu hóa trên card tiêu dùng để phân tách thị trường không?
Ví dụ không hoàn hảo lắm: hãy tưởng tượng một khu dân cư nhỏ khoảng 15 căn nhà đang được xây. Thông thường người ta sẽ đặt một máy biến áp 200kVA ở góc đường và cấp lượng điện phù hợp từ lưới điện. Nhưng do thiếu máy biến áp, nhà thầu lắp một máy biến áp thương mại 1250kVA. Nó có thể cấp điện cho số nhà nhiều hơn rất nhiều so với nhu cầu, nên vận hành với công suất dư khá lớn. Một ngày nọ, một cư dân muốn mở một cơ sở trồng trọt quy mô lớn và tìm ra cách kích hoạt phần công suất máy biến áp dư đó chỉ cho nhà mình. Thứ geohot tìm ra chính là phần “kích hoạt” đó
Từ lâu tôi luôn thán phục khả năng hack của George Hotz. Nó cũng truyền rất nhiều cảm hứng cho các dự án cá nhân của tôi
Anh ấy thường mắc kẹt ở những vấn đề nông và tùy ý mà với các kỹ sư hiểu biết hơn có lẽ sẽ thấy bớt khó hơn. Cũng thường thấy anh ấy viết mã rất tệ, thậm chí là mã sai. Các cảnh liên quan đến Twitter là ví dụ hay. Dù vậy, một mình anh ấy vẫn kiên trì lặp đi lặp lại và cũng thường xuyên tạo ra những cải tiến đáng kinh ngạc tương ứng. Đó là một tấm gương rất đáng học hỏi
Chúc mừng geohot và tất cả những người đóng góp cho tinygrad/comma
Lướt qua README thì, cho những ai tò mò, đây là P2P trên PCIe chứ không phải NVLink
Trong các kiến trúc sau này họ sẽ bắt đầu khóa thứ này trong firmware, nên khi còn dùng được thì sẽ rất tốt
Vì vậy dùng được dù chỉ một thế hệ vẫn tốt hơn là không có gì
Tôi tò mò không biết George tự làm, hay là ai đó nhắm tới khoản tiền thưởng mà tinycorp treo
Và tôi muốn hỏi những ai hiểu rõ phân hệ PCI: chuyện này trông không giống NVIDIA chủ động cố chặn, mà giống như họ không để tâm hơn, phải không?
Vì vậy việc can thiệp thiết bị để cấu hình cho toàn bộ VRAM được đưa vào không gian địa chỉ là hợp lý. Chỉ cần có hỗ trợ resizable BAR, hoặc BAR kích thước cố định đủ lớn. Việc ra lệnh cho một card đọc và ghi các địa chỉ được ánh xạ tới VRAM của card khác cũng hợp lý. Tôi tò mò liệu dung lượng chuyển mạch PCIe sẽ là nút thắt, hay liên kết điểm-điểm và VRAM sẽ là nút thắt. Dù bên nào đi nữa, giảm các lượt đi-về qua RAM hệ thống cũng sẽ hữu ích