เพิ่มการรองรับ P2P ให้กับไดรเวอร์ NVIDIA Linux Open GPU

โปรเจ็กต์นี้เป็นการ fork ไดรเวอร์ NVIDIA เพื่อเพิ่มการรองรับ P2P ให้กับ GPU 4090

  • ติดตั้งได้ง่ายด้วยการรัน ./install.sh
  • อาจต้องลบไดรเวอร์เดิมออกจาก DKMS ก่อน
  • ระบบต้องรองรับ Large BAR และต้องปิด IOMMU
  • ยังไม่มั่นใจว่าการ flush cache ทั้งหมดถูกต้องครบถ้วนหรือไม่ ดังนั้นหากพบปัญหาขอให้รายงานเข้ามา
  • นี่ไม่ใช่การแฮ็ก แต่เป็นการทำตามสเปก PCIe และหากจัดระเบียบโค้ดให้ดี ก็อาจถูกรวมกลับเข้า upstream ได้

หลักการทำงาน

ปัญหาของ NVIDIA P2P แบบเดิม

  • เดิมใช้ฮาร์ดแวร์อินเทอร์เฟซชื่อ MAILBOXP2P สำหรับส่งข้อมูลหน่วยความจำระหว่าง GPU
  • บน 4090 ฮาร์ดแวร์นี้ไม่มีอยู่หรือถูกปิดใช้งานไว้ จึงทำให้ P2P ใช้งานไม่ได้
  • ไดรเวอร์ช่วงแรก ๆ รายงานว่ามันทำงานผิดพลาด แต่จริง ๆ แล้วกำลังส่งข้อมูลผ่านบัส PCIe อยู่
  • อย่างไรก็ตาม เนื่องจากไม่มีฮาร์ดแวร์ mailbox ทำให้ข้อมูลที่คัดลอกไปไม่ถูกส่งไปยังตำแหน่งที่ถูกต้อง และอาจทำให้ระบบล่มได้

การเพิ่มการรองรับ Large BAR

  • NVIDIA ได้เพิ่มการรองรับ Large BAR ให้กับ 3090 บางรุ่นและ 4090 ทุกรุ่น
  • บน H100 มีการเพิ่มโหมด PCIe ชื่อ BAR1P2P ที่ใช้ BAR โดยตรงแทน mailbox
  • หากต้องการเปิดใช้งานสิ่งนี้บน 4090 จำเป็นต้องข้าม HAL และเรียกใช้เมธอดของ GH100 โดยตรง
    • ใช้เมธอดอย่าง kbusEnableStaticBar1Mapping_GH100 เพื่อแมป VRAM ทั้งหมดเข้ากับ BAR1
    • ต้องปิดการใช้งานพื้นที่ดังกล่าวในฟังก์ชัน MapAperture

ความยากในการเปิดใช้งาน P2P

  • แม้จะแมป VRAM แล้ว แต่เมื่อรัน ./simpleP2P จาก cuda-samples ก็ยังเกิด MMU error
    • เพราะใช้ GMMU_APERTURE_PEER เป็นชนิดการแมป ซึ่ง 4090 ไม่รองรับ
    • ชนิดที่ 4090 รองรับมีเพียง GMMU_APERTURE_VIDEO, GMMU_APERTURE_SYS_NONCOH, GMMU_APERTURE_SYS_COH
  • จึงเปลี่ยน GMMU_APERTURE_PEER เป็น GMMU_APERTURE_SYS_NONCOH
    • เพราะไม่ต้องการความสอดคล้องกับ CPU L2 cache แต่จำเป็นต้องออกผ่านบัส PCIe
  • เปลี่ยนฟิลด์ที่อยู่ฝั่ง peer อย่าง fldAddrPeer เป็น fldAddrSysmem
  • ตั้งค่าฟิลด์ fabricBaseAddress เป็นแอดเดรสอ้างอิงของ BAR1

การยืนยันการทำงาน

  • ยืนยันว่า ./simpleP2P ทำงานได้ตามปกติ
    • P2P ระหว่าง GPU0 และ GPU1 ทำความเร็วได้ 24GB/s
  • ตรวจสอบแบนด์วิดท์แบบสองทิศทางด้วย p2pBandwidthLatencyTest
    • วัดแบนด์วิดท์ภายในเครื่องได้ 920GB/s และแบนด์วิดท์ P2P ได้ 51GB/s
  • ตรวจสอบความเข้ากันได้ด้วยการทดสอบ NCCL
    • ใช้ GPU 4090 จำนวน 6 ตัว ทำค่า bus bandwidth เฉลี่ยได้ 24.5GB/s

ความเห็นของ GN⁺

  • ดูเหมือนว่าการที่ไดรเวอร์ NVIDIA ส่วนใหญ่ถูกเปิดซอร์สไว้ ทำให้ชุมชนนักพัฒนาสามารถลองทำสิ่งนี้ได้ และหวังว่าในอนาคตจะมีส่วนที่เป็นโอเพนซอร์สมากขึ้นอีก
  • หากสามารถนำ 4090 หลายตัวมาเชื่อมต่อและใช้งานร่วมกันได้ ก็จะเปิดทางให้นักพัฒนาอิสระหรือแล็บขนาดเล็กสามารถฝึกโมเดล AI ขนาดใหญ่มากได้
  • แต่ในอีกด้านหนึ่ง การที่นักพัฒนายังต้องมาจัดการกับส่วนที่พึ่งพาฮาร์ดแวร์และซับซ้อนเช่นนี้ด้วยตัวเอง ก็สะท้อนว่า NVIDIA อาจยังรองรับ 4090 ได้ไม่สมบูรณ์นัก
  • อีกทั้งเรื่องนี้ยังจำกัดอยู่เฉพาะไดรเวอร์บน Linux และการใช้งานเชิงพาณิชย์บน Windows ก็ดูยังอีกไกล หวังว่าจะมีการรองรับอย่างเป็นทางการจาก NVIDIA เร็ว ๆ นี้
  • เนื่องจาก 4090 ยังเป็นฮาร์ดแวร์ที่ใหม่มาก จึงอาจยากที่จะคาดหวังความเข้ากันได้อย่างสมบูรณ์กับไลบรารีหรือเฟรมเวิร์ก ML อย่าง CUDA, PyTorch, Tensorflow คงต้องรอให้ระบบนิ่งกว่านี้ก่อน

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น