TF Lite Delegate เป็นคอมโพเนนต์ของ TensorFlow Lite ที่เปลี่ยนเส้นทางการดำเนินการของโครงข่ายประสาทเทียมไปยังฮาร์ดแวร์เฉพาะ: GPU, NPU, DSP หรือ CPU ที่ปรับแต่งแล้ว หากไม่มีดีเลเกต โมเดลจะทำงานบน CPU ในโหมดความเข้ากันได้เต็มรูปแบบ — ช้าแต่คาดเดาได้ ดีเลเกตจะเร่งการอนุมานได้ 3–10 เท่าขึ้นอยู่กับชิปและโมเดล ตามข้อมูลจาก TensorFlow, 2025 ดีเลเกต GPU และ NNAPI ลดความหน่วงในการอนุมานลง 60–90% โดยไม่สูญเสียความแม่นยำอย่างมีนัยสำคัญ
ประเด็นสำคัญ
TF Lite Delegate เป็นอะแดปเตอร์ซอฟต์แวร์ระหว่าง TensorFlow Lite Runtime และตัวเร่งความเร็วฮาร์ดแวร์ของอุปกรณ์ ดีเลเกตจะสกัดกั้นการดำเนินการกราฟของโมเดล (การม้วนรวม การรวมกลุ่ม การคูณเมทริกซ์) และดำเนินการบนหน่วยประมวลผลเฉพาะแทน CPU หากดีเลเกตไม่รองรับการดำเนินการใด จะทำงานบน CPU — เรียกว่าการมอบหมายบางส่วน
สถาปัตยกรรม TF Lite Delegate สร้างขึ้นรอบอินเทอร์เฟซ SimpleDelegate API และโครงสร้าง TfLiteDelegate ใน C++ ดีเลเกตแต่ละตัวจะimplement วิธีการมอบหมายโหนดกราฟ การจัดสรรหน่วยความจำ และการดำเนินการบนอุปกรณ์เป้าหมาย นักพัฒนาจะเชื่อมต่อดีเลเกตผ่าน Interpreter::ModifyGraphWithDelegate ก่อนเรียก Invoke ตามคู่มือ TensorFlow ดีเลเกตจะถูกนำไปใช้กับการดำเนินการที่รองรับทั้งหมดของโมเดลโดยอัตโนมัติ
การตรวจสอบความเข้ากันได้ เป็นขั้นตอนที่จำเป็น การดำเนินการบางอย่างไม่ได้รับการรองรับโดยดีเลเกตทุกตัว TensorFlow Lite มีเครื่องมือ Delegation Compatibility Check: เรียกใช้โมเดลกับดีเลเกตและตรวจสอบว่ามีกี่การดำเนินการ (ops) ที่ถูกมอบหมาย หากน้อยกว่า 80% ถูกมอบหมาย ให้พิจารณาเลือกดีเลเกตอื่นหรือใช้ CPU ตามข้อมูล TensorFlow (2025) GPU Delegate รองรับ 45 การดำเนินการ NNAPI — 60+
ในโปรเจกต์ IT Sectr เราใช้ดีเลเกต GPU สำหรับ iOS และ XNNPACK สำหรับ Android พร้อมการตรวจสอบความเข้ากันได้ในตัว: โมเดลจะถูกทดสอบกับดีเลเกตทั้งหมด เลือกตัวที่เร็วที่สุดที่มีความสมบูรณ์ในการมอบหมายอย่างน้อย 90%
// การเชื่อมต่อ GPU Delegate บน Android
val gpuDelegate = GpuDelegate()
val options = Interpreter.Options().apply {
addDelegate(gpuDelegate)
setNumThreads(4)
}
val interpreter = Interpreter(modelBuffer, options)
interpreter.run(input, output)
gpuDelegate.close()
การตรวจสอบการดำเนินการที่ถูกมอบหมาย — การควบคุมความเข้ากันได้ผ่าน Interpreter โดยค่าเริ่มต้น ดีเลเกตจะยอมรับการดำเนินการทั้งหมดที่รองรับ สำหรับการดีบัก ให้ใช้การบันทึกจำนวนโหนดที่ถูกมอบหมาย หากโมเดลมีการดำเนินการแบบกำหนดเอง (custom ops) ดีเลเกตจะไม่เร่ง但它们แต่ก็ไม่ทำให้เสียหาย — จะทำงานบน CPU
// ตรวจสอบจำนวนการดำเนินการที่ถูกมอบหมาย
val delegateCount = interpreter.getDelegateOpsCount(gpuDelegate)
val totalNodes = interpreter.getNodesCount()
Log.d("TFLite", "ถูกมอบหมาย: $delegateCount / $totalNodes")
if (delegateCount < totalNodes * 0.8) {
// เกณฑ์ 80% — เลือกดีเลเกตอื่น
}
GPU Delegate เป็นดีเลเกต TensorFlow Lite สำหรับเรียกใช้โมเดลบน GPU ผ่าน OpenGL ES 3.1+ (Android) หรือ Metal (iOS) โปรเซสเซอร์กราฟิกได้รับการปรับแต่งสำหรับการดำเนินการเมทริกซ์แบบขนาน — Core ML และโครงข่ายประสาทแบบม้วนรวม (CNN) ได้รับประโยชน์มากที่สุด GPU Delegate ลดความหน่วงในการอนุมานลง 4–8 เท่าสำหรับโมเดลเช่น MobileNet, EfficientNet, Inception
ข้อจำกัดของ GPU Delegate: ไม่รองรับการดำเนินการทั้งหมด (เพียง 45 จาก ~120 ใน TF Lite), ต้องการ OpenGL ES 3.1 หรือ Metal, ใช้พลังงานมากกว่า CPU GPU ไม่มีประสิทธิภาพสำหรับขนาดแบตช์ > 1 ในสถานการณ์มือถือ ตามเกณฑ์มาตรฐาน TensorFlow (2025) บน Pixel 8 ที่มี GPU Adreno 740 MobileNetV2 ทำงานใน 4.2 ms บน GPU เทียบกับ 18.7 ms บน CPU — เร่งความเร็ว 4.4 เท่า
การกำหนดค่า GPU Delegate รวมถึงการเลือกความแม่นยำ: float16 ลดความแม่นยำแต่เร่งการอนุมาน 30–40% โดยไม่สูญเสียคุณภาพอย่างเห็นได้ชัด (สำหรับงานส่วนใหญ่) เปิด allow_precision_loss=true เพื่อประสิทธิภาพ GPU สูงสุด สำหรับงานที่ต้องการความแม่นยำสูง (การแพทย์ การเงิน) ให้ใช้ float32
// GPU Delegate พร้อมการปรับแต่งความแม่นยำ
val gpuOptions = GpuDelegateFactory.Options().apply {
isPrecisionLossAllowed = true
inferencePreference = GpuDelegateFactory.Options.InferencePreference.SUSTAINED_SPEED
}
val delegate = GpuDelegateFactory.create(gpuOptions)
GPU Delegate บน iOS ใช้ Metal Performance Shaders ผ่าน Metal Delegate ใน iOS ดีเลเกตทำงานผ่าน Core ML delegate สำหรับ Apple Neural Engine หรือ Metal โดยตรง Apple A17 Pro เรียกใช้ MobileNetV2 ใน 1.3 ms — เร็วกว่า CPU 6 เท่า Metal delegate พร้อมใช้งานตั้งแต่ iOS 12 และรองรับอุปกรณ์ทั้งหมดที่มีชิป A7+
NNAPI Delegate (Android Neural Networks API) เป็นดีเลเกต TF Lite ที่ใช้การเร่งความเร็วฮาร์ดแวร์ผ่าน Android NN HAL (Hardware Abstraction Layer) NNAPI เปลี่ยนเส้นทางการดำเนินการของโมเดลไปยัง NPU, DSP หรือ GPU ขึ้นอยู่กับไดรเวอร์ที่พร้อมใช้งานของอุปกรณ์ รองรับบน Android 8.1+ (API 27+) และเป็นดีเลเกตที่แนะนำโดยค่าเริ่มต้นสำหรับ Android
ข้อดีของ NNAPI — การเลือกตัวเร่งความเร็วอัตโนมัติ หากอุปกรณ์มี NPU (Qualcomm Hexagon, MediaTek APU, Samsung NPU) NNAPI จะมอบหมายการดำเนินการให้ หากไม่มี NPU — ไปยัง GPU ผ่าน OpenCL หาก GPU ก็ไม่รองรับ — ไปยัง CPU พร้อมการปรับแต่ง DSP นักพัฒนาไม่ต้องระบุตัวเร่งความเร็วเฉพาะ — NNAPI เลือกตัวที่เหมาะสมที่สุด ตาม Google I/O 2024 ดีเลเกต NNAPI บน Snapdragon 8 Gen 3 เร่งโมเดล LLM ได้ 12 เท่า
ข้อจำกัดของ NNAPI: การรองรับไม่เท่ากันในอุปกรณ์ต่างๆ อุปกรณ์รุ่นเก่า (Android 8.1) มีชุดไดรเวอร์จำกัด Huawei ที่มี Kirin ไม่รองรับ NNAPI ผ่าน Google Services — ให้ใช้ GPU Delegate เพื่อความเข้ากันได้ที่รับประกัน Google แนะนำ NNAPI Delegate เป็นตัวเลือกแรก โดยมีการสำรองไปยัง GPU หรือ XNNPACK
// NNAPI Delegate พร้อมการสำรอง CPU
val nnApiOptions = NnApiDelegate.Options().apply {
acceleratorName = null // null = เลือกอัตโนมัติ
allowFp16 = true
executionPreference = NnApiDelegate.ExecutionPreference.SUSTAINED_SPEED
}
val delegate = NnApiDelegate(nnApiOptions)
val interpreter = Interpreter(model, Interpreter.Options().apply {
addDelegate(delegate)
setNumThreads(4)
})
ชื่อตัวเร่งความเร็ว NNAPI — พารามิเตอร์สำหรับการเลือกตัวเร่งความเร็วอย่างชัดเจน หากส่ง null NNAPI จะเลือกโดยอัตโนมัติ สำหรับการทดสอบ ให้ระบุเฉพาะ: "qti", "google-edgetpu", "mediatek" รายการตัวเร่งความเร็วที่พร้อมใช้งานจะแสดงผ่าน NnApiDelegate.getAvailableAccelerators() ในโพรดักชัน ให้ใช้การเลือกอัตโนมัติพร้อมเกณฑ์ความเข้ากันได้
XNNPACK Delegate เป็นดีเลเกต TensorFlow Lite สำหรับการทำงานบน CPU ที่ปรับแต่งแล้วผ่านคำสั่ง SIMD (ARM NEON, SSE, AVX) XNNPACK ไม่ต้องการ GPU หรือ NPU — เป็นดีเลเกต CPU บริสุทธิ์ แต่เร่งความเร็วได้ 2–4 เท่าด้วย SIMD, การรวมโอเปอเรเตอร์, การดึงข้อมูลล่วงหน้า และการอนุมานเชิงปริมาณ (INT8) เหมาะสำหรับอุปกรณ์ที่ไม่มี NPU เฉพาะหรือเมื่อต้องการความเข้ากันได้ที่รับประกัน
XNNPACK พัฒนาโดย Google เป็นดีเลเกต TF Lite เริ่มต้นสำหรับ CPU (รวมอยู่ใน TFLite Runtime โดยค่าเริ่มต้น) รองรับ 90+ การดำเนินการ — มากกว่า GPU หรือ NNAPI XNNPACK มีประสิทธิภาพเป็นพิเศษสำหรับโมเดลเชิงปริมาณ (INT8, INT16): การดำเนินการทำงานเร็วกว่ารุ่น float32 2–3 เท่า ตามเกณฑ์มาตรฐาน Google (2025) XNNPACK เร่ง INT8 MobileNetV2 ได้ 2.8 เท่าเมื่อเทียบกับ CPU พื้นฐาน
XNNPACK เทียบกับ GPU: บนอุปกรณ์ที่ไม่มี NPU XNNPACK มักจะเร็วกว่า GPU Delegate สำหรับแบตช์ขนาดเล็ก (1–4) — GPU มีค่าใช้จ่ายในการถ่ายโอนข้อมูลระหว่าง CPU และ GPU XNNPACK ทำงานในพื้นที่ที่อยู่ CPU เดียวกัน — ไม่มีการคัดลอกหน่วยความจำ สำหรับโมเดลสูงถึง 5MB XNNPACK อาจเร็วกว่า GPU สำหรับโมเดล CNN ขนาดใหญ่ GPU ชนะด้วยการทำงานแบบขนาน
// XNNPACK Delegate เปิดใช้งานโดยค่าเริ่มต้นใน TFLite 2.18+
// การใช้งานอย่างชัดเจนผ่าน XnnpackDelegate
val xnnpackOptions = XnnpackDelegate.Options().apply {
numThreads = 4
flags = XnnpackDelegate.Flags.USE_XNNPACK
}
val delegate = XnnpackDelegate(xnnpackOptions)
val interpreter = Interpreter(modelBuffer, Interpreter.Options().apply {
addDelegate(delegate)
})
แฟล็ก XNNPACK: USE_XNNPACK — บังคับเปิดดีเลเกต, FLUSH_TO_ZERO — จัดการตัวเลขที่ไม่ได้ทำให้เป็นมาตรฐานเพื่อการเร่งความเร็ว, ENABLE_XNNPACK_SHAPES — ขนาดอินพุตแบบไดนามิก เพื่อความเข้ากันได้สูงสุด ให้ใช้ตัวเลือกเริ่มต้น หากเกิดข้อผิดพลาดบนอุปกรณ์รุ่นเก่า ให้ปิด XNNPACK — โมเดลยังคงทำงานบน CPU แต่ช้าลง
Core ML Delegate เป็นดีเลเกต TensorFlow Lite สำหรับ iOS ที่ใช้ Apple Core ML Framework Core ML แปลงโมเดล TF Lite เป็นรูปแบบ .mlmodel และทำงานบน Apple Neural Engine (ANE), GPU (Metal) หรือ CPU Apple A17 Pro และ M3 มี Neural Engine เฉพาะที่ Core ML ใช้โดยอัตโนมัติ Core ML Delegate เร่งการอนุมาน 5–10 เท่าเมื่อเทียบกับ CPU บนอุปกรณ์ iOS สมัยใหม่
Core ML บน iOS รองรับ flex delegate (การมอบหมายแบบไดนามิกของการดำเนินการที่พร้อมใช้งานสำหรับ Core ML) และการแปลงโมเดลเต็มรูปแบบ (การแปลงทั้งโมเดลเป็น .mlmodel) Apple แนะนำ flex delegate — เร็วกว่าเพราะทำงานที่รันไทม์โดยไม่ต้องแปลงล่วงหน้า Core ML Delegate รองรับโมเดล float32, float16 และเชิงปริมาณ (INT8)
Metal Delegate เป็นดีเลเกตระดับต่ำกว่าที่ทำงานโดยตรงกับ Metal Performance Shaders ใช้ Metal เมื่อ Core ML ไม่รองรับการดำเนินการบางอย่าง Metal Delegate ให้การควบคุม GPU สูงสุดแต่ต้องใช้โค้ดมากกว่า ตาม Apple (WWDC 2024) Metal Delegate สำหรับโมเดล Swift ดั้งเดิมอาจเร็วกว่า Core ML 15–20% เนื่องจากไม่มีค่าใช้จ่ายในการแปลง
// Core ML Delegate บน iOS ผ่าน TFLite Swift API
import TensorFlowLite
let coreMLDelegate = CoreMLDelegate()
var options = InterpreterOptions()
options.addDelegate(coreMLDelegate)
let interpreter = try Interpreter(modelPath: modelPath, options: options)
try interpreter.invoke(at: 0)
การเลือกระหว่าง Core ML และ Metal: Core ML สำหรับโพรดักชัน, Metal สำหรับกรณีพิเศษ Core ML จัดการหน่วยความจำ NE โดยอัตโนมัติ รองรับการสำรอง CPU (fallback) และไม่ต้องการการแปลงด้วยตนเอง Metal ให้การควบคุมบัฟเฟอร์และเหมาะสำหรับการดำเนินการที่กำหนดเอง ในโปรเจกต์ IT Sectr เราใช้ Core ML Delegate สำหรับโมเดล iOS ทั้งหมดและ Metal เฉพาะงานวิเคราะห์วิดีโอแบบเรียลไทม์
การเลือก TF Lite Delegate ขึ้นอยู่กับแพลตฟอร์มเป้าหมาย โมเดล และข้อกำหนดด้านความหน่วง ไม่มีดีเลเกตที่ดีที่สุดในระดับสากล — แต่ละตัวมีจุดแข็งและจุดอ่อน กลยุทธ์ที่เหมาะสมที่สุด: ทดสอบดีเลเกตทั้งหมดที่พร้อมใช้งานบนอุปกรณ์เป้าหมายและเลือกตัวที่เร็วพอ — ไม่ใช่ตัวที่เร็วที่สุด แต่เพียงพอขั้นต่ำ
| ดีเลเกต | แพลตฟอร์ม | การเร่งความเร็ว | ความเข้ากันได้ |
|---|---|---|---|
| GPU | Android, iOS | 4–8 เท่า | 45 การดำเนินการ |
| NNAPI | Android 8.1+ | 3–12 เท่า | 60+ การดำเนินการ |
| XNNPACK | Android, iOS | 2–4 เท่า | 90+ การดำเนินการ |
| Core ML | iOS 12+ | 5–10 เท่า | 50+ การดำเนินการ |
คำแนะนำในการเลือก: สำหรับ Android ที่มี NPU (Snapdragon 8 Gen 2+, Dimensity 9000+) — NNAPI Delegate สำหรับ Android ที่ไม่มี NPU — XNNPACK Delegate (ค่าเริ่มต้น) สำหรับ iOS — Core ML Delegate สำหรับโปรเจกต์ข้ามแพลตฟอร์ม ให้ใช้กลยุทธ์: NNAPI บน Android, Core ML บน iOS, XNNPACK เป็นตัวสำรอง GPU Delegate — เมื่อ NNAPI ไม่พร้อมใช้งานและ XNNPACK ไม่เร็วพอ
การทดสอบความหน่วง เป็นขั้นตอนสำคัญในการเลือก วัดการอนุมานที่อุณหภูมิต่ำสุด (อุปกรณ์เย็น) และหลังจากทำงานต่อเนื่อง 5 นาที (การลดประสิทธิภาพเนื่องจากความร้อน) GPU และ NNAPI อาจลดประสิทธิภาพเมื่อร้อน XNNPACK (CPU) ได้รับผลกระทบน้อยกว่า ใช้ TensorFlow Lite Benchmark Tool สำหรับการทดสอบอัตโนมัติของดีเลเกตทั้งหมดบนอุปกรณ์ของคุณ
// กลยุทธ์การเลือกดีเลเกต
fun selectDelegate(): TfLiteDelegate {
return when {
NnApiDelegate.getAvailableAccelerators()?.isNotEmpty == true ->
NnApiDelegate()
GpuDelegateFactory.isGpuDelegateAvailable() ->
GpuDelegate()
else -> XnnpackDelegate()
}
}
กลยุทธ์การสำรอง — โหลดโมเดลโดยไม่มีข้อยกเว้น: หากดีเลเกตไม่รองรับ ให้ทำงานบน CPU TensorFlow Lite จะโยน IllegalArgumentException เมื่อเกิดข้อผิดพลาดในการสร้างดีเลเกต ห่อการสร้างดีเลเกตใน try-catch และเรียกใช้โมเดลโดยไม่มีดีเลเกตเมื่อเกิดข้อผิดพลาด AI ที่ช้าแต่ทำงานได้ดีกว่าข้อผิดพลาดสำหรับผู้ใช้
คำถามที่พบบ่อย
TF Lite Delegate คือตัวเร่งความเร็วสำหรับโครงข่ายประสาทบนอุปกรณ์เคลื่อนที่ แทนที่จะเรียกใช้โมเดลช้าๆบน CPU ดีเลเกตจะส่งการคำนวณไปยัง GPU หรือชิปประสาทเฉพาะ (NPU) ลองนึกภาพ CPU เป็นเครื่องมืออเนกประสงค์และดีเลเกตเป็นเครื่องจักรเฉพาะสำหรับงานที่กำหนด: มันทำสิ่งเดียวกันแต่เร็วกว่าหลายเท่า
ดีเลเกตที่เร็วที่สุดขึ้นอยู่กับอุปกรณ์ บนอุปกรณ์ที่มี Neural Engine (Apple A17 Pro, Snapdragon 8 Gen 3) — NNAPI (Android) หรือ Core ML (iOS) ให้การเร่งความเร็วสูงสุดถึง 10–12 เท่า GPU Delegate เร็วเป็นอันดับสอง XNNPACK (CPU) ช้าที่สุดในบรรดาดีเลเกตแต่เข้ากันได้มากที่สุด บนอุปกรณ์ที่ไม่มี NPU XNNPACK หรือ GPU อาจเหมาะสมที่สุด
ไม่ ดีเลเกตแต่ละตัวรองรับชุดการดำเนินการที่จำกัด GPU Delegate — 45 การดำเนินการ, NNAPI — 60+, XNNPACK — 90+ การดำเนินการที่ไม่รองรับจะทำงานบน CPU (การมอบหมายบางส่วน) สำหรับการดำเนินการที่กำหนดเอง (custom ops) ดีเลเกตจะไม่ถูกนำไปใช้ ก่อนใช้งาน ตรวจสอบความเข้ากันได้ผ่าน getDelegateOpsCount — หากน้อยกว่า 80% ของโหนดถูกมอบหมาย ให้เลือกดีเลเกตอื่น
เพิ่ม dependency ใน build.gradle: implementation 'org.tensorflow:tensorflow-lite-gpu-delegate:+' หรือ 'org.tensorflow:tensorflow-lite:x.x.x' (XNNPACK ในตัว) สร้างดีเลเกต (GpuDelegate(), NnApiDelegate(), XnnpackDelegate()) และส่งไปยัง Interpreter.Options.addDelegate() เรียกใช้อินเทอร์พรีเตอร์ — ดีเลเกตจะถูกนำไปใช้โดยอัตโนมัติ หลังจากการทำงาน ให้ปิดดีเลเกตผ่าน close()
ใช่ TF Lite รองรับดีเลเกตหลายตัว — ถูกนำไปใช้ตามลำดับ อินเทอร์พรีเตอร์จะลองมอบหมายการดำเนินการให้ดีเลเกตตัวแรก จากนั้นตัวที่สอง และต่อไป หากไม่มีดีเลเกตใดรองรับการดำเนินการ จะทำงานบน CPU ซึ่งมีประโยชน์สำหรับการสำรอง: อันดับแรก NNAPI จากนั้น GPU จากนั้น XNNPACK ลำดับการเพิ่มส่งผลต่อลำดับความสำคัญ
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม