46 คะแนน โดย GN⁺ 23 일 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • โมเดลภาษาขนาดเล็กมากที่มีพารามิเตอร์เพียงประมาณ 9 ล้านตัว และสามารถ ฝึกได้ภายใน 5 นาทีด้วย Colab โน้ตบุ๊กเพียงอันเดียว
  • ทำครบทั้งกระบวนการตั้งแต่ การสร้างข้อมูล, tokenizer, การฝึกโมเดล ไปจนถึงการอนุมาน ในสภาพแวดล้อมเดียว และรองรับทั้ง เบราว์เซอร์·Colab·เครื่องโลคัล
  • ออกแบบเป็น คาแรกเตอร์ ‘Guppy’ ที่จินตนาการโลกใต้น้ำ สนทนาด้วยประโยคสั้นและเรียบง่าย โดยเน้น ความโปร่งใสเพื่อการเรียนรู้
  • ใช้ สถาปัตยกรรม Transformer แบบพื้นฐาน เพื่อให้เห็นโครงสร้างแกนหลักของโมเดลภาษาอย่างชัดเจนโดยไม่พึ่งเทคนิคซับซ้อน
  • เป็นโครงการโอเพนซอร์สที่ทุกคนสามารถทดลองและเรียนรู้ได้ ด้วย ชุดข้อมูลสาธารณะบน HuggingFace และไลเซนส์ MIT

ภาพรวมของ GuppyLM

  • GuppyLM คือโมเดลภาษาขนาดเล็กมากที่มีพารามิเตอร์ประมาณ 9 ล้านตัว เป็นโมเดลที่พูดคุยเหมือนปลาคาแรกเตอร์ ‘Guppy’
  • ถูกออกแบบโดยตั้งเป้าเป็น LLM ที่สามารถฝึกได้เองภายใน 5 นาทีด้วย Colab โน้ตบุ๊กเพียงอันเดียว ทำให้ทำครบทุกขั้นตอนตั้งแต่การสร้างข้อมูล, tokenizer, โครงสร้างโมเดล, ลูปการฝึก ไปจนถึงการอนุมานได้ในสภาพแวดล้อมเดียว
  • สร้างขึ้นเพื่อให้สามารถ สัมผัสการทำงานภายในของโมเดลภาษาได้โดยตรง โดยไม่ต้องมี GPU คลัสเตอร์ขนาดใหญ่หรือความรู้เฉพาะทาง
  • แม้จะไม่สามารถสร้างข้อความยาวแบบโมเดลขนาดใหญ่ได้ แต่เป็น โมเดลเพื่อการเรียนรู้ที่แสดงให้เห็นทั้งกระบวนการตั้งแต่การรับอินพุต การเรียนรู้น้ำหนัก ไปจนถึงการสร้างเอาต์พุตอย่างโปร่งใส
  • สามารถรันได้ทั้งใน เบราว์เซอร์, Colab และสภาพแวดล้อมโลคัล และมีการเผยแพร่ทั้งชุดข้อมูลและโมเดลผ่าน HuggingFace

คุณสมบัติของโมเดล

  • GuppyLM เป็นคาแรกเตอร์ที่คิดโดยมีโลกใต้น้ำเป็นศูนย์กลาง เช่น น้ำ, อุณหภูมิ, แสง, การสั่นสะเทือน, อาหาร
  • ใช้ ประโยคสั้นและตัวพิมพ์เล็ก และไม่เข้าใจแนวคิดนามธรรมของมนุษย์ เช่น เงินหรือการเมือง
  • มี บุคลิกเป็นมิตร อยากรู้อยากเห็น และเรียบง่าย
  • ข้อมูลฝึกประกอบด้วย 60 หัวข้อ และตัวอย่างบทสนทนาสังเคราะห์ 60,000 รายการ และสามารถฝึกได้ภายในประมาณ 5 นาทีบน GPU เดี่ยว
  • ด้วยขนาดโมเดลที่เล็ก จึงสามารถทำ การอนุมานบนเบราว์เซอร์ด้วย WebAssembly ได้

สถาปัตยกรรม

  • จำนวนพารามิเตอร์: 8.7M
  • จำนวนเลเยอร์: 6
  • มิติ hidden: 384
  • หัว attention: 6
  • มิติ FFN: 768 (ReLU)
  • ขนาดคำศัพท์: 4,096 (BPE)
  • ความยาวซีเควนซ์สูงสุด: 128 โทเค็น
  • การทำ normalization: LayerNorm
  • position embedding: แบบเรียนรู้ได้
  • LM head: แชร์น้ำหนักร่วมกับ embedding
  • ใช้ โครงสร้าง Transformer แบบพื้นฐาน โดยไม่ใช้เทคนิคซับซ้อนอย่าง GQA, RoPE, SwiGLU, early exit เป็นต้น

บุคลิกและหัวข้อสนทนา

  • Guppy สนทนาด้วย ประโยคสั้น, การใช้ตัวพิมพ์เล็ก, และ การคิดที่ยึดประสาทสัมผัสเป็นหลัก
  • ตอบสนองต่อหัวข้อต่าง ๆ เช่น อาหาร, น้ำ, แสง, ตู้ปลา, ฟองอากาศ, การสะท้อน, ผิวน้ำ, โลกภายนอก
  • หัวข้อหลัก 60 รายการประกอบด้วย การทักทาย, อารมณ์, อุณหภูมิ, อาหาร, แสง, น้ำ, ตู้ปลา, เสียงรบกวน, ความเหงา, ความฝัน, ฤดูกาล, เรื่องตลก, ความรัก, สุขภาพ, TV เป็นต้น

วิธีรันและการใช้งาน

  • รันบนเบราว์เซอร์

    • ทำ การอนุมานแบบโลคัล ด้วย WebAssembly
    • ดาวน์โหลด โมเดล ONNX แบบ quantized ขนาดประมาณ 10MB แล้วรันได้โดยไม่ต้องมีเซิร์ฟเวอร์หรือ API key
  • แชตบน Colab

    • ดาวน์โหลดโมเดลที่ pretrain ไว้แล้วจาก HuggingFace เพื่อใช้งานผ่าน อินเทอร์เฟซแบบโต้ตอบ
    • รันทุกเซลล์แล้วสามารถเริ่มแชตได้ทันที
  • ฝึกบน Colab

    • ตั้งค่า runtime เป็น T4 GPU แล้วรันทุกเซลล์
    • ทำอัตโนมัติทั้งการดาวน์โหลดชุดข้อมูล, ฝึก tokenizer, ฝึกโมเดล และทดสอบ
    • สามารถอัปโหลดโมเดลที่ได้ไปยัง HuggingFace หรือบันทึกไว้ในเครื่องโลคัล
  • แชตในสภาพแวดล้อมโลคัล

    • ติดตั้ง pip install torch tokenizers แล้วรันคำสั่ง python -m guppylm chat
    • หากบทสนทนายาวเกินไป คุณภาพจะลดลงเนื่องจากข้อจำกัด 128 โทเค็น
    • รองรับโหมดที่ป้อนพรอมป์ต์ครั้งเดียว รับคำตอบ แล้วจบการทำงานได้เช่นกัน

ชุดข้อมูล

  • ใช้ชุดข้อมูล arman-bd/guppylm-60k-generic บน HuggingFace
  • จำนวนตัวอย่าง: 60,000 (ฝึก 57K / ทดสอบ 3K)
  • รูปแบบ: {"input": "...", "output": "...", "category": "..."}
  • จำนวนหมวดหมู่: 60
  • วิธีสร้าง: ข้อมูลสังเคราะห์แบบอิงเทมเพลต
    • ใช้เทมเพลตราว 60 แบบ, วัตถุในตู้ปลา 30 แบบ, ชนิดอาหาร 17 แบบ, และชุดกิจกรรม 25 แบบ เพื่อ สร้างเอาต์พุตที่ไม่ซ้ำกันราว 16,000 รายการ

โครงสร้างโปรเจกต์

  • guppylm/

    • config.py: โมเดลและไฮเปอร์พารามิเตอร์การฝึก
    • model.py: โมเดล Transformer แบบพื้นฐาน
    • dataset.py: การโหลดข้อมูลและการจัดการแบตช์
    • train.py: ลูปการฝึก (cosine LR, AMP)
    • generate_data.py: สร้างข้อมูลบทสนทนา 60 หัวข้อ
    • eval_cases.py: ชุดกรณีทดสอบ
    • prepare_data.py: เตรียมข้อมูลและฝึก tokenizer
    • inference.py: อินเทอร์เฟซแชต
  • tools/

    • make_colab.py: สร้าง Colab โน้ตบุ๊ก
    • export_onnx.py: ส่งออกเป็นโมเดล ONNX (uint8 quantization)
    • export_dataset.py: อัปโหลดชุดข้อมูลไปยัง HuggingFace
    • dataset_card.md: คำอธิบายชุดข้อมูลสำหรับ HuggingFace
  • docs/

    • index.html: เดโมบนเบราว์เซอร์ (ONNX + WASM)
    • download.sh: ดาวน์โหลดโมเดลและ tokenizer
    • model.onnx: โมเดลที่ถูก quantize แล้ว (~10MB)
    • tokenizer.json: BPE tokenizer
    • guppy.png: ภาพโลโก้

การตัดสินใจด้านการออกแบบ

  • ตัด system prompt ออก:โมเดลขนาด 9M ทำตามคำสั่งแบบมีเงื่อนไขได้ยาก จึงฝังบุคลิกลงในน้ำหนักโดยตรง แทนการใช้พรอมป์ต์เดียวกันกับทุกตัวอย่าง

    • ทำให้ประหยัดได้ประมาณ 60 โทเค็นในขั้นตอนอนุมาน
    • บทสนทนาแบบเทิร์นเดียว: ด้วยข้อจำกัด 128 โทเค็น คุณภาพจะเริ่มลดลงหลัง 3~4 เทิร์น
    • แม้จะเข้ากับคอนเซปต์ ‘ความจำแบบปลาทอง’ ของ Guppy แต่ การสนทนาแบบเทิร์นเดียวมีความเสถียรมากที่สุด
    • คง Transformer แบบพื้นฐานไว้: เทคนิคอย่าง GQA, SwiGLU, RoPE, early exit ไม่ได้ช่วยเพิ่มคุณภาพกับโมเดลขนาด 9M และมีแต่เพิ่มความซับซ้อน
    • ชุด standard attention + ReLU FFN + LayerNorm ก็ให้ประสิทธิภาพเพียงพอ
    • ใช้ข้อมูลสังเคราะห์: เพื่อรักษาบุคลิกของคาแรกเตอร์ให้คงเส้นคงวา จึงเลือกใช้วิธี สร้างข้อมูลแบบอิงเทมเพลต

ไลเซนส์

  • ไลเซนส์ MIT

1 ความคิดเห็น

 
GN⁺ 23 일 전
ความเห็นจาก Hacker News
  • สงสัยว่าโปรเจ็กต์นี้มี เอกสารประกอบ หรือไม่
    ตัวโค้ดเองดูเหมือนจะเป็นหนึ่งในอิมพลีเมนเทชันที่เรียบง่ายที่สุดของ (Not So) Large Language Model แต่สำหรับนักพัฒนาที่ยังไม่คุ้นกับ multi-head attention, ReLU FFN, LayerNorm, positional embedding ฯลฯ ก็อาจเข้าใจได้ไม่ง่าย
    โปรเจ็กต์นี้มีลักษณะเชิงการศึกษาใกล้เคียงกับ Minix เหมือนที่ Minix ถูกใช้เป็นเครื่องมือเรียนรู้การออกแบบระบบปฏิบัติการ การให้นักศึกษาเพิ่มฟีเจอร์เข้าไปใน GuppyLM เพื่อเรียนรู้การออกแบบ LLM ก็เป็นแนวทางที่ดี

    • การป้อนโค้ดเข้า LLM แล้วลอง สนทนา เกี่ยวกับมันก็น่าจะเป็นวิธีที่ดีเช่นกัน
  • สงสัยว่าโปรเจ็กต์นี้ต่างจาก microgpt หรือ minGPT ของ Andrej Karpathy อย่างไร

    • ยังไม่ได้ลองเปรียบเทียบ แต่ขอบคุณสำหรับข้อเสนอแนะ จะลองไปดูทั้งสองโปรเจ็กต์
    • ประเด็นสำคัญไม่ใช่การเปรียบเทียบ นี่ไม่ใช่โปรดักต์ แต่เป็น โปรเจ็กต์ทดลองที่เจ๋งมาก
  • มีตัวอย่าง ภาพแสดงผลแบบ 3D ของเลเยอร์ LLM ขนาดเล็กอยู่ที่ bbycroft.net/llm ซึ่งช่วยให้เข้าใจการทำงานภายในได้มาก
    ดูการพูดคุยที่เกี่ยวข้องได้ที่ ที่นี่

    • เจ๋งมาก! จะลองดูให้ลึกกว่านี้
    • แม้จะไม่ได้เกี่ยวโดยตรง แต่โปรเจ็กต์นี้เจ๋งจริง ๆ น่าจะลองเพิ่ม UI อีกสักหน่อย
    • เป็นการทำ visualization ที่น่าสนใจ
  • ยอดเยี่ยมมากสำหรับการเริ่มต้นเรียนรู้ LLM
    เมื่อก่อนเคยสร้างโมเดลของตัวเองโดยใช้ Paradise Lost ของ Milton เป็นฐาน
    ดูเพิ่ม: wvrk.org/works/milton

  • อันนี้น่าจะเป็นผลมาจากการที่ ข้อมูลฝึกทั้งหมดเป็นตัวพิมพ์เล็ก

    You> hello
    Guppy> hi. did you bring micro pellets.
    You> HELLO
    Guppy> i don't know what it means but it's mine.
    
    • สังเกตได้ดี! ดูเหมือนว่า tokenizer จะไม่มีโทเคนตัวพิมพ์ใหญ่เลย
      ถึงอย่างนั้นคาแรกเตอร์ของมันก็ยังชัดอยู่
  • ชวนให้สงสัยว่าจะสร้าง LLM ที่ฝึกด้วย Toki Pona อย่างเดียวได้ไหม
    ดู วิกิ Toki Pona

    • แต่ข้อมูลฝึกมีไม่เพียงพอ แก่นสำคัญของ LLM คือ ข้อมูลจำนวนมหาศาลและทรัพยากรการคำนวณ
  • กำลังทำโปรเจ็กต์ที่ให้เอเจนต์ LLM หลายตัวแบ่งปัน โลกเสมือน ร่วมกันและโต้ตอบกันอย่างอัตโนมัติ
    สิ่งที่น่าทึ่งคือการมีอยู่ของ ‘โลก’ ส่งผลต่อพฤติกรรมของโมเดลอย่างมาก
    ถึงจะเป็นโมเดลเดียวกันและพรอมป์ต์เดียวกัน แต่ถ้าปัจจัยแวดล้อมอย่างข้อจำกัดด้านทรัพยากร เอเจนต์อื่น ๆ หรือหน่วยความจำแบบต่อเนื่องเปลี่ยนไป ผลลัพธ์ก็เปลี่ยนไปโดยสิ้นเชิง
    พวกเรามัวแต่โฟกัสกับการปรับแต่งตัวโมเดลเอง และคิดถึง สภาพแวดล้อมการทำงาน ของมันน้อยเกินไป

  • ในที่สุดก็รู้สึกเหมือนมี LLM ที่ซื่อสัตย์ เกี่ยวกับโลกออกมาแล้ว
    คำตอบที่ว่า “ความหมายของชีวิตคืออาหาร” ดูจะผิดน้อยกว่าคำตอบจากโมเดลที่ใหญ่กว่านี้ 10,000 เท่า

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

    • แทบทำไม่ได้เลย ด้วยพารามิเตอร์ 9M ความจุจึงจำกัดมาก
      เป้าหมายของโปรเจ็กต์นี้คือการ สาธิตหลักการทำงาน ของ LLM
  • งานยอดเยี่ยมมาก ขอบคุณที่นำมาแบ่งปัน
    แต่ก็สงสัยว่าตอนนี้ LLM ให้ความรู้สึกว่า ‘หมดความลึกลับ’ ไปแล้วจริงหรือยัง
    เพราะมันยังน่าทึ่งอยู่ดีที่ผลลัพธ์แบบนี้เกิดขึ้นได้จากแค่สถิติเรียบง่ายกับพลังประมวลผลมหาศาล