ไดรเวอร์ GPU Nvidia 4090 ที่ถูกแฮ็ก เปิดใช้งาน P2P
(github.com/tinygrad)- รีโพซิทอรีนี้คือซอร์สรีลีสของ NVIDIA Linux open GPU kernel modules และตาม README ระบุเวอร์ชันเป็น 565.57.01
- เคอร์เนลโมดูลที่คอมไพล์ขึ้นมาต้องใช้ร่วมกับเฟิร์มแวร์ GSP และคอมโพเนนต์ไดรเวอร์ NVIDIA GPU ฝั่ง user space ของ ไดรเวอร์รีลีส 565.57.01 เดียวกัน
- รองรับ x86_64 และ aarch64 และรองรับ Linux kernel ในช่วงเดียวกับ NVIDIA kernel module แบบ proprietary โดยปัจจุบันคือ 4.15 ขึ้นไป
- เคอร์เนลโมดูลแบ่งเป็นคอมโพเนนต์ที่ไม่ขึ้นกับระบบปฏิบัติการ และ ชั้นอินเทอร์เฟซ Linux kernel โดยต้องบิลด์ชั้นอินเทอร์เฟซเคอร์เนลให้ตรงกับเคอร์เนลเป้าหมาย
- GPU ที่รองรับคือ GPU ตั้งแต่ Turing เป็นต้นไป และในตารางมีการระบุผลิตภัณฑ์ GeForce, RTX, ซีรีส์ A/H/L หลายรุ่น รวมถึง NVIDIA GeForce RTX 4090 พร้อม PCI ID
รีลีสและเงื่อนไขการบิลด์
- รีโพซิทอรีนี้คือซอร์สรีลีสของ NVIDIA Linux open GPU kernel modules และมีเวอร์ชันเป็น 565.57.01
- คำสั่งบิลด์พื้นฐานมีดังนี้
make modules -j$(nproc)
- ก่อนติดตั้งต้องลบ NVIDIA kernel module เดิมออก และรันคำสั่งต่อไปนี้ด้วยสิทธิ์ root
make modules_install -j$(nproc)
- เคอร์เนลโมดูลที่บิลด์จากที่นี่ต้องใช้เฟิร์มแวร์ GSP และคอมโพเนนต์ไดรเวอร์ NVIDIA GPU ฝั่ง user space ของ ไดรเวอร์รีลีส 565.57.01 ที่ตรงกัน
- มีการยกตัวอย่างวิธีติดตั้งไฟล์ไดรเวอร์ NVIDIA GPU
.runด้วยออปชัน--no-kernel-modules
- มีการยกตัวอย่างวิธีติดตั้งไฟล์ไดรเวอร์ NVIDIA GPU
สถาปัตยกรรมที่รองรับและ toolchain
- ปัจจุบันสามารถบิลด์เคอร์เนลโมดูลสำหรับ x86_64 หรือ aarch64 ได้
- หาก cross-compile ให้ระบุ
TARGET_ARCH=aarch64|x86_64พร้อมกับCC,LD,AR,CXX,OBJCOPYบนบรรทัดคำสั่งของ make - สามารถบิลด์ด้วย GCC หรือ Clang เวอร์ชันค่อนข้างใหม่ได้
- ชั้นอินเทอร์เฟซเคอร์เนล ของเคอร์เนลโมดูลต้องบิลด์ด้วย toolchain เดียวกับที่ใช้บิลด์เคอร์เนลเป้าหมาย
- เวอร์ชัน Linux kernel ที่รองรับเท่ากับช่วงที่ NVIDIA kernel module แบบ proprietary รองรับ ซึ่งปัจจุบันคือ Linux kernel 4.15 ขึ้นไป
ออปชันการบิลด์
NV_VERBOSE=1จะแสดงคำสั่งทั้งหมดที่ถูกรัน- ค่าเริ่มต้นจะแสดงเพียงบรรทัด
CCแบบสั้น
- ค่าเริ่มต้นจะแสดงเพียงบรรทัด
DEBUG=1จะคอมไพล์เคอร์เนลโมดูลเป็น debug build- การบิลด์ปกติจะคอมไพล์โดยไม่มีข้อมูลดีบัก
- ออปชันนี้ยังเปิดใช้งานข้อความ debug log หลายรายการของเคอร์เนลโมดูลด้วย
โครงสร้างของเคอร์เนลโมดูล
- NVIDIA kernel module ส่วนใหญ่แบ่งออกเป็นสองคอมโพเนนต์
- คอมโพเนนต์ที่ไม่ขึ้นกับ OS: ส่วนที่เป็นอิสระจากระบบปฏิบัติการ
- kernel interface layer: ส่วนที่เฉพาะกับเวอร์ชันและการตั้งค่าของ Linux kernel
- ในแพ็กเกจติดตั้ง
.runของ NVIDIA จะมีการแจกจ่ายคอมโพเนนต์ที่ไม่ขึ้นกับ OS ในรูปแบบไบนารี- คอมโพเนนต์นี้มีขนาดใหญ่และใช้เวลาคอมไพล์นาน จึงมีเวอร์ชันที่บิลด์ไว้ล่วงหน้าเพื่อไม่ให้ผู้ใช้ต้องคอมไพล์ใหม่ทุกครั้งที่ติดตั้งไดรเวอร์
- ชื่อคอมโพเนนต์นี้ใน
nvidia.koคือnv-kernel.o_binary - ชื่อคอมโพเนนต์นี้ใน
nvidia-modeset.koคือnv-modeset-kernel.o_binary nvidia-drm.koและnvidia-uvm.koไม่มีคอมโพเนนต์ที่ไม่ขึ้นกับ OS
- ชั้นอินเทอร์เฟซเคอร์เนล ของแต่ละเคอร์เนลโมดูลต้องบิลด์ให้ตรงกับเคอร์เนลเป้าหมาย
โครงสร้างไดเรกทอรีและการทำงานร่วมกับ Nouveau
- หน้าที่ของไดเรกทอรีหลักมีดังนี้
kernel-open/: ชั้นอินเทอร์เฟซเคอร์เนลkernel-open/nvidia/: ชั้นอินเทอร์เฟซเคอร์เนลสำหรับnvidia.kokernel-open/nvidia-drm/: ชั้นอินเทอร์เฟซเคอร์เนลสำหรับnvidia-drm.kokernel-open/nvidia-modeset/: ชั้นอินเทอร์เฟซเคอร์เนลสำหรับnvidia-modeset.kokernel-open/nvidia-uvm/: ชั้นอินเทอร์เฟซเคอร์เนลสำหรับnvidia-uvm.kosrc/: โค้ดที่ไม่ขึ้นกับ OSsrc/nvidia/: โค้ดที่ไม่ขึ้นกับ OS สำหรับnvidia.kosrc/nvidia-modeset/: โค้ดที่ไม่ขึ้นกับ OS สำหรับnvidia-modeset.kosrc/common/: โค้ดยูทิลิตีที่ใช้ในnvidia.koหรือnvidia-modeset.koอย่างน้อยหนึ่งตัวnouveau/: เครื่องมือสำหรับทำงานร่วมกับไดรเวอร์อุปกรณ์ Nouveau
- สคริปต์ Python ในไดเรกทอรี
nouveauจะดึง อิมเมจไบนารีของเฟิร์มแวร์ บางส่วนที่ฝังอยู่ในซอร์สโค้ดพร้อมข้อมูลที่เกี่ยวข้อง แล้วบันทึกเป็นไฟล์แยก - ไฟล์เหล่านี้ถูกใช้โดยไดรเวอร์อุปกรณ์ Nouveau เพื่อโหลดและสื่อสารกับ เฟิร์มแวร์ GSP
- เลย์เอาต์ของไฟล์ไบนารีมีอธิบายไว้ใน
nouveau_firmware_layout.odsซึ่งเป็นไฟล์รูปแบบ OpenDocument Spreadsheet
การมีส่วนร่วมและการจัดการปัญหา
- การมีส่วนร่วมทำผ่านการสร้าง pull request ไปยังรีโพซิทอรี
open-gpu-kernel-modulesของ NVIDIA - เมื่อต้องการส่ง pull request จำเป็นต้องยอมรับ Contributor License Agreement
- โค้ดเบสนี้ใช้ร่วมกับไดรเวอร์ proprietary ของ NVIDIA และซอร์สแบบเปิดถูกสร้างขึ้นจากโค้ดที่ใช้ร่วมกันหลังผ่านกระบวนการหลายขั้นตอน
- รีโพซิทอรีบน GitHub ทำงานคล้าย snapshot ของแต่ละไดรเวอร์รีลีสเป็นหลัก
- ไม่ควรคาดหวังว่าจะมี revision history ของการเปลี่ยนแปลงรายรายการที่เกิดขึ้นในโค้ดเบสส่วนกลางของ NVIDIA
- มีความเป็นไปได้สูงว่าแต่ละไดรเวอร์รีลีสจะมี git commit เพียงหนึ่งรายการ
- การมีส่วนร่วมรายรายการอาจไม่สามารถสะท้อนเข้ารีโพซิทอรี GitHub เป็น git commit แยกได้
- เนื่องจากมีกระบวนการก่อนเผยแพร่ การนำ contribution ไปใช้กับโค้ดเบสส่วนกลางจึงต้อง merge ด้วยมือ
- การรีแฟกเตอร์ขนาดใหญ่อาจ merge และรับเข้าได้ยาก จึงควรติดต่อและประสานงานล่วงหน้า
- ปัญหาที่เกี่ยวข้องกับ Open GPU Kernel Modules สามารถส่งไปยัง Issues ของรีโพซิทอรี NVIDIA, ฟอรัมนักพัฒนา NVIDIA หรือ
linux-bugs@nvidia.com - หากพบช่องโหว่ด้านความปลอดภัย ควรดูเอกสาร
SECURITY.mdแยกต่างหาก
ขอบเขต GPU ที่รองรับ
- NVIDIA open kernel modules ใช้งานได้กับ GPU ตั้งแต่ Turing เป็นต้นไป
- รายละเอียดการรองรับฟีเจอร์และข้อจำกัดให้ดูเอกสาร
kernel_open.htmlใน NVIDIA GPU driver end user README - การรองรับ vGPU ให้ดู
README.vgpuที่รวมอยู่ใน vGPU Host Package - ตาราง GPU ที่รองรับแสดงทั้งชื่อผลิตภัณฑ์และ PCI ID
- หากมี ID สามค่า ค่าแรกคือ PCI Device ID ค่าที่สองคือ PCI Subsystem Vendor ID และค่าที่สามคือ PCI Subsystem Device ID
- ในตารางมีหลายผลิตภัณฑ์ เช่น 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 ความคิดเห็น
ความคิดเห็นใน Hacker News
ยอดมาก เคยสงสัยว่าเรื่องนี้ทำได้ไหม ตอนนี้สิ่งเดียวที่ขวาง เครื่อง 4x4090 สำหรับ LLM แบบโลคัลก็คือเวลาในการสร้างเท่านั้น
ถ้าทำ tensor parallelism ได้ ก็น่าจะถูกกว่าและเร็วกว่า H100 SXM มากสำหรับงาน inference แต่ยังไม่เข้าใจว่าทำไม tinybox ถึงเลือกคอนฟิก GPU 6 ตัว งานจำนวนมากรันได้ดีเฉพาะกับ 4 หรือ 8 ตัว ตอนนี้ดูเหมือนจ่ายเงินสำหรับ 6 ตัวแต่ใช้จริงแค่ 4 ตัว หรือกลายเป็นคอนฟิกก้ำกึ่งที่ไม่ใช่ 8 ตัว
เหตุผลที่เลือก 6 ตัวคือมี PCIe lane 128 เลน หรือก็คือพอร์ต x16 จำนวน 8 พอร์ต ใช้กับ NVMe 1 พอร์ต และเครือข่าย 1 พอร์ต ก็จะเชื่อม GPU 6 ตัวแบบ full fabric ได้ ถ้าใช้แค่ 4 ตัวก็เสีย PCIe เปล่า และถ้าใช้ 8 ตัวก็แทบไม่เหลือช่องทางเชื่อมต่อภายนอกนอกจาก USB3 ไม่กี่พอร์ต
เป้าหมายก็คือรันโมเดล 70B FP16 ซึ่งต้องใช้ VRAM ประมาณ 140GB พอดีกับ 6*24GB = 144GB
เช่น NVMe 4 ตัวก็ใช้ x16 เลนแล้ว เครือข่าย 10G ก็ต้องใช้อีก x4 เลน
NVIDIA SXM ภายหลังอัปเดตเป็นเวอร์ชัน 3 และ 4 และคอนฟิกนี้ก็ไม่ใช่ฐานของมัน แต่บางทีอาจมีเหตุผลอื่นที่ทำให้ 6-way สมเหตุสมผล
เป็นข่าวดีจริง ๆ อยู่ในแวดวงวิชาการ เลยรู้จักหลายแล็บที่สร้างเครื่องด้วย 4090 หลายใบ แล้วไม่รู้ว่า Nvidia ปิดกั้นการสื่อสาร P2P ระหว่างการ์ดไว้
นั่นก็เป็นหนึ่งในเหตุผลที่ผมไม่ซื้อ 4090 แม้มันจะถูกกว่าสำหรับงานของผมมากก็ตาม นี่ไม่ใช่ NVLink แต่ในเมื่อ Nvidia แทบจะตัด NVLink ออกจากการ์ดที่ไม่ใช่รุ่นท็อปไปหมดแล้ว มีก็ยังดีกว่าไม่มี ปลายปีที่แล้วผมขอใบเสนอราคาสำหรับ H100 แบบ NVLink 4 ใบ ระยะเวลาส่งมอบคือ 13 เดือน ส่วนรุ่นที่ไม่มี NVLink รับได้ใน 4 เดือน ตอนนี้ซื้อ L40S 4 ใบมาเพื่อประคองแล็บไว้ แต่ปัญหาซัพพลายเชนและราคาที่พุ่งขึ้นมหาศาลทำให้งานวิจัยลำบากมาก มันไม่เพียงพออย่างยิ่งสำหรับสนับสนุนนักศึกษาปริญญาเอก 6 คนและนักศึกษาปริญญาตรีอีกหลายคน
ตอนปี 2015~2018 ที่มหาวิทยาลัยเก่า เราสามารถสร้างเครื่องที่มี GPU 2 ใบพร้อม NVLink ได้ในราคาเครื่องละ 5,000 ดอลลาร์ แล้ววางไว้ใต้โต๊ะให้นักศึกษาแต่ละคนได้ ตอนนั้นง่ายกว่ามาก
จากมุมมองของแล็บ ต่อให้ MTBF เหลือครึ่งเดียว ก็คงเลือกการ์ดที่ราคาแค่ 1/4 ได้เสมอ
P2P ในที่นี้หมายถึงอะไร? ลองค้นดูเหมือนจะเป็น peer to peer แต่ในบริบทของการ์ดจอมันหมายความว่าอะไร?
https://developer.nvidia.com/gpudirect
อยากให้บริษัทฮาร์ดแวร์จำนวนมากขึ้นเปิดเอกสาร แล้วปล่อยให้ชุมชนค้นหาส่วนที่เหลือเอง
คล้ายกับสิ่งที่เกิดขึ้นกับ IBM VGA ยุคแรก ๆ ลองไปดู "Mode X" หรือโหมดจริงของฮาร์ดแวร์ที่ไม่ใช่ BIOS แม้แต่ 800x600x16 ก็ได้ น่าเสียดายที่ส่วนใหญ่ดูเหมือนจะชอบควบคุมทุกแง่มุมของการใช้ผลิตภัณฑ์อย่างแน่นหนา เพื่อรีดเงินจากฐานผู้ใช้ให้มากขึ้น โดยส่วนตัวผมคิดว่าช่วงที่ PC มีประสิทธิผลมากที่สุดก็เป็นช่วงที่ เปิดกว้างที่สุด เช่นกัน
แล้วราคาสินค้าก็จะยิ่งแพงขึ้นเฉย ๆ
adversarial interoperability เป็นเรื่องปกติ และคนก็ทำ reverse engineering ให้ซอฟต์แวร์รันได้ ไม่ว่าผู้ผลิตจะอยากหรือไม่ก็ตาม สิ่งที่เมื่อก่อนพบได้น้อยแต่ตอนนี้พบได้ทั่วไปคือ การล็อกซอฟต์แวร์·ฮาร์ดแวร์ วิทยาการเข้ารหัสควรเป็นเทคโนโลยีที่มอบอำนาจให้เรา แต่สุดท้ายกลับถูกใช้เพื่อกีดกันเราออกจากเครื่องของเราเอง ตอนนี้เราไม่ได้อยู่หลังพวงมาลัยแล้ว แม้แต่ระบบปฏิบัติการก็ไม่ได้ควบคุมระบบอีกต่อไป แม้แต่ระบบ Linux ที่เสรีก็เป็นเพียง "OS ของผู้ใช้" ภายในก้อนที่ประกอบจากเฟิร์มแวร์และซิลิคอนแบบปิดที่ผู้ผลิตไม่เปิดเผย และแทบจะเป็นแค่ชิ้นส่วนเล็ก ๆ ที่ถูก sandbox ออกจากการทำงานจริง
เหตุผลดั้งเดิมที่ Nvidia ยกมาเมื่อถอด NVLink ออกจากไลน์อัปผู้บริโภค คือ PCIe 5 น่าจะเร็วพอแล้ว
แต่ซีรีส์ 40xx กลับออกมาโดยไม่มีทั้ง PCIe 5 และการรองรับ P2P ตอนนี้ดีที่อย่างน้อยก็เติมเต็มได้ครึ่งหนึ่ง แต่ยากจะจินตนาการว่าพวกเขาจะยอมให้ทำแบบนี้ต่อในเฟิร์มแวร์เจเนอเรชันถัดไป
นี่เป็นหนึ่งในฟีเจอร์ที่ถูกปิดไว้ในการ์ดสำหรับผู้บริโภคเพื่อ แบ่งแยกตลาด ใช่ไหม?
เปรียบเทียบแบบไม่สมบูรณ์นัก ลองนึกว่ามีชุมชนเล็ก ๆ ราว 15 หลังคาเรือนกำลังก่อสร้างอยู่ ปกติจะมีหม้อแปลง 200kVA วางไว้ที่หัวมุม แล้วจ่ายไฟจากโครงข่ายในระดับที่เหมาะสม แต่เพราะขาดแคลนหม้อแปลง ผู้รับเหมาจึงติดตั้งหม้อแปลงเชิงพาณิชย์ 1250kVA แทน มันจ่ายไฟให้บ้านได้มากกว่าที่จำเป็นมาก จึงทำงานโดยเหลือความจุอยู่อีกเยอะ วันหนึ่งผู้อยู่อาศัยคนหนึ่งอยากเริ่มทำฟาร์มปลูกขนาดใหญ่ เลยหาวิธีเปิดใช้ความจุหม้อแปลงส่วนเกินนั้นเฉพาะบ้านตัวเอง สิ่งที่ geohot ค้นพบก็คือการ “เปิดใช้” แบบนั้นเอง
ผมทึ่งในฝีมือแฮ็กของ George Hotz มาตลอดตั้งแต่ก่อนหน้านี้แล้ว โปรเจกต์ส่วนตัวของผมก็ได้รับแรงบันดาลใจอย่างมากจากเขา
เขามักติดกับปัญหาตื้น ๆ และค่อนข้างสุ่ม ซึ่งวิศวกรที่มีความรู้มากกว่าน่าจะรู้สึกว่ายากน้อยกว่า มักเห็นเขาเขียนโค้ดที่แย่มาก หรือแม้แต่โค้ดที่ผิดจริง ๆ ฉากเกี่ยวกับ Twitter เป็นตัวอย่างที่ดี แต่ถึงอย่างนั้น เขาก็วนทำซ้ำอย่างดื้อดึงด้วยตัวคนเดียว และสร้างการปรับปรุงที่น่าทึ่งได้บ่อยพอ ๆ กัน เป็นตัวอย่างที่ดีให้เรียนรู้
ขอแสดงความยินดีกับทั้ง geohot และผู้มีส่วนร่วมใน tinygrad/comma
ผมไล่อ่าน README คร่าว ๆ แล้ว สำหรับคนที่สงสัย นี่คือ P2P บน PCIe ไม่ใช่ NVLink
ในสถาปัตยกรรมรุ่นต่อ ๆ ไป พวกเขาคงเริ่มล็อกสิ่งนี้ไว้ในเฟิร์มแวร์ ดังนั้นระหว่างที่ยังใช้ได้ก็คงดี
ดังนั้นได้ใช้สักหนึ่งเจเนอเรชันก็ยังดีกว่าไม่มีเลย
สงสัยว่า George ทำเองหรือเปล่า หรือเป็นคนที่หวังเงินรางวัลที่ tinycorp ตั้งไว้
และอยากถามคนที่รู้ระบบย่อย PCI ดี ๆ ว่า เรื่องนี้ดูเหมือน NVIDIA ไม่ได้พยายามบล็อกอย่างจริงจัง แต่แค่ไม่ได้สนใจมากกว่า ใช่ไหม?
ดังนั้นการไปแตะอุปกรณ์เพื่อกำหนดค่าให้เอา VRAM ทั้งหมดเข้าไปอยู่ในพื้นที่แอดเดรสจึงสมเหตุสมผล ถ้ามีการรองรับ resizable BAR หรือถ้า BAR ขนาดคงที่ใหญ่พอก็ทำได้ และการสั่งให้การ์ดใบหนึ่งอ่านและเขียนแอดเดรสที่แมปไปยัง VRAM ของการ์ดอีกใบก็สมเหตุสมผลเช่นกัน อยากรู้ว่าความจุการสวิตช์ของ PCIe จะเป็นคอขวด หรือว่าลิงก์แบบจุดต่อจุดกับ VRAM จะเป็นคอขวด ไม่ว่าจะทางไหน การลดการวิ่งไป-กลับผ่าน RAM ของระบบก็น่าจะช่วยได้