- อธิบายวิธีสร้างโมเดล GPT-2 (124M) ขึ้นมาใหม่ด้วย
llm.c ภายใน 90 นาทีด้วยค่าใช้จ่าย $20
- GPT-2 (124M) เป็นโมเดลขนาดเล็กที่สุดที่ OpenAI เผยแพร่ในปี 2019
- หากใช้โหนด 8X A100 80GB SXM บน Lambda จะมีค่าใช้จ่ายราว $14 ต่อชั่วโมง รวมทั้งหมดประมาณ $20
- สามารถฝึกด้วย GPU เดี่ยวได้เช่นกัน แต่จะใช้เวลานานกว่า (4-24 ชั่วโมง)
การเปรียบเทียบผลลัพธ์
- บนชุดข้อมูลตรวจสอบ FineWeb ให้ประสิทธิภาพดีกว่าเช็กพอยต์ที่ OpenAI เผยแพร่
- อย่างไรก็ตาม GPT-2 ถูกฝึกด้วย WebText จึงไม่ใช่การเปรียบเทียบที่ยุติธรรมทั้งหมด
- มีการวัดความแม่นยำบน HellaSwag ด้วย และทำได้ 29.9 ซึ่งใกล้เคียงกับ 33.7 ของ GPT-3 Small (124M)
- แซง GPT-2 (124M) ที่ได้ 29.4 ไปแล้ว
- แต่ในที่นี้ฝึกด้วยโทเค็น 10B ขณะที่ GPT-3 ฝึกด้วยโทเค็น 300B
การตั้งค่าสภาพแวดล้อมขั้นต่ำ
- ต้องใช้ GPU (แนะนำ Lambda Labs)
- คู่มือนี้อ้างอิง Linux x86 64bit Ubuntu 22.04 พร้อม CUDA 12
- ติดตั้ง miniconda แล้วติดตั้ง PyTorch nightly version (ไม่บังคับ)
- ติดตั้งแพ็กเกจที่จำเป็นสำหรับ tokenizer
- ติดตั้ง cuDNN เพื่อความเร็ว (ไม่บังคับ)
- ติดตั้ง MPI เมื่อต้องการใช้หลาย GPU (ไม่บังคับ)
- เตรียมข้อมูลชุด FineWeb 10B โทเค็นล่วงหน้า (~1 ชั่วโมง)
- คอมไพล์ llm.c (ใช้ mixed precision และ cuDNN FlashAttention)
การรันการฝึก
- มีตัวอย่างคำสั่งสำหรับการใช้ GPU เดี่ยว
- หากใช้หลาย GPU (8 ตัว) ให้รันด้วย
mpirun
- คำอธิบายพารามิเตอร์หลัก
-i, -j : พาธข้อมูลฝึก/ตรวจสอบ
-o : พาธสำหรับบันทึกล็อกและเช็กพอยต์
-e : การกำหนดค่าเริ่มต้นโมเดล (depth 12 GPT-2)
-b : ขนาดไมโครบัช (หากหน่วยความจำไม่พอให้ลดลง)
-t : ความยาวลำดับสูงสุด
-d : ขนาดบัชรวม (อ้างอิงตามบทความ GPT-3)
-r : การตั้งค่า Recompute (ประหยัดหน่วยความจำ)
-z : ZeRO-1 (sharding สถานะ optimizer)
- รวมถึงการตั้งค่าอื่น ๆ เช่น weight decay, learning rate, รอบการบันทึกเช็กพอยต์ ฯลฯ
กระบวนการฝึก
- หากใช้โทเค็นฝึก 10B และขนาดบัช 0.5M จะคาดว่าต้องใช้ประมาณ 20K สเต็ป
- บน A100 40GB PCIe GPU จะมีการแสดงเวลาในแต่ละสเต็ป, MFU และอัตราการประมวลผลโทเค็น
- ช่วงต้นของการฝึกมีอาการ gradient exploding แต่แก้ได้ด้วย clipping
การทำภาพข้อมูล
- มี Jupyter notebook สำหรับแยกวิเคราะห์ไฟล์ล็อกและสร้างกราฟเส้นโค้งการฝึก
Tokenizer
- จำเป็นสำหรับแปลงโทเค็นจำนวนเต็มให้เป็นสตริง
- สามารถสร้างได้ด้วยสคริปต์ PyTorch
Sampling
- ตอนนี้ยังไม่ได้ปรับให้เหมาะกับงานอนุมาน
- แก้โค้ดเล็กน้อยก็สามารถทำ unconditional/conditional sampling ได้
โครงสร้างโค้ด
- การติดตั้งส่วนใหญ่รวมอยู่ในไฟล์
train_gpt2.cu
- 500 บรรทัดแรกเป็นการตั้งค่า MPI, NCCL, cuDNN, cuBLAS เป็นต้น
- ถัดมา 1500 บรรทัดเป็น forward/backward ของ Transformer
- 1000 บรรทัดถัดไปเป็นการติดตั้งโมเดล GPT-2
- 1000 บรรทัดสุดท้ายเป็นลูปการฝึก การพาร์สอาร์กิวเมนต์ เป็นต้น
โมเดล 350M
- โทเค็น 10B ยังไม่เพียงพอ จึงใช้ 30B โทเค็น
- ใช้เวลา 14 ชั่วโมงบน 8X A100 80GB และมีค่าใช้จ่ายราว $200
FAQ
- รองรับการ sampling หรือไม่: รองรับ แต่ยังไม่มีประสิทธิภาพนัก
- สามารถแชตได้หรือไม่: ตอนนี้รองรับเฉพาะ pretraining ยังไม่รองรับการ fine-tune สำหรับแชต
- การฝึกแบบกระจายหลายโหนด: ทำได้ แต่ยังไม่ได้ทดสอบ
- เป็น deterministic ระดับบิตหรือไม่: เกือบ deterministic แต่ยังต้องแพตช์เคอร์เนลบางส่วน
- รองรับการฝึกด้วย FP8 หรือไม่: ตอนนี้ฝึกด้วย BF16 และมีแผนรองรับ FP8 เร็ว ๆ นี้
- รองรับ GPU ที่ไม่ใช่ NVIDIA หรือไม่: ตอนนี้รองรับเฉพาะ C/CUDA
ความเห็นของ GN⁺
- GPT-2 เป็นโมเดลสำคัญมากในฐานะจุดเริ่มต้นของ LLM ยุคใหม่ หลังจากนั้น GPT-3 และ LLM อื่น ๆ ก็ไม่ได้แตกต่างจาก GPT-2 อย่างมีนัยสำคัญนัก
- โปรเจกต์นี้ช่วยให้ใครก็ตามสามารถทดลองฝึกโมเดลระดับ GPT-2 ได้ด้วยตนเองในต้นทุนที่สมเหตุสมผล น่าจะช่วยเพิ่มความเข้าใจเกี่ยวกับ LLM ได้มาก
- อย่างไรก็ตาม ตอนนี้ยังไม่ได้ปรับให้เหมาะกับงานอนุมาน จึงยังมีข้อจำกัดหากจะนำไปใช้ในบริการจริง และยังไม่รองรับการ fine-tune ให้เป็นโมเดลสนทนา
- ปัจจุบันรองรับเฉพาะ NVIDIA GPU แต่ในอนาคตคาดว่าจะรองรับแพลตฟอร์มที่หลากหลายขึ้น เช่น AMD หรือ Apple Silicon
- โครงการโอเพนซอร์สที่มีเป้าหมายคล้ายกัน ได้แก่ Megatron-LM, DeepSpeed และ FairSeq ซึ่งแต่ละตัวก็มีข้อดีข้อเสียต่างกัน ควรเลือกให้เหมาะกับการใช้งาน
- เป็นโปรเจกต์ที่น่าตื่นเต้นมากในมุมของการกระตุ้นระบบนิเวศการพัฒนา LLM และน่าจับตาต่อไปในอนาคต
ยังไม่มีความคิดเห็น