23 คะแนน โดย GN⁺ 2025-09-16 | 7 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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 การฝึก การเตรียมข้อมูล และการรันโหมด interactive
  • llm.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 ความคิดเห็น

 
t7vonn 2025-09-18

เรียบดีนะ

 
ahwjdekf 2025-09-16

ทำไมล่ะ? นี่คือแบบว่า ฉันก็ทำได้นิดหน่อยเหมือนกันงั้นเหรอ?

 
cosine20 2025-09-22

บารมีของคาร์ม่า -47 สุดจัดเลย 555

 
skrrgang 2025-09-16

แค่เห็นตัว r ของ rust ก็เริ่มคันไม้คันมือแล้วก็หงุดหงิดขึ้นมาทันทีเลยใช่ไหมล่ะ 555555555555

 
aer0700 2025-09-16

คงมีอะไรให้เรียนรู้ระหว่างทำอยู่บ้างนะ

 
devjeonghwan 2025-09-16

ถ้าไม่เคยลองทำ ก็สร้างมันขึ้นมาไม่ได้หรอก

 
GN⁺ 2025-09-16
ความคิดเห็นจาก Hacker News
  • เห็นโค้ดที่มีทั้งคอมเมนต์ที่ GPT สร้างอัตโนมัติหรือเขียนซ้ำค่าคงที่ที่นิยามไว้แล้วอยู่ด้วย เลยคิดว่าควรลบส่วนพวกนี้ออก ตัวอย่างเช่นค่าคงที่อย่าง const MAX_SEQ_LEN: usize = 80 มีอยู่ใน lib.rs แล้ว ดังนั้นก็น่าจะใช้ค่าคงที่เดิมตามที่คอมเมนต์แนะนำจะดีกว่า

    • การที่ยังมีส่วนแบบนี้หลงเหลืออยู่ ทำให้รู้สึกว่านี่ไม่ใช่ผลลัพธ์ที่นักพัฒนาเข้าใจและสร้างขึ้นมาจริง ๆ
    • อยากรู้ว่าได้ส่ง PR ที่เกี่ยวข้องไปหรือยัง
    • เรื่องวิธีใช้ค่าคงที่ ผู้เขียนเองอาจจะแค่ยังไม่รู้วิธีก็ได้ สัปดาห์แรกที่ฉันใช้ Rust ก็จำได้ว่ายังคิดหนักเรื่องการตั้งชื่อและโครงสร้างโค้ดเหมือนกัน
    • สงสัยว่าคนอื่นคิดอย่างไรกับความเป็นไปได้ที่ Rust แบบสไตล์ vibe coding อาจทำให้คุณภาพโค้ดของภาษานี้โดยรวมลดลง
    • คิดว่าคำวิจารณ์นี้ตรงประเด็นมาก
  • เคยเสียเวลาไปหลายวันกับ dependency hell ของ Python มาก่อน ดังนั้นแนวทางแบบ Rust ที่แค่ cargo run ครั้งเดียวจบจึงเหมือนฝันจริง ๆ แต่อยากรู้ว่าส่วนที่เจ็บปวดที่สุดเมื่อทำแบบไม่ใช้เฟรมเวิร์กคืออะไร ถ้าให้เดาคงเป็นการดีบักลอจิก backpropagation แน่ ๆ

    • ขอแนะนำเครื่องมือชื่อ uv จากที่ลองใช้เองแล้ว การรันโปรเจกต์ Python สะดวกขึ้น 90% ไปที่ uv
    • คิดว่าส่วนที่ยากที่สุดน่าจะเป็นเรื่องการใช้ทรัพยากรอย่าง GPU เป็นต้น
    • ถ้าจะพูดถึงปัญหา dependency ของ Python แบบนี้อาจเข้าใจได้ถ้าเป็นราวปี 2010 แต่ในปี 2025 มองว่าเป็นการพูดเกินจริงไปมาก
    • บอกว่า cargo run เหมือนฝัน แต่จริง ๆ ฉันว่าประสบการณ์ cargo build ที่เหมือนคอมไพล์อินเทอร์เน็ตทั้งก้อนใหม่หมดพร้อมอุ่น CPU ในฤดูหนาวนั้นดีกว่าอีก
    • รู้สึกว่าคนที่ชม cargo หลายคนไม่ค่อยเข้าใจ trade-off ของการจัดการ dependency แม้การสร้างทุกไลบรารีใหม่ทุกครั้งแบบ C จะไม่มีประสิทธิภาพ แต่ถ้าดึง dependency ได้ง่ายเกินไปแบบ npm หรือ cargo ก็จะเกิดข้อเสียหนัก ๆ ตามมา ทั้ง dependency ที่พอกพูน เวลาบิลด์ และปัญหาความปลอดภัย ระบบ build ที่ดีไม่ได้แปลว่าต้องเพิ่ม dependency ได้ง่ายเสมอไป และการพึ่งคลังแพ็กเกจกลางที่ใครก็โยง dependency เข้าหากันได้ก็ไม่ใช่รูปแบบที่ดีนัก
  • ตอนนี้กำลังทำโปรเจกต์ Rust คล้ายกันอยู่ มีเวอร์ชันที่รันในเบราว์เซอร์ผ่าน WebAssembly ด้วย และเปิดทั้ง เดโมบนเบราว์เซอร์ กับ ซอร์สโค้ด ไว้แล้ว

  • ชุดแพ็กเกจ ndarray, rand, rand_distr ดูสะอาดดี

    • ด้วยความอยากรู้เลยไปดู dependency tree ด้วย cargo tree และตอนนี้ก็ดูยังค่อนข้างสะอาดอยู่
    • แต่ก็ไม่คิดว่าต้นไม้นี้มีความหมายมากนัก เพราะตัวโค้ดอาจเขียนเองแบบไม่มีประสิทธิภาพก็ได้ และในบางกรณีการใช้ไลบรารีภายนอกอย่างเหมาะสมอาจดีกว่า
    • สงสัยว่านี่เป็นการพูดเชิงเสียดสีหรือว่ามีบริบทเพิ่มเติม
  • คิดว่าความปลอดภัยด้านหน่วยความจำของ Rust มีประโยชน์มากพอสมควรในการลด buffer overflow ตอนทำ transformer ส่วน CUDA kernel ก็ยังเหนือกว่าในเรื่องประสิทธิภาพอยู่ดี แล้ว tokenizer นี่ทำ BPE ขึ้นมาใหม่เองหรือใช้ไลบรารีที่มีอยู่แล้ว

  • ฉันเองก็เคยทำ picogpt ด้วย Rust และอ้างอิงบล็อก GPT from scratch ของ jaykmody เยอะมาก ลิงก์โปรเจกต์

  • ขอแสดงความยินดีด้วย และขอทักเล็กน้อยว่าใน LLM ควรแยกอินสแตนซ์ของ transformer block แต่ละตัว ไม่ควรนำตัวเดียวกันกลับมาใช้ซ้ำ ฉันเองก็เคยลองปูพื้นฐานแบบคล้าย ๆ กันมาก่อนด้วย Zig และ MLX แล้วค่อย ๆ เพิ่มฟีเจอร์ ก่อนจะย้ายไปใช้ PyTorch/Transformers ในภายหลัง

    • แต่การฝึกแบบนี้จะมีความหมายก็ต่อเมื่อเป็นการลงมือเขียนโค้ดเองจริง ๆ ประสบการณ์ในการสร้างด้วยตัวเองโดยไม่พึ่ง GPT นั่นแหละที่มีคุณค่า
  • คอมเมนต์ของผู้เขียนโปรเจกต์ถูกรวบรวมไว้ บน Reddit

  • ชอบที่ทั้งโปรเจกต์มีโครงสร้างที่อ่านง่ายมาก

    • อยากชี้ว่าเป็นโค้ดที่ AI สร้างขึ้น
    • สไตล์ออกไปทาง procedural/object-oriented มาก เลยยากจะเรียกว่าเป็นสไตล์ Rust ที่ดีในความหมายเข้มงวดนัก สไตล์เชิงฟังก์ชันที่ใช้ iterators หรือ enum มักจะกระชับและเป็นอุดมคติมากกว่า แต่ในฐานะการทดลองไอเดียก็ถือว่าโอเคมาก
    • ไม่เคยรู้มาก่อนว่า Rust จะอ่านง่ายแบบนี้ได้ ตรงกันข้ามกลับรู้สึกว่าวิศวกร Rust พยายามหลีกเลี่ยงโค้ดเรียบง่ายแบบนี้ เหมือนเป็นการแข่งขันทรมานตัวเองกลาย ๆ ทำให้เข้าใจประสบการณ์ทั้งหมดที่เคยเจอเกี่ยวกับชุมชน Rust และวัฒนธรรมการจ้างงานมากขึ้น
  • สงสัยว่าใช้ชุดข้อมูลจากที่ไหน เดี๋ยวจะลองไปหาเองแต่ขอถามไว้ก่อน ฉันพัฒนาสถาปัตยกรรมที่เน้น CPU และไม่มี backpropagation ซึ่งใช้กับชุดข้อมูล classification ได้ดี และรองรับ incremental update ทีละตัวอย่างเดียว จึงน่าจะใช้กับ continual learning ได้ด้วย ตอนนี้เคยแค่ลองเทรนกับ tiny.txt เป็นเดโมเล็ก ๆ ยังไม่เคยลองกับ large language model (LLM) จริง ๆ คิดว่าสถาปัตยกรรมนี้น่าจะทำงานได้ดีพอสมควรสำหรับผู้ช่วยแบบ on-device หรือ on-premise เลยตั้งใจจะทดลองต่อ อยากรู้ว่ามีชุดข้อมูลโอเพนซอร์สสำหรับฝึก LLM อะไรที่แนะนำบ้าง

    • Hermes-3 Dataset ใช้ได้ดี
    • ใน huggingface มีชุดสายสนทนา user-assistant ของ openai และ anthropic อยู่หลายแบบ แต่ข้อควรระวังคือมี hallucination เยอะพอสมควร สำหรับ instruction fine-tuning ถือว่าใช้ได้ดี ถ้าต้องการ instruction following แนะนำ kimi k2 distillation
    • โปรเจกต์นี้ใส่ข้อมูลฝึกไว้ตรง ๆ ในไฟล์ main.rs เลย เนื้อหาเป็นประโยคสั้น ๆ ความรู้ทั่วไปประมาณ 50 ประโยค น่าจะเพื่อให้เวลาเทรนสั้นลง เพราะงั้นถ้าไม่ใช่พรอมป์ต์แนวมีสคริปต์ ผลลัพธ์จะแย่ลงอย่างรวดเร็ว ตัวอย่างพรอมป์ต์และผลลัพธ์:
      • เมื่อป้อน "hello": จะได้ "Eclipses occur when one celestial body moves into the shadow of another" เป็นต้น ซึ่งดูใช้ได้
      • เมื่อป้อน "what are facts": จะวนซ้ำเป็นชุดคำที่ไม่มีความหมาย
      • เมื่อป้อน "how are mountains formed?": จะได้คำที่ไม่สอดคล้องกันและเอาต์พุตที่ไม่มีความหมาย