이 페이지는 Cloud Translation API를 통해 번역되었습니다.
Switch to English

TensorFlow Lite GPU 델리게이트

TensorFlow Lite 는 여러 하드웨어 가속기를 지원합니다. 이 문서는 Android 및 iOS에서 TensorFlow Lite 대리자 API를 사용하여 GPU 백엔드를 사용하는 방법을 설명합니다.

GPU는 대규모 병렬 처리가 가능한 워크로드를 위해 높은 처리량을 갖도록 설계되었습니다. 따라서 이들은 많은 수의 연산자로 구성된 심층 신경망에 적합하며, 각 연산자는 작은 워크로드로 쉽게 분할되고 병렬로 수행 될 수있는 일부 입력 텐서에서 작업하므로 일반적으로 지연 시간이 짧습니다. 최상의 시나리오에서 GPU에 대한 추론은 이제 이전에는 사용할 수 없었던 실시간 애플리케이션에 대해 충분히 빠르게 실행될 수 있습니다.

CPU와 달리 GPU는 16 비트 또는 32 비트 부동 소수점 숫자로 계산하며 최적의 성능을 위해 양자화가 필요하지 않습니다. 델리게이트는 8 비트 양자화 된 모델을 허용하지만 계산은 부동 소수점 숫자로 수행됩니다. 자세한 내용은 고급 문서 를 참조하십시오.

GPU 추론의 또 다른 이점은 전력 효율성입니다. GPU는 매우 효율적이고 최적화 된 방식으로 계산을 수행하므로 동일한 작업이 CPU에서 실행될 때보 다 전력을 덜 소비하고 열을 덜 발생시킵니다.

데모 앱 튜토리얼

GPU 델리게이트를 시험하는 가장 쉬운 방법은 GPU 지원을 통해 분류 데모 애플리케이션을 구축하는 아래 튜토리얼을 따르는 것입니다. GPU 코드는 현재로서는 바이너리 일뿐입니다. 곧 오픈 소스가 될 것입니다. 데모를 작동시키는 방법을 이해 한 후에는 사용자 지정 모델에서이를 시도해 볼 수 있습니다.

Android (Android Studio 포함)

단계별 자습서 는 Android 용 GPU Delegate 비디오 시청하십시오.

1 단계. TensorFlow 소스 코드를 복제하고 Android Studio에서 엽니 다.

git clone https://github.com/tensorflow/tensorflow

2 단계. 야간 GPU AAR을 사용하도록 app/build.gradle 편집

기존 dependencies 블록의 기존 tensorflow-lite 패키지와 함께 tensorflow-lite-gpu 패키지를 추가합니다.

dependencies {
    ...
    implementation 'org.tensorflow:tensorflow-lite:2.3.0'
    implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
}

3 단계. 빌드 및 실행

실행 → '앱'을 실행합니다. 응용 프로그램을 실행하면 GPU 활성화 버튼이 표시됩니다. 양자화에서 부동 모델로 변경 한 다음 GPU를 클릭하여 GPU에서 실행합니다.

Android GPU 데모 실행 및 GPU로 전환

iOS (XCode 포함)

단계별 자습서 는 iOS 용 GPU Delegate 비디오 시청하십시오.

1 단계. 데모 소스 코드를 얻고 컴파일되었는지 확인합니다.

iOS 데모 앱 튜토리얼을 따르십시오. 수정되지 않은 iOS 카메라 데모가 휴대폰에서 작동하는 지점으로 이동합니다.

2 단계. TensorFlow Lite GPU CocoaPod를 사용하도록 Podfile 수정

TensorFlow Lite 2.0.0까지 GPU 델리게이트를 포함하는 바이너리 CocoaPod를 빌드했습니다. 프로젝트를 사용하도록 전환하려면`TensorFlowLite` 대신`TensorFlowLiteGpuExperimental` 포드를 사용하도록`tensorflow / tensorflow / lite / examples / ios / camera / Podfile` 파일을 수정하세요. ```target 'YourProjectName'# pod 'TensorFlowLite', '1.12.0'pod 'TensorFlowLiteGpuExperimental'```

TensorFlow Lite 2.1.0부터 GPU 델리게이트가 TensorFlowLiteC 포드에 포함됩니다. 언어에 따라 TensorFlowLiteCTensorFlowLiteSwift 중에서 선택할 수 있습니다.

야간 버전 및 예정된 2.3.0 릴리스의 경우 기본적으로 GPU 델리게이트가 이진 크기를 줄이기 위해 포드에서 제외됩니다. 하위 사양을 지정하여 포함 할 수 있습니다. TensorFlowLiteSwift 포드의 경우 :

pod 'TensorFlowLiteSwift/Metal', '~> 0.0.1-nightly',

또는

pod 'TensorFlowLiteSwift', '~> 0.0.1-nightly', :subspecs => ['Metal']

C API를 사용하려는 경우 TensorFlowLiteC 대해서도 유사하게 수행 할 수 있습니다.

3 단계. GPU 델리게이트 활성화

GPU 델리게이트를 사용할 코드를 활성화하려면 CameraExampleViewController.h 에서 TFLITE_USE_GPU_DELEGATE 를 0에서 1로 변경해야합니다.

#define TFLITE_USE_GPU_DELEGATE 1

4 단계. 데모 앱 빌드 및 실행

이전 단계를 수행 한 후 앱을 실행할 수 있습니다.

5 단계. 릴리스 모드

4 단계에서 디버그 모드로 실행하는 동안 성능을 향상하려면 적절한 최적의 Metal 설정을 사용하여 릴리스 빌드로 변경해야합니다. 특히 이러한 설정을 편집하려면 Product > Scheme > Edit Scheme... 합니다. Run 선택합니다. Info 탭에서 Build ConfigurationDebug 에서 Release 변경하고 Debug executable 선택 취소 Debug executable .

릴리스 설정

그런 다음 Options 탭을 클릭하고 GPU Frame CaptureDisabled 변경하고 Metal API ValidationDisabled 합니다.

금속 옵션 설정

마지막으로 64 비트 아키텍처에서 릴리스 전용 빌드를 선택해야합니다. Project navigator -> tflite_camera_example -> PROJECT -> tflite_camera_example -> Build Settings Build Active Architecture Only > Release 를 Yes로 설정합니다.

릴리스 옵션 설정

자신의 모델에서 GPU 델리게이트 시도

기계적 인조 인간

Android Studio ML 모델 바인딩 또는 TensorFlow Lite 인터프리터를 사용하는지에 따라 모델 가속을 호출하는 두 가지 방법이 있습니다.

TensorFlow Lite 인터프리터

대리자를 추가하는 방법을 보려면 데모를보십시오. 애플리케이션에서 위와 같이 AAR을 추가하고 org.tensorflow.lite.gpu.GpuDelegate 모듈을 가져온 다음 addDelegate 함수를 사용하여 GPU 델리게이트를 인터프리터에 등록합니다.

Kotlin

    import org.tensorflow.lite.Interpreter
    import org.tensorflow.lite.gpu.CompatibilityList
    import org.tensorflow.lite.gpu.GpuDelegate

    val compatList = CompatibilityList()

    val options = Interpreter.Options().apply{
        if(compatList.isDelegateSupportedOnThisDevice){
            // if the device has a supported GPU, add the GPU delegate
            val delegateOptions = compatList.bestOptionsForThisDevice
            this.addDelegate(GpuDelegate(delegateOptions))
        } else {
            // if the GPU is not supported, run on 4 threads
            this.setNumThreads(4)
        }
    }

    val interpreter = Interpreter(model, options)

    // Run inference
    writeToInput(input)
    interpreter.run(input, output)
    readFromOutput(output)
      

자바

    import org.tensorflow.lite.Interpreter;
    import org.tensorflow.lite.gpu.CompatibilityList;
    import org.tensorflow.lite.gpu.GpuDelegate;

    // Initialize interpreter with GPU delegate
    Interpreter.Options options = new Interpreter.Options();
    CompatibilityList compatList = CompatibilityList();

    if(compatList.isDelegateSupportedOnThisDevice()){
        // if the device has a supported GPU, add the GPU delegate
        GpuDelegate.Options delegateOptions = compatList.getBestOptionsForThisDevice();
        GpuDelegate gpuDelegate = new GpuDelegate(delegateOptions);
        options.addDelegate(gpuDelegate);
    } else {
        // if the GPU is not supported, run on 4 threads
        options.setNumThreads(4);
    }

    Interpreter interpreter = new Interpreter(model, options);

    // Run inference
    writeToInput(input);
    interpreter.run(input, output);
    readFromOutput(output);
      

iOS

빠른

GPU 델리게이트로 TensorFlow Lite 인터프리터를 초기화합니다.

import TensorFlowLite

// Load model ...

let delegate = MetalDelegate()

if let interpreter = try Interpreter(modelPath: modelPath,
                                     delegates: [delegate]) {
  // Run inference ...
}

목표 -C

애플리케이션 코드에 GPU 델리게이트 헤더를 포함하고 Interpreter::ModifyGraphWithDelegate 함수를 호출하여 GPU 델리게이트를 인터프리터에 등록합니다.

#include "tensorflow/lite/c/c_api.h"
#include "tensorflow/lite/delegates/gpu/metal_delegate.h"

// Initialize model
TfLiteModel* model = TfLiteModelCreateFromFile(model_path);

// Initialize interpreter with GPU delegate
TfLiteInterpreterOptions* options = TfLiteInterpreterOptionsCreate();
TfLiteDelegate* delegate = TFLGPUDelegateCreate(nil);  // default config
TfLiteInterpreterOptionsAddDelegate(options, metal_delegate);
TfLiteInterpreter* interpreter = TfLiteInterpreterCreate(model, options);
TfLiteInterpreterOptionsDelete(options);

TfLiteInterpreterAllocateTensors(interpreter);

NSMutableData *input_data = [NSMutableData dataWithLength:input_size * sizeof(float)];
NSMutableData *output_data = [NSMutableData dataWithLength:output_size * sizeof(float)];
TfLiteTensor* input = TfLiteInterpreterGetInputTensor(interpreter, 0);
const TfLiteTensor* output = TfLiteInterpreterGetOutputTensor(interpreter, 0);

// Run inference
TfLiteTensorCopyFromBuffer(input, inputData.bytes, inputData.length);
TfLiteInterpreterInvoke(interpreter);
TfLiteTensorCopyToBuffer(output, outputData.mutableBytes, outputData.length);

// Clean up
TfLiteInterpreterDelete(interpreter);
TFLGpuDelegateDelete(metal_delegate);
TfLiteModelDelete(model);

지원되는 모델 및 작업

GPU 델리게이트가 출시되면서 백엔드에서 실행할 수있는 몇 가지 모델이 포함되었습니다.

지원되는 작업의 전체 목록을 보려면 고급 문서 를 참조하세요.

지원되지 않는 모델 및 작업

일부 작업이 GPU 델리게이트에서 지원되지 않는 경우 프레임 워크는 GPU에서 그래프의 일부만 실행하고 CPU에서 나머지 부분 만 실행합니다. CPU / GPU 동기화 비용이 높기 때문에 이와 같은 분할 실행 모드는 전체 네트워크가 CPU에서만 실행될 때보 다 성능이 저하되는 경우가 많습니다. 이 경우 사용자는 다음과 같은 경고를 받게됩니다.

WARNING: op code #42 cannot be handled by this delegate.

이 실패에 대한 콜백을 제공하지 않았습니다. 이것은 진정한 런타임 실패가 아니기 때문에 개발자가 델리게이트에서 네트워크를 실행하는 동안 관찰 할 수있는 것입니다.

최적화를위한 팁

CPU에서 사소한 일부 작업은 GPU 비용이 높을 수 있습니다. 이러한 작업의 한 클래스는 BATCH_TO_SPACE , SPACE_TO_BATCH , SPACE_TO_DEPTH 등을 포함한 다양한 형태의 재구성 작업입니다. 이러한 작업이 네트워크 설계자의 논리적 사고를 위해 네트워크에 삽입되는 경우 성능을 위해 제거하는 것이 좋습니다.

GPU에서 텐서 데이터는 4 채널로 분할됩니다. 따라서 모양 [B,H,W,5] 의 텐서에 대한 계산은 모양 [B,H,W,8] 의 텐서에 대해 거의 동일하게 수행되지만 [B,H,W,4] 보다 훨씬 나쁩니다 [B,H,W,4] .

그런 의미에서 카메라 하드웨어가 RGBA의 이미지 프레임을 지원하는 경우 메모리 복사 (3 채널 RGB에서 4 채널 RGBX로)를 피할 수 있으므로 해당 4 채널 입력을 훨씬 빠르게 공급할 수 있습니다.

최상의 성능을 위해 주저하지 말고 모바일에 최적화 된 네트워크 아키텍처로 분류기를 다시 훈련 시키십시오. 이는 온 디바이스 추론을위한 최적화의 중요한 부분입니다.