DSC ทางเลือกใหม่ของ PyTorch เผชิญปัญหาคอขวดด้านประสิทธิภาพจากการเลือกใช้ ctypes Interface

ทีมชุมชน BigGo
DSC ทางเลือกใหม่ของ PyTorch เผชิญปัญหาคอขวดด้านประสิทธิภาพจากการเลือกใช้ ctypes Interface

DSC ไลบรารี tensor ใหม่ที่เข้ากันได้กับ PyTorch ซึ่งออกแบบมาสำหรับการ inference ในด้าน machine learning ได้ดึงดูดความสนใจจากนักพัฒนาด้วย API ที่ออกแบบมาอย่างเรียบร้อยและมี dependencies น้อย อย่างไรก็ตาม การอภิปรายในชุมชนได้เผยให้เห็นปัญหาด้านประสิทธิภาพที่สำคัญซึ่งอาจส่งผลต่อการนำไปใช้ในสภาพแวดล้อมการผลิต

ไลบรารีนี้สร้างโดยนักพัฒนา nirw4nna มีเป้าหมายเพื่อให้ interface ที่คล้าย NumPy พร้อมด้วยการสนับสนุน neural network ในตัวและการสลับ backend ระหว่าง CPU และ CUDA ได้อย่างราบรื่น DSC มีคุณสมบัติการจัดสรรหน่วยความจำแบบกำหนดเองเพื่อหลีกเลี่ยงการเรียก malloc ในขณะรันไทม์ และสนับสนุนภาษาโปรแกรมหลายภาษาผ่าน C API ที่ใช้ร่วมกัน

คุณสมบัติหลักของ DSC :

  • ไลบรารี tensor ที่เข้ากันได้กับ PyTorch พร้อม API แบบ NumPy
  • รองรับเครือข่ายประสาทเทียมในตัวด้วย nn.Module
  • รองรับ backend หลายแบบ ( CPU และ CUDA )
  • ตัวจัดสรรหน่วยความจำแบบกำหนดเองพร้อมการจัดสรรล่วงหน้า
  • การพึ่งพาภายนอกน้อยที่สุด
  • API ระดับต่ำที่เข้ากันได้กับ C ที่ห่อหุ้มใน Python

ปัญหาคอขวดด้านประสิทธิภาพจากการออกแบบ Interface

ปัญหาที่เร่งด่วนที่สุดที่ชุมชนระบุคือการใช้ ctypes ของ DSC สำหรับการสื่อสารระหว่าง Python กับ C นักพัฒนาหลายคนได้ชี้ให้เห็นว่าการเลือกใช้การออกแบบนี้สร้าง overhead ด้านประสิทธิภาพที่มากเมื่อเปรียบเทียบกับทางเลือกสมัยใหม่

Call overhead ของการใช้ ctypes เทียบกับ nanobind/pybind นั้นมหาศาลมาก... ctypes เพียงแค่เรียกไปที่ libffi ซึ่งเป็นที่รู้จักกันว่าเป็นวิธีที่ช้าที่สุดในการทำ ffi

ช่องว่างด้านประสิทธิภาพนี้กลายเป็นสิ่งสำคัญสำหรับ workload ของ machine learning ที่ทุกไมโครวินาทีมีความสำคัญ ผู้สร้างได้รับทราบความกังวลนี้และแสดงความสนใจในการสำรวจ nanobind ซึ่งเป็นโซลูชัน binding ที่มีประสิทธิภาพมากกว่าที่คอมไพล์ interface แทนที่จะใช้การเรียก foreign function ในขณะรันไทม์

ข้อมูลเชิงลึกเปรียบเทียบประสิทธิภาพ:

  • อินเทอร์เฟซ ctypes สร้างโอเวอร์เฮดการเรียกใช้งานที่มีนัยสำคัญเมื่อเทียบกับ nanobind/pybind
  • การสร้างเคอร์เนล C++ แบบทดลองแสดงผลการเพิ่มประสิทธิภาพประมาณ 20%
  • llama.cpp ยังคงเร็วกว่าเนื่องจากเคอร์เนลที่ปรับแต่งด้วยมือ
  • สถาปัตยกรรมปัจจุบันใช้เคอร์เนลแยกหลายตัว (เช่น 5 ตัวสำหรับ softmax)

การตัดสินใจด้านสถาปัตยกรรมถูกตรวจสอบ

สมาชิกในชุมชนได้ตั้งคำถามเกี่ยวกับแนวทางสถาปัตยกรรมโดยรวมด้วย บางคนแนะนำว่าการใช้ template และ switch statement อย่างหนักของ DSC อาจได้ประโยชน์จาก intermediate representation แบบ compiler ผู้สร้างได้ยืนยันการสังเกตนี้ โดยแบ่งปันว่างานทดลองในการสร้าง C++ kernel ที่ปรับให้เหมาะสมแสดงให้เห็นการเพิ่มประสิทธิภาพประมาณ 20% เมื่อเทียบกับแนวทาง multi-kernel ปัจจุบัน

การใช้งาน C++ แบบ C-style ของไลบรารีได้จุดประกายการอภิปรายเกี่ยวกับแนวปฏิบัติการพัฒนาสมัยใหม่ ในขณะที่นักพัฒนาบางคนชอบโค้ดที่ชัดเจนและระดับต่ำเพื่อการใช้เหตุผลด้านประสิทธิภาพ คนอื่นๆ สนับสนุนการปรับให้เหมาะสมที่ขับเคลื่อนโดย profiler มากกว่าการคาดเดาเกี่ยวกับประสิทธิภาพการสร้างโค้ด

โปรเจกต์การเรียนรู้ที่มีความปรารถนาในการผลิต

DSC ที่เริ่มต้นเป็นโปรเจกต์การเรียนรู้ส่วนตัวที่ได้แรงบันดาลใจจาก llama.cpp ได้พัฒนาเกินจุดประสงค์เพื่อการศึกษาเดิม ผู้สร้างยอมรับว่าแม้ว่า llama.cpp จะยังคงเร็วกว่าเนื่องจาก kernel ที่ปรับให้เหมาะสมด้วยมือสำหรับสถาปัตยกรรมเฉพาะ แต่ DSC มีเป้าหมายเพื่อให้เครื่องมือที่มีจุดประสงค์ทั่วไปมากกว่าที่ทำให้การทดลองโมเดลง่ายขึ้นสำหรับนักพัฒนาที่ไม่มีพื้นฐาน ML ลึกซึ้ง

โปรเจกต์ปัจจุบันสนับสนุนการดำเนินการ tensor พื้นฐานและสามารถโหลดโมเดลจากไฟล์ safetensors พร้อมแผนการเพิ่มการสนับสนุนไฟล์ GGUF อย่างไรก็ตาม ความกังวลด้านประสิทธิภาพที่ชุมชนยกขึ้นแสดงให้เห็นว่าการเปลี่ยนแปลงสถาปัตยกรรมที่สำคัญอาจจำเป็นก่อนที่ DSC จะสามารถแข่งขันกับ framework ที่จัดตั้งขึ้นแล้วในสภาพแวดล้อมการผลิต

การอภิปรายนี้เน้นย้ำถึงความท้าทายที่ต่อเนื่องในพื้นที่ ML infrastructure: การสร้างสมดุลระหว่างความง่ายในการใช้งานกับการปรับประสิทธิภาพในขณะที่รักษาสถาปัตยกรรมโค้ดที่สะอาดและบำรุงรักษาได้

อ้างอิง: dsc