โคลน ChatGPT ที่สร้างด้วย C ขนาด 3000 ไบต์บนพื้นฐาน GPT-2 (2023)
(nicholas.carlini.com)-
การสร้างโคลน ChatGPT
- โปรแกรมนี้เป็นอิมพลีเมนเทชันของ GPT-2 ที่ไม่พึ่งพา dependency ภายนอก
- โหลดเมทริกซ์น้ำหนักจากไฟล์ TensorFlow และไฟล์ BPE แล้วทำโทเคไนซ์อินพุตด้วย byte pair encoder แบบเรียบง่าย
- อิมพลีเมนต์แพ็กเกจพีชคณิตเชิงเส้นพื้นฐาน กำหนดสถาปัตยกรรมทรานส์ฟอร์เมอร์ รันการอนุมานของทรานส์ฟอร์เมอร์ และแปลงผลลัพธ์กลับจากโทเคนด้วย BPE decoder
- เขียนด้วยภาษา C เพียงประมาณ 3000 ไบต์
- ปรับแต่งประสิทธิภาพมาอย่างดีจนโมเดล GPT-2 Small สามารถตอบสนองบนอุปกรณ์สมัยใหม่ได้ภายในไม่กี่วินาที
- อิมพลีเมนต์ KV caching และอัลกอริทึมการคูณเมทริกซ์ที่มีประสิทธิภาพ
-
โครงสร้างโปรแกรม
- ไลบรารีเมทริกซ์คณิตศาสตร์พื้นฐาน (700 ไบต์)
- การคูณเมทริกซ์แบบเร็ว (300 ไบต์)
- เลเยอร์โครงข่ายประสาท (300 ไบต์)
- โมเดลทรานส์ฟอร์เมอร์ (600 ไบต์)
- byte pair encoding (400 ไบต์)
- อินพุต/เอาต์พุต (200 ไบต์)
- การโหลดน้ำหนัก (300 ไบต์)
- การโหลด byte pair encoding (300 ไบต์)
-
พื้นหลังของ ChatGPT และทรานส์ฟอร์เมอร์
- ChatGPT คือแอปพลิเคชันที่ให้ผู้ใช้สนทนากับ language model ได้
- GPT-4 เป็นโมเดลรุ่นใหม่ที่น่าประทับใจอย่างมาก
- โปรแกรม C นี้จำลองการทำงานของ ChatGPT โดยใช้ GPT-2 ซึ่งเป็นโมเดลที่อ่อนกว่าจากปี 2019
- GPT-2 คือทรานส์ฟอร์เมอร์ที่รับลำดับคำขนาดคงที่เป็นอินพุตและทำนายคำถัดไป
-
คำอธิบายโค้ด C
-
เริ่มต้นกับคณิตศาสตร์เมทริกซ์ (700 ไบต์)
- โครงข่ายประสาทประกอบขึ้นจากการดำเนินการกับเมทริกซ์
- สร้างไลบรารีเมทริกซ์โดยใช้การนิยามเมทริกซ์แบบมินิมอล
- ใช้แมโครเพื่อดึงลอจิกที่ใช้ร่วมกันออกมาเป็นเมตารูทีน
-
การคูณเมทริกซ์แบบเร็ว (300 ไบต์)
- การคูณเมทริกซ์พื้นฐานถูกอิมพลีเมนต์ด้วยลูปสามชั้น
- ด้วยลักษณะการทำงานของหน่วยความจำและแคช การอ่านและเขียนหน่วยความจำเดิมซ้ำ ๆ จะเร็วกว่า
-
เลเยอร์โครงข่ายประสาท (300 ไบต์)
- เพื่อเขียนทรานส์ฟอร์เมอร์ จึงกำหนดเลเยอร์โครงข่ายประสาทแบบพิเศษบางอย่างขึ้นมา
- อิมพลีเมนต์ฟังก์ชันกระตุ้น GELU และฟังก์ชันตั้งค่า subdiagonal ที่จำเป็นสำหรับ causal attention เป็นต้น
-
สถาปัตยกรรมทรานส์ฟอร์เมอร์ (600 ไบต์)
- อิมพลีเมนต์ทรานส์ฟอร์เมอร์ภายใน 600 ไบต์
- ในแต่ละเลเยอร์จะคำนวณ key, query, value สร้าง attention matrix และรวมผลลัพธ์เข้าด้วยกัน
-
byte pair encoding (400 ไบต์)
- เนื่องจาก language model ต้องการอินพุตขนาดคงที่ จึงใช้ชิ้นส่วนของคำเพื่อสร้างโทเคน
- แยกคำที่กำหนดออกเป็นอักขระเดี่ยว แล้วรวมคู่โทเคนที่อยู่ติดกัน
-
การโหลดน้ำหนัก (300 ไบต์)
- โหลดน้ำหนักของโครงข่ายประสาทจากดิสก์
- น้ำหนักถูกซีเรียลไลซ์เป็นเลขทศนิยมลอยตัว 32 บิต
-
การโหลด byte pair encoding (300 ไบต์)
- โหลด vocabulary ของ byte pair encoding จากดิสก์
- รูปแบบไฟล์ประกอบด้วยรายการ byte pair encoding
-
-
บทสรุป
- ความก้าวหน้าด้านแมชชีนเลิร์นนิงที่สั่งสมมาหลายทศวรรษสามารถบีบอัดลงในไม่กี่พันไบต์ได้
- เป็นตัวอย่างของโครงข่ายประสาทแบบเรียบง่ายที่รวมทุกอย่างไว้ ยกเว้นน้ำหนักของโมเดลจริง
1 ความคิดเห็น
ความเห็นจาก Hacker News
ตอนที่ใช้ GPT-2 จำลองการคุยกับเพื่อน มันทั้งสนุกและบางครั้งก็แม่นยำจนน่าประหลาดใจ เลยสงสัยว่าการก้าวกระโดดครั้งใหญ่ระหว่าง GPT-2 กับ GPT-3 มาจากโมเดลที่ใหญ่ขึ้น ข้อมูลที่มากขึ้น หรือทั้งสองอย่าง แม้ RLHF จะสร้างความแตกต่างอย่างมาก แต่โมเดล GPT-3 พื้นฐานเองก็มีประโยชน์มากเมื่อมีตัวอย่างให้เพียงพอ
เป็นตัวอย่างที่ดีที่แสดงให้เห็นว่าโครงข่ายประสาทแบบง่ายนั้นจริง ๆ แล้วเรียบง่ายแค่ไหน ปัญญาประดิษฐ์คือเวทมนตร์ดำที่เราใช้หาเงิน
ยังไม่ได้ลองรันโค้ด แต่ประทับใจกับขนาดที่เล็กมาก โปรแกรม ELISA ยุคแรก ๆ ยังใหญ่กว่านี้ ตลอด 4 ปีที่ผ่านมาเราทำให้สิ่งนี้พอดีได้ในระดับไบต์ หากมีคำใบ้ว่าความมหัศจรรย์อยู่ตรงไหนก็อยากให้ช่วยอธิบาย สงสัยว่าเป็นฟังก์ชัน GELU หรือโมเดลที่ดาวน์โหลดผ่านสคริปต์ bash
GPT-2 เขียนนิทานเรื่องโปรดของฉันได้ ลิงก์: The Princess, the Fairy Godmother, and the Chest
สงสัยว่า GPT-2 ได้รับการปรับแต่งมาเพื่อใช้แชตจริง ๆ หรือไม่ ถ้าไม่ใช่ ก็คิดว่าการเรียกสิ่งนี้ว่าเป็นโคลนของ ChatGPT อาจจะเกินไป
LISP ไม่ได้ดีกว่า C เสมอไป ครั้งนี้ยอมให้ผ่าน ถ้าพลาดลิงก์โค้ดไป นี่คือ: C-Chat-GPT-2
สงสัยว่าสามารถรันได้บนฮาร์ดแวร์แบบไหน ใช้น้ำหนักแบบ quantized ของ huggingface ได้หรือไม่ และเหมาะเป็นพิเศษกับปัญหาหรือคำถามประเภทใด
ทุกวันนี้สามารถใช้ gptscript เพื่อทำ ChatGPT ของตัวเองได้อย่างง่ายดาย ลิงก์: gptscript
ไม่เข้าใจว่า C macro คล้ายกับ regular expression อย่างไร C macro จับคู่คำแล้วแทนที่ด้วยข้อความอื่น ส่วน regular expression ใช้จับคู่ข้อความด้วยแพตเทิร์นที่ค่อนข้างซับซ้อน และตัวมันเองก็ไม่ได้แทนที่ข้อความ
สงสัยว่ามีใครลองรันในเครื่องตัวเองแล้วดูหรือยังว่า GP2 นี้สร้างผลลัพธ์ออกมาเป็นอย่างไร