ทำไม LLM ถึงต้องมี KV Cache และทำไมมันถึงโตขึ้นเรื่อย ๆ

ทำไม LLM ถึงต้องมี KV Cache และทำไมมันถึงโตขึ้นเรื่อย ๆ

LLM สร้างข้อความได้อย่างไร: เข้าใจพื้นฐานการทำงาน

Large Language Model (LLM) ที่ใช้กันแพร่หลายในปัจจุบันมีหัวใจคือสถาปัตยกรรม Transformer โมเดลเหล่านี้สร้างข้อความทีละ โทเค็น (Token) โดยอาศัยกลไก Attention

กลไก Attention ช่วยให้โมเดลสามารถ “มองย้อนกลับ” ไปยังโทเค็นก่อนหน้าทั้งหมด เพื่อหาว่าส่วนไหนสำคัญต่อการสร้างโทเค็นถัดไป คล้ายกับการจดจ่อในบทสนทนา

ในทางเทคนิค กลไกนี้ใช้เวกเตอร์ 3 ชนิด คือ Query (Q), Key (K), และ Value (V) สำหรับแต่ละโทเค็น Query ของโทเค็นปัจจุบันจะถูกใช้เพื่อหาความเกี่ยวข้องกับ Key ของโทเค็นที่ผ่านมาทั้งหมด จากนั้นจึงนำ Value ที่เกี่ยวข้องมาสร้างโทเค็นใหม่

ปัญหาใหญ่คือ ในการสร้างโทเค็นแต่ละครั้ง โมเดลจะต้องคำนวณเวกเตอร์ Key (K) และ Value (V) ของโทเค็นก่อนหน้าทั้งหมดซ้ำแล้วซ้ำเล่า กระบวนการนี้กินเวลาและทรัพยากรมากเมื่อข้อความเริ่มยาว

KV Cache คืออะไร: ผู้ช่วยความจำของ LLM

เพื่อแก้ปัญหาการคำนวณซ้ำซ้อนนี่เอง จึงเกิดแนวคิดของ KV Cache ขึ้นมา

KV Cache เป็นเหมือนหน่วยความจำพิเศษที่ทำหน้าที่เก็บเวกเตอร์ Key (K) และ Value (V) ที่โมเดลเคยคำนวณไว้แล้วสำหรับโทเค็นก่อนหน้าทั้งหมด ทำให้ไม่ต้องคำนวณใหม่

เมื่อโมเดลสร้างโทเค็นใหม่ มันจะคำนวณเวกเตอร์ Query (Q) ของโทเค็นนั้น แล้วนำ Q ไปเทียบกับ K และ V ที่เก็บไว้ใน KV Cache ของโทเค็นก่อนหน้า หลังจากสร้างโทเค็นใหม่เสร็จ โมเดลก็จะคำนวณ K และ V ของโทเค็นใหม่นั้นเพียงครั้งเดียว แล้วเก็บเพิ่มเข้าไปใน KV Cache ทันที

การมี KV Cache ช่วยเร่งความเร็วในการสร้างข้อความได้อย่างมหาศาล เพราะลดการคำนวณซ้ำซ้อน ทำให้ LLM ทำงานได้มีประสิทธิภาพมากขึ้น โดยเฉพาะเมื่อต้องประมวลผลข้อความยาวๆ

ทำไม KV Cache ถึงเติบโตไม่หยุด และผลกระทบที่ตามมา

แม้ KV Cache จะมีประโยชน์ แต่ก็มีข้อจำกัดที่สำคัญ

ทุกครั้งที่ LLM สร้างโทเค็นใหม่ K และ V ของโทเค็นนั้นก็จะถูกเก็บเพิ่มเข้าไปใน Cache เสมอ ทำให้ KV Cache มีขนาดใหญ่ขึ้นเรื่อยๆ ตามความยาวของข้อความที่สร้าง ยิ่งข้อความยาวเท่าไหร่ Cache ก็ยิ่งใหญ่เท่านั้น

ปัญหานี้ส่งผลกระทบหลัก ๆ คือ การใช้หน่วยความจำ (Memory Consumption) KV Cache สามารถกินพื้นที่หน่วยความจำของ GPU ได้เป็นจำนวนมาก ยิ่ง LLM มีขนาดใหญ่ หรือประมวลผลพร้อมกันหลายชุดข้อมูล หน่วยความจำก็ยิ่งเต็มเร็ว ทำให้ บริบท (Context) ที่ LLM รับได้มีจำกัด

อีกประการคือ ประสิทธิภาพ (Performance) แม้จะลดการคำนวณ แต่เมื่อ Cache ใหญ่มาก การเข้าถึงข้อมูลจากหน่วยความจำอาจกลายเป็นคอขวด ทำให้ความเร็วโดยรวมไม่เพิ่มขึ้นเท่าที่ควร

กลยุทธ์รับมือกับ KV Cache ที่ขยายใหญ่

นักพัฒนาและนักวิจัยกำลังหาวิธีจัดการกับขนาดของ KV Cache เพื่อให้ LLM ทำงานได้ดีและประหยัดทรัพยากรยิ่งขึ้น

หนึ่งในวิธีคือ การทำ Quantization โดยลดขนาดข้อมูลของเวกเตอร์ K และ V เช่น จาก float16 เป็น int8 ซึ่งช่วยลดการใช้หน่วยความจำโดยยังคงรักษาประสิทธิภาพการทำงานไว้ได้

อีกวิธีคือการจัดการ บริบท (Context) อย่างชาญฉลาด เช่น การเก็บเฉพาะ K และ V ของโทเค็นที่อยู่ใกล้เคียงปัจจุบัน (sliding window) หรือเลือกเก็บเฉพาะส่วนที่สำคัญจริง ๆ เพื่อลดขนาด Cache โดยไม่สูญเสียสาระสำคัญ

นอกจากนี้ ยังมีการพัฒนาสถาปัตยกรรมโมเดลใหม่ ๆ ที่ไม่พึ่งพากลไก Attention มากเท่าเดิม หรือปรับปรุงกลไก Attention ให้มีประสิทธิภาพด้านหน่วยความจำดีขึ้น เช่น Sparse Attention หรือโมเดลอย่าง Mamba ซึ่งเป็นแนวทางที่น่าสนใจในอนาคต

การทำความเข้าใจเรื่อง KV Cache นี้ช่วยให้เห็นถึงความท้าทายและนวัตกรรมเบื้องหลังการทำงานของ LLM ที่เราใช้กันอยู่ทุกวัน