C/C++ API ile GPU hızlandırma temsilcisi

Makine öğrenimi (ML) modellerinizi çalıştırmak için grafik işlem birimlerini (GPU'lar) kullanmak, ML özellikli uygulamalarınızın performansını ve kullanıcı deneyimini önemli ölçüde artırabilir. Android cihazlarda, bir temsilci ve aşağıdaki API'lerden birini kullanarak modellerinizin GPU hızlandırmalı yürütülmesini etkinleştirebilirsiniz:

  • Tercüman API'si - kılavuz
  • Görev kitaplığı API'si - kılavuz
  • Yerel (C/C++) API - bu kılavuz

Bu kılavuz, C API, C++ API için GPU temsilcisinin gelişmiş kullanımlarını ve nicelenmiş modellerin kullanımını kapsar. En iyi uygulamalar ve gelişmiş teknikler de dahil olmak üzere TensorFlow Lite için GPU temsilcisini kullanma hakkında daha fazla bilgi için GPU temsilcileri sayfasına bakın.

GPU hızlandırmayı etkinleştir

Aşağıdaki örnek kodda gösterildiği gibi, TfLiteGpuDelegateV2Create() ile temsilci oluşturup TfLiteGpuDelegateV2Delete() ile yok ederek C veya C++'da Android için TensorFlow Lite GPU temsilcisini kullanın:

// Set up interpreter.
auto model = FlatBufferModel::BuildFromFile(model_path);
if (!model) return false;
ops::builtin::BuiltinOpResolver op_resolver;
std::unique_ptr<Interpreter> interpreter;
InterpreterBuilder(*model, op_resolver)(&interpreter);

// NEW: Prepare GPU delegate.
auto* delegate = TfLiteGpuDelegateV2Create(/*default options=*/nullptr);
if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;

// Run inference.
WriteToInputTensor(interpreter->typed_input_tensor<float>(0));
if (interpreter->Invoke() != kTfLiteOk) return false;
ReadFromOutputTensor(interpreter->typed_output_tensor<float>(0));

// NEW: Clean up.
TfLiteGpuDelegateV2Delete(delegate);

Özel seçeneklere sahip bir temsilci örneği oluşturmak için TfLiteGpuDelegateOptionsV2 nesne kodunu inceleyin. Varsayılan seçenekleri TfLiteGpuDelegateOptionsV2Default() ile başlatabilir ve ardından bunları gerektiği gibi değiştirebilirsiniz.

C veya C++'da Android için TensorFlow Lite GPU temsilcisi, Bazel derleme sistemini kullanır. Aşağıdaki komutu kullanarak temsilciyi oluşturabilirsiniz:

bazel build -c opt --config android_arm64 tensorflow/lite/delegates/gpu:delegate                           # for static library
bazel build -c opt --config android_arm64 tensorflow/lite/delegates/gpu:libtensorflowlite_gpu_delegate.so  # for dynamic library

Interpreter::ModifyGraphWithDelegate() veya Interpreter::Invoke() çağrılırken, arayanın geçerli iş parçacığında bir EGLContext olmalı ve Interpreter::Invoke() aynı EGLContext çağrılmalıdır. Bir EGLContext mevcut değilse, temsilci dahili olarak bir tane oluşturur, ancak bu durumda Interpreter::Invoke() her zaman Interpreter::ModifyGraphWithDelegate() çağrıldığı aynı iş parçacığından çağrıldığından emin olmalısınız.

Google Play Hizmetlerinde TensorFlow Lite ile:

Google Play Hizmetleri C API'sinde TensorFlow Lite kullanıyorsanız, TensorFlow Lite çalışma zamanını başlatmadan önce cihazınız için bir GPU temsilcisinin mevcut olup olmadığını kontrol etmek için Java/Kotlin API'sini kullanmanız gerekecektir.

GPU temsilcisi gradle bağımlılıklarını uygulamanıza ekleyin:

implementation 'com.google.android.gms:play-services-tflite-gpu:16.2.0'

Ardından GPU kullanılabilirliğini kontrol edin ve kontrol başarılı olursa TfLiteNative'i başlatın:

Java

Task tfLiteHandleTask =
TfLiteGpu.isGpuDelegateAvailable(this)
   .onSuccessTask(gpuAvailable -> {
      TfLiteInitializationOptions options =
        TfLiteInitializationOptions.builder()
          .setEnableGpuDelegateSupport(gpuAvailable).build();
        return TfLiteNative.initialize(this, options);
      }
    );
      

Kotlin

val tfLiteHandleTask = TfLiteGpu.isGpuDelegateAvailable(this)
    .onSuccessTask { gpuAvailable ->
        val options = TfLiteInitializationOptions.Builder()
            .setEnableGpuDelegateSupport(gpuAvailable)
            .build()
        TfLiteNative.initialize(this, options)
    }
        

Ayrıca CMake yapılandırmanızı TFLITE_USE_OPAQUE_DELEGATE derleyici bayrağını içerecek şekilde güncellemeniz gerekir:

add_compile_definitions(TFLITE_USE_OPAQUE_DELEGATE)

FlatBuffers kitaplığı, temsilci eklentilerini yapılandırmak için kullanılır, bu nedenle onu yerel kodunuzun bağımlılıklarına eklemeniz gerekir. Resmi CMake proje yapılandırmasını aşağıdaki gibi kullanabilirsiniz:

target_include_directories(tflite-jni PUBLIC
        third_party/headers # flatbuffers
     ...)

Ayrıca başlıkları uygulamanıza da paketleyebilirsiniz.

Son olarak C kodunuzda GPU çıkarımını kullanmak için TFLiteSettings kullanarak GPU temsilcisini oluşturun:

#include "flatbuffers/flatbuffers.h"
#include "tensorflow/lite/acceleration/configuration/configuration_generated.h"

flatbuffers::FlatBufferBuilder fbb;
tflite::TFLiteSettingsBuilder builder(fbb);
const tflite::TFLiteSettings* tflite_settings =
    flatbuffers::GetTemporaryPointer(fbb, builder.Finish());

const TfLiteOpaqueDelegatePlugin* pluginCApi = TfLiteGpuDelegatePluginCApi();
TfLiteOpaqueDelegate* gpu_delegate = pluginCApi->create(tflite_settings);

Nicelenmiş modeller

Android GPU temsilci kitaplıkları varsayılan olarak nicelenmiş modelleri destekler. GPU temsilcisiyle nicelenmiş modelleri kullanmak için herhangi bir kod değişikliği yapmanız gerekmez. Aşağıdaki bölümde, test veya deneysel amaçlarla nicelenmiş desteğin nasıl devre dışı bırakılacağı açıklanmaktadır.

Nicelenmiş model desteğini devre dışı bırakın

Aşağıdaki kod, nicelenmiş modeller için desteğin nasıl devre dışı bırakılacağını gösterir.

C++

TfLiteGpuDelegateOptionsV2 options = TfLiteGpuDelegateOptionsV2Default();
options.experimental_flags = TFLITE_GPU_EXPERIMENTAL_FLAGS_NONE;

auto* delegate = TfLiteGpuDelegateV2Create(options);
if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;
      

Nicelenmiş modelleri GPU hızlandırmayla çalıştırma hakkında daha fazla bilgi için bkz. GPU temsilcisine genel bakış.