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

Makine öğrenimi (ML) modellerinizi çalıştırmak için grafik işleme birimlerini (GPU) kullanmak, makine öğrenimi özellikli uygulamalarınızın performansını ve kullanıcı deneyimini önemli ölçüde iyileştirebilir. Android cihazlarda, bir yetki verilmiş ve aşağıdaki API'lerden birini kullanarak modellerinizin GPU ile hızlandırılmış yürütülmesini etkinleştirebilirsiniz:

  • Translateer API - kılavuz
  • Yerel (C/C++) API'si - bu kılavuz

Bu kılavuz; C API, C++ API için GPU yetkilendirmesinin gelişmiş kullanımlarını ve ölçülmüş modellerin kullanımını kapsar. En iyi uygulamalar ve gelişmiş teknikler de dahil olmak üzere TensorFlow Lite için GPU yetkilendirmesini kullanma hakkında daha fazla bilgi edinmek için GPU yetkileri sayfasına bakın.

GPU hızlandırmayı etkinleştir

Aşağıdaki örnek kodda gösterildiği gibi, TfLiteGpuDelegateV2Create() ile yetki oluşturup TfLiteGpuDelegateV2Delete() ile kaldırarak C veya C++'ta Android için TensorFlow Lite GPU yetkilendirmesini 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şlatıp daha sonra gereken şekilde değiştirebilirsiniz.

C veya C++'ta 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, çağrıyı yapanın geçerli iş parçacığında EGLContext bulundurması ve Interpreter::Invoke() öğesinin aynı EGLContext içinden çağrılması gerekir. EGLContext mevcut değilse temsilci, dahili olarak bir tane oluşturur ancak Interpreter::Invoke() öğesinin her zaman Interpreter::ModifyGraphWithDelegate() öğesinin çağrıldığı iş parçacığından çağrıldığından emin olmanız gerekir.

Google Play Hizmetleri'nde TensorFlow Lite ile:

Google Play Hizmetleri C API'de TensorFlow Lite'ı kullanıyorsanız TensorFlow Lite çalışma zamanını başlatmadan önce cihazınız için bir GPU yetkilisinin kullanılıp kullanılamadığını kontrol etmek üzere Java/Kotlin API'yi kullanmanız gerekir.

Uygulamanıza GPU yetkilendirme gradle bağımlılıklarını 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<Void> 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)
    }
        

CMake yapılandırmanızı, TFLITE_USE_OPAQUE_DELEGATE derleyici işaretini içerecek şekilde de güncellemeniz gerekir:

add_compile_definitions(TFLITE_USE_OPAQUE_DELEGATE)

FlatBuffers kitaplığı, yetki verilmiş eklentileri yapılandırmak için kullanılır. Bu nedenle, bu kitaplığı yerel kodunuzun bağımlılıklarına eklemeniz gerekir. Resmi CMake proje yapılandırmasını aşağıdaki şekilde kullanabilirsiniz:

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

Ayrıca, başlıkları uygulamanızla birlikte gruplandırabilirsiniz.

Son olarak, C kodunuzda GPU çıkarımını kullanmak için TFLiteSettings kullanarak GPU temsilcisi 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);

Nicel modeller

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

Nicelleştirilmiş model desteğini devre dışı bırak

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

C++

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

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

GPU hızlandırması ile nicelenmiş modelleri çalıştırma hakkında daha fazla bilgi için GPU yetkisi'ne genel bakış bölümüne bakın.