ข้ามไปยังเนื้อหา

ฝึกโมเดลใน Docker: หนึ่งชิ้นงาน สี่เป้าหมาย

โมดูล 5 — ฝึกโมเดลและนำไปใช้หลายเป้าหมาย · สไลด์: slides.md · ภาพรวมโมดูล · หน้าหลักสูตร

เลิกยืมโมเดลสำเร็จรูปแล้วฝึกของเราเอง เริ่มจากเหตุผลที่ต้องฝึกใน Docker ภาพรวม “หนึ่งชิ้นงาน สี่เป้าหมาย” ของ model_int8.tflite แล้วรัน train.py กับ eval_pc.py ของจริง (หรือบน Colab) ก่อนเข้าใจ อ่าน log ให้ออกว่าแต่ละบรรทัดบอกอะไร

เมื่อจบบทเรียนนี้ คุณจะ:

  1. บอกเหตุผลที่ฝึกใน Docker ได้อย่างน้อยสองข้อ และอธิบายหน้าที่ของ -v “$PWD”:/work กับ –rm ในคำสั่ง docker run
  2. วาดแผนผังหนึ่งชิ้นงานสี่เป้าหมาย (MCU, PC, Web, Cortex-A) ของ model_int8.tflite และบอกได้ว่าทำไมมีแค่ MCU ที่ต้องผ่าน Vela
  3. รัน train.py และ eval_pc.py (ใน Docker หรือบน Colab) แล้วจดจำนวนหน้าต่างแต่ละกอง ความแม่น float32 และ int8 ขนาดไฟล์ และไฟล์ที่ต้องเดินทางคู่กับโมเดล

ผ่านชุดบทเรียน 5.1–5.2 มาแล้ว มี data/gestures.csv จากบอร์ด หรือสร้างชุดสังเคราะห์ด้วย python dataset_tools.py --synthesize --out data/gestures.csv ติดตั้ง Docker ไว้ (ครั้งแรกจะดาวน์โหลด TensorFlow หลายร้อย MB) หรือเตรียมเปิด notebook บน Google Colab

ในโฟลเดอร์ shared/training สั่ง docker build -t edgeai-train . ครั้งเดียว แล้ว docker run --rm -v "$PWD":/work edgeai-train python train.py --data data/gestures.csv --out model_int8.tflite ดู accuracy ไต่ขึ้นทุก epoch จนได้ไฟล์ model_int8.tflite ราว 11 KB โผล่ในโฟลเดอร์บนเครื่องเรา ก่อนรู้ว่าข้างในทำอะไร

การฝึกต้องใช้ TensorFlow กับไลบรารีอีกเป็นสิบ แต่ละเครื่องเวอร์ชันไม่ตรงกันจนเกิด “บนเครื่องผมรันได้นะ” Docker แก้ด้วยอิมเมจเดียว: Dockerfile เริ่มจาก python:3.11-slim ลง tensorflow, ai-edge-litert, numpy, scikit-learn และลง ethos-u-vela แยกชั้นไว้ ทุกคนจึงได้เวอร์ชันเดียวกันบน macOS, Windows และ Linux ไม่รกเครื่อง ลบทิ้งได้ -v "$PWD":/work เอาโฟลเดอร์ปัจจุบันไปวางใน container โค้ด ข้อมูล และผลลัพธ์จึงอยู่ที่เดียวกัน --rm ลบ container ทิ้งเมื่อจบ ถ้ายังไม่มี Docker ใช้ notebook train_edge_ai.ipynb บน Google Colab แทนได้ (notebook สังเคราะห์ข้อมูลเองในหน่วย g จึงใช้ซ้อม pipeline ได้ แต่โมเดลที่จะใช้กับบอร์ดต้องฝึกจาก CSV ของบอร์ด)

ทั้งโมดูลหมุนรอบไฟล์เดียว model_int8.tflite แบบ train once, run everywhere: PC รันด้วย eval_pc.py ผ่าน ai-edge-litert Cortex-A (Raspberry Pi, Jetson) รันไฟล์เดิมด้วยสคริปต์เดิม เบราว์เซอร์ใช้ฉบับที่ convert_web.py เตรียมให้ และ MCU ต้องคอมไพล์เพิ่มด้วย quantize_vela.sh (Vela) เพราะ Ethos-U55 ต้องการกราฟที่แปลงเป็น op ของ NPU ไฟล์ _vela.tflite ที่ได้จึงใช้ได้กับ MCU เท่านั้น

log ของ train.py กับชุดสังเคราะห์บอกทีละบรรทัด: train/val/test windows: 101 21 21 คือจำนวนหน้าต่างสามกอง ทุก epoch มี accuracy คู่กับ val_accuracy ที่ควรไต่ขึ้นด้วยกัน จากนั้น float32 test accuracy บนชุดที่โมเดลไม่เคยเห็น ขนาดไฟล์ที่เขียน (ไฟล์อ้างอิงในคอร์ส 11,504 ไบต์) และ model_int8.tflite.norm.npz ที่เก็บ mean/std ไว้ ไฟล์นี้ต้องเดินทางคู่กับโมเดลเสมอ eval_pc.py รันไฟล์ int8 จริงแล้วพิมพ์ int8 test accuracy กับ confusion matrix นี่คือ ground truth ก่อนเอาไปที่อื่น ชุดสังเคราะห์แยกคลาสง่ายจึงได้ตัวเลขสวย ข้อมูลจริงจะมีความสับสนบ้างเป็นเรื่องปกติ

สไลด์ของบทเรียนนี้อ้างถึงไฟล์ที่อยู่ในบทเรียนอื่นหรือใน shared/ ด้วย:

คำถามชุดเดียวกันอยู่ใน quiz.yaml สำหรับระบบที่ตรวจอัตโนมัติ

  1. ใน docker run –rm -v “$PWD”:/work edgeai-train python train.py ส่วน -v “$PWD”:/work ทำอะไร (เลือกหนึ่งข้อ · เป้าหมายข้อ 1)

    • ก) ลบ container ทิ้งเมื่อจบ
    • ข) เอาโฟลเดอร์ปัจจุบันบนเครื่องไปวางที่ /work ใน container โค้ด ข้อมูล และผลลัพธ์จึงอยู่ที่เดียวกัน
    • ค) ตั้งชื่ออิมเมจ
    • ง) ติดตั้ง TensorFlow ลงเครื่อง
    เฉลย

    ข — bind mount ทำให้ไฟล์ model_int8.tflite ที่เขียนใน /work โผล่บนเครื่องเราทันที ส่วน –rm คือลบ container และ -t ตอน build คือตั้งชื่อ

  2. เป้าหมายใดต้องคอมไพล์ model_int8.tflite เพิ่มอีกขั้นก่อนใช้ (เลือกหนึ่งข้อ · เป้าหมายข้อ 2)

    • ก) PC ผ่าน ai-edge-litert
    • ข) Cortex-A เช่น Raspberry Pi
    • ค) MCU ที่ใช้ Ethos-U55 ต้องผ่าน Vela
    • ง) ไม่มีเป้าหมายใดต้องทำเพิ่ม
    เฉลย

    ค — Vela แปลงส่วนที่ NPU รันได้เป็น op ของ Ethos-U ไฟล์ที่ได้จึงรันได้แค่บน MCU ส่วน PC และ Cortex-A ใช้ไฟล์ int8 เดิม

  3. log บอก float32 test accuracy 0.980 แต่ eval_pc.py บอก int8 test accuracy 0.600 ควรสงสัยอะไรก่อน (เลือกหนึ่งข้อ · เป้าหมายข้อ 3)

    • ก) ข้อมูลไม่สมดุล
    • ข) การบีบเป็น int8 (calibration หรือ normalize ที่ไม่ตรงกัน) มีปัญหา
    • ค) Docker ช้าเกินไป
    • ง) ไม่มีอะไรผิด int8 ควรแม่นน้อยกว่ามากเสมอ
    เฉลย

    ข — โมเดลเดียวกันควรได้ int8 ใกล้ float32 ถ้าตกมากให้ตรวจ representative dataset และไฟล์ .norm.npz ที่ใช้ normalize ตอนทดสอบ

  4. ไฟล์ใดต้องเดินทางคู่กับ model_int8.tflite ไปทุกเป้าหมาย (เลือกหนึ่งข้อ · เป้าหมายข้อ 3)

    • ก) Dockerfile
    • ข) model_int8.tflite.norm.npz ที่เก็บ mean/std ของชุดฝึก
    • ค) gestures.csv ทั้งไฟล์
    • ง) train.py
    เฉลย

    ข — ฝั่งที่ใช้โมเดลต้อง normalize ข้อมูลด้วย mean/std ชุดเดียวกับตอนฝึก ไม่งั้นโมเดลไม่ error แต่ทายผิดเงียบ ๆ

  • build อิมเมจแล้วรัน train.py กับ eval_pc.py (หรือรัน notebook บน Colab จนจบ) จดตัวเลขทุกบรรทัดที่อธิบายไว้ลงบันทึกการเรียน
  • วาดแผนผัง model_int8.tflite ไปสี่เป้าหมาย พร้อมเขียนชื่อสคริปต์ของแต่ละทาง
  • ลบ model_int8.tflite.norm.npz ทิ้งแล้วรัน eval_pc.py อีกครั้ง จดว่าเกิดอะไรและเพราะอะไร

บทเรียน 5.4 เราจะเปิด train.py แกะสี่จังหวะ build, fit, convert, eval พร้อมคณิตเบื้องหลังแต่ละจังหวะ

บทเรียนถัดไป: บทเรียน 5.4 — ข้างในการฝึก: Keras, Conv1D, gradient descent, int8 และ confusion matrix

  • งานอื่นที่คุณเคยเจอปัญหา “บนเครื่องผมรันได้” มีอะไรบ้าง Docker ช่วยได้ไหม
  • ถ้าต้องส่งโมเดลให้ทีมเว็บกับทีมเฟิร์มแวร์พร้อมกัน คุณจะส่งไฟล์อะไรให้ใครบ้าง

คำถามทบทวน

ลองตอบเองก่อน แล้วค่อยเปิดดูเฉลย

  1. ใน docker run --rm -v "$PWD":/work edgeai-train python train.py ส่วน -v "$PWD":/work ทำอะไร (เป้าหมายข้อ 1)

    1. ลบ container ทิ้งเมื่อจบ
    2. เอาโฟลเดอร์ปัจจุบันบนเครื่องไปวางที่ /work ใน container โค้ด ข้อมูล และผลลัพธ์จึงอยู่ที่เดียวกัน
    3. ตั้งชื่ออิมเมจ
    4. ติดตั้ง TensorFlow ลงเครื่อง
    ดูเฉลย

    คำตอบ: B. เอาโฟลเดอร์ปัจจุบันบนเครื่องไปวางที่ /work ใน container โค้ด ข้อมูล และผลลัพธ์จึงอยู่ที่เดียวกัน

    bind mount ทำให้ไฟล์ model_int8.tflite ที่เขียนใน /work โผล่บนเครื่องเราทันที ส่วน --rm คือลบ container และ -t ตอน build คือตั้งชื่อ

  2. เป้าหมายใดต้องคอมไพล์ model_int8.tflite เพิ่มอีกขั้นก่อนใช้ (เป้าหมายข้อ 2)

    1. PC ผ่าน ai-edge-litert
    2. Cortex-A เช่น Raspberry Pi
    3. MCU ที่ใช้ Ethos-U55 ต้องผ่าน Vela
    4. ไม่มีเป้าหมายใดต้องทำเพิ่ม
    ดูเฉลย

    คำตอบ: C. MCU ที่ใช้ Ethos-U55 ต้องผ่าน Vela

    Vela แปลงส่วนที่ NPU รันได้เป็น op ของ Ethos-U ไฟล์ที่ได้จึงรันได้แค่บน MCU ส่วน PC และ Cortex-A ใช้ไฟล์ int8 เดิม

  3. log บอก float32 test accuracy 0.980 แต่ eval_pc.py บอก int8 test accuracy 0.600 ควรสงสัยอะไรก่อน (เป้าหมายข้อ 3)

    1. ข้อมูลไม่สมดุล
    2. การบีบเป็น int8 (calibration หรือ normalize ที่ไม่ตรงกัน) มีปัญหา
    3. Docker ช้าเกินไป
    4. ไม่มีอะไรผิด int8 ควรแม่นน้อยกว่ามากเสมอ
    ดูเฉลย

    คำตอบ: B. การบีบเป็น int8 (calibration หรือ normalize ที่ไม่ตรงกัน) มีปัญหา

    โมเดลเดียวกันควรได้ int8 ใกล้ float32 ถ้าตกมากให้ตรวจ representative dataset และไฟล์ .norm.npz ที่ใช้ normalize ตอนทดสอบ

  4. ไฟล์ใดต้องเดินทางคู่กับ model_int8.tflite ไปทุกเป้าหมาย (เป้าหมายข้อ 3)

    1. Dockerfile
    2. model_int8.tflite.norm.npz ที่เก็บ mean/std ของชุดฝึก
    3. gestures.csv ทั้งไฟล์
    4. train.py
    ดูเฉลย

    คำตอบ: B. model_int8.tflite.norm.npz ที่เก็บ mean/std ของชุดฝึก

    ฝั่งที่ใช้โมเดลต้อง normalize ข้อมูลด้วย mean/std ชุดเดียวกับตอนฝึก ไม่งั้นโมเดลไม่ error แต่ทายผิดเงียบ ๆ

อ้างอิงบทเรียนนี้

ถ้านำบทเรียนนี้ไปสอน ทำสไลด์ หรือทำเอกสารต่อ ให้อ้างอิงด้วยข้อความนี้ ถ้าดัดแปลงเนื้อหา ให้เติม (ดัดแปลง)ต่อท้ายชื่อบทเรียน

"ฝึกโมเดลใน Docker: หนึ่งชิ้นงาน สี่เป้าหมาย" จาก TESA Open Knowledge โดยสมาคมสมองกลฝังตัวไทย (Thai Embedded Systems Association: TESA) https://github.com/tesaiot/tesa-qualification-program สัญญาอนุญาต CC BY-NC 4.0

ข้อความอ้างอิงภาษาอังกฤษ: "Training in Docker: one artifact, four targets" from TESA Open Knowledge by the Thai Embedded Systems Association (TESA), https://github.com/tesaiot/tesa-qualification-program, licensed under CC BY-NC 4.0

ลิงก์บทเรียน: https://tesaiot.github.io/tesa-qualification-program/courses/edge-ai-developer/m05-training/l03-training-pipeline/

วิธีอ้างอิง TESA ฉบับเต็ม

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

เนื้อหาเผยแพร่ภายใต้ CC BY-NC 4.0 นำไปใช้ต่อในงานที่ไม่ใช่เพื่อการค้าได้ โปรดอ้างอิงสมาคมสมองกลฝังตัวไทย (TESA) ทุกครั้ง · วิธีอ้างอิง TESA