取り組みの背景 — なぜ今「オンデバイスAI」なのか
クラウドAPIを呼び出すAI機能は手軽に実装できますが、レイテンシ、通信コスト、プライバシーの観点から限界があります。Edge AI(オンデバイスAI推論)は、モデルをデバイス上で直接実行することで、これらの課題を根本的に解決するアプローチです。
2026年現在、Apple の Core ML と Google の TensorFlow Lite はともにモバイル向けの推論エンジンとして成熟しており、Antigravity のAIエージェント機能を組み合わせることで、モデルの変換・量子化からアプリへの統合・テストまでを大幅に効率化できます。
Antigravity を使ってオンデバイスAI推論アプリを開発する実践的なワークフローを、Core ML(iOS)と TensorFlow Lite(Android / クロスプラットフォーム)の両方を順番に整理していきます。
Edge AI 開発の全体像とメリット
オンデバイスAIの開発フローは、大きく4つのフェーズに分かれます。
1. モデルの準備と変換
まずは学習済みモデルを用意し、モバイル向けのフォーマットに変換します。PyTorch や TensorFlow で学習したモデルを、Core ML(.mlmodel / .mlpackage)や TensorFlow Lite(.tflite)形式に変換する工程です。
2. モデルの量子化と最適化
モバイルデバイスのリソース制約に合わせて、モデルサイズを削減します。INT8量子化を適用すると、モデルサイズを最大75%削減しながら95%以上の精度を維持できるケースが多く、実用性が非常に高いです。
3. アプリへの統合
変換・最適化したモデルをiOSやAndroidのアプリに組み込みます。推論コードの実装、入出力のフォーマット変換、UIとの連携などが含まれます。
4. テストとパフォーマンス計測
実機でのレイテンシ計測、メモリ使用量の確認、バッテリー消費テストを行い、品質を担保します。
Antigravity のエージェントは、これら全フェーズでコード生成・レビュー・テスト自動化を支援してくれます。
Core ML でiOS向けオンデバイスAI推論を実装する
モデル変換スクリプトをAntigravityで生成
Antigravity のエージェントに、PyTorch モデルを Core ML 形式に変換するスクリプトの生成を依頼してみましょう。
# convert_to_coreml.py
# PyTorch の画像分類モデルを Core ML 形式に変換するスクリプト
import torch
import coremltools as ct
from torchvision.models import mobilenet_v3_small, MobileNet_V3_Small_Weights
# 学習済みモデルをロード
weights = MobileNet_V3_Small_Weights.DEFAULT
model = mobilenet_v3_small(weights=weights)
model.eval()
# トレース用のダミー入力
dummy_input = torch.randn(1, 3, 224, 224)
traced_model = torch.jit.trace(model, dummy_input)
# Core ML 形式に変換(量子化オプション付き)
mlmodel = ct.convert(
traced_model,
inputs=[ct.ImageType(name="image", shape=(1, 3, 224, 224))],
convert_to="mlprogram", # ML Program 形式(iOS 15+)
compute_precision=ct.precision.FLOAT16, # FP16量子化でサイズ半減
)
# 期待する出力:
# メタデータ付きの .mlpackage ファイルが生成される
mlmodel.save("ImageClassifier.mlpackage")
print("✅ Core ML モデルの変換が完了しました")
print(f" モデルサイズ: 約 {mlmodel.__sizeof__() / 1024 / 1024:.1f} MB")このスクリプトでは compute_precision=ct.precision.FLOAT16 を指定することで、精度を維持しつつモデルサイズを約50%削減しています。
Swift でのリアルタイム推論実装
変換したモデルをiOSアプリに組み込むSwiftコードも、Antigravity のインラインチャット(⌘+I)で効率的に生成できます。
// ImageClassifierService.swift
// Core ML モデルでリアルタイム画像分類を実行するサービス
import CoreML
import Vision
class ImageClassifierService {
private let model: VNCoreMLModel
init() throws {
// Core ML モデルをロード
let config = MLModelConfiguration()
config.computeUnits = .all // Neural Engine + GPU + CPU を自動選択
let mlModel = try ImageClassifier(configuration: config).model
self.model = try VNCoreMLModel(for: mlModel)
}
func classify(image: CGImage) async throws -> [(label: String, confidence: Float)] {
return try await withCheckedThrowingContinuation { continuation in
let request = VNCoreMLRequest(model: model) { request, error in
if let error = error {
continuation.resume(throwing: error)
return
}
guard let results = request.results as? [VNClassificationObservation] else {
continuation.resume(returning: [])
return
}
// 上位5件の分類結果を返す
let topResults = results.prefix(5).map {
(label: $0.identifier, confidence: $0.confidence)
}
continuation.resume(returning: topResults)
}
// Neural Engine を優先的に使用
request.usesCPUOnly = false
let handler = VNImageRequestHandler(cgImage: image)
try? handler.perform([request])
}
}
}
// 期待する出力例:
// [("golden_retriever", 0.92), ("labrador", 0.05), ("dog", 0.02), ...]computeUnits = .all を指定することで、Apple Neural Engine(ANE)が使えるデバイスでは自動的にANEが選択され、推論速度が大幅に向上します。
TensorFlow Lite でクロスプラットフォーム対応する
INT8量子化でモデルを軽量化
TensorFlow Lite では、ポストトレーニング量子化(PTQ)を使ってモデルサイズを劇的に削減できます。Antigravity のエージェントにスクリプト生成を依頼しましょう。
# quantize_tflite.py
# TensorFlow モデルを INT8 量子化した TFLite 形式に変換
import tensorflow as tf
import numpy as np
# 代表データセットのジェネレータ(量子化キャリブレーション用)
def representative_dataset():
"""量子化の精度を維持するための代表データを提供"""
for _ in range(100):
# 実際のユースケースに近い入力データを用意する
data = np.random.rand(1, 224, 224, 3).astype(np.float32)
yield [data]
# SavedModel を TFLite に変換
converter = tf.lite.TFLiteConverter.from_saved_model("saved_model/")
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8
tflite_model = converter.convert()
# 量子化モデルを保存
with open("model_quantized.tflite", "wb") as f:
f.write(tflite_model)
# 期待する出力:
# ファイルサイズが元のモデルの約25%に削減される
# 例: 16MB → 4MB(INT8量子化適用後)
original_size = 16.0 # MB(例)
quantized_size = len(tflite_model) / 1024 / 1024
print(f"✅ 量子化完了")
print(f" 元のサイズ: {original_size:.1f} MB")
print(f" 量子化後: {quantized_size:.1f} MB")
print(f" 削減率: {(1 - quantized_size / original_size) * 100:.0f}%")INT8量子化により、モデルサイズを約75%削減しながら推論精度を95%以上維持できるのが大きなメリットです。
Kotlin でのAndroid向け推論実装
Antigravity の Agent モードを使って、Android 向けの推論コードを一括生成することも可能です。
// EdgeAIClassifier.kt
// TensorFlow Lite を使った Android 向け画像分類
import android.content.Context
import android.graphics.Bitmap
import org.tensorflow.lite.Interpreter
import org.tensorflow.lite.gpu.GpuDelegate
import java.io.FileInputStream
import java.nio.ByteBuffer
import java.nio.ByteOrder
import java.nio.MappedByteBuffer
import java.nio.channels.FileChannel
class EdgeAIClassifier(private val context: Context) {
private var interpreter: Interpreter? = null
private var gpuDelegate: GpuDelegate? = null
fun initialize() {
// GPU デリゲートでハードウェアアクセラレーション
gpuDelegate = GpuDelegate()
val options = Interpreter.Options().apply {
addDelegate(gpuDelegate!!)
setNumThreads(4) // GPU が使えない場合のフォールバック
}
val modelBuffer = loadModelFile("model_quantized.tflite")
interpreter = Interpreter(modelBuffer, options)
}
fun classify(bitmap: Bitmap): List<Pair<String, Float>> {
val inputBuffer = preprocessImage(bitmap)
val outputBuffer = Array(1) { FloatArray(1000) }
interpreter?.run(inputBuffer, outputBuffer)
// 上位5件の結果をラベルとスコアのペアで返す
return outputBuffer[0]
.mapIndexed { index, score -> Pair(labels[index], score) }
.sortedByDescending { it.second }
.take(5)
}
// 期待する出力例:
// [("golden_retriever", 0.91), ("labrador", 0.04), ...]
private fun preprocessImage(bitmap: Bitmap): ByteBuffer {
val buffer = ByteBuffer.allocateDirect(1 * 224 * 224 * 3)
buffer.order(ByteOrder.nativeOrder())
val resized = Bitmap.createScaledBitmap(bitmap, 224, 224, true)
val pixels = IntArray(224 * 224)
resized.getPixels(pixels, 0, 224, 0, 0, 224, 224)
for (pixel in pixels) {
buffer.put(((pixel shr 16) and 0xFF).toByte()) // R
buffer.put(((pixel shr 8) and 0xFF).toByte()) // G
buffer.put((pixel and 0xFF).toByte()) // B
}
return buffer
}
private fun loadModelFile(filename: String): MappedByteBuffer {
val fd = context.assets.openFd(filename)
val input = FileInputStream(fd.fileDescriptor)
val channel = input.channel
return channel.map(FileChannel.MapMode.READ_ONLY, fd.startOffset, fd.declaredLength)
}
fun release() {
interpreter?.close()
gpuDelegate?.close()
}
companion object {
private val labels = listOf(/* ImageNet ラベル 1000件 */)
}
}GpuDelegate を利用することで、対応デバイスではGPUアクセラレーションが有効になり、CPU実行の2〜5倍の速度向上が期待できます。
Antigravity エージェントを活用した開発ワークフロー
ステップ1: プロジェクトの初期設定
Antigravity を起動し、新しいプロジェクトを作成します。AGENTS.md ファイルにモバイルAI開発向けの設定を記述すると、エージェントの精度が向上します。
<!-- AGENTS.md -->
# Edge AI モバイルアプリプロジェクト
## コンテキスト
- iOS: Swift + Core ML(iOS 17+対象)
- Android: Kotlin + TensorFlow Lite(API 26+対象)
- モデル: MobileNetV3 ベースの画像分類
## コーディング規約
- エラーハンドリングを省略しないこと
- メモリリークを防ぐため、モデルの解放処理を必ず実装すること
- パフォーマンス計測のログを推論コードに含めることステップ2: エージェントでコード生成
Antigravity の Agent モードで「Core ML の推論サービスクラスを作成して」と指示するだけで、上記のような実装が自動生成されます。さらに「TensorFlow Lite 版も同じインターフェースで作って」と追加指示すれば、クロスプラットフォーム対応のコードが得られます。
ステップ3: テストとベンチマーク
Antigravity のエージェントに「推論のユニットテストとパフォーマンスベンチマークを生成して」と依頼すると、テストコードも自動で作成されます。
// ImageClassifierTests.swift
// 推論精度とレイテンシのベンチマークテスト
import XCTest
@testable import MyApp
class ImageClassifierTests: XCTestCase {
var classifier: ImageClassifierService!
override func setUpWithError() throws {
classifier = try ImageClassifierService()
}
func testClassificationAccuracy() async throws {
let testImage = loadTestImage("golden_retriever.jpg")
let results = try await classifier.classify(image: testImage)
XCTAssertFalse(results.isEmpty, "分類結果が空です")
XCTAssertEqual(results[0].label, "golden_retriever")
XCTAssertGreaterThan(results[0].confidence, 0.8)
}
func testInferenceLatency() async throws {
let testImage = loadTestImage("sample.jpg")
// 10回実行して平均レイテンシを計測
let start = CFAbsoluteTimeGetCurrent()
for _ in 0..<10 {
_ = try await classifier.classify(image: testImage)
}
let elapsed = (CFAbsoluteTimeGetCurrent() - start) / 10
// Neural Engine 使用時は 20ms 以下を期待
print("平均推論時間: \(elapsed * 1000)ms")
XCTAssertLessThan(elapsed, 0.1, "推論時間が100msを超えています")
}
// 期待する出力:
// 平均推論時間: 12.3ms(iPhone 15 Pro, Neural Engine使用時)
}まとめ
Edge AI はモバイルアプリ開発の新たな標準になりつつあります。Core ML と TensorFlow Lite を使ったオンデバイスAI推論は、レイテンシの削減、プライバシーの保護、オフライン対応という3つの大きなメリットをもたらします。
Antigravity のAIエージェント機能を活用すれば、モデル変換スクリプト、推論コード、テストコードの生成を効率化でき、開発期間を大幅に短縮できます。まずは既存のモデルをCore MLまたはTFLite形式に変換し、小さなプロトタイプから始めてみてください。
さらに実践的なモバイル開発テクニックについては、Antigravity × Flutter モバイル開発完全ガイドやAntigravity × Xcode 26 / iOS 26 開発ガイドも参考にしてください。