- รันโมเดลภาษาพารามิเตอร์ 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 และการ quantizationRESULTS.mdสรุปวิธีการทั้งหมด การทดลอง ablation และ ค่าที่วัดบนชิป
โปรเจกต์พื้นฐานและบันทึก
- TinyStories เป็นชุดข้อมูลเรื่องสั้นสังเคราะห์ที่สร้างขึ้นเพื่อให้โมเดลขนาดเล็กเรียนรู้การเขียนที่สอดคล้องได้
- Per-Layer Embeddings ของ Google Gemma เป็นพื้นฐานที่ช่วยบรรจุโมเดลขนาดใหญ่ลงในชิปขนาดเล็ก
- llama2.c ของ Andrej Karpathy มีอิทธิพลต่อแนวทางการฝึกโมเดลภาษาขนาดเล็กและรันด้วย C ล้วน
- ใน repository ยังเก็บ ข้อผิดพลาดในการคำนวณ ที่เคยทำให้จำนวนพารามิเตอร์ช่วงแรกสูงเกินจริง และกระบวนการแก้ไขไว้ด้วย
- สามารถดูจุดที่ตัวเลขเปลี่ยนและเหตุผลได้จากประวัติ commit และ
RESULTS.md
- สามารถดูจุดที่ตัวเลขเปลี่ยนและเหตุผลได้จากประวัติ commit และ
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ทุกวันนี้สิ่งที่ทำได้ด้วย ไมโครคอนโทรลเลอร์ราคา 5 ดอลลาร์ น่าทึ่งมาก ในบรรดา บอร์ด Milk-V รุ่น Duo มีหน่วยความจำได้สูงสุด 256MB พร้อม TPU 1TOPS@INT8 และยังรัน Linux ได้ เลยซื้อมา 5 ตัว
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
แม้จะยังมีงานที่ 4KB PIC เป็นตัวเลือกที่ดีที่สุด แต่ในสถานการณ์ส่วนใหญ่ก็ไม่ควรทำเหมือนไม่มีตัวเลือกที่ดีกว่า
โมเดลแปลงเสียงเป็นข้อความและข้อความเป็นเสียงก็เริ่มเข้าใกล้ขนาดนี้แล้ว เลยสงสัยว่า อุปกรณ์ขนาดเล็ก ที่คุยกับเราได้ใกล้แค่ไหนแล้ว อาจถึงวันที่แปรงสีฟันให้คำแนะนำเรื่องสุขอนามัยช่องปากหรือแม้แต่ยิงโฆษณายาสีฟัน
แต่ไม่อยากอยู่ในโลกที่ต้องหา ตัวบล็อกโฆษณา สำหรับ AI ในแปรงสีฟันด้วย
ใช้ เทคนิค embedding แยกตามเลเยอร์ ได้ฉลาดมาก มีโมเดล TTS ที่ใช้งานได้จริงขนาดราว 20–30 ล้านพารามิเตอร์อยู่ด้วย ดังนั้น ESP32 ที่ไม่เชื่อมต่อเครือข่ายก็อาจอ่านข้อความออกเสียงได้แทบเรียลไทม์
PSRAM, แฟลช และ SD card ต่างก็มีแบนด์วิดท์รายตัวไม่สูงนัก แต่ถ้าให้หลายตัวทำงานพร้อมกันก็อาจไปถึงอัตราประมวลผลที่สูงพอสมควรได้ ฮาร์ดแวร์เฉพาะทางขนาดใหญ่จะยังเหนือกว่าในแง่ประสิทธิภาพต่อพลังงาน แต่การจัดแบบนี้ก็น่าสนใจเพราะ ต้นทุนเริ่มต้นต่ำและขยายเพิ่มได้ทีละขั้น
อยากรู้ว่ามีทางเลือกที่ใช้งานได้จริงอะไรบ้าง นอกจากไมโครคอนโทรลเลอร์ สำหรับทำให้ local LLM บน Raspberry Pi 4 ไม่ต้องใช้เวลาตอบทีละ 30 วินาที
การรัน LLM บนอุปกรณ์จิ๋วก็น่าทึ่ง แต่ที่น่าประทับใจกว่านั้นคือ วิธีการฝึก ที่สร้างน้ำหนักแบบนี้ขึ้นมา
ถ้าใช้แฟลชด้วย access pattern ที่ดีพอ จะขยายแนวทางนี้ไปเป็นการรัน โมเดลที่ใหญ่กว่ามาก บน CPU ได้หรือไม่
ESP32-S3 ทรงพลังพอสมควร จนตอนนี้กำลังใช้กับงานพัฒนา Raspberry Pi 4 อยู่ หนึ่งในพอร์ต USB สองพอร์ตรองรับ OTG จึงทำฟังก์ชันที่ถ้าใช้วิธีอื่นอาจต้องเสียเกิน 100 ดอลลาร์ได้
ตอนนี้ใช้งานกับ tinyusb และ pico-pio-usb ได้แล้ว และก็กำลังทดลองพอร์ตไป Rust โดยหวังประสิทธิภาพที่สูงขึ้น
อยากรู้ว่า ความแม่นยำของโมเดล quantized นี้อยู่ในระดับไหน
ประสิทธิภาพ ที่แสดงได้ในขนาดเท่านี้น่าทึ่งมาก และทำให้น่าคาดหวังว่า single-board computer ที่แรงขึ้นอีกเล็กน้อยตามที่พูดถึงในเธรดจะทำอะไรได้บ้าง