اجرای API مدل کامپایل شده LiteRT در اندروید با Kotlin

رابط برنامه‌نویسی کاربردی مدل کامپایل‌شده‌ی LiteRT با زبان کاتلین در دسترس است و به توسعه‌دهندگان اندروید یک تجربه‌ی یکپارچه و مبتنی بر شتاب‌دهنده با رابط‌های برنامه‌نویسی کاربردی سطح بالا ارائه می‌دهد.

برای مثالی از یک برنامه LiteRT در کاتلین، به نسخه آزمایشی تقسیم‌بندی تصویر با کاتلین مراجعه کنید.

شروع کنید

برای افزودن LiteRT Compiled Model API به برنامه اندروید خود، مراحل زیر را دنبال کنید.

اضافه کردن بسته Maven

وابستگی LiteRT را به همراه API مدل کامپایل‌شده به برنامه خود اضافه کنید:

dependencies {
  ...
  implementation `com.google.ai.edge.litert:litert:2.0.0-alpha`
}

ایجاد مدل کامپایل شده

با استفاده از رابط برنامه‌نویسی کاربردی CompiledModel ، زمان اجرا را با یک مدل و انتخاب شتاب‌دهنده سخت‌افزاری خود، مقداردهی اولیه کنید:

val  model =
  CompiledModel.create(
    context.assets,
    "mymodel.tflite",
    CompiledModel.Options(Accelerator.CPU),
    env,
  )

ایجاد بافرهای ورودی و خروجی

ساختارهای داده لازم (بافرها) را برای نگهداری داده‌های ورودی که برای استنتاج به مدل وارد می‌کنید و داده‌های خروجی که مدل پس از اجرای استنتاج تولید می‌کند، ایجاد کنید.

val inputBuffers = model.createInputBuffers()
val outputBuffers = model.createOutputBuffers()

اگر از حافظه CPU استفاده می‌کنید، ورودی‌ها را با نوشتن مستقیم داده‌ها در اولین بافر ورودی پر کنید.

inputBuffers[0].writeFloat(FloatArray(data_size) { data_value /* your data */ })

مدل را فراخوانی کنید

با فراهم کردن بافرهای ورودی و خروجی، مدل کامپایل شده را اجرا کنید.

model.run(inputBuffers, outputBuffers)

بازیابی خروجی‌ها

با خواندن مستقیم خروجی مدل از حافظه، خروجی‌ها را بازیابی کنید.

val outputFloatArray = outputBuffers[0].readFloat()

مفاهیم و اجزای کلیدی

برای اطلاعات در مورد مفاهیم کلیدی و اجزای APIهای مدل کامپایل شده LiteRT Kotlin به بخش‌های زیر مراجعه کنید.

استنتاج پایه (CPU)

در ادامه، پیاده‌سازی فشرده و ساده‌شده‌ای از استنتاج با LiteRT Next ارائه شده است.

// Load model and initialize runtime
val  model =
    CompiledModel.create(
        context.assets,
        "mymodel.tflite"
    )

// Preallocate input/output buffers
val inputBuffers = model.createInputBuffers()
val outputBuffers = model.createOutputBuffers()

// Fill the first input
inputBuffers[0].writeFloat(FloatArray(data_size) { data_value /* your data */ })

// Invoke
model.run(inputBuffers, outputBuffers)

// Read the output
val outputFloatArray = outputBuffers[0].readFloat()

// Clean up buffers and model
inputBuffers.forEach { it.close() }
outputBuffers.forEach { it.close() }
model.close()

مدل کامپایل شده (CompiledModel)

رابط برنامه‌نویسی کاربردی مدل کامپایل‌شده ( CompiledModel ) مسئول بارگذاری یک مدل، اعمال شتاب سخت‌افزاری، نمونه‌سازی زمان اجرا، ایجاد بافرهای ورودی و خروجی و اجرای استنتاج است.

قطعه کد ساده‌شده‌ی زیر نشان می‌دهد که چگونه API مدل کامپایل‌شده، یک مدل LiteRT ( .tflite ) را دریافت کرده و یک مدل کامپایل‌شده ایجاد می‌کند که آماده‌ی اجرای استنتاج است.

val  model =
  CompiledModel.create(
    context.assets,
    "mymodel.tflite"
  )

قطعه کد ساده‌شده‌ی زیر نشان می‌دهد که چگونه رابط برنامه‌نویسی کاربردی (API) CompiledModel ) یک ورودی و یک بافر خروجی می‌گیرد و استنتاج‌ها را با مدل کامپایل‌شده اجرا می‌کند.

// Preallocate input/output buffers
val inputBuffers = model.createInputBuffers()
val outputBuffers = model.createOutputBuffers()

// Fill the first input
inputBuffers[0].writeFloat(FloatArray(data_size) { data_value /* your data */ })
// Invoke
model.run(inputBuffers, outputBuffers)
// Read the output
val outputFloatArray = outputBuffers[0].readFloat()

// Clean up buffers and model
inputBuffers.forEach { it.close() }
outputBuffers.forEach { it.close() }
model.close()

برای مشاهده کامل‌تر نحوه پیاده‌سازی CompiledModel API، به کد منبع در Model.kt مراجعه کنید.

بافر تنسور (TensorBuffer)

LiteRT پشتیبانی داخلی برای قابلیت همکاری بافر ورودی/خروجی ارائه می‌دهد و از API بافر تنسور ( TensorBuffer ) برای مدیریت جریان داده‌ها به داخل و خارج از CompiledModel استفاده می‌کند. API بافر تنسور امکان نوشتن ( Write<T>() ) و خواندن ( Read<T>() ) و قفل کردن بافرها را فراهم می‌کند.

برای مشاهده کامل‌تر نحوه پیاده‌سازی API Tensor Buffer، به کد منبع در TensorBuffer.kt مراجعه کنید.