- โอเพนซอร์สที่ผสาน FSDP(Fully Sharded Data Parallel) และ QLoRA(Quantization + Low-Rank Adaptation") เข้าด้วยกัน
- สามารถทำ fine-tuning โมเดลภาษาขนาด 70b ได้อย่างมีประสิทธิภาพด้วยคอมพิวเตอร์เดสก์ท็อปทั่วไปและ GPU เกมมิงมาตรฐานเพียง 2 ใบ
เบื้องหลัง
- แม้ฮาร์ดแวร์ระดับดาต้าเซ็นเตอร์กับ GPU เกมมิงที่ติดตั้งในคอมพิวเตอร์เดสก์ท็อปจะมีช่องว่างด้านประสิทธิภาพไม่มาก แต่ราคากลับต่างกันมาก
- GPU เกมมิงมีหน่วยความจำน้อย จึงฝึกโมเดลภาษาขนาดใหญ่ได้ยาก
- Answer.AI ต้องการหาวิธีแก้ปัญหานี้ด้วยการใช้ GPU เกมมิงราคาย่อมเยาเพื่อฝึกโมเดลโอเพนซอร์สที่ดีที่สุด
QLoRA: ฝึกโมเดลที่ใหญ่ขึ้นบน GPU ใบเดียว
- QLoRA คือการผสาน quantization กับ LoRA โดยลดน้ำหนักของโมเดลเหลือ 4 บิตเพื่อลดการใช้หน่วยความจำ GPU
- LoRA หลีกเลี่ยงข้อจำกัดด้านหน่วยความจำด้วยการไม่ฝึกทั้งโมเดลภาษาใหญ่ทั้งหมด แต่เพิ่ม adapter matrix ขนาดเล็กเข้าไปแล้วฝึกเฉพาะส่วนนั้น
- QLoRA ทำให้สามารถฝึกโมเดล 65b บนการ์ด 48GB ได้ แต่ก็ยังไม่พอสำหรับการฝึกโมเดล 70b บน GPU เกมมิง 24GB
FSDP: ขยายขนาดการฝึกด้วย GPU หลายใบ
- FSDP(Fully Sharded Data Parallel) กระจายพารามิเตอร์ของโมเดลไปยัง GPU หลายใบเพื่อให้ใช้งานพร้อมกันได้
- FSDP ทำให้สามารถนำประสิทธิภาพของ DDP(Distributed Data Parallel) ไปใช้กับโมเดลขนาดใหญ่ที่ GPU ใบเดียวรับไม่ไหว
- ตัวอย่างเช่น โมเดล 70b(พารามิเตอร์ 7 หมื่นล้านตัว) แบบไม่ทำ quantization ใช้ RAM 140GB (เพราะพารามิเตอร์แต่ละตัวเก็บเป็น 16 บิต หรือ 2 ไบต์) ซึ่งแม้แต่การ์ด H100 ของ NVIDIA (ราคาใบละประมาณ $40,000!) ก็ยังไม่พอ ต้องใช้ RAM 80GB
- แต่ถ้าใช้ FSDP ก็สามารถรวม H100 จำนวน 4 ใบให้มี RAM รวม 320GB ได้ และประหยัดเงินไป $150000
การผสาน FSDP กับ QLoRA
- Answer.AI ลดขนาดโมเดลด้วย QLoRA แล้วกระจายไปยังการ์ดเกมมิง 24GB หลายใบด้วย FSDP เพื่อให้ฝึกได้อย่างมีประสิทธิภาพ
- วิธีนี้ทำให้สามารถฝึกโมเดล 70b ด้วย GPU เกมมิงทั่วไปเพียง 2 ใบได้
- หลังจากหารือแนวคิดการผสาน FSDP กับ QLoRA ในช่วงปลายปี 2023 ก็ได้แก้ปัญหาที่จำเป็นต่าง ๆ จนสำเร็จ
- ในกระบวนการนี้มีการนำเทคนิคและไลบรารีหลากหลายอย่างมาผสมกันใช้
- เก็บพารามิเตอร์ที่ถูก quantize ด้วยชนิดข้อมูลเดียวกับ "Computation Type" ของโมเดล
- gradient checkpointing ที่แทนจะเก็บกราเดียนต์ทั้งหมด ก็เก็บ activation ไว้ตาม 'checkpoint' หลายจุดของทั้งโมเดล แล้วค่อยรันขั้นตอน forward ใหม่ตามต้องการเพื่อคำนวณกราเดียนต์กลับมา
- CPU offloading ที่เก็บ weight ไว้ใน RAM ของ CPU แทนที่จะเก็บบน GPU เมื่อไม่ได้ใช้งาน เพื่อลดหน่วยความจำ GPU ที่ต้องใช้ลงอย่างมาก
- Flash Attention 2 : คำนวณ Attention อย่างมีประสิทธิภาพด้วย Cuda kernel ที่ปรับให้เหมาะกับหน่วยความจำ
- ค้นพบ HQQ(Half-Quadratic Quantization) และเชื่อมให้ทำงานร่วมกับ FSDP (เร็วกว่าและแม่นยำกว่า GPTQ 50 เท่า)
วิธีใช้ FSDP/QLoRA
- การใช้ FSDP ต้องมี GPU อย่างน้อย 2 ใบ (สามารถใช้เครื่อง dual 3090 บน Runpod ได้ในราคา $0.6 ต่อชั่วโมง)
- ติดตั้ง Transformers, PEFT, Bitsandbytes เวอร์ชันล่าสุด (รวมถึง HQQ หากใช้งาน) จากนั้น clone รีโพซิทอรีของ Answer.AI แล้วรันตาม README
- หากต้องการฝึก Alpaca บนการ์ด 24GB จำนวน 2 ใบ
python train.py --train_type qlora --dataset alpaca --batch_size 8 --gradient_accumulation_steps 2 --output_dir qlora_output --log_to wandb
- ยังอยู่ในช่วงเริ่มต้นมาก (alpha/preview)
- มีแผนจะเปิดเผยผล benchmarking ภายในไม่กี่สัปดาห์
ความเห็นของ GN⁺
- บทความนี้น่าจะน่าสนใจมากสำหรับคนที่ทำงานในสาย AI และแมชชีนเลิร์นนิง โดยเฉพาะเพราะนำเสนอวิธีใหม่ในการฝึกโมเดลภาษาขนาดใหญ่ให้มีประสิทธิภาพ
- หากเทคโนโลยีนี้ประสบความสำเร็จและถูกใช้อย่างแพร่หลาย ก็อาจลดกำแพงด้านต้นทุนของการวิจัยและพัฒนา AI ลงได้อย่างมาก ซึ่งอาจเป็นโอกาสสำคัญสำหรับแล็บขนาดเล็กหรือนักพัฒนาเดี่ยว
- อย่างไรก็ตาม หากต้องการให้แนวทางนี้ถูกนำไปใช้ในวงกว้างจริง ๆ ความเสถียรและความง่ายในการใช้งานจะเป็นปัจจัยสำคัญ เนื่องจากตอนนี้ยังอยู่ในช่วงเริ่มต้น จึงต้องอาศัยการทดสอบและฟีดแบ็กจากชุมชนเพื่อปรับปรุงระบบ
- เมื่อนำเทคโนโลยีใหม่มาใช้ ควรพิจารณาเรื่องความเข้ากันได้กับระบบเดิม ประสิทธิภาพ และต้นทุนอยู่เสมอ ข้อดีของเทคโนโลยีนี้คือช่วยให้การฝึกโมเดลขนาดใหญ่เข้าถึงได้ง่ายขึ้น แต่เพราะยังอยู่ในช่วงเริ่มต้น จึงอาจมีข้อเสียด้านความเสถียรและการสนับสนุน
1 ความคิดเห็น
ความเห็นจาก Hacker News
บทความนี้ยอดเยี่ยมมาก แต่ก็น่าเสียดายที่มีโอกาสใช้คำว่า 'nibble' หลายครั้งแล้วกลับพลาดไปทั้งหมด
ในฐานะผู้บริโภค ผมคิดว่าน่าจะสนใจมากขึ้นถ้ามีตารางแสดงว่าการปรับจูนโมเดล 70b ด้วยระบบที่ใช้ค่าน้ำหนัก 4 บิตจะใช้เวลานานแค่ไหน เช่น ขนาดโมเดล ขนาดการฝึก ต้นทุนการฝึก และคุณภาพที่คาดว่าจะลดลงจากเทคนิคนี้
สงสัยว่าสามารถใช้การเข้ารหัสแบบ (-1,0,1) ได้หรือไม่ ถ้ามีโมเดลนั้นออกมา ก็อยากรู้ว่า answer.ai จะใช้เทคนิคเดียวกันนี้เพื่อปรับจูนโมเดลขนาดใหญ่ด้วย GPU ขนาดเล็กสองตัวได้หรือไม่ และอยากเห็นการวิเคราะห์ต้นทุน/ประโยชน์ด้วย
งานวิจัยแบบนี้มีประโยชน์มากในการเปิดทางให้ผู้ใช้รายบุคคลแข่งขันในตลาด LLM ได้ เป็นงานที่ยอดเยี่ยมและสอดคล้องกับแนวคิดในหนังสือ 'Zero to One'
บทความไม่ได้พูดถึงว่าใน NeurIPS Efficiency Challenge ผลงานที่ได้อันดับต้น ๆ ทั้งหมดใช้ QLoRA ซึ่งเป็นตัวอย่างที่ดีที่แสดงให้เห็นถึงความสำคัญและประโยชน์ของ QLoRA
นี่คือแนวทางที่น่าสนใจและสร้างสรรค์ที่สุดเท่าที่ผมเคยเห็นในวงการ LLM แบบ 'โอเพนซอร์ส' และหวังว่าวงวิชาการจะยึดสิ่งนี้เป็นมาตรฐาน
อยากให้การเทรนบน Metal ที่รวดเร็วเกิดขึ้นเร็วกว่านี้ ตอนนี้ Mac Studio นั้นถูกกว่ามากและเร็วพอสำหรับการทำ inference กับโมเดลขนาดใหญ่ แต่แทบไม่มีโซลูชันสำหรับการเทรนเลย
คุณภาพและความชัดเจนของการเขียนเชิงเทคนิคนั้นยอดเยี่ยมมาก
สงสัยว่าสามารถนำค่าน้ำหนักของ LLM (70B) มาเทรนใหม่ด้วยข้อมูลของตัวเองได้หรือไม่
สำหรับคนที่ปรับจูน LLM ภายใต้งบฮาร์ดแวร์ที่จำกัด นี่คือความก้าวหน้าครั้งใหญ่ระดับพลิกเกม
สงสัยว่าทำไมถึงเลือก DeepSpeed แทน FSDP
สงสัยว่าตอนที่สามารถปรับจูนโมเดลได้แล้ว มีการใช้เครื่องมืออะไรในการจูนประสิทธิภาพบ้าง
เคยลองใช้การทำให้โมเดล sparse หรือไม่ ดูเหมือนว่าวิธีนี้อาจช่วยให้ปรับจูนได้ด้วย RAM ที่น้อยลง