การเปิดตัวล่าสุดของ go-attention ซึ่งเป็นการพัฒนากลไกความสนใจ (attention mechanisms) และเลเยอร์ transformer ด้วยภาษา Go ล้วนๆ ได้จุดประเด็นถกเถียงอย่างมากในชุมชนนักพัฒนาเกี่ยวกับข้อจำกัดด้านประสิทธิภาพของ Go สำหรับงานที่ต้องการการประมวลผลเข้มข้น เช่น machine learning
แม้ว่าไลบรารีนี้มีเป้าหมายที่จะนำเสนอการพัฒนาที่สะอาดโดยไม่พึ่งพาส่วนประกอบภายนอก แต่ข้อเสนอแนะจากชุมชนบ่งชี้ว่ามันอาจเผชิญกับความท้าทายด้านประสิทธิภาพอย่างมากเมื่อเทียบกับทางเลือกในภาษาอื่นที่รองรับการเร่งความเร็วด้วยฮาร์ดแวร์ได้ดีกว่า
ความกังวลเรื่องประสิทธิภาพครองการอภิปราย
นักพัฒนาในชุมชนได้แสดงความกังวลอย่างจริงจังเกี่ยวกับผลกระทบด้านประสิทธิภาพของการพัฒนากลไกความสนใจด้วยภาษา Go ล้วนๆ ผู้แสดงความคิดเห็นหลายคนชี้ให้เห็นว่า Go ขาดการรองรับ SIMD (Single Instruction, Multiple Data) โดยตรง ซึ่งเป็นสิ่งสำคัญสำหรับการดำเนินการกับเวกเตอร์และเมทริกซ์ที่เป็นพื้นฐานของโมเดล transformer นักพัฒนาคนหนึ่งกล่าวว่า Go มีความเร็วที่ยอมรับไม่ได้เมื่อเกี่ยวกับการคำนวณทางคณิตศาสตร์ และหากไม่มีคำสั่ง SIMD ของ CPU การพัฒนานี้อาจช้ากว่าโค้ดที่เทียบเท่าใน C, C++, Rust หรือแม้แต่ Python และ Java (ซึ่งโดยปกติจะเรียกใช้ไลบรารี C/C++ ที่ได้รับการปรับให้เหมาะสมแล้ว) หลายเท่า
การขาดการรองรับ GPU/CUDA ในไลบรารีนี้ยังถูกเน้นย้ำว่าเป็นข้อจำกัดที่สำคัญ เนื่องจากการพัฒนา transformer สมัยใหม่พึ่งพาการเร่งความเร็วด้วย GPU อย่างมากเพื่อประสิทธิภาพในทางปฏิบัติ นักพัฒนาบางคนแนะนำว่าการใช้ Go bindings สำหรับไลบรารีที่มีอยู่แล้วเช่น llama.cpp จะเป็นแนวทางที่ปฏิบัติได้จริงมากกว่าสำหรับกรณีการใช้งานในระบบจริง
ข้อจำกัดด้านประสิทธิภาพที่ถูกชี้แจงโดยชุมชน:
- ขาดการรองรับ SIMD (Single Instruction, Multiple Data) แบบดั้งเดิม
- ไม่มีการเร่งความเร็วด้วย GPU/CUDA
- โค้ดแบบสเกลาร์ที่ทำงานกับค่า fp64 เดี่ยว
- อาจจะ "ช้ากว่าหลายเท่า" เมื่อเทียบกับการใช้ C/C++/Rust
ทางเลือกที่แนะนำ:
- การใช้ Go bindings สำหรับ llama.cpp
- การใช้ส่วนสำคัญใน Go assembly (Goasm)
- การใช้แพ็กเกจเฉพาะทางเช่น viterin/vek หรือ kelindar/simd
- การใช้ Go เป็นตัวสร้างโค้ด JIT ด้วย cgo
แนวทางทางเลือกและวิธีแก้ปัญหา
นักพัฒนาหลายคนได้เสนอทางแก้ไขที่เป็นไปได้สำหรับคอขวดด้านประสิทธิภาพ ข้อเสนอแนะหนึ่งเกี่ยวข้องกับการใช้การรองรับแอสเซมบลีของ Go (Goasm) เพื่อพัฒนาการดำเนินการทางคณิตศาสตร์ที่สำคัญ คนอื่นๆ กล่าวถึงแพ็คเกจ Go ที่มีอยู่แล้วเช่น viterin/vek หรือ kelindar/simd ที่สามารถช่วยปรับปรุงประสิทธิภาพผ่านการใช้ SIMD ที่ดีขึ้น
แนวทางทางเลือกที่น่าสนใจถูกเสนอโดยนักพัฒนาคนหนึ่งที่อธิบายถึงการใช้ Go เป็นตัวสร้างโค้ด JIT โดยเชื่อมโยงผลลัพธ์แบบไดนามิก และกระโดดเข้าไปในนั้นด้วย cgo เพื่อให้ได้ประสิทธิภาพที่ดีขึ้นซึ่งสามารถอิ่มตัว CPU vector math units ได้อย่างง่ายดาย สิ่งนี้แสดงให้เห็นถึงวิธีแก้ปัญหาสร้างสรรค์ที่นักพัฒนากำลังสำรวจเพื่อเอาชนะข้อจำกัดด้านประสิทธิภาพโดยธรรมชาติของ Go สำหรับการดำเนินการทางคณิตศาสตร์
คุณค่าทางการศึกษาแม้จะมีปัญหาด้านประสิทธิภาพ
แม้จะมีความกังวลเรื่องประสิทธิภาพ สมาชิกบางคนในชุมชนชื่นชมคุณค่าทางการศึกษาของการพัฒนานี้ ผู้แสดงความคิดเห็นคนหนึ่งกล่าวว่าไลบรารีนี้เปิดโอกาสให้ศึกษา [กลไกความสนใจ] ในระดับการพัฒนาแทนที่จะอ่านบล็อก สิ่งนี้บ่งชี้ว่าแม้ว่าไลบรารีนี้อาจไม่เหมาะสำหรับงานในระบบจริง แต่มันมีจุดประสงค์สำคัญในการทำให้อัลกอริทึมเหล่านี้เข้าถึงได้ง่ายขึ้นและเข้าใจได้ง่ายขึ้นสำหรับนักพัฒนา Go
เมื่อวิเคราะห์โค้ดด้วยเครื่องมือเช่น Ghidra นักพัฒนายืนยันว่าการพัฒนานี้คอมไพล์เป็นโค้ดแบบสเกลาร์ที่ทำงานกับค่า fp64 เดี่ยว ซึ่งเน้นย้ำความกังวลด้านประสิทธิภาพ ฉันทามติดูเหมือนจะเป็นว่าในขณะที่ไลบรารีนี้อาจมีประโยชน์สำหรับการเรียนรู้และการสร้างต้นแบบ แต่แอปพลิเคชันในระบบจริงน่าจะต้องใช้แนวทางทางเลือกที่สามารถใช้ประโยชน์จากการเร่งความเร็วด้วยฮาร์ดแวร์
การอภิปรายเกี่ยวกับ go-attention สะท้อนให้เห็นถึงความตึงเครียดที่กว้างขึ้นในระบบนิเวศของ Go ระหว่างการเน้นความเรียบง่ายและความอ่านง่ายของภาษากับความต้องการด้านประสิทธิภาพของโดเมนที่ต้องการการประมวลผลเข้มข้น เช่น machine learning ดังที่นักพัฒนาคนหนึ่งกล่าวไว้:
หากไม่ใช้คำสั่ง SIMD ของ CPU มันจะมีค่าใช้จ่ายสูงมาก
การถกเถียงนี้ยังเกี่ยวข้องกับความสนใจที่เพิ่มขึ้นในการพัฒนาพื้นฐานของ machine learning ในภาษาอื่นนอกเหนือจาก Python เนื่องจากนักพัฒนาพยายามที่จะรวมความสามารถเหล่านี้เข้ากับเทคโนโลยีที่มีอยู่แล้วของพวกเขาโดยไม่มีภาระในการทำงานร่วมกันระหว่างภาษา
อ้างอิง: go-attention: A full attention mechanism and transformer in pure go