NVIDIA เพิ่มการรองรับ Python แบบเนทีฟให้ CUDA
(thenewstack.io)- CUDA กำลังขยายตัวออกจากระบบนิเวศที่มี C/C++ เป็นศูนย์กลาง ไปในทิศทางที่ช่วยให้นักพัฒนา Python จัดการงานประมวลผลบน NVIDIA GPU ได้โดยตรงมากขึ้น
- การรองรับใหม่นี้ไม่ใช่แค่ binding แบบธรรมดา แต่เป็นความพยายามที่จะผสาน อินเทอร์เฟซ Python และกระบวนการแบบสคริปต์เข้ากับชุดเครื่องมือ CUDA ทั้งระบบ
- สแตก CUDA Python ประกอบด้วย binding พื้นฐาน, runtime compiler, cuPyNumeric, CUDA Core, NVMath Python, profiler และเครื่องมือวิเคราะห์โค้ด
- NVIDIA ต้องการใช้ การคอมไพล์แบบ JIT และการเชื่อมต่อกับโค้ด C++ เดิม เพื่อเพิ่มประสิทธิภาพการพัฒนาด้วย Python พร้อมรักษาช่องว่างด้านประสิทธิภาพให้เล็กที่สุด
- อินเทอร์เฟซ CuTile เป็นโมเดลที่ช่วยให้นักพัฒนา Python เข้าใจและดีบักงานบน GPU ได้ง่ายขึ้น โดยมองในระดับอาร์เรย์และไทล์แทนเธรด
Python แบบเนทีฟมาถึง CUDA แล้ว
- Python กลายเป็นภาษาโปรแกรมที่ได้รับความนิยมมากที่สุดในโลก แซงหน้า JavaScript ตามผลสำรวจโอเพนซอร์สปี 2024 ของ GitHub
- ชุดเครื่องมือซอฟต์แวร์ CUDA ของ NVIDIA ไม่มีการรองรับ Python แบบเนทีฟมานานหลายปี แต่ในงาน GTC ได้มีการประกาศ การรองรับแบบเนทีฟ และการผสานรวมทั้งระบบ
- นักพัฒนาสามารถเขียนงานคอมพิวติ้งเชิงอัลกอริทึมที่รันบน NVIDIA GPU ได้โดยตรงด้วย Python
- Stephen Jones สถาปนิก CUDA ระบุว่าเขาทำงานเพื่อให้ “accelerated Python” กลายเป็นการรองรับระดับชั้นหนึ่งในสแตก CUDA
- ทิศทางใหม่นี้ไม่ใช่การย้ายภาษา C มาอยู่ในไวยากรณ์ Python แต่เป็นการสร้าง CUDA Python ที่เป็นธรรมชาติสำหรับนักพัฒนา Python
ขยายสู่ฐานนักพัฒนา Python
- เดิมที CUDA ต้องอาศัยความรู้ด้าน C++ หรือ Fortran และแม้จะมีเครื่องมือ Python อยู่บ้าง แต่ก็ไม่ใช่การรองรับแบบเนทีฟ
- การรองรับ Python แบบเนทีฟจะเปิดเครื่องมือพัฒนาของ CUDA ให้เข้าถึง นักพัฒนา Python หลายล้านคน
- The Futurum Group ระบุว่าจำนวนผู้ใช้ CUDA เพิ่มจาก 2 ล้านคนในปี 2020 เป็น 4 ล้านคนในปี 2023
- Python เป็นภาษาที่เติบโตอย่างรวดเร็ว และ NVIDIA ก็จะเข้าถึงนักพัฒนา Python ในประเทศกำลังพัฒนาอย่างอินเดียและบราซิลได้ด้วย
- แม้ GPU ของ NVIDIA จำนวนมากจะอยู่ในสหรัฐฯ และยุโรป แต่บริษัทด้านโทรคมนาคมและโครงสร้างพื้นฐานในอินเดียกำลังสร้างการติดตั้ง GPU ขนาดใหญ่ที่จะใช้งานในอนาคต
- NVIDIA กำลังทุ่มเทกับการดึงดูดโปรแกรมเมอร์ และต้องการรองรับภาษาโปรแกรมเพิ่มเติม รวมถึง Rust และ Julia
โครงสร้างของสแตก CUDA แบบ Pythonic
- CUDA ประกอบด้วยไลบรารี, SDK, คอมไพเลอร์, host runtime, เครื่องมือ, ซอฟต์แวร์แบบแพ็กเกจล่วงหน้า และอัลกอริทึม
- NVIDIA ได้เพิ่มองค์ประกอบต่าง ๆ ลงใน Pythonic CUDA stack
- เป้าหมายหลักคือการให้ GPU acceleration โดยไม่ต้องออกจาก Python
- ตามคำกล่าวของ Jones นั้น CUDA Python ไม่ควรจบแค่การให้ kernel แต่ต้องมีการทำงานที่ลื่นไหลกับทั้งสแตก
- ต้องสามารถเขียน kernel แล้วนำไปใส่ใน PyTorch ได้
- ต้องสามารถเรียกใช้ไลบรารีแบบ Pythonic และองค์ประกอบอื่น ๆ ได้ด้วย
- ชั้นคอมไพเลอร์ถูกออกแบบมาโดยมี การคอมไพล์แบบ JIT เป็นแกนหลัก ซึ่งช่วยลด dependency tree ของสแตก GPU ลงอย่างมาก
- การทำงานร่วมกันระหว่างแต่ละชั้นมีความสำคัญต่อการเพิ่มผลิตภาพจากการใช้ Python แบบ end-to-end
CUDA Core, cuPyNumeric, NVMath Python
- ในระยะแรก NVIDIA ได้สร้าง Python binding พื้นฐานและไลบรารี Python ซึ่งรวมถึง runtime compiler
- cuPyNumeric เป็นตัวแทนแบบ drop-in ของ NumPy ซึ่งเป็นไลบรารีคำนวณที่ใช้กันอย่างแพร่หลายใน Python
- เปลี่ยนเพียงคำสั่ง import บรรทัดเดียว โค้ด NumPy ก็จะไปรันบน GPU แทน CPU
- ตลอดหนึ่งปีที่ผ่านมา NVIDIA ได้สร้าง CUDA Core ขึ้นมา และ Jones มองว่านี่คือการจินตนาการ CUDA runtime ใหม่ให้เป็น Python ที่เป็นธรรมชาติและเนทีฟ
- CUDA Core ทำงานตามลำดับการทำงานของ Python, ทำงานทั้งหมดภายในโปรเซส และพึ่งพา การคอมไพล์แบบ JIT อย่างมาก
- NVIDIA ยังได้สร้าง NVMath Python ซึ่งให้อินเทอร์เฟซรวมสำหรับการเรียกใช้ไลบรารีทั้งฝั่งโฮสต์และฝั่งดีไวซ์
- Jones ระบุว่าความสามารถในการรวมการเรียกใช้ไลบรารีเข้าด้วยกันสามารถนำไปสู่การปรับปรุงประสิทธิภาพอย่างมาก
- ยังมีการสร้างไลบรารีที่ช่วยให้เข้าถึงไลบรารี C++ ที่เร่งความเร็วแล้วได้โดยตรงจากโค้ด Python
- ไม่ต้องนำมาเขียนใหม่เป็น Python แต่เชื่อมต่อกับโค้ด C++ เดิมที่ผ่านการจูนอย่างละเอียดอยู่แล้ว
- Jones มองว่าวิธีนี้ทำให้ความต่างด้านประสิทธิภาพลดลงจนแทบไม่มีนัยสำคัญ
- มีการเพิ่มเครื่องมือสำหรับ profiler และตัววิเคราะห์โค้ดด้วย
โมเดลการเขียนโปรแกรม CuTile
- Python ช่วยให้เขียนโค้ดได้ง่ายโดยไม่ต้องสนใจรายละเอียดของฮาร์ดแวร์มากนัก และ NVIDIA ก็กำลังเพิ่มชั้นการเขียนโค้ดที่เหมาะกับการนามธรรมระดับสูงขึ้นสำหรับการรันบน GPU
- โมเดลการเขียนโปรแกรมใหม่ อินเทอร์เฟซ CuTile ถูกพัฒนาสำหรับ CUDA แบบ Pythonic ก่อน และจะมีส่วนขยายสำหรับ C++ CUDA ตามมาในภายหลัง
- CuTile ถูกออกแบบจากแนวคิดที่ว่านักพัฒนา Python คิดในเชิงอาร์เรย์มากกว่าเธรด ต่างจากนักพัฒนา C++
- ไม่สามารถส่งออกโค้ด Python ไปเป็นงานเร่งความเร็วบน GPU ได้อย่างน่าอัศจรรย์ในทันที
- โดยทั่วไป CUDA จะแบ่งปัญหาออกเป็นบล็อกเล็ก ๆ หลายพันบล็อก
- แต่ละบล็อกจะแบ่งต่อเป็นไทล์ที่เล็กลง
- ภายในไทล์จะมีเธรดหลายพันตัวประมวลผลแต่ละองค์ประกอบ
- เธรดเหล่านั้นรวมกันเพื่อทำงานคำนวณหนึ่งอย่าง
- พลังการคำนวณมหาศาลของ GPU มาจากความสามารถในการประมวลผลแบบขนานตั้งแต่ระดับเธรดลงไปถึงองค์ประกอบเดี่ยว
- NVIDIA มองว่าการรันบน GPU ไม่จำเป็นต้องลงไปถึงระดับเธรดเสมอไป และสามารถจัดการได้ในระดับกลางอย่าง ระดับไทล์
- CuTile ช่วยแมปอาร์เรย์ลงสู่ GPU อย่างมีประสิทธิภาพในระดับที่หยาบกว่านี้ ทำให้เข้าใจโค้ดและดีบักได้ง่ายขึ้น
- Jones ระบุว่าแนวทางนี้ให้ประสิทธิภาพโดยพื้นฐานแล้วเทียบเท่ากัน
- ข้อมูลของไทล์อาจประกอบด้วยเวกเตอร์, เทนเซอร์ และอาร์เรย์
- คอมไพเลอร์สามารถทำงานได้ดีกว่าในการแมปการดำเนินการของอาร์เรย์ทั้งหมดลงสู่ GPU ผ่าน thread block และ Jones มองว่าหลายครั้งคอมไพเลอร์ทำได้ดีกว่าตัวเขาเอง เพราะมันเข้าใจรายละเอียดของการรันบน GPU อย่างลึกซึ้ง
- Python ต่างจาก C++ ตรงที่ไม่ได้ถูกออกแบบมาให้เป็นภาษาที่ละเอียดในระดับต่ำ และ Jones ยก Triton ของ OpenAI เป็นตัวอย่างที่เหมาะสมอย่างเป็นธรรมชาติสำหรับโปรแกรม Python
2 ความคิดเห็น
มันจะเร็วกว่า Cuda wrapper ที่มีอยู่เดิมอย่าง Cupy, pytorch ไหมนะ ข้อดีของ Cupy กับ torch คือ API แทบจะเหมือนกับ numpy มาก เลยสามารถย้ายโค้ดทดสอบที่เขียนด้วย numpy มาใช้ได้แทบไม่ต้องออกแรงมาก อันนี้คงต้องลองใช้ดูก่อนครับ
ความเร็วช่วงแรกนี่จริงหรือเปล่า? ช้าเกินไปนะ...