วิธีเอาชนะความไม่เป็นเชิงกำหนดในการอนุมานของ LLM
(thinkingmachines.ai)- ในการอนุมานของ LLM (โมเดลภาษาขนาดใหญ่) มักเกิดปัญหา ความไม่เป็นเชิงกำหนด (nondeterminism) ที่ทำให้แม้ใช้อินพุตและเงื่อนไขเดียวกัน ผลลัพธ์ก็ยังออกมาแตกต่างกันได้
- เดิมทีเชื่อกันว่าสาเหตุหลักของความไม่เป็นเชิงกำหนดคือ ภาวะพร้อมกัน (concurrency) และ สมบัติไม่เปลี่ยนหมู่ของการคำนวณเลขทศนิยมลอยตัว (non-associativity) ของ floating-point
- แต่สาเหตุที่แท้จริงคือ การเปลี่ยนแปลงลำดับการคำนวณภายในเคอร์เนล (โค้ดคำนวณ) ที่เกิดจาก การเปลี่ยนแปลงขนาดแบตช์ (batch size)
- หากทำให้ทุกการคำนวณภายในเคอร์เนลมี ความคงที่ต่อแบตช์ (batch invariance) ก็สามารถรับประกัน ความสามารถในการทำซ้ำ (reproducibility) ได้อย่างสมบูรณ์
- สามารถสร้างเคอร์เนลที่คงที่ต่อแบตช์สำหรับโอเปอเรชันหลักอย่าง RMSNorm, matmul และ attention ได้ด้วย การคำนวณแบบขนานข้อมูล, split reduction, กลยุทธ์ split ขนาดคงที่ เป็นต้น
บทนำและภาพรวมของปัญหา
- ความสามารถในการทำซ้ำ (reproducibility) ซึ่งเป็นองค์ประกอบสำคัญของความก้าวหน้าทางวิทยาศาสตร์ กลับไม่ค่อยถูกรักษาไว้ในการอนุมานของ LLM (โมเดลภาษาขนาดใหญ่)
- แม้จะถามคำถามเดียวกันกับ ChatGPT หลายครั้ง ก็ยังพบได้บ่อยว่าได้ คำตอบที่แตกต่างกัน
- เหตุผลคือกระบวนการ sampling ผลลัพธ์ของ LLM เป็น การเลือกเชิงความน่าจะเป็น ที่อาศัยการกระจายความน่าจะเป็น
- อย่างไรก็ตาม แม้จะ ตั้งค่า temperature เป็น 0 ในทางปฏิบัติ LLM API ก็ยัง ไม่เป็นเชิงกำหนดเสมอไป (กล่าวคือ อินพุตเดียวกันไม่ได้ให้ผลลัพธ์เหมือนเดิมทุกครั้ง)
- ปัญหา ความไม่เป็นเชิงกำหนด นี้ยังคงมีอยู่แม้รันบนไลบรารีอนุมานโอเพนซอร์ส (เช่น vLLM, SGLang) และฮาร์ดแวร์ที่ดูแลเอง
สมมติฐานเดิมและข้อจำกัด
- สมมติฐานที่เป็นที่รู้จักอย่างกว้างขวาง: ความไม่เป็นเชิงกำหนดเกิดจาก ภาวะพร้อมกัน + สมบัติไม่เปลี่ยนหมู่ของ floating-point
- การคำนวณ floating-point บน GPU อาจให้ผลต่างกันเล็กน้อยตามลำดับการคำนวณและลำดับการจบงานของเธรด
- แต่ในความเป็นจริง หากทำการคูณเมทริกซ์แบบเดิมกับข้อมูลเดิมซ้ำ ๆ ก็จะได้ผลลัพธ์ เหมือนกันทุกบิต (bw=bitwise equal) เสมอ
- การหาสาเหตุที่แท้จริงจึงต้องอาศัยการวิเคราะห์ที่ลึกกว่านี้
การวิเคราะห์เชิงลึกถึงสาเหตุของความไม่เป็นเชิงกำหนดในการอนุมานของ LLM
แก่นแท้ของสมบัติไม่เปลี่ยนหมู่ของ floating-point
- การคำนวณ floating-point มีความสัมพันธ์แบบ (a+b)+c ≠ a+(b+c)
- เมื่อนำค่าที่มีขนาดต่างกัน (exponent ต่างกัน) มาคำนวณ จะเกิดการสูญเสียความแม่นยำและข้อมูล ทำให้ ผลลัพธ์เปลี่ยนไปตามลำดับการคำนวณ
- เนื่องจากลำดับการคำนวณอาจเปลี่ยนได้ หากทำการรวมค่าหลายครั้งแบบสุ่ม ก็จะได้ ผลลัพธ์ที่หลากหลาย (ยืนยันได้จากการทดลอง)
การเปลี่ยนลำดับการคำนวณในเคอร์เนลและภาวะพร้อมกัน
- โดยทั่วไปมักชี้ว่า atomic add และปัญหาจากภาวะพร้อมกันคือสาเหตุหลักของความไม่เป็นเชิงกำหนด
- แต่เคอร์เนลส่วนใหญ่ที่ใช้ในการอนุมานของ LLM (โดยเฉพาะใน forward pass) สามารถทำงานได้โดยไม่ต้องใช้ atomic add
- ด้วยกลยุทธ์การขนานและ split (reduction) ที่เหมาะสมล่วงหน้า ก็สามารถ คงลำดับการคำนวณเดิมไว้ได้
สาเหตุหลักที่แท้จริง: การขาด "ความคงที่ต่อแบตช์ (batch invariance)"
- เคอร์เนลแต่ละตัว หากอินพุตเหมือนกัน ก็จะคืนผลลัพธ์เดิมเสมอ (run-to-run deterministic)
- แต่เนื่องจากคำขอพร้อมกันจากผู้ใช้หลายคน (batch size) เปลี่ยนแปลงอย่างไม่เป็นเชิงกำหนด จึงทำให้ ผลลัพธ์ที่ได้จริงสำหรับแต่ละคำขอไม่คงที่
- ตาม ขนาดแบตช์ ลำดับการแยกหรือรวมการคำนวณภายในจะเปลี่ยนไป และทำให้เกิดความไม่เป็นเชิงกำหนด
- กล่าวคือ ประเด็นสำคัญคือ ภาระของเซิร์ฟเวอร์และระดับความขนาน (ขนาดแบตช์) นั้นไม่เป็นเชิงกำหนด
การออกแบบเคอร์เนลที่คงที่ต่อแบตช์และกรณีของโอเปอเรชันหลัก
RMSNorm
- ใช้กลยุทธ์ data-parallel: ให้หนึ่งคอร์ประมวลผลแต่ละองค์ประกอบของแบตช์แบบอิสระ
- เมื่อขนาดแบตช์ใหญ่ จะรักษาระดับความขนานได้เพียงพอ ทำให้กลยุทธ์การขนานคงที่และได้ ความคงที่ต่อแบตช์
- หากขนาดแบตช์เล็กมาก อาจต้องใช้กลยุทธ์ทางเลือกอย่าง split reduction ซึ่งในกรณีนี้จะต้องยอมเสียความคงที่ต่อแบตช์บางส่วน
การคูณเมทริกซ์ (matmul)
- ใช้กลยุทธ์ data-parallel โดยขนานงานตามแต่ละไทล์ (tile)
- เพื่อให้เหมาะกับการใช้ tensor core จำเป็นต้องแบ่งเป็นไทล์แบบ 2D และในแบตช์ที่เล็กมากอาจต้องใช้กลยุทธ์พิเศษอย่าง split-K
- เมื่อใช้กลยุทธ์ split-K อาจทำให้ความคงที่ต่อแบตช์เสียไป
- แม้ต้องยอมเสียประสิทธิภาพบางส่วน ก็สามารถบังคับให้ใช้คอนฟิกเคอร์เนลเดียวกันเพื่อรักษาลำดับการคำนวณที่สม่ำเสมอ (reproducible) ได้
Attention
- ใน FlashAttention2 เป็นต้น ใช้กลยุทธ์ ขนานตามทิศทาง query และทำ reduction ของ Key/Value พร้อมกัน เพื่อรักษาความคงที่ต่อแบตช์
- หากลำดับ reduction เปลี่ยนไปตามขนาดแบตช์หรือการแบ่งซีเควนซ์ (เช่น chunked prefill, prefix caching) ความคงที่ก็จะเสียไป
- ในกลยุทธ์ split-reduction อย่าง split-KV (FlashDecoding) จะคงลำดับการคำนวณให้เดิมโดย ตรึงขนาด split ให้คงที่ (fixed split-size)
- ในการทำงานภายใน ต้องไม่แยกจัดการ key/value cache กับโทเคนใหม่คนละแบบ แต่ต้องรักษาเลย์เอาต์ของ key/value ให้สม่ำเสมอในทุกการคำนวณ
การติดตั้งใช้งาน
- มีเดโมการอนุมานแบบกำหนดได้โดยใช้ batch-invariant kernel ร่วมกับ vLLM และ torch.Library
- สามารถดู kernel ทดแทนสำหรับโอเปอเรชันที่เกี่ยวข้องได้จาก GitHub repo (thinking-machines-lab/batch-invariant-ops)
การทดลองและประสิทธิภาพ
การทดลองวัดความไม่เป็นเชิงกำหนด
- ใช้โมเดล Qwen/Qwen3-235B-A22B-Instruct-2507 สร้างผลลัพธ์ 1000 ครั้งด้วยพรอมป์เดียวกัน (“Tell me about Richard Feynman”) ภายใต้เงื่อนไข temperature 0
- ได้ คำตอบที่แตกต่างกัน 80 แบบ (แม้เป็นพรอมป์เดียวกันก็ยังมีความไม่เป็นเชิงกำหนด)
- 102 โทเคนแรกเหมือนกันทั้งหมด และเริ่มแยกครั้งแรกที่โทเคนลำดับที่ 103 (“Queens, New York” vs “New York City”)
- เมื่อใช้ batch-invariant kernel ทั้ง 1000 ครั้งได้ผลลัพธ์เหมือนกันทั้งหมด ทำให้ได้ความสามารถในการทำซ้ำอย่างสมบูรณ์
การประเมินประสิทธิภาพ
- ใช้ GPU 1 ตัว รัน Qwen-3-8B และส่งคำขอ 1000 รายการที่มีซีเควนซ์ยาว 90~110 แต่ละรายการ
- vLLM ปกติ: 26 วินาที
- deterministic vLLM แบบยังไม่ปรับแต่ง: 55 วินาที
- เมื่อนำ attention kernel ที่ปรับปรุงแล้วมาใช้: 42 วินาที
- แม้การปรับแต่งยังไม่สมบูรณ์ แต่ยัง คงระดับประสิทธิภาพที่ใช้งานได้จริง
คุณค่าใน on-policy RL
- เดิมทีความแตกต่างเล็กน้อยทางตัวเลขระหว่าง training กับ inference ทำให้ on-policy RL ไม่สามารถนำไปใช้ได้อย่างแม่นยำ
- หากทำให้การอนุมานเป็นแบบกำหนดได้ ก็จะสามารถทำให้ทั้ง sampling และ training เหมือนกันทุกบิต (bitwise identical) และทำให้ on-policy RL ที่แท้จริงเป็นไปได้
- ยืนยันได้ว่าผลลัพธ์ ตรงกันอย่างสมบูรณ์ ในเมตริกสำคัญ เช่น KL-divergence และ reward
บทสรุป
- ในระบบอนุมานของ LLM อาจมองข้ามความไม่เป็นเชิงกำหนดและความคลาดเคลื่อนเชิงตัวเลขได้ง่าย แต่หากระบุและแก้ไข สาเหตุรากฐานของปัญหา (การขาดความคงที่ต่อแบตช์) ก็จะได้ ความสามารถในการทำซ้ำและความเป็นเชิงกำหนดอย่างสมบูรณ์
- งานวิจัยนี้ชี้แนวทางแก้ปัญหาความไม่เป็นเชิงกำหนดในการอนุมานของ LLM และช่วยให้นักพัฒนาสามารถทำให้ระบบของตนเองมีความสามารถในการทำซ้ำอย่างสมบูรณ์ได้
ข้อมูลการอ้างอิง
- เมื่อต้องการอ้างอิงงานวิจัยนี้ ให้ใช้ข้อมูลต่อไปนี้
He, Horace and Thinking Machines Lab, "Defeating Nondeterminism in LLM Inference",
Thinking Machines Lab: Connectionism, Sep 2025.
หรือ
@article{he2025nondeterminism,
author = {Horace He and Thinking Machines Lab},
title = {Defeating Nondeterminism in LLM Inference},
journal = {Thinking Machines Lab: Connectionism},
year = {2025},
note = {https://thinkingmachines.ai/blog/…},
doi = {10.64434/tml.20250910}
}
ยังไม่มีความคิดเห็น