1. 🏁 บทนำและภาพรวมของ CLI
ยินดีต้อนรับสู่ Codelab แบบลงมือปฏิบัติจริงเกี่ยวกับ LiteRT CLI 101 คู่มือนี้ออกแบบมาเพื่อแนะนำคุณทีละขั้นตอนตั้งแต่การตั้งค่าสภาพแวดล้อมเริ่มต้นไปจนถึงการทำให้ระบบอัจฉริยะ Edge ที่เพิ่มประสิทธิภาพแล้วใช้งานได้
🌟 ข้อมูลเบื้องต้น
Edge AI ต้องใช้โมเดลโครงข่ายประสาทเทียมที่ซับซ้อนบนโทรศัพท์มือถือ อุปกรณ์สวมใส่ และฮาร์ดแวร์แบบฝังโดยตรง
- LiteRT (เดิมชื่อ TensorFlow Lite / TFLite) เป็นเฟรมเวิร์กในอุปกรณ์ของ Google สำหรับการทำให้ ML และ GenAI ที่มีประสิทธิภาพสูงใช้งานได้บนแพลตฟอร์ม Edge ผ่านการแปลง การรันไทม์ และการเพิ่มประสิทธิภาพที่มีประสิทธิภาพ
- LiteRT CLI ผสานรวมสแต็ก Google AI Edge เข้ากับคำสั่งเชลล์แบบสแตนด์อโลน (
litert) เพื่อปรับปรุงเวิร์กโฟลว์การพัฒนาที่เกี่ยวข้องกับ LiteRT ซึ่งรวมถึงการแปลง การหาปริมาณ การคอมไพล์ การเรียกใช้ การวัดประสิทธิภาพ และการแสดงภาพโมเดล LiteRT (TFLite) บนฮาร์ดแวร์ต่างๆ (CPU / GPU / NPU) ในแพลตฟอร์มต่างๆ (เดสก์ท็อป อุปกรณ์เคลื่อนที่ หรือระบบคลาวด์)
2. 🔄 เวิร์กโฟลว์พื้นฐาน: การแปลง การหาปริมาณ และการเรียกใช้
ในส่วนนี้ เราจะดำเนินการตามวงจรการสร้างโมเดล Edge AI ที่สมบูรณ์ด้วย LiteRT CLI ได้แก่ ตัวห่อหุ้มโมเดล PyTorch ➔ การแปลงการติดตาม ➔ การหาปริมาณโมเดล ➔ การอนุมานบนเดสก์ท็อป ➔ การวัดประสิทธิภาพ
📝 ขั้นตอนที่ 1: เตรียมสคริปต์ตัวห่อหุ้มโมเดล PyTorch
สร้าง resnet18.py ในไดเรกทอรีปัจจุบัน โดยจะแสดงฮุกการติดตามแบบไดนามิกเพื่อให้ตัวสร้างกราฟสามารถจับรูปร่างได้
import torch
import torchvision
def get_model(batch_size: int = 1) -> torch.nn.Module:
model = torchvision.models.resnet18(
weights=torchvision.models.ResNet18_Weights.IMAGENET1K_V1
)
model.eval()
return model
def get_args(batch_size: int = 1) -> tuple[torch.Tensor, ...]:
return (torch.randn(batch_size, 3, 224, 224),)
🔄 ขั้นตอนที่ 2: แปลงโมเดล PyTorch เป็น LiteRT โดยใช้ LiteRT Torch
เรียกใช้ตัวแปลง LiteRT Torch เพื่อสร้างโมเดลเป้าหมาย .tflite Float32 มาตรฐาน
# Convert PyTorch source to LiteRT
litert convert resnet18.py --output resnet18
# Verify target was exported
ls -lh resnet18/resnet18.tflite
📉 ขั้นตอนที่ 3: หาปริมาณน้ำหนักเป็น INT8
ใช้การ์ดสูตรแบบไดนามิกและแบบน้ำหนักเท่านั้นเพื่อลดขนาดลงประมาณ 4 เท่า
# 1. Dynamic Range Quantization (Dynamic activations + static INT8 weights)
litert quantize resnet18/resnet18.tflite \
--recipe dynamic_wi8_afp32 \
--output resnet18/resnet18_int8_dynamic.tflite
# 2. Weight-Only Quantization (Float32 activations + static INT8 weights)
litert quantize resnet18/resnet18.tflite \
--recipe weight_only_wi8_afp32 \
--output resnet18/resnet18_int8_weight_only.tflite
🚀 ขั้นตอนที่ 4: เรียกใช้การอนุมานในเครื่อง
ดำเนินการทดสอบด้วยพารามิเตอร์อินพุตจำลองเพื่อยืนยันบล็อกประสิทธิภาพ
# Run original Float32 model inference
litert run resnet18/resnet18.tflite --desktop --cpu
# Run optimized Dynamic INT8 model inference
litert run resnet18/resnet18_int8_dynamic.tflite --cpu --iterations 1
📊 ขั้นตอนที่ 5: วัดประสิทธิภาพของโมเดล
วัดเมตริกที่มีความแม่นยำสูง ซึ่งรวมถึงเวลาในการตอบสนองเฉลี่ย ต้นทุนการเริ่มต้นใช้งาน ปริมาณงานการดำเนินการของ CPU และรอยเท้าหน่วยความจำที่ใช้งานอยู่แบบไดนามิก
# Benchmark original Float32 model
litert benchmark resnet18/resnet18.tflite --desktop --cpu
# Benchmark optimized Dynamic range INT8 model
litert benchmark resnet18/resnet18_int8_dynamic.tflite --desktop --cpu
3. 🔌 การตั้งค่าและการยืนยันสภาพแวดล้อมภายใน
มาสร้างแซนด์บ็อกซ์ที่แยกต่างหากและสะอาดบนเวิร์กสเตชัน (macOS หรือ Linux) กัน
🔌 ตัวเลือก ก: การตั้งค่าที่รวดเร็วเป็นพิเศษ (uv)
การใช้ uv จะแยกไลบรารีออกในไม่กี่วินาที ซึ่งจะล้างข้อขัดแย้งของแคชสภาพแวดล้อม
# Create active workspace sandbox
uv venv --clear --python=3.13 --seed
source .venv/bin/activate
# Install litert-cli from pypi
uv pip install litert-cli-nightly
🐍 ตัวเลือก ข: การตั้งค่ามาตรฐาน (pip)
หากไม่มี uv ให้ใช้การกำหนดค่าสภาพแวดล้อมเสมือนของ Python มาตรฐาน
# Create active workspace sandbox
python3 -m venv .venv
source .venv/bin/activate
# Install litert-cli from pypi
pip install --upgrade pip setuptools wheel
pip install litert-cli-nightly
🛠️ ตัวเลือก ค: การตั้งค่าภายในที่แก้ไขได้
หากคุณกำลังพัฒนาหรือทดสอบภายในโคลนไดเรกทอรีต้นทางของที่เก็บโดยตรง ให้ทำดังนี้
# Create active workspace sandbox
uv venv --clear --python=3.13 --seed
source .venv/bin/activate
# Install from local directory root
uv pip install -e .
🔍 การยืนยันการตั้งค่า
ตรวจสอบว่าเส้นทางกำหนดเส้นทางคำสั่ง litert อย่างถูกต้อง
litert --help
💡 แคตตาล็อกการอ้างอิงโมเดลส่วนกลาง (model-ref)
LiteRT CLI ใช้ แคตตาล็อกโมเดล ส่วนกลางเพื่อให้สคริปต์และการพัฒนามีความเสถียร
- รูปแบบ: กำหนดชื่อที่ไม่ซ้ำกัน (นามแฝง) ให้กับโมเดลที่ดาวน์โหลดหรือนำเข้า เช่น
mobilenet - ตัวแปร: ใช้โคลอนเป้าหมายเพื่ออ้างถึงตัวแปรที่เพิ่มประสิทธิภาพ เช่น
mobilenet:int8หรือmobilenet:gpu - ความเรียบง่าย: คำสั่ง CLI ทั้งหมดยอมรับนามแฝง
ที่ไม่มีเส้นทางนี้โดยตรง ซึ่งจะแก้ปัญหาที่เก็บไฟล์จริงโดยอัตโนมัติในทันที
4. 📲 การทำให้ใช้งานได้และการสร้างโปรไฟล์อุปกรณ์
มาเพิ่มประสิทธิภาพด้วยการเรียกใช้การวัดประสิทธิภาพภายในที่มีความแม่นยำสูง การทำให้ใช้งานได้กับเป้าหมายฮาร์ดแวร์ USB จริง การใช้ผู้รับมอบสิทธิ์ฮาร์ดแวร์ การคอมไพล์ล่วงหน้า และการวัดประสิทธิภาพระบบคลาวด์
📊 เมตริกการสร้างโปรไฟล์ภายใน
ดาวน์โหลด EfficientNet-B1 และสร้างโปรไฟล์สถิติประสิทธิภาพในโฮสต์เดสก์ท็อป
# Download and register model alias in central catalog
litert download litert-community/efficientnet_b1 --file "*.tflite" --output efficientnet
litert import efficientnet/efficientnet_b1.tflite --model-ref efficientnet_b1
# Run high-precision benchmark on desktop CPU
litert benchmark efficientnet_b1 --desktop --cpu
สังเกตส่วนหัวของประสิทธิภาพหลักในบันทึกการวัดประสิทธิภาพ
Model initialization: เวลาในการบูตเครือข่ายโครงสร้างWarmup (avg): เวลาในการโอเวอร์เฮดการคอมไพล์Inference (avg): เวลาในการประมวลผลทางคณิตศาสตร์แบบดิบOverall footprint: RAM สูงสุดที่ใช้ระหว่างการดำเนินการ
📲 เป้าหมาย ก: CPU ของอุปกรณ์เคลื่อนที่ (เชื่อมต่อ USB)
เชื่อมต่ออุปกรณ์ Android ที่เปิดใช้การแก้ไขข้อบกพร่อง USB แล้วทำให้ใช้งานได้โดยทำดังนี้
# 1. Confirm device connection
adb devices
# 2. Push and execute model on mobile CPU
litert run efficientnet_b1 --android --cpu
CLI จะพุชโมเดลไปยังอุปกรณ์เป้าหมาย เรียกใช้ลูปการอนุมาน และส่งเอาต์พุตกลับโดยอัตโนมัติ
🎮 เป้าหมาย ข: GPU ของอุปกรณ์เคลื่อนที่
โอนเวิร์กโหลดที่หนักหน่วงไปยัง GPU แบบไดนามิกโดยใช้ OpenCL หรือ WebGPU
# Benchmark model performance on mobile GPU
litert benchmark efficientnet_b1 --android --gpu
# Run inference with GPU acceleration and CPU fallback
litert run efficientnet_b1 --android --accelerator gpu,cpu
⚙️ เป้าหมาย ค: JIT Android NPU
ลดภาระพารามิเตอร์การดำเนินการไปยัง NPU โดยตรงในชิปเซ็ตที่ทันสมัย
# Run with on-device JIT NPU acceleration
litert run efficientnet_b1 --android --accelerator npu,cpu
- คำเตือน: การสร้างกราฟแบบไดนามิกภายในรันไทม์บนอุปกรณ์จะทำให้เกิดการวอร์มอัป JIT ในการเริ่มต้นใช้งานที่ล่าช้าอย่างมาก
🚀 เป้าหมาย ง: NPU ที่คอมไพล์ AOT
คอมไพล์ล่วงหน้าแบบออฟไลน์เพื่อข้ามโอเวอร์เฮด JIT ของรันไทม์และเพิ่มความเร็วสูงสุด
# 1. Offline compile for Qualcomm SM8750 NPU (Linux host)
litert compile efficientnet/efficientnet_b1.tflite --target sm8750
# 2. Execute compiled AOT binary with zero JIT warmup latency
litert run efficientnet_b1_Qualcomm_SM8750.tflite --android --npu
☁️ การสร้างโปรไฟล์ระบบคลาวด์ (Google AI Edge Portal)
พุชการทดสอบไปยังโปรไฟล์ฮาร์ดแวร์ระยะไกลในฟาร์มอุปกรณ์ของ Google Cloud
# Log in to your Google Cloud project
gcloud auth login
# Push benchmark metrics to Pixel 7 CPU
litert benchmark efficientnet_b1 --gcp --device "pixel 7" --cpu --gcp-project "your-project-id"
# Push benchmark metrics to Snapdragon GPU targets
litert benchmark efficientnet_b1 --gcp --devices "pixel 7, sm-s931u1" --gpu --gcp-project "your-project-id"
5. 🧠 หัวข้อขั้นสูง: LLM และการรู้จำคำพูด
มาสำรวจโมเดลขั้นสูงโดยการแปลงและเรียกใช้โมเดลภาษาขนาดใหญ่ (LLM) และโมเดลการรู้จำคำพูดอัตโนมัติ (ASR) กัน
💬 Generative AI (LLM)
LLM ของ Edge มีขีดจำกัดด้านหน่วยความจำ เราแก้ปัญหานี้โดยใช้การหาปริมาณแบบน้ำหนักเท่านั้น INT4/INT8 ซึ่งจะบีบอัดน้ำหนักในขณะที่เก็บช่องทางการดำเนินการไว้ใน Float32
# 1. Automated download & conversion from Hugging Face
litert convert Qwen/Qwen1.5-0.5B-Chat --output models/qwen
# 2. Quantize model weights to INT4
litert convert Qwen/Qwen1.5-0.5B-Chat \
--quantize-recipe weight_only_wi4_afp32 \
--output models/qwen_w4
# 3. Generation once
litert lm run models/qwen/model.litertlm --prompt "Introduce San Francisco."
# 4. Interactive chat
litert lm run models/qwen/model.litertlm
🎙️ การประมวลผลคำพูด (ASR)
โมเดล ASR เช่น Whisper หรือ Parakeet มีทั้งโมดูลตัวเข้ารหัสและตัวถอดรหัส เราสามารถวัดประสิทธิภาพสำหรับโมดูลที่เฉพาะเจาะจงได้โดยใช้คีย์ลายเซ็น:
# 1. Download prepackaged Whisper-Tiny
litert download litert-community/whisper-tiny --file "whisper_tiny_30s_f32.tflite" --output "models/whisper_tiny"
# 2. Profile audio encoding
litert benchmark models/whisper_tiny/whisper_tiny_30s_f32.tflite --android --gpu --signature-key "encode"
# 3. Profile text token decoding loop
litert benchmark models/whisper_tiny/whisper_tiny_30s_f32.tflite --android --cpu --signature-key "decode"
6. 🤖 ใช้ในการเขียนโค้ดแบบ Agent
LiteRT CLI ใช้งานง่ายกับ Agent และคุณสามารถผสานรวมเข้ากับ Agent การเขียนโค้ดได้โดยตรง
ต่อไปนี้เป็นตัวอย่างบางส่วน เพิ่มทักษะ LiteRT CLI SKILL.md ลงใน Agent การเขียนโค้ด (เช่น Google Antigravity) แล้วลองใช้ข้อความแจ้งด้านล่าง
7. 🚀 ขอแสดงความยินดีและขั้นตอนถัดไป
🎉 ยอดเยี่ยม! คุณทำ Codelab LiteRT CLI 101 เสร็จแล้ว
ตอนนี้คุณมีทักษะในการพัฒนา ML ของ Edge ดังนี้
- แปลงโมเดล PyTorch เป็นโมเดล LiteRT
- หาปริมาณน้ำหนักโมเดลเป็น INT4/INT8
- เรียกใช้โมเดลบน CPU/GPU/NPU ของอุปกรณ์เคลื่อนที่
- คอมไพล์สำหรับ NPU
- วัดประสิทธิภาพบนเดสก์ท็อป อุปกรณ์เคลื่อนที่ และระบบคลาวด์
- แปลงและเรียกใช้โมเดล LLM
- ใช้ในการเขียนโค้ดแบบ Agent
🔗 แหล่งข้อมูล
- LiteRT CLI: https://github.com/google-ai-edge/LiteRT-CLI
- LiteRT: https://ai.google.dev/edge/litert
- ตัวอย่าง: https://github.com/google-ai-edge/LiteRT-CLI/tree/main/examples