ความผิดพลาดเล็ก ๆ ที่ส่งผลมหาศาล: ถอดรหัสบั๊กแม่นยำใน Apple Silicon ที่ทำโมเดล AI พังยับ

ความผิดพลาดเล็ก ๆ ที่ส่งผลมหาศาล: ถอดรหัสบั๊กแม่นยำใน Apple Silicon ที่ทำโมเดล AI พังยับ

ทำไมโมเดลภาษาขนาดใหญ่ (LLM) ถึงต้องรันเร็วบนเครื่องเรา?

ทุกวันนี้ โมเดลภาษาขนาดใหญ่ หรือ LLM กำลังเป็นที่พูดถึงอย่างกว้างขวาง หลายคนคงอยากเห็นมันทำงานได้ลื่นไหลบนคอมพิวเตอร์ส่วนตัว โดยเฉพาะอย่างยิ่งเครื่องที่ใช้ชิป Apple Silicon ซึ่งขึ้นชื่อเรื่องประสิทธิภาพและประหยัดพลังงาน

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

เป้าหมายคือการสร้าง AI ที่มีพลังแต่เข้าถึงง่าย ไม่ต้องพึ่งพาเซิร์ฟเวอร์คลาวด์ตลอดเวลา นี่คือสิ่งที่นักพัฒนาพยายามผลักดันกันอย่างหนัก

การลดความแม่นยำ (Quantization) เทคนิคเพื่อความเร็ว

วิธีหนึ่งที่ใช้กันบ่อยเพื่อเพิ่มความเร็วและลดการใช้หน่วยความจำของ LLM คือ การลดความแม่นยำ หรือ Quantization

ปกติแล้วคอมพิวเตอร์จะใช้ตัวเลขแบบ 32-bit float ซึ่งมีความละเอียดสูง แต่เราสามารถ “บีบอัด” ตัวเลขเหล่านี้ให้เป็น 16-bit float หรือแม้แต่ 8-bit integer ได้ ซึ่งช่วยลดขนาดโมเดลและทำให้การคำนวณเร็วขึ้นมาก

อย่างไรก็ตาม การลดความแม่นยำนี้เหมือนเหรียญสองด้าน มันช่วยให้โมเดลทำงานได้ไวขึ้นก็จริง แต่ก็อาจแลกมาด้วยความเสี่ยงที่ ความถูกต้องของผลลัพธ์ จะลดลงได้

บั๊กปริศนาในหัวใจของ Apple Silicon

เรื่องน่าตกใจเพิ่งถูกค้นพบในเฟรมเวิร์ก MLX ของ Apple ซึ่งเป็นหัวใจสำคัญในการขับเคลื่อน AI/ML บนชิป Apple Silicon

บั๊กนี้อยู่ในส่วนที่เรียกว่า “Attention Kernel” โดยเฉพาะอย่างยิ่งในการทำงานของฟังก์ชัน Softmax ซึ่งเป็นกลไกสำคัญใน Transformer Models ที่เป็นรากฐานของ LLM

ปัญหาอยู่ที่ ค่าสเกลลิ่ง ซึ่งเป็นตัวเลขที่ใช้ปรับขนาดข้อมูลก่อนเข้าฟังก์ชัน Softmax

ค่าสเกลลิ่งตัวนี้ดันถูกปัดเป็นแบบ 16-bit float เร็วเกินไป ทั้ง ๆ ที่การคำนวณส่วนใหญ่ในตอนนั้นยังใช้ความแม่นยำแบบ 32-bit float อยู่เลย

ผลกระทบจากการปัดเศษที่แสนเล็กน้อย

ความผิดพลาดเล็ก ๆ น้อย ๆ จากการปัดเศษนี้ ดูเผิน ๆ อาจไม่มีอะไร

แต่เมื่อมันไปรวมกับคุณสมบัติทางคณิตศาสตร์ของฟังก์ชัน Softmax ที่มีลักษณะการขยายค่าแบบ เลขยกกำลัง (exponential) ผลลัพธ์ที่ได้จึงเป็นหายนะ

ข้อผิดพลาดที่ดูเล็กจิ๋ว กลับถูกขยายใหญ่ขึ้นอย่างรวดเร็ว จนทำให้เอาต์พุตของการคำนวณ Attention กลายเป็นข้อมูลที่ไร้ความหมายโดยสิ้นเชิง

ในบางกรณี ความแม่นยำลดลงถึง 100% พูดง่าย ๆ คือ โมเดลให้ผลลัพธ์ที่ผิดพลาดทั้งหมด เหมือนสุ่มเดาขึ้นมานั่นเอง

บทเรียนสำคัญจากการแก้ไขบั๊ก

การแก้ไขบั๊กนี้ค่อนข้างตรงไปตรงมา แค่ปรับโค้ดเพื่อให้ค่าสเกลลิ่งคงความแม่นยำแบบ 32-bit float ไว้จนกว่าจะคำนวณเสร็จ ก่อนที่จะแปลงเป็น 16-bit float ในขั้นตอนถัดไป

เหตุการณ์นี้แสดงให้เห็นว่า ในโลกของการพัฒนา AI โดยเฉพาะอย่างยิ่งการทำงานกับ ฮาร์ดแวร์และซอฟต์แวร์ระดับล่าง รายละเอียดเล็ก ๆ น้อย ๆ เกี่ยวกับ ความแม่นยำของตัวเลข มีความสำคัญอย่างยิ่งยวด

การตัดสินใจผิดพลาดเพียงเสี้ยววินาทีของการปัดเศษ สามารถส่งผลกระทบอย่างร้ายแรงต่อ ความน่าเชื่อถือและความถูกต้องของโมเดล AI ได้

เรื่องนี้เน้นย้ำถึงความซับซ้อนและความใส่ใจในรายละเอียดที่จำเป็นในการสร้างเทคโนโลยี AI ที่ทรงพลังและเชื่อถือได้ให้กับผู้ใช้งานทุกคน