ข้อมูลเบื้องต้นเกี่ยวกับ LiteRT CLI: เพิ่มประสิทธิภาพเวิร์กโฟลว์ Edge AI

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 ➔ การแปลงการติดตาม ➔ การหาปริมาณโมเดล ➔ การอนุมานบนเดสก์ท็อป ➔ การวัดประสิทธิภาพ

เวิร์กโฟลว์ LiteRT CLI 101

📝 ขั้นตอนที่ 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