Android'de Edge AI için NDK ile C++ Performans Rehberi
Gemini Nano gibi cihaz üstü LLM'lerde Kotlin soyutlama maliyetini aşmak için JNI, zero-copy ByteBuffer ve NPU hizalama tekniklerini inceliyoruz.
Android'de Gemini Nano gibi büyük dil modelleri doğrudan cihaz üzerinde çalışırken, Kotlin ve ART'ın sağladığı yönetilen bellek soyutlaması artık bir avantaj değil, performans darboğazına dönüşüyor. Kaynak, saniyede milyarlarca kayan nokta işlemi gerektiren token üretimi gibi senaryolarda çöp toplayıcının bellek taşıma davranışının SIMD hizalaması ve donanım hızlandırıcı erişimiyle nasıl çatıştığını ele alıyor. Çözüm olarak NDK üzerinden C++ ile yazılmış özel 'kernel'lere geçiş öneriliyor.
JNI köprüsünün her geçişte context switching, argüman dönüştürme ve güvenlik kontrolü maliyeti taşıdığı vurgulanıyor; bu nedenle ince taneli değil, kaba taneli (coarse-grained) delegasyon yaklaşımı öneriliyor: büyük bellek işaretçisi C++ tarafına aktarılıp milyonlarca işlem native tarafta döngüyle işleniyor. Sıfır kopya (zero-copy) veri aktarımı için ByteBuffer.allocateDirect() ve GetDirectBufferAddress() kullanımı, model ağırlıkları gibi büyük veri blokları için kritik bir optimizasyon olarak öne çıkıyor.
Metin ayrıca Google'ın AICore mimarisini, CameraX'e benzer şekilde NPU donanımını soyutlayan sistem düzeyinde bir servis olarak tanımlıyor; bu sayede bellek tekrarını önleme, sorunsuz model güncellemeleri ve yüksek düzey NPU erişim yetkileri sağlanıyor. CPU'da ARM NEON ile vektörleştirme, GPU'da kernel başlatma maliyetini azaltma ve NPU'da 64/128 byte hizalama gibi donanıma özgü optimizasyon stratejileri detaylandırılıyor. Son olarak, native çağrıların Kotlin'in asenkron dünyasıyla Coroutines, callbackFlow ve Context Receivers kullanılarak nasıl güvenli ve akıcı biçimde entegre edilebileceği açıklanıyor.
Mobil AI mühendisleri için bu yaklaşım, sadece performans kazancı değil, aynı zamanda düşük gecikmeli, gerçek zamanlı token akışı gibi kullanıcı deneyimi gereksinimlerini karşılamanın da anahtarı niteliğinde.