Google Play 서비스 Java API의 TensorFlow Lite

Google Play 서비스의 TensorFlow Lite는 Native API 외에 Java API를 사용하여 액세스할 수도 있습니다. 특히 Google Play 서비스의 TensorFlow Lite는 TensorFlow Lite 인터프리터 API를 통해 사용할 수 있습니다.

인터프리터 API 사용

TensorFlow 런타임에서 제공되는 TensorFlow Lite 인터프리터 API는 ML 모델을 빌드하고 실행하기 위한 범용 인터페이스를 제공합니다. Google Play 서비스 런타임에서 TensorFlow Lite를 사용하여 인터프리터 API로 추론을 실행하려면 다음 단계를 따르세요.

1. 프로젝트 종속 항목 추가

TensorFlow Lite용 Play 서비스 API에 액세스하려면 앱 프로젝트 코드에 다음 종속 항목을 추가합니다.

dependencies {
...
    // Tensorflow Lite dependencies for Google Play services
    implementation 'com.google.android.gms:play-services-tflite-java:16.0.1'
    // Optional: include Tensorflow Lite Support Library
    implementation 'com.google.android.gms:play-services-tflite-support:16.0.1'
...
}

2. TensorFlow Lite 초기화 추가

TensorFlow Lite API를 사용하기 전에 Google Play 서비스 API의 TensorFlow Lite 구성요소를 초기화합니다.

Kotlin

val initializeTask: Task<Void> by lazy { TfLite.initialize(this) }

Java

Task<Void> initializeTask = TfLite.initialize(context);

3. 인터프리터 만들기 및 런타임 옵션 설정

다음 코드 예와 같이 InterpreterApi.create()를 사용하여 인터프리터를 만들고 InterpreterApi.Options.setRuntime()를 호출하여 Google Play 서비스 런타임을 사용하도록 구성합니다.

Kotlin

import org.tensorflow.lite.InterpreterApi
import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime
...
private lateinit var interpreter: InterpreterApi
...
initializeTask.addOnSuccessListener {
  val interpreterOption =
    InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
  interpreter = InterpreterApi.create(
    modelBuffer,
    interpreterOption
  )}
  .addOnFailureListener { e ->
    Log.e("Interpreter", "Cannot initialize interpreter", e)
  }

Java

import org.tensorflow.lite.InterpreterApi
import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime
...
private InterpreterApi interpreter;
...
initializeTask.addOnSuccessListener(a -> {
    interpreter = InterpreterApi.create(modelBuffer,
      new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY));
  })
  .addOnFailureListener(e -> {
    Log.e("Interpreter", String.format("Cannot initialize interpreter: %s",
          e.getMessage()));
  });

Android 사용자 인터페이스 스레드가 차단되지 않으므로 위 구현을 사용해야 합니다. 스레드 실행을 더 면밀하게 관리해야 한다면 인터프리터 만들기에 Tasks.await() 호출을 추가할 수 있습니다.

Kotlin

import androidx.lifecycle.lifecycleScope
...
lifecycleScope.launchWhenStarted { // uses coroutine
  initializeTask.await()
}

Java

@BackgroundThread
InterpreterApi initializeInterpreter() {
    Tasks.await(initializeTask);
    return InterpreterApi.create(...);
}

4. 추론 실행

생성한 interpreter 객체를 사용하여 run() 메서드를 호출하여 추론을 생성합니다.

Kotlin

interpreter.run(inputBuffer, outputBuffer)

Java

interpreter.run(inputBuffer, outputBuffer);

하드웨어 가속

TensorFlow Lite를 사용하면 GPU (그래픽 처리 장치)와 같은 특수 하드웨어 프로세서를 사용하여 모델의 성능을 가속화할 수 있습니다. 대리자라는 하드웨어 드라이버를 사용하여 이러한 특수 프로세서를 활용할 수 있습니다.

GPU 대리자는 Google Play 서비스를 통해 제공되며 인터프리터 API의 Play 서비스 버전과 마찬가지로 동적으로 로드됩니다.

기기 호환성 확인

일부 기기는 TFLite를 사용한 GPU 하드웨어 가속을 지원하지 않습니다. 오류 및 잠재적인 비정상 종료를 완화하려면 TfLiteGpu.isGpuDelegateAvailable 메서드를 사용하여 기기가 GPU 대리자와 호환되는지 확인합니다.

이 메서드를 사용하여 기기가 GPU와 호환되는지 확인하고 GPU가 지원되지 않는 경우 CPU를 대체 수단으로 사용하세요.

useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

useGpuTask와 같은 변수가 있으면 이 변수를 사용하여 기기에서 GPU 대리자를 사용하는지 확인할 수 있습니다.

Kotlin

val interpreterTask = useGpuTask.continueWith { task ->
  val interpreterOptions = InterpreterApi.Options()
      .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
  if (task.result) {
      interpreterOptions.addDelegateFactory(GpuDelegateFactory())
  }
  InterpreterApi.create(FileUtil.loadMappedFile(context, MODEL_PATH), interpreterOptions)
}
    

Java

Task<InterpreterApi.Options> interpreterOptionsTask = useGpuTask.continueWith({ task ->
  InterpreterApi.Options options =
      new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY);
  if (task.getResult()) {
     options.addDelegateFactory(new GpuDelegateFactory());
  }
  return options;
});
    

인터프리터 API를 사용한 GPU

인터프리터 API와 함께 GPU 대리자를 사용하려면 다음 안내를 따르세요.

  1. Play 서비스에서 GPU 대리자를 사용하도록 프로젝트 종속 항목을 업데이트합니다.

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
    
  2. TFlite 초기화에서 GPU 위임 옵션을 사용 설정합니다.

    Kotlin

        TfLite.initialize(context,
          TfLiteInitializationOptions.builder()
           .setEnableGpuDelegateSupport(true)
           .build())
        

    Java

        TfLite.initialize(context,
          TfLiteInitializationOptions.builder()
           .setEnableGpuDelegateSupport(true)
           .build());
        
  3. 인터프리터 옵션에서 GPU 대리자를 사용 설정합니다. addDelegateFactory() withinTranslateerApi.Options()`를 호출하여 대리자 팩토리를 GpuDelegateFactory로 설정합니다.

    Kotlin

    val interpreterOption = InterpreterApi.Options()
    .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
    .addDelegateFactory(GpuDelegateFactory())
    

    Java

    Options interpreterOption = InterpreterApi.Options()
    .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) .addDelegateFactory(new
    GpuDelegateFactory());
    

독립 실행형 TensorFlow Lite에서 이전

독립형 TensorFlow Lite에서 Play 서비스 API로 앱을 이전하려는 경우 앱 프로젝트 코드 업데이트에 관한 다음 추가 안내를 참고하세요.

  1. 이 페이지의 제한사항 섹션을 검토하여 사용 사례가 지원되는지 확인하세요.
  2. 코드를 업데이트하기 전에 모델의 성능 및 정확성을 검사하세요. 특히 버전 2.1 이전 버전의 TensorFlow Lite를 사용하는 경우 새로운 구현과 비교할 기준을 확인할 수 있습니다.
  3. TensorFlow Lite용 Play 서비스 API를 사용하기 위해 모든 코드를 이전한 경우 앱 크기를 줄일 수 있도록 build.gradle 파일에서 기존 TensorFlow Lite 런타임 라이브러리 종속 항목 (org.tensorflow:tensorflow-lite:*가 포함된 항목)을 삭제해야 합니다.
  4. 코드에서 new Interpreter 객체 생성이 모두 발생하는 것을 모두 확인한 후 TranslateerApi.create() 호출을 사용하도록 각 항목을 수정합니다. 새로운 TfLite.initialize는 비동기식이므로 대부분의 경우 드롭인 대체가 아닙니다. 호출 완료 시점을 위한 리스너를 등록해야 합니다. 3단계 코드의 코드 스니펫을 참조하세요.
  5. org.tensorflow.lite.Interpreter 또는 org.tensorflow.lite.InterpreterApi 클래스를 사용하여 소스 파일에 import org.tensorflow.lite.InterpreterApi;import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime;를 추가합니다.
  6. 결과로 발생하는 InterpreterApi.create() 호출에 인수가 하나뿐인 경우 인수 목록에 new InterpreterApi.Options()를 추가합니다.
  7. InterpreterApi.create() 호출의 마지막 인수에 .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)를 추가합니다.
  8. 다른 모든 org.tensorflow.lite.Interpreter 클래스와 일치하는 항목을 org.tensorflow.lite.InterpreterApi로 바꿉니다.

독립형 TensorFlow Lite와 Play 서비스 API를 함께 사용하려면 TensorFlow Lite 2.9 이상을 사용해야 합니다. TensorFlow Lite 2.8 이하 버전은 Play 서비스 API 버전과 호환되지 않습니다.