1 điểm bởi GN⁺ 2024-04-13 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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_64aarch64, 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 .run của trình điều khiển NVIDIA GPU với tùy chọn --no-kernel-modules

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_64 cùng với CC, LD, AR, CXX, OBJCOPY trê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=1 sẽ in ra toàn bộ các lệnh được thực thi
    • Ở mặc định chỉ in ra các dòng CC ngắn gọn
  • DEBUG=1 biê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 .run củ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.konv-kernel.o_binary
    • Tên thành phần tương ứng trong nvidia-modeset.konv-modeset-kernel.o_binary
    • nvidia-drm.konvidia-uvm.ko khô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 kernel
    • kernel-open/nvidia/: lớp giao diện kernel cho nvidia.ko
    • kernel-open/nvidia-drm/: lớp giao diện kernel cho nvidia-drm.ko
    • kernel-open/nvidia-modeset/: lớp giao diện kernel cho nvidia-modeset.ko
    • kernel-open/nvidia-uvm/: lớp giao diện kernel cho nvidia-uvm.ko
    • src/: mã độc lập với hệ điều hành
    • src/nvidia/: mã độc lập với hệ điều hành cho nvidia.ko
    • src/nvidia-modeset/: mã độc lập với hệ điều hành cho nvidia-modeset.ko
    • src/common/: mã tiện ích dùng trong một hoặc nhiều thành phần giữa nvidia.konvidia-modeset.ko
    • nouveau/: 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 nouveau trí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-modules củ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.md riê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.html trong README dành cho người dùng cuối của NVIDIA GPU driver
  • Hỗ trợ vGPU cần tham khảo README.vgpu có 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

 
GN⁺ 2024-04-13
Ý 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

    • tinygrad hỗ trợ chia không đều. Không có lý do căn bản nào bắt buộc phải là 4 hay 8; nếu phần mềm tốt, công việc có thể được song song hóa gần như hoàn toàn với bất kỳ số lượng GPU nào
      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
    • Lý do là 6 GPU vì cần bộ lưu trữ nhanh, mà thứ đó dùng lane PCIe
      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
    • 6 có vẻ hợp lý. Một phần trong 128 lane của ThreadRipper phải dành cho mạng và NVMe
      Ví dụ 4 ổ NVMe sẽ cần lane x16, mạng 10G lại cần thêm lane x4
    • Tôi đã tìm tài liệu NVIDIA SXM2 được công bố cách đây không lâu, và SXM2/NVLink 2.0 cũng trông giống hệ thống 6-way
      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ý
    • Sẽ rất hay nếu có thể chia sẻ chi tiết bản dựng đang tính đến. Phòng lab của tôi cần máy chủ, nhưng có quá nhiều lựa chọn nên khó hình dung
  • Đâ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

    • Ngay cả trước đó, Nvidia đã làm cuộc sống của chúng tôi khó khăn hơn bằng cách dần loại bỏ thiết kế blower của các card tiêu dùng có thể đưa vào máy chủ
      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
    • So với các nhà cung cấp GPU cloud thì chi phí thế nào?
  • 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ì?

    • Nghĩa là khi gửi dữ liệu từ bộ nhớ của một GPU sang GPU khác, không cần đi qua RAM hệ thống. https://xilinx.github.io/XRT/master/html/p2p.html
    • Nó nói đến truy cập bộ nhớ dùng chung giữa các GPU Nvidia
      https://developer.nvidia.com/gpudirect
    • Thuật ngữ chính xác, và trước đây có lẽ hầu hết mọi người sẽ gọi như vậy, là bus mastering
    • Một thuật ngữ ngớ ngẩn. Nói vậy thì liên kết RS-232 cũng được gọi là peer to peer
  • Ướ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 đó họ không thể tính giá khác nhau cho từng khách hàng trên cùng một phần cứng. Không phải ai cũng có lợi
    • Nếu tôi là nhà sản xuất phần cứng và khóa tính năng bằng phần mềm không còn hiệu quả, tôi sẽ chuyển sang khóa bằng phần cứng
      Khi đó giá sản phẩm đơn giản là sẽ đắt hơn
    • Tính mở rõ ràng là tuyệt vời, nhưng thật ra không phải điều bắt buộc. Người ta vẫn có thể tìm cách xử lý các hệ thống đóng
      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ự
    • Phần mềm của Nvidia chính là hào kinh tế của họ
  • 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?

    • Ở một mức độ nào đó thì đú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” đó
    • Có lẽ sẽ bị phản đối nhiều, nhưng tôi mong các hành vi như thế này trên thiết bị tiêu dùng bị cấm hoặc bị đánh thuế thật nặng
    • Hoàn toàn không có động lực nào để triển khai và kiểm thử tính năng này trên GPU tiêu dùng. Các cấu hình đa GPU để chơi game hầu như chưa bao giờ hoạt động thật sự ổn
  • 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

    • Xem quá trình phát triển của anh ấy thật sự rất thú vị. Sự hào phóng khi chia sẻ như vậy cũng đáng được nhắc đến
      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
    • Tôi nhận được nhiều động lực từ stream của anh ấy. Sự tập trung và nỗ lực là cốt lõi của kết quả tốt, và nếu thêm tầm nhìn cùng chiến lược rõ ràng thì còn có thể đạt được thành công
      Chúc mừng geohot và tất cả những người đóng góp cho tinygrad/comma
    • Anh ấy có khả năng tập trung như một phi công quân sự đang bay đường dài
    • Chiếc laptop Xbox360 của anh ấy là nguồn động lực cốt lõi thời niên thiếu của tôi
  • Lướt qua README thì, cho những ai tò mò, đây là P2P trên PCIe chứ không phải NVLink

    • RTX 40 không có NVLink trên PCB, nhưng một số card cùng dòng có hỗ trợ nên chắc nó có trong silicon. Tôi đoán có lẽ đã bị tắt bằng fuse
    • Theo tôi biết, 4090 không hỗ trợ PCIe 5.0 nên bị giới hạn ở tốc độ PCIe 4.0. Dù vậy vẫn là một cải thiện
  • 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

    • Đúng, nhưng dù sao thì sớm muộn gì chuyện đó cũng sẽ xảy ra
      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?

    • Thiết bị PCI vốn luôn có thể đọc và ghi vào không gian địa chỉ dùng chung. Dù bị ràng buộc bởi IOMMU, thông thường nó chủ yếu được dùng cho DMA vào RAM hệ thống, nhưng không bị giới hạn ở đó
      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
    • Commit đứng tên geohot nên có vẻ là chính George đã làm
    • Tiến độ cũng được ghi lại trên Discord của tinygrad