1 คะแนน โดย GN⁺ 3 시간 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • รันโมเดลภาษาพารามิเตอร์ 28.9 ล้านตัวบน ESP32-S3 โดยไม่ต้องเชื่อมต่อเซิร์ฟเวอร์ และแสดงข้อความบนจอเล็กได้ประมาณ 9 โทเคนต่อวินาที
  • ใช้โครงสร้าง Per-Layer Embeddings โดยเก็บพารามิเตอร์ 25 ล้านตัวจากทั้งหมดไว้ในแฟลชที่ช้า และอ่านเพียงประมาณ 6 แถวที่จำเป็นต่อแต่ละโทเคน หรือ 450 ไบต์
  • โมเดลมีขนาด 14.9MB ที่ 4 บิต โดยวางคอร์คำนวณที่ใช้กับทุกโทเคนไว้ใน SRAM 512KB, output head และหน่วยความจำทำงานไว้ใน PSRAM 8MB และตาราง embedding ขนาดใหญ่ไว้ในแฟลช 16MB
  • ฝึกด้วย TinyStories จึงสร้างเรื่องสั้นเรียบง่ายได้ค่อนข้างสอดคล้อง แต่ไม่เหมาะกับการถามตอบ การทำตามคำสั่ง การเขียนโค้ด หรือความรู้เชิงข้อเท็จจริง
  • บรรจุพารามิเตอร์ได้มากกว่าโมเดลพารามิเตอร์ 260,000 ตัวที่เคยรันบนชิปคล้ายกันประมาณ 100 เท่า โดยหัวใจสำคัญอยู่ที่โครงสร้างหน่วยความจำสำหรับยัดโมเดลขนาดใหญ่ลงในชิปเล็ก มากกว่าคุณภาพการสร้างข้อความ

ฮาร์ดแวร์และประสิทธิภาพการรัน

  • ประมวลผลทั้งหมดบน ESP32-S3 ตัวเดียวราคาประมาณ 8 ดอลลาร์ โดยไม่ส่งข้อมูลไปยังเซิร์ฟเวอร์
    • ใช้ SRAM 512KB, PSRAM 8MB และแฟลช 16MB
    • ความเร็วรวมประมาณ 9.5 tok/s และความเร็วคำนวณล้วนประมาณ 9.7 tok/s
    • ขนาดโมเดล 4 บิตคือ 14.9MB
  • จากพารามิเตอร์ทั้งหมด 28.9 ล้านตัว มี 25 ล้านตัว ถูกเก็บไว้ในตาราง lookup บนแฟลช

วิธีใส่โมเดลลงในหน่วยความจำขนาดเล็ก

  • โดยทั่วไป โมเดลทั้งหมดต้องเข้าถึงได้จากหน่วยความจำความเร็วสูง แต่ SRAM ของ ESP32-S3 มีเพียง 512KB จึงรองรับได้แค่โมเดลขนาดเล็กมาก
  • อาศัยข้อเท็จจริงว่าพารามิเตอร์ส่วนใหญ่อยู่ในตาราง embedding ที่ไม่ได้เป็นเป้าหมายของการคำนวณ จึงปล่อยตารางไว้ในแฟลช
    • อ่านเพียงประมาณ 6 แถวที่จำเป็นต่อแต่ละโทเคน หรือประมาณ 450 ไบต์
    • เก็บเฉพาะส่วนเล็ก ๆ ที่ทำหน้าที่คำนวณจริงไว้ในหน่วยความจำความเร็วสูง
    • โมเดลส่วนใหญ่จะไม่ถูกโหลดระหว่างรัน แต่เลือกเฉพาะส่วนที่จำเป็นจากแฟลช
  • บทบาทของหน่วยความจำแบ่งดังนี้
    • SRAM: คอร์คำนวณที่ใช้กับทุกโทเคน
    • PSRAM: output head และหน่วยความจำทำงาน
    • แฟลช: ตารางพารามิเตอร์ 25 ล้านตัว

การใช้ Per-Layer Embeddings

  • นำ Per-Layer Embeddings ที่ใช้ใน Gemma 3n และ Gemma 4 ของ Google มาปรับใช้กับโครงสร้างหน่วยความจำของไมโครคอนโทรลเลอร์ แทนที่จะเป็นโทรศัพท์มือถือหรือ GPU
  • เท่าที่ผู้สร้างโปรเจกต์ตรวจสอบ ยังไม่พบกรณีก่อนหน้าที่นำวิธีนี้มาใช้กับชิปขนาดเล็กเช่นนี้

สิ่งที่โมเดลทำได้และข้อจำกัด

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

โค้ดและข้อมูลการทดลอง

  • firmware/esp32_llm/README.md มีเฟิร์มแวร์ การเดินสาย และขั้นตอนการแฟลช
  • src/ และ experiments/ มีโค้ดสำหรับการฝึก การทดลอง ablation และการ quantization
  • RESULTS.md สรุปวิธีการทั้งหมด การทดลอง ablation และ ค่าที่วัดบนชิป

โปรเจกต์พื้นฐานและบันทึก

  • TinyStories เป็นชุดข้อมูลเรื่องสั้นสังเคราะห์ที่สร้างขึ้นเพื่อให้โมเดลขนาดเล็กเรียนรู้การเขียนที่สอดคล้องได้
  • Per-Layer Embeddings ของ Google Gemma เป็นพื้นฐานที่ช่วยบรรจุโมเดลขนาดใหญ่ลงในชิปขนาดเล็ก
  • llama2.c ของ Andrej Karpathy มีอิทธิพลต่อแนวทางการฝึกโมเดลภาษาขนาดเล็กและรันด้วย C ล้วน
  • ใน repository ยังเก็บ ข้อผิดพลาดในการคำนวณ ที่เคยทำให้จำนวนพารามิเตอร์ช่วงแรกสูงเกินจริง และกระบวนการแก้ไขไว้ด้วย
    • สามารถดูจุดที่ตัวเลขเปลี่ยนและเหตุผลได้จากประวัติ commit และ RESULTS.md

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

 
GN⁺ 3 시간 전
ความคิดเห็นจาก Hacker News
  • ทุกวันนี้สิ่งที่ทำได้ด้วย ไมโครคอนโทรลเลอร์ราคา 5 ดอลลาร์ น่าทึ่งมาก ในบรรดา บอร์ด Milk-V รุ่น Duo มีหน่วยความจำได้สูงสุด 256MB พร้อม TPU 1TOPS@INT8 และยังรัน Linux ได้ เลยซื้อมา 5 ตัว

    • อีกจุดที่ไม่ควรมองข้ามคือ 128-bit vector ISA และรีจิสเตอร์ 32 ตัว รองรับจำนวนเต็มและ floating point สูงสุด 64 บิต และเมื่อ LMUL=8 จะประมวลผลได้ 1,024 บิตด้วยคำสั่งเดียว โดยโอเปอเรชันส่วนใหญ่ใช้ 3 ไซเคิลต่อ 128 บิต
      GCC และ Clang รองรับ xTHeadVector อย่างสมบูรณ์ และถ้าใช้ C intrinsics ก็จะเข้ากันได้กับ RVV 1.0 ด้วยแค่ตัวเลือกบรรทัดคำสั่ง โค้ดจำนวนมากอย่าง memcpy(), memset(), memcmp(), strlen(), strcpy(), strcmp() ที่จัดการองค์ประกอบ 8 บิตยังเข้ากันได้ในระดับไบนารี
      ตอนซื้อ Duo 64MB ราคาอยู่ที่ 3 ดอลลาร์ และหลังจากนั้นรุ่น 64MB·256MB·512MB อยู่ที่ 5·7·10 ดอลลาร์ตามลำดับ แต่ปีนี้ราคาขึ้นไปมาก: https://arace.tech/products/milk-v-duo, https://arace.tech/products/milkv-duo-s
    • ไมโครคอนโทรลเลอร์ราคาต่ำกว่า 0.5 ดอลลาร์ก็มีขาย แต่แม้แต่สินค้าราคา 5 ดอลลาร์ก็ดูมีข้อจำกัดหนักเกินไปสำหรับการรันโมเดล จนแทบเป็นสภาพแวดล้อมที่ใช้งานจริงไม่ได้ หวังว่าจะไม่เกิด ภาวะ MCU ขาดตลาด เพราะความต้องการจากโมเดล
    • ไม่จำเป็นต้องคิดว่าไมโครคอนโทรลเลอร์ยังติดอยู่กับฮาร์ดแวร์ยุค 1980 และมี assembly หรือ C เป็นตัวเลือกเดียว อุปกรณ์ระดับนี้สามารถรันระบบปฏิบัติการของ Xerox PARC ได้สบาย
      แม้จะยังมีงานที่ 4KB PIC เป็นตัวเลือกที่ดีที่สุด แต่ในสถานการณ์ส่วนใหญ่ก็ไม่ควรทำเหมือนไม่มีตัวเลือกที่ดีกว่า
    • ราคาและประสิทธิภาพระดับนี้ทำให้รู้สึกชัดว่า สถานะผูกขาดของ ARM สร้างต้นทุนให้ทั้งอุตสาหกรรมมากแค่ไหน
  • โมเดลแปลงเสียงเป็นข้อความและข้อความเป็นเสียงก็เริ่มเข้าใกล้ขนาดนี้แล้ว เลยสงสัยว่า อุปกรณ์ขนาดเล็ก ที่คุยกับเราได้ใกล้แค่ไหนแล้ว อาจถึงวันที่แปรงสีฟันให้คำแนะนำเรื่องสุขอนามัยช่องปากหรือแม้แต่ยิงโฆษณายาสีฟัน

    • คำแนะนำเรื่องสุขอนามัยช่องปากนั้นทำได้อยู่แล้ว แปรงสีฟัน Philips ระดับสูงเชื่อมต่อ Bluetooth และให้ฟีดแบ็กผ่านแอปได้
      แต่ไม่อยากอยู่ในโลกที่ต้องหา ตัวบล็อกโฆษณา สำหรับ AI ในแปรงสีฟันด้วย
  • ใช้ เทคนิค embedding แยกตามเลเยอร์ ได้ฉลาดมาก มีโมเดล TTS ที่ใช้งานได้จริงขนาดราว 20–30 ล้านพารามิเตอร์อยู่ด้วย ดังนั้น ESP32 ที่ไม่เชื่อมต่อเครือข่ายก็อาจอ่านข้อความออกเสียงได้แทบเรียลไทม์

    • อยากลองทดสอบการจัดวางแบบให้แต่ละ MCU รับผิดชอบคนละเลเยอร์ของโมเดล โดยเชื่อม RP2350 หลายตัวด้วยสายเฉพาะของ PIO และใช้ interpolator ร่วมกับคำสั่งคูณสองชั้น
      PSRAM, แฟลช และ SD card ต่างก็มีแบนด์วิดท์รายตัวไม่สูงนัก แต่ถ้าให้หลายตัวทำงานพร้อมกันก็อาจไปถึงอัตราประมวลผลที่สูงพอสมควรได้ ฮาร์ดแวร์เฉพาะทางขนาดใหญ่จะยังเหนือกว่าในแง่ประสิทธิภาพต่อพลังงาน แต่การจัดแบบนี้ก็น่าสนใจเพราะ ต้นทุนเริ่มต้นต่ำและขยายเพิ่มได้ทีละขั้น
  • อยากรู้ว่ามีทางเลือกที่ใช้งานได้จริงอะไรบ้าง นอกจากไมโครคอนโทรลเลอร์ สำหรับทำให้ local LLM บน Raspberry Pi 4 ไม่ต้องใช้เวลาตอบทีละ 30 วินาที

  • การรัน LLM บนอุปกรณ์จิ๋วก็น่าทึ่ง แต่ที่น่าประทับใจกว่านั้นคือ วิธีการฝึก ที่สร้างน้ำหนักแบบนี้ขึ้นมา

    • ในช่วงพารามิเตอร์ขนาดเล็ก การทำ optimization แบบหนัก ๆ เพื่อไล่คะแนน benchmark อย่างเดียวทำได้ยาก ดังนั้นประโยชน์ของ leaderboard ยังไม่หมดไป ตรงกันข้าม มันยังมีบทบาทในการหาโมเดลที่เล็กลงแต่ให้ประสิทธิภาพบน benchmark เท่าเดิม พร้อมทั้งผลักดันให้ขั้นตอนการทำโมเดลรับรู้และตัดความสามารถในการบีบอัดกับความซ้ำซ้อนออกตั้งแต่ต้น
  • ถ้าใช้แฟลชด้วย access pattern ที่ดีพอ จะขยายแนวทางนี้ไปเป็นการรัน โมเดลที่ใหญ่กว่ามาก บน CPU ได้หรือไม่

    • ไม่นานมานี้มีความพยายามคล้ายกัน ใช้ CPU เดสก์ท็อปทั่วไป, NVMe SSD และ RAM ราว 25GB เพื่อรัน GLM-5.2 แต่ความเร็วอยู่ในระดับ สูงสุด 20 วินาทีต่อโทเค็น ไม่ใช่โทเค็นต่อวินาที: https://github.com/JustVugg/colibri
    • แบนด์วิดท์แฟลชของ ESP32 มีได้เพียงราว 1 ใน 4 ของ SRAM ภายใน ในระบบที่แรงกว่านี้ช่องว่างจะยิ่งกว้างขึ้นมาก และหากต้องการใช้ แบนด์วิดท์หน่วยความจำ ให้คุ้มกับพลังประมวลผลที่เพิ่มขึ้น ก็ต้องป้อนข้อมูลมากขึ้นอย่างมาก
  • ESP32-S3 ทรงพลังพอสมควร จนตอนนี้กำลังใช้กับงานพัฒนา Raspberry Pi 4 อยู่ หนึ่งในพอร์ต USB สองพอร์ตรองรับ OTG จึงทำฟังก์ชันที่ถ้าใช้วิธีอื่นอาจต้องเสียเกิน 100 ดอลลาร์ได้

    • ถ้ายอมรับข้อจำกัดบางอย่างได้ ก็จัดแบบคล้ายกันด้วย RP2350 ได้ในราคาประมาณ 1 ดอลลาร์ ความเร็วสูงสุดคือ USB Full Speed ที่ 12Mbps โดยใช้อุปกรณ์ต่อพ่วง USB ในชิปสำหรับตัวหนึ่ง และอีกตัวต่อกับขา GPIO ที่ PIO รองรับ
      ตอนนี้ใช้งานกับ tinyusb และ pico-pio-usb ได้แล้ว และก็กำลังทดลองพอร์ตไป Rust โดยหวังประสิทธิภาพที่สูงขึ้น
  • อยากรู้ว่า ความแม่นยำของโมเดล quantized นี้อยู่ในระดับไหน

  • ประสิทธิภาพ ที่แสดงได้ในขนาดเท่านี้น่าทึ่งมาก และทำให้น่าคาดหวังว่า single-board computer ที่แรงขึ้นอีกเล็กน้อยตามที่พูดถึงในเธรดจะทำอะไรได้บ้าง