RustGPT: LLM แบบทรานส์ฟอร์เมอร์ล้วนที่สร้างขึ้นใหม่ทั้งหมดด้วย Rust
(github.com/tekaratzas)- RustGPT คือ โมเดลภาษาแบบทรานส์ฟอร์เมอร์ ที่พัฒนาด้วย Rust ล้วนและ
ndarrayเท่านั้น โดยไม่พึ่งเฟรมเวิร์กแมชชีนเลิร์นนิงภายนอก - ถูกออกแบบให้เรียนรู้ความรู้เชิงข้อเท็จจริงและรูปแบบการสนทนาผ่าน pre-training และ instruction tuning
- โครงสร้างเป็นไปตาม สถาปัตยกรรม LLM แบบทั่วไป คือ tokenizer → embedding → transformer block → output projection
- มี โครงสร้างซอร์สโค้ดแบบแยกโมดูล และ โค้ดทดสอบ ที่ช่วยให้เข้าใจกระบวนการฝึก การอนุมาน และการปรับแต่งได้อย่างละเอียด
- เป็นแหล่งอ้างอิงสำคัญสำหรับนักพัฒนาหรือผู้เรียนที่อยาก สร้าง LLM ตั้งแต่ต้นในระบบนิเวศ Rust โดยไม่พึ่งเฟรมเวิร์ก
ภาพรวมโปรเจกต์
- RustGPT เป็นโปรเจกต์โอเพนซอร์สที่สร้าง LLM ด้วย ภาษา Rust ล้วนและไลบรารีคณิตศาสตร์เชิงเส้น (
ndarray) โดยไม่ใช้เฟรมเวิร์กแมชชีนเลิร์นนิงภายนอกหรือ dependency ที่ซับซ้อน - เป้าหมายหลักคือการลงมือสร้างองค์ประกอบแกนหลักของ LLM สมัยใหม่ด้วยตัวเอง เช่น ทรานส์ฟอร์เมอร์ attention embedding และการปรับแต่งค่า เพื่อทำความเข้าใจกระบวนการฝึกอย่างลึกซึ้ง
- ต่างจาก LLM กระแสหลักอื่น ๆ ตรงที่ออกแบบทั้ง โครงสร้างทรานส์ฟอร์เมอร์, backpropagation, tokenizer และ optimizer ด้วยโค้ด Rust ทั้งหมด ทำให้นักพัฒนาและนักวิจัยสาย Rust สามารถเข้าใจและต่อยอดหลักการของดีปเลิร์นนิงได้ตั้งแต่พื้นฐาน
- จุดต่างสำคัญคือใช้ ndarray สำหรับการคำนวณเมทริกซ์ และไม่พึ่งแพ็กเกจแมชชีนเลิร์นนิงภายนอกอย่าง PyTorch หรือ TensorFlow
- ด้วยความเป็นโมดูลาร์และมี test coverage ที่แข็งแรง จึงเหมาะกับการทดลองและการปรับปรุงหลากหลายรูปแบบ รวมถึงเหมาะสำหรับการเรียนการสอนแนว "LLM ที่สร้างเองตั้งแต่ต้น (From Scratch)"
คุณสมบัติหลักและแนวทางการพัฒนา
- สถาปัตยกรรมทรานส์ฟอร์เมอร์: ข้อความนำเข้า → tokenization → embedding → transformer block → การพยากรณ์ผลลัพธ์สุดท้าย
- ข้อความนำเข้าจะผ่านกระบวนการแยกโทเคนแล้วแปลงเป็นเวกเตอร์ embedding
- embedding จะถูกส่งผ่าน Transformer Block (multi-head attention + feedforward network)
- สุดท้าย Output Projection Layer จะสร้างการกระจายความน่าจะเป็นของคำศัพท์เพื่อใช้ในการพยากรณ์
โครงสร้างการพัฒนา
main.rs: pipeline การฝึก การเตรียมข้อมูล และการรันโหมด interactivellm.rs: ลอจิกการทำ feedforward, backpropagation และการฝึกของ LLM โดยรวมtransformer.rs,self_attention.rs,feed_forward.rs: บล็อกทรานส์ฟอร์เมอร์หลักembeddings.rs,output_projection.rs: embedding และชั้นเอาต์พุตสุดท้ายadam.rs: การพัฒนา Adam optimizer- แต่ละโมดูลมี โค้ดทดสอบ ที่สอดคล้องกัน (
tests/) เพื่อใช้ตรวจสอบการทำงานได้
วิธีฝึก ทดสอบ และการไหลของข้อมูล
- กระบวนการฝึก
- สร้าง vocabulary → pre-training (100 epoch, ข้อมูลประโยคข้อเท็จจริง) → instruction tuning (100 epoch, ข้อมูลบทสนทนา)
- ตัวอย่าง pre-training: "The sun rises in the east and sets in the west"
- ตัวอย่าง instruction tuning: "User: How do mountains form? Assistant: ..."
- รองรับโหมด interactive
- หลังฝึกเสร็จ สามารถทดสอบบทสนทนาแบบ prompt-response ได้
- ตัวอย่าง: "How do mountains form?" → "Mountains are formed through tectonic forces or volcanism..."
องค์ประกอบทางเทคนิคโดยละเอียด
- ขนาด vocabulary: กำหนดแบบไดนามิกจากข้อมูลฝึก
- มิติ embedding: 128, hidden layer: 256
- ความยาวลำดับสูงสุด: 80 โทเคน
- สถาปัตยกรรม: transformer block 3 ชุด + embedding + ชั้นเอาต์พุต
- อัลกอริทึมการฝึก: Adam optimizer, gradient clipping (จำกัด L2 norm ที่ 5.0)
- อัตราการเรียนรู้: pre-training 0.0005, instruction tuning 0.0001
- ฟังก์ชัน loss: cross-entropy loss
จุดเด่นของโมเดลและโค้ด
- tokenizer แบบปรับแต่งเอง (รองรับการจัดการเครื่องหมายวรรคตอน)
- การสร้างข้อความแบบ greedy decoding
- โครงสร้างชั้นแบบโมดูลาร์ และอินเทอร์เฟซที่ชัดเจน
- test coverage: มีโค้ดทดสอบรายชั้นและรายฟังก์ชัน
- dependency: ใช้เพียง ndarray (คำนวณเมทริกซ์), rand / rand_distr (กำหนดค่าเริ่มต้นแบบสุ่ม) เท่านั้น (ไม่ใช้ ML ภายนอกอย่าง PyTorch/TensorFlow)
- คุณค่าด้านการเรียนรู้: เหมาะอย่างยิ่งสำหรับศึกษาหลักการฝึกและโครงสร้างภายในของ LLM สมัยใหม่
ความเป็นไปได้ในการพัฒนาต่อ
- เพิ่มสถาปัตยกรรมขั้นสูง: multi-head attention, RoPE, positional encoding เป็นต้น
- ปรับแต่งประสิทธิภาพ: SIMD, การฝึกแบบขนาน, การปรับปรุงประสิทธิภาพหน่วยความจำ
- รองรับการบันทึก/โหลดโมเดล
- เพิ่มการสุ่มตัวอย่างที่ดีขึ้น (beam search, Top-k/Top-p) และตัวชี้วัดการประเมินผล
ความสำคัญ
- เป็นโปรเจกต์เพื่อการเรียนรู้และทดลองที่แสดงให้เห็นว่า สามารถสร้าง LLM ได้โดยตรงด้วย Rust เพียงอย่างเดียว โดยไม่ต้องพึ่งเฟรมเวิร์กอย่าง PyTorch หรือ TensorFlow ที่อยู่บน Python
- เป็นแหล่งอ้างอิงที่มีประโยชน์สำหรับนักพัฒนาที่ต้องการเข้าใจกลไกภายในของ LLM และสร้างระบบ ML ในสภาพแวดล้อม Rust
7 ความคิดเห็น
เรียบดีนะ
ทำไมล่ะ? นี่คือแบบว่า ฉันก็ทำได้นิดหน่อยเหมือนกันงั้นเหรอ?
บารมีของคาร์ม่า -47 สุดจัดเลย 555
แค่เห็นตัว r ของ rust ก็เริ่มคันไม้คันมือแล้วก็หงุดหงิดขึ้นมาทันทีเลยใช่ไหมล่ะ 555555555555
คงมีอะไรให้เรียนรู้ระหว่างทำอยู่บ้างนะ
ถ้าไม่เคยลองทำ ก็สร้างมันขึ้นมาไม่ได้หรอก
ความคิดเห็นจาก Hacker News
เห็นโค้ดที่มีทั้งคอมเมนต์ที่ GPT สร้างอัตโนมัติหรือเขียนซ้ำค่าคงที่ที่นิยามไว้แล้วอยู่ด้วย เลยคิดว่าควรลบส่วนพวกนี้ออก ตัวอย่างเช่นค่าคงที่อย่าง
const MAX_SEQ_LEN: usize = 80มีอยู่ใน lib.rs แล้ว ดังนั้นก็น่าจะใช้ค่าคงที่เดิมตามที่คอมเมนต์แนะนำจะดีกว่าเคยเสียเวลาไปหลายวันกับ dependency hell ของ Python มาก่อน ดังนั้นแนวทางแบบ Rust ที่แค่
cargo runครั้งเดียวจบจึงเหมือนฝันจริง ๆ แต่อยากรู้ว่าส่วนที่เจ็บปวดที่สุดเมื่อทำแบบไม่ใช้เฟรมเวิร์กคืออะไร ถ้าให้เดาคงเป็นการดีบักลอจิก backpropagation แน่ ๆcargo runเหมือนฝัน แต่จริง ๆ ฉันว่าประสบการณ์cargo buildที่เหมือนคอมไพล์อินเทอร์เน็ตทั้งก้อนใหม่หมดพร้อมอุ่น CPU ในฤดูหนาวนั้นดีกว่าอีกตอนนี้กำลังทำโปรเจกต์ Rust คล้ายกันอยู่ มีเวอร์ชันที่รันในเบราว์เซอร์ผ่าน WebAssembly ด้วย และเปิดทั้ง เดโมบนเบราว์เซอร์ กับ ซอร์สโค้ด ไว้แล้ว
ชุดแพ็กเกจ
ndarray,rand,rand_distrดูสะอาดดีคิดว่าความปลอดภัยด้านหน่วยความจำของ Rust มีประโยชน์มากพอสมควรในการลด buffer overflow ตอนทำ transformer ส่วน CUDA kernel ก็ยังเหนือกว่าในเรื่องประสิทธิภาพอยู่ดี แล้ว tokenizer นี่ทำ BPE ขึ้นมาใหม่เองหรือใช้ไลบรารีที่มีอยู่แล้ว
ฉันเองก็เคยทำ picogpt ด้วย Rust และอ้างอิงบล็อก GPT from scratch ของ jaykmody เยอะมาก ลิงก์โปรเจกต์
ขอแสดงความยินดีด้วย และขอทักเล็กน้อยว่าใน LLM ควรแยกอินสแตนซ์ของ transformer block แต่ละตัว ไม่ควรนำตัวเดียวกันกลับมาใช้ซ้ำ ฉันเองก็เคยลองปูพื้นฐานแบบคล้าย ๆ กันมาก่อนด้วย Zig และ MLX แล้วค่อย ๆ เพิ่มฟีเจอร์ ก่อนจะย้ายไปใช้ PyTorch/Transformers ในภายหลัง
คอมเมนต์ของผู้เขียนโปรเจกต์ถูกรวบรวมไว้ บน Reddit
ชอบที่ทั้งโปรเจกต์มีโครงสร้างที่อ่านง่ายมาก
สงสัยว่าใช้ชุดข้อมูลจากที่ไหน เดี๋ยวจะลองไปหาเองแต่ขอถามไว้ก่อน ฉันพัฒนาสถาปัตยกรรมที่เน้น CPU และไม่มี backpropagation ซึ่งใช้กับชุดข้อมูล classification ได้ดี และรองรับ incremental update ทีละตัวอย่างเดียว จึงน่าจะใช้กับ continual learning ได้ด้วย ตอนนี้เคยแค่ลองเทรนกับ tiny.txt เป็นเดโมเล็ก ๆ ยังไม่เคยลองกับ large language model (LLM) จริง ๆ คิดว่าสถาปัตยกรรมนี้น่าจะทำงานได้ดีพอสมควรสำหรับผู้ช่วยแบบ on-device หรือ on-premise เลยตั้งใจจะทดลองต่อ อยากรู้ว่ามีชุดข้อมูลโอเพนซอร์สสำหรับฝึก LLM อะไรที่แนะนำบ้าง