TF Lite Interpreter เป็นองค์ประกอบสำคัญของ TensorFlow Lite ที่รับผิดชอบในการดำเนินการโมเดล .tflite บนอุปกรณ์เคลื่อนที่และฝังตัว อินเทอร์พรีเตอร์จะโหลดการแสดงผล FlatBuffers ของโมเดล จัดสรรเทนเซอร์สำหรับข้อมูลนำเข้าและส่งออก ดำเนินการกราฟการคำนวณและส่งคืนผลลัพธ์ ตาม TensorFlow Lite API Reference, 2025 อินเทอร์พรีเตอร์พร้อมใช้งานใน Java และ C++ สำหรับ Android, Swift และ Objective-C สำหรับ iOS และผ่าน Python bindings สำหรับการทดสอบ TF Lite Interpreter รองรับตัวแทนสำหรับการเร่งความเร็วฮาร์ดแวร์ผ่าน GPU, NNAPI และ Core ML
ประเด็นสำคัญ
TF Lite Interpreter เป็นรันไทม์ที่เรียบง่ายซึ่งดำเนินการโมเดลการเรียนรู้ของเครื่องบนอุปกรณ์โดยไม่มีโครงสร้างพื้นฐานเซิร์ฟเวอร์ อินเทอร์พรีเตอร์ไม่รองรับการฝึกอบรม — เฉพาะการอนุมานเท่านั้น ทำให้มีน้ำหนักเบา: ขนาดไบนารีของอินเทอร์พรีเตอร์พื้นฐานบน Android ประมาณ 300 KB
อินเทอร์พรีเตอร์ทำงานกับโมเดลในรูปแบบ .tflite ที่อิงตาม FlatBuffers เมื่อสร้างขึ้น อินเทอร์พรีเตอร์จะโหลดโมเดลเข้าสู่หน่วยความจำผ่าน mmap ให้การเข้าถึงข้อมูลโดยตรงโดยไม่ต้องคัดลอก จากนั้นอินเทอร์พรีเตอร์จะจัดสรรเทนเซอร์ตามคำอธิบายโมเดลและพร้อมสำหรับการดำเนินการ
อินสแตนซ์อินเทอร์พรีเตอร์แต่ละตัว ไม่ปลอดภัยสำหรับเธรด ในการดำเนินการโมเดลเดียวกันแบบขนานในหลายเธรด ให้สร้างอินสแตนซ์อินเทอร์พรีเตอร์แยกต่างหากพร้อมสำเนาของโมเดล สำหรับการเรียกตามลำดับในเธรดเดียว สามารถใช้อินสแตนซ์อินเทอร์พรีเตอร์ซ้ำได้
บน Android อินเทอร์พรีเตอร์พร้อมใช้งานผ่าน Java API ในแพ็คเกจ org.tensorflow.lite.Interpreter วิธีการหลักคือ run(Object input, Object output) ซึ่งรับอาร์เรย์หลายมิติหรือ ByteBuffer สำหรับการควบคุมที่ละเอียดยิ่งขึ้น ให้ใช้เมธอด runForMultipleInputsOutputs() และ resizeInput()
บน iOS อินเทอร์พรีเตอร์พร้อมใช้งานผ่าน Swift API ในโมดูล TensorFlowLite อินเทอร์เฟซพื้นฐานคล้ายกับ Android: การเริ่มต้นผ่าน Interpreter.init(modelPath:), การจัดสรรเทนเซอร์ผ่าน allocateTensors(), การดำเนินการผ่าน invoke() Swift API รองรับ Data และ MLMultiTensor เป็นประเภทข้อมูลนำเข้า
| แพลตฟอร์ม | ภาษา | คลาส | วิธีการอนุมาน |
|---|---|---|---|
| Android | Java / Kotlin | Interpreter | run(), runForMultipleInputsOutputs() |
| Android (เนทีฟ) | C++ | Interpreter | Invoke() |
| iOS | Swift / Obj-C | Interpreter | invoke() |
| Linux / Python | Python | Interpreter | get_tensor(), invoke() |
ตัวแทนคือส่วนประกอบที่ ย้ายการดำเนินการไปยังฮาร์ดแวร์เฉพาะทาง GPU Delegate ใช้ OpenGL ES (Android) และ Metal (iOS) เพื่อเร่งการดำเนินการกราฟิก NNAPI Delegate ย้ายการดำเนินการไปยัง NPU, DSP หรือ GPU ผ่าน Android Neural Networks API
Core ML Delegate พร้อมใช้งานบน iOS และแปลการดำเนินการ TFLite เป็นรูปแบบ Core ML ตาม Apple ML Benchmarking การใช้ Core ML Delegate บน iPhone 15 Pro เร่งการอนุมานได้ถึง 4 เท่าเมื่อเทียบกับ CPU ตัวแทนรองรับการดำเนินการ FP32 และ FP16
XNNPACK Delegate เป็น โซลูชันสากล สำหรับ ARM CPU ที่ปรับให้เหมาะสมสำหรับโปรเซสเซอร์มือถือ ไม่ต้องการฮาร์ดแวร์พิเศษและรองรับ INT8, FP16 และ FP32 แนะนำให้ใช้เป็นตัวแทนพื้นฐานที่ทำงานบนทุกอุปกรณ์
อินเทอร์พรีเตอร์จัดการเทนเซอร์ผ่าน พูลหน่วยความจำ ที่ถูกจัดสรรเมื่อเรียก allocateTensors() ขนาดพูลถูกกำหนดตามคำอธิบายโมเดลในไฟล์ .tflite หลังจากการจัดสรร อินเทอร์พรีเตอร์จะไม่จัดสรรหน่วยความจำเพิ่มเติมในระหว่างการอนุมาน
สำหรับโมเดลที่มี ขนาดนำเข้าแบบไดนามิก ให้ใช้ resizeInput() เมธอดนี้จะจัดสรรหน่วยความจำใหม่สำหรับเทนเซอร์นำเข้าตามขนาดใหม่ หลังจากปรับขนาดเทนเซอร์นำเข้า อาจจำเป็นต้องจัดสรรใหม่ผ่าน allocateTensors()
เมื่อทำงานกับหลายโมเดล สิ่งสำคัญคือต้อง ปล่อยทรัพยากร ผ่าน close() อินสแตนซ์อินเทอร์พรีเตอร์ที่ไม่ถูกปล่อยอาจทำให้หน่วยความจำรั่วไหล โดยเฉพาะบนอุปกรณ์ที่มี RAM จำกัด สำหรับ iOS ให้ใช้นับการอ้างอิงอัตโนมัติ ARC สำหรับ Android ให้ใช้ try-with-resources หรือการเรียก close() อย่างชัดเจน
ข้อผิดพลาดที่พบบ่อยที่สุดเมื่อทำงานกับอินเทอร์พรีเตอร์คือ มิติเทนเซอร์ไม่ตรงกัน หากข้อมูลนำเข้าไม่ตรงกับรูปร่างที่คาดหวัง อินเทอร์พรีเตอร์จะโยน IllegalArgumentException บน Android หรือข้อผิดพลาดรันไทม์บน iOS ตรวจสอบมิติผ่าน inputTensorAt() และ outputTensorAt()
ปัญหาที่พบบ่อยอันดับสองคือ โอเปอเรเตอร์ที่ไม่รองรับ เมื่อใช้ตัวแทน หากตัวแทนไม่รองรับโอเปอเรเตอร์ อินเทอร์พรีเตอร์จะกลับไปใช้ CPU โดยอัตโนมัติสำหรับโอเปอเรเตอร์นั้น เพื่อระบุสถานการณ์ดังกล่าว ให้เปิดใช้งานการบันทึกผ่าน setCancelled() หรือตรวจสอบบันทึก TFLite
TFLite มี เครื่องมือ Benchmark สำหรับการสร้างโปรไฟล์: การวัดเวลาดำเนินการของแต่ละโอเปอเรเตอร์ การใช้หน่วยความจำ การเปรียบเทียบตัวแทน เครื่องมือ Benchmark พร้อมใช้งานเป็นส่วนหนึ่งของ TFLite Support Library และสามารถทำงานได้โดยตรงบนอุปกรณ์
ตัวอย่างการรันโมเดลบน Android ด้วย Java API โดยใช้ GPU Delegate อินเทอร์พรีเตอร์ถูกสร้างขึ้นด้วยตัวเลือกที่รวมตัวแทน GPU หลังจากการอนุมาน ผลลัพธ์จะถูกอ่านจากเทนเซอร์ส่งออก:
import org.tensorflow.lite.Interpreter;
import org.tensorflow.lite.gpu.GpuDelegate;
import java.nio.MappedByteBuffer;
MappedByteBuffer model = loadModelFile(context);
GpuDelegate gpu = new GpuDelegate();
Interpreter.Options opts = new Interpreter.Options().addDelegate(gpu);
Interpreter interpreter = new Interpreter.create(model, opts);
float[][] input = preprocessImage(bitmap);
float[][] output = new float[1][1000];
interpreter.run(input, output);
int bestClass = argmax(output[0]);
Log.d("TFLite", "คลาสสูงสุด: " + bestClass);
gpu.close();
interpreter.close();
ตัวอย่างการรันบน Python สำหรับการทดสอบก่อนการปรับใช้ Python API ของ TFLite ช่วยให้โหลด .tflite ดำเนินการอนุมานและแสดงผลลัพธ์ ใช้สำหรับการดีบักและการตรวจสอบความแม่นยำของโมเดล:
import tensorflow as tf
import numpy as np
# โหลดโมเดล TFLite จากไฟล์
interpreter = tf.lite.Interpreter(model_path="model.tflite")
interpreter.allocate_tensors()
# รับรายละเอียดเทนเซอร์นำเข้าและส่งออก
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
# เตรียมข้อมูลนำเข้าแบบสุ่มสำหรับการทดสอบ
input_data = np.random.randn(
*input_details[0]["shape"]
).astype(np.float32)
interpreter.set_tensor(input_details[0]["index"], input_data)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]["index"])
print("รูปร่างส่งออก:", output_data.shape)
คำถามที่พบบ่อย
อินเทอร์พรีเตอร์พื้นฐานสำหรับ Android ใช้พื้นที่ประมาณ 300 KB หน่วยความจำเพิ่มเติมถูกจัดสรรสำหรับเทนเซอร์โมเดลและขึ้นอยู่กับขนาดข้อมูลนำเข้า จำนวนโอเปอเรเตอร์ และโหมดการหาปริมาณ
อินสแตนซ์อินเทอร์พรีเตอร์เดียว ไม่ปลอดภัยสำหรับเธรด สำหรับการดำเนินการแบบขนาน ให้สร้างหลายอินสแตนซ์พร้อมสำเนาโมเดลแยกต่างหาก แต่ละอินสแตนซ์ใช้หน่วยความจำของตัวเองสำหรับเทนเซอร์
ใช้ TFLite Support Library — คลาส DelegatesApi เรียก DelegatesApi.getAvailableDelegates() เพื่อรับรายการตัวแทนที่พร้อมใช้งานบนอุปกรณ์เฉพาะ
ตรวจสอบ ความสมบูรณ์ของไฟล์ .tflite ผ่าน tf.lite.experimental.Analyzer ตรวจสอบให้แน่ใจว่าโมเดลถูกแปลงสำหรับ TFLite เวอร์ชันที่ถูกต้องและรองรับการดำเนินการที่พร้อมใช้งานบนอุปกรณ์เป้าหมาย
ใช้เมธอด resizeInput(int idx, int[] dims) ใน Java API หรือ resizeInput(at:to:) ใน Swift หลังจากเปลี่ยนขนาด ให้เรียก allocateTensors() เพื่อจัดสรรหน่วยความจำใหม่
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม