AI/ML Uç Bilişim
TEKNİK REHBER AI/ML UÇ BİLİŞİM NPU Programlama 2026

NPU Programlama —
Coral · Hailo · RK NPU.

Neural Processing Unit ile uç cihazda hızlandırılmış çıkarım. Google Coral Edge TPU, Hailo-8, Rockchip RK3588 NPU ve NXP Ethos-U55 — compiler zincirinden Python API'ye kapsamlı rehber.

00 NPU nedir? — TOPS metriği, neden CPU yetersiz?

NPU (Neural Processing Unit), derin öğrenme çıkarımı için özel tasarlanmış donanım hızlandırıcısıdır. CPU ve GPU'dan farklı olarak, tensor çarpma ve aktivasyon işlemlerini masif paralel MAC (Multiply-Accumulate) dizileriyle gerçekleştirir.

TOPS metriği

TOPS (Tera Operations Per Second)
Saniyede 10¹² MAC işlemi. Doğrudan performans karşılaştırması için kullanılır. Ancak TOPS, tek başına yeterli değildir — bant genişliği, bellek, desteklenen op'lar ve compiler kalitesi de önemlidir.
Kullanılabilirlik (Effective TOPS)
Teorik TOPS değerinin ne kadarına modelinizin erişebildiğidir. Kötü derleme veya desteklenmeyen op'lar nedeniyle etkin TOPS, teorik değerin %30-70'ine düşebilir.
Güç verimliliği (TOPS/W)
Pil bağımlı uygulamalar için kritik metrik. Coral Edge TPU ~4 TOPS/W, Hailo-8 ~10 TOPS/W, NVIDIA Jetson Nano ~1 TOPS/W. NPU'lar CPU/GPU'ya kıyasla çok daha verimlidir.

Neden CPU/GPU yetersiz kalır?

  ResNet-50 INT8 çıkarım — 224×224, 1 batch

  CPU (Cortex-A72 @ 1.8GHz, 4 çekirdek)
  ┌────────────────────────────────────┐
  │ Peak perf  : 0.11 TOPS INT8        │
  │ Latency    : 850 ms                │
  │ Güç        : 5.0 W                 │
  └────────────────────────────────────┘

  GPU (Mali-G52 MP2)
  ┌────────────────────────────────────┐
  │ Peak perf  : 0.06 TOPS INT8        │
  │ Latency    : 450 ms (driver o/h)   │
  │ Güç        : 2.5 W                 │
  └────────────────────────────────────┘

  NPU (Coral Edge TPU, 4 TOPS INT8)
  ┌────────────────────────────────────┐
  │ Peak perf  : 4.0 TOPS INT8         │
  │ Latency    : 15 ms                 │
  │ Güç        : 2.0 W                 │
  └────────────────────────────────────┘
    
NPU Kısıtları

NPU'lar yalnızca spesifik op kümelerini hızlandırır. Desteklenmeyen op'lar CPU'ya fallback eder ve pipeline bölünmesi (partitioning) oluşturur. Model compiler, desteklenen op bloklarını tespit eder ve NPU/CPU arası bölümlemeyi otomatik yapar.

01 Google Coral Edge TPU

Google'ın Edge TPU'su, yalnızca INT8 modellerini çalıştıran 4 TOPS sabit noktalı hızlandırıcıdır. USB Accelerator, PCIe M.2 ve geliştirme kartı form faktörleriyle sunulur.

Form faktörler

Form FaktörBağlantıLatencyKullanım
USB AcceleratorUSB 3.0~2ms + USB o/hPrototip, RPi
M.2 Accelerator (A+E)PCIe Gen2 x1~2msEndüstriyel gömülü
Dev BoardYerleşik TPU~2msBağımsız sistem
SOM (System on Module)PCIe yerleşik~2msÜretim ürünleri

Edge TPU Compiler

Ön koşul: Tam INT8 TFLite modeli
Compiler yalnızca fully-quantized INT8 TFLite modellerini kabul eder. float32 veya hybrid modeller reddedilir. TFLite Converter'dan inference_input_type=tf.int8 ile üretilmelidir.
Desteklenen op'lar
Conv2D, DepthwiseConv2D, MaxPool, AvgPool, FullyConnected, ReLU, ReLU6, Concat (belirli koşullarda), ResizeBilinear. Liste güncel compiler sürümüyle genişler.
Bölümleme
Desteklenmeyen op'lar CPU'ya devreder. Compiler çıktısında kaç parametrenin Edge TPU'ya (on-chip) gideceğini raporlar. İdeal: %100 on-chip mapping.
bash — Edge TPU compiler
# Edge TPU Compiler kurulumu (Debian/Ubuntu)
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" \
     | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
sudo apt-get update && sudo apt-get install -y edgetpu-compiler

# Model derleme
edgetpu_compiler gesture_int8.tflite

# Çıktı:
# Edge TPU Compiler version 16.0
# Model compiled successfully in 3832 ms.
# Model: gesture_int8.tflite
#   INFO: Number of operations that will run on Edge TPU: 28/28
#   INFO: Compiler successfully mapped all operations to Edge TPU.
# Output: gesture_int8_edgetpu.tflite

pycoral ile çıkarım

coral_infer.py
from pycoral.utils import edgetpu
from pycoral.adapters import common, classify
from PIL import Image
import numpy as np, time

# Edge TPU interpreter oluştur
interpreter = edgetpu.make_interpreter("gesture_int8_edgetpu.tflite")
interpreter.allocate_tensors()

# Giriş boyutları
size = common.input_size(interpreter)  # (96, 96)
print(f"Giriş boyutu: {size}")

# Görüntü yükle ve çıkarım yap
img  = Image.open("test_gesture.jpg").resize(size, Image.LANCZOS)
common.set_input(interpreter, img)

t0 = time.perf_counter()
interpreter.invoke()
dt = (time.perf_counter() - t0) * 1000

# Sınıflandırma çıktısını al
classes = classify.get_classes(interpreter, top_k=3, score_threshold=0.0)
for c in classes:
    print(f"  Sınıf {c.id}: {c.score:.4f}")

print(f"Edge TPU çıkarım: {dt:.2f} ms")

02 Hailo-8 — HailoRT SDK, dataflow compiler

Hailo-8, 26 TOPS performansı ile gömülü AI'nın üst segment kartıdır. Raspberry Pi HAT formu veya M.2 olarak RPi CM4'e takılabilir. Veri akışı mimarisi, düşük güç tüketimiyle yüksek throughput sağlar.

HailoRT SDK bileşenleri

Hailo Dataflow Compiler (DFC)
ONNX veya TFLite modeli, Hailo'nun HEF (Hailo Execution Format) dosyasına derler. Model quantization ve memory-mapping kararlarını bu compiler verir.
HailoRT
Çıkarım zamanı kütüphanesi. C++, Python ve GStreamer plugin binding'leri sağlar. PCIe/USB üzerinden cihazla iletişim kurar.
hailortcli
Komut satırı araçları: cihaz listesi, model çalıştırma, benchmark, güç ölçümü. hailortcli fw-update ile firmware güncelleme.
bash — Hailo kurulumu (RPi OS)
# HailoRT DEB paketi kur (hailo.ai developer zone)
sudo dpkg -i hailort_4.17.0_arm64.deb

# Python binding
pip install hailort

# Cihaz tespiti
hailortcli scan
# Hailo-8 PCIe device found [0000:01:00.0]

# Benchmark
hailortcli benchmark yolov8n.hef --batch-size 1 --time-to-run 30

Python API ile çıkarım

hailo_infer.py
import hailo_platform as hp
import numpy as np, time

# HEF modeli yükle
hef = hp.HEF("yolov8n.hef")

# Cihaz ve yapılandırma
target = hp.VDevice()
network_group = target.configure(hef)[0]
network_params = network_group.create_params()

# Giriş/çıkış stream bilgisi
input_vstreams  = hp.InputVStreamParams.make(network_group)
output_vstreams = hp.OutputVStreamParams.make(network_group)

input_name  = list(input_vstreams)[0]
output_name = list(output_vstreams)[0]

# Çıkarım döngüsü
with hp.InferVStreams(network_group, input_vstreams, output_vstreams) as infer:
    img = np.random.randint(0, 255, (1, 3, 640, 640), dtype=np.uint8)

    t0 = time.perf_counter()
    infer_results = infer.infer({input_name: img})
    dt = (time.perf_counter() - t0) * 1000

    output = infer_results[output_name]
    print(f"Hailo-8 çıkarım: {dt:.2f} ms")
    print(f"Çıkış şekli: {output.shape}")

03 Rockchip NPU — RK3588, RKNN Toolkit 2

Rockchip RK3588 SoC, üç NPU çekirdeğiyle toplam 6 TOPS INT8 performansı sağlar. RKNN Toolkit 2 ile modeller compile edilir ve RKNN C/Python API ile çalıştırılır.

RK3588 NPU mimarisi

  RK3588 SoC
  ┌──────────────────────────────────────────────┐
  │  4x Cortex-A76 + 4x Cortex-A55 (CPU)        │
  │  Mali-G610 MP4 (GPU)                         │
  │                                              │
  │  NPU (Neural Processing Unit)                │
  │  ┌─────────┐  ┌─────────┐  ┌─────────┐      │
  │  │ Core 0  │  │ Core 1  │  │ Core 2  │      │
  │  │ 2 TOPS  │  │ 2 TOPS  │  │ 2 TOPS  │      │
  │  └─────────┘  └─────────┘  └─────────┘      │
  │  Toplam: 6 TOPS INT8                         │
  │  Shared: 2 MB on-chip SRAM per core          │
  └──────────────────────────────────────────────┘
    

RKNN Toolkit 2 kurulumu

bash — Host PC (Ubuntu 20.04 x86_64)
# Python 3.8-3.11 ortamı
conda create -n rknn python=3.10
conda activate rknn

# RKNN Toolkit 2 (host PC - model compile için)
pip install rknn-toolkit2==2.2.0

# RKNN Lite (hedef cihazda - runtime için)
# Hedef cihazda (RK3588 üzerinde):
pip install rknn-toolkit-lite2==2.2.0

# C runtime library: /usr/lib/librknnrt.so (cihazda önceden kurulu)

04 RKNN model derleme

RKNN model derleme, host PC'de rknn-toolkit2 ile gerçekleştirilir. Quantization kalibrasyonu için temsili veri seti gereklidir.

Derleme pipeline'ı

rknn_compile.py — Host PC
from rknn.api import RKNN
import numpy as np, cv2, glob

rknn = RKNN(verbose=True)

# 1. Model yükle (ONNX veya TFLite)
rknn.load_onnx(model="yolov8n.onnx")

# 2. Konfigürasyon
rknn.config(
    mean_values=[[0, 0, 0]],           # RGB ortalama
    std_values=[[255, 255, 255]],       # normalleştirme
    target_platform="rk3588",          # hedef SoC
    quant_img_RGB2BGR=False,
    quantized_algorithm="normal",       # "normal" | "kl_divergence"
    quantized_method="channel",         # per-channel quantization
    optimization_level=3
)

# 3. Model oluştur
rknn.build(do_quantization=True,
           dataset="calib_dataset.txt")  # kalibrasyon görüntü yolları

# 4. Doğruluk analizi (ONNX vs RKNN karşılaştırma)
rknn.accuracy_analysis(
    inputs=["calib_dataset.txt"],
    target=None,                        # simülasyon modu
    output_dir="./snapshot"
)

# 5. Model dışa aktar
rknn.export_rknn("yolov8n.rknn")
print("RKNN model dışa aktarıldı")
rknn.release()

Kalibrasyon veri seti dosyası

generate_calib_list.py
import glob, os

images = glob.glob("./calib_images/*.jpg")[:200]
with open("calib_dataset.txt", "w") as f:
    for img_path in images:
        f.write(os.path.abspath(img_path) + "\n")
print(f"{len(images)} kalibrasyon görüntüsü yazıldı")

RK3588'de çıkarım (Python Lite)

rknn_infer_rk3588.py — Hedef Cihaz
from rknnlite.api import RKNNLite
import numpy as np, cv2, time

rknn_lite = RKNNLite()

# Model yükle
ret = rknn_lite.load_rknn("yolov8n.rknn")
if ret != 0:
    print("RKNN model yükleme hatası!")
    exit(ret)

# Runtime başlat (NPU core seçimi: 0,1,2 veya NPU_CORE_AUTO)
rknn_lite.init_runtime(
    core_mask=RKNNLite.NPU_CORE_0   # tek core
    # core_mask=RKNNLite.NPU_CORE_0_1_2  # 3 core, büyük modeller için
)

# Görüntü hazırlama
img = cv2.imread("test.jpg")
img = cv2.resize(img, (640, 640))
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# Çıkarım
t0 = time.perf_counter()
outputs = rknn_lite.inference(inputs=[img])
dt = (time.perf_counter() - t0) * 1000

print(f"RKNN çıkarım: {dt:.2f} ms")
print(f"Çıkış şekli: {outputs[0].shape}")

rknn_lite.release()

05 NXP eIQ / Ethos-U55 — MCU NPU, Vela compiler

ARM Ethos-U55, MCU'lara entegre edilmiş küçük bir NPU'dur. 256 MAC @ 500MHz ile ~128 GOps INT8 performansı sağlar. NXP i.MX RT1170 ve STM32N6 gibi MCU'larda mevcuttur.

Ethos-U55 mimarisi

MAC konfigürasyonu
128 veya 256 MAC birimi seçenekleri. Her MAC, tek clock döngüsünde INT8 çarpma-toplama yapar. Yavaş clock (~500MHz) düşük güç sağlar.
Vela Compiler
ARM'ın Ethos-U için model derleyicisi. TFLite modelini Ethos-U microNPU komut formatına çevirir. Desteklenmeyen op'lar otomatik olarak CPU'ya bırakılır.
TFLite Micro + Ethos Delegate
TFLM runtime, Ethos-U delegate üzerinden NPU'yu çağırır. NPU ve CPU arasındaki yük paylaşımı otomatik yapılır. CPU uygulamasına göre 10-30x hızlanma sağlanır.
bash — Vela compiler
# Vela kurulumu
pip install ethos-u-vela

# Model derleme (Ethos-U55, 256 MAC konfigürasyonu)
vela gesture_int8.tflite \
     --accelerator-config ethos-u55-256 \
     --system-config Ethos_U55_High_End \
     --memory-mode Shared_Sram \
     --output-dir vela_output/

# Çıktı: vela_output/gesture_int8_vela.tflite

# Optimizasyon raporu
vela --show-cpu-operations gesture_int8.tflite \
     --accelerator-config ethos-u55-256

TFLM + Ethos delegate (C++)

ethos_main.cc
#include "tensorflow/lite/micro/micro_interpreter.h"
#include "tensorflow/lite/micro/micro_mutable_op_resolver.h"
#include "ethosu_driver.h"                    // Ethos-U driver
#include "tensorflow/lite/micro/cortex_m_generic/debug_log_callback.h"

// Ethos-U55 NPU sürücüsü başlat
static struct ethosu_driver ethosu_drv;
extern "C" void NPU_IRQHandler(void) {
    ethosu_irq_handler(ðosu_drv);
}

void setup_ethos() {
    ethosu_init(ðosu_drv,
                (void*)ETHOS_U_NPU_BASE,   // NPU base address
                NULL, 0,                    // cache flush callback
                1, 0);                      // secure, privileged
}

// TFLM ile Ethos delegate kullanımı
#include "tensorflow/lite/micro/micro_mutable_op_resolver.h"
// Ethos-U op resolver'a ekleme
resolver.AddEthosU();  // NPU delegate op ekle

// Interpreter'da delegate otomatik aktif olur

06 Performans karşılaştırması — CPU vs GPU vs NPU

Gerçek ölçüm verilerine dayalı karşılaştırma tabloları. MobileNet-v2 ve ResNet-50 modelleri farklı donanımlarda test edilmiştir.

MobileNet-v2 INT8 — 224×224, batch=1

DonanımLatencyThroughputGüçGüç Veriml.
RPi4 CPU (4x A72)35 ms28 FPS4.5 W6 FPS/W
RPi4 + Coral USB3.5 ms280 FPS5.5 W51 FPS/W
RK3588 CPU18 ms55 FPS3.0 W18 FPS/W
RK3588 NPU0.8 ms1200 FPS3.2 W375 FPS/W
Hailo-8 (RPi HAT)0.5 ms2000+ FPS5.0 W400 FPS/W

ResNet-50 INT8 — 224×224, batch=1

DonanımLatencyThroughputGüç
RPi4 CPU (4x A72)320 ms3 FPS5.0 W
RPi4 + Coral USB15 ms65 FPS6.0 W
RK3588 NPU4.2 ms240 FPS3.5 W
Hailo-82.1 ms470 FPS5.0 W
Jetson Orin NX (GPU)1.5 ms650 FPS15 W
Güç-Performans Dengesi

Jetson Orin NX en yüksek mutlak performansı sunar ancak 15W güç tüketimi, pil bağımlı uygulamalarda sorun yaratır. Hailo-8 ve RK3588 NPU, güç verimliliği açısından gömülü AI için en iyi seçeneklerdir.

07 Çok modelli pipeline — CPU ön işleme + NPU çıkarım

Gerçek dünya uygulamalarında genellikle birden fazla model sıralı çalıştırılır. Ön işleme ve son işleme CPU'da, ağır çıkarım NPU'da yapılan hibrit pipeline en verimli yaklaşımdır.

Yüz tespiti + tanıma pipeline'ı

  Kamera Frame (CPU)
       ↓
  [CPU] Resize + Normalize + BGR2RGB
       ↓
  [NPU] YOLOv5-face — yüz tespiti (bounding box)
       ↓
  [CPU] ROI crop + align (affine transform)
       ↓
  [NPU] ArcFace — yüz embedding (512-d vektör)
       ↓
  [CPU] Cosine similarity ile veritabanı eşleştirme
       ↓
  [CPU] Sonuç overlay + alarm/GPIO
    

Pipeline thread mimarisi

pipeline_threads.py
import threading, queue, time
import numpy as np

# Thread-safe kuyruklar
raw_queue   = queue.Queue(maxsize=4)   # Ham frame
det_queue   = queue.Queue(maxsize=4)   # Tespit sonuçları
result_queue= queue.Queue(maxsize=4)   # Son sonuçlar

def capture_thread():
    """CPU: Kamera yakalama"""
    import cv2
    cap = cv2.VideoCapture(0)
    while True:
        ret, frame = cap.read()
        if not ret: break
        if not raw_queue.full():
            raw_queue.put(frame)

def detection_npu_thread(det_session):
    """NPU: Yüz tespiti"""
    while True:
        frame = raw_queue.get()
        # Ön işleme (CPU)
        inp = preprocess(frame, size=(640,640))
        # NPU çıkarım
        boxes = det_session.run(None, {"images": inp})[0]
        det_queue.put((frame, boxes))

def recognition_npu_thread(rec_session, face_db):
    """NPU: Yüz tanıma"""
    while True:
        frame, boxes = det_queue.get()
        results = []
        for box in parse_boxes(boxes):
            roi = crop_align(frame, box)           # CPU affine
            emb = rec_session.run(None, {"input": roi})[0]
            name, sim = find_match(emb, face_db)   # CPU cosine
            results.append((box, name, sim))
        result_queue.put((frame, results))

# Thread'leri başlat
threading.Thread(target=capture_thread, daemon=True).start()
threading.Thread(target=detection_npu_thread,
                 args=(det_session,), daemon=True).start()
threading.Thread(target=recognition_npu_thread,
                 args=(rec_session, face_db), daemon=True).start()

08 Pratik — Coral USB ile 30fps yüz tespiti

Raspberry Pi 4 + Coral USB Accelerator ile gerçek zamanlı yüz tespiti. MobileNet-SSD tabanlı INT8 model, Edge TPU'da <4ms çıkarım süresi ve 30fps hedefi.

Gereksinimler

bash — RPi4 kurulum
# libedgetpu (USB runtime)
echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" \
     | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
sudo apt-get update
sudo apt-get install -y libedgetpu1-std   # max hız için: libedgetpu1-max

# pycoral
pip install pycoral

# Hazır model: face detection SSD MobileNet INT8
wget https://github.com/google-coral/test_data/raw/master/ssd_mobilenet_v2_face_quant_postprocess_edgetpu.tflite
wget https://raw.githubusercontent.com/google-coral/test_data/master/face_labels.txt

Tam yüz tespiti uygulaması

coral_face_detect.py
from pycoral.utils import edgetpu
from pycoral.adapters import detect, common
import cv2, time, numpy as np

MODEL = "ssd_mobilenet_v2_face_quant_postprocess_edgetpu.tflite"
THRESHOLD  = 0.5

interpreter = edgetpu.make_interpreter(MODEL)
interpreter.allocate_tensors()
_, height, width, _ = interpreter.get_input_details()[0]['shape']

cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH,  640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

frame_count = 0
fps_time    = time.time()

while True:
    ret, frame = cap.read()
    if not ret: break

    # Ön işleme: resize + BGR→RGB
    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    resized = cv2.resize(rgb, (width, height))

    # Edge TPU çıkarım
    common.set_input(interpreter, resized)
    t0 = time.perf_counter()
    interpreter.invoke()
    inference_ms = (time.perf_counter() - t0) * 1000

    # Tespit sonuçları
    objs = detect.get_objects(interpreter, score_threshold=THRESHOLD)

    # Bounding box çiz
    h, w = frame.shape[:2]
    for obj in objs:
        bbox = obj.bbox
        x0 = int(bbox.xmin * w); y0 = int(bbox.ymin * h)
        x1 = int(bbox.xmax * w); y1 = int(bbox.ymax * h)
        cv2.rectangle(frame, (x0,y0), (x1,y1), (0,255,0), 2)
        cv2.putText(frame, f"{obj.score:.2f}",
                    (x0, y0-5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,255,0), 2)

    # FPS hesaplama
    frame_count += 1
    if frame_count % 30 == 0:
        elapsed = time.time() - fps_time
        fps = 30.0 / elapsed
        fps_time = time.time()
        print(f"FPS: {fps:.1f}  Çıkarım: {inference_ms:.1f}ms  Yüz: {len(objs)}")

    cv2.putText(frame, f"{inference_ms:.1f}ms  {len(objs)} yuz",
                (10,30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0,0,255), 2)
    cv2.imshow("Coral Face Detection", frame)
    if cv2.waitKey(1) == ord('q'): break

cap.release()
cv2.destroyAllWindows()

Ölçüm sonuçları

MetrikCoral USB (std)Coral USB (max)CPU only
Edge TPU çıkarım3.8 ms2.4 ms48 ms
Toplam pipeline8.2 ms6.8 ms55 ms
Gerçek FPS~32 FPS~38 FPS~18 FPS
USB ısınmaNormalIlık
30fps Hedefi Aşıldı

Coral USB Accelerator (std hız) 32fps, max hız modunda 38fps sağlar. libedgetpu1-max paketi daha yüksek clock ile çalışır ancak ısınma ve USB besleme akımını artırır. Pil bağımlı sistemlerde std hız tercih edilmelidir.