TensorFlow Lite 위임

위임은 GPU 및 디지털 신호 프로세서(DSP)와 같은 기기 내 가속기를 활용하여 TensorFlow Lite 모델의 하드웨어 가속을 지원합니다.

기본적으로 TensorFlow Lite는 ARM Neon 명령 집합에 최적화된 CPU 커널을 사용합니다. 하지만 CPU는 다목적 프로세서로, 일반적으로 머신러닝 모델에서 볼 수 있는 무거운 산술 (예: 컨볼루션 및 밀집 레이어와 관련된 행렬 수학)에 최적화되어 있지는 않습니다.

반면 대부분의 최신 휴대전화에는 이러한 과도한 작업을 더 잘 처리할 수 있는 칩이 포함되어 있습니다. 이를 신경망 작업에 활용하면 지연 시간 및 전력 효율성 측면에서 엄청난 이점을 얻을 수 있습니다. 예를 들어 GPU는 지연 시간을 최대 5배 향상할 수 있습니다.

이러한 각 가속기에는 맞춤 계산을 지원하는 연결된 API가 있습니다(예: 모바일 GPU용 OpenCL 또는 OpenGL ES). 일반적으로 이러한 인터페이스를 통해 신경망을 실행하려면 많은 커스텀 코드를 작성해야 합니다. 각 액셀러레이터에는 장단점이 있고 신경망의 모든 연산을 실행할 수 없다는 점을 고려하면 상황이 더욱 복잡해집니다. TensorFlow Lite의 Delegate API는 TFLite 런타임과 이러한 하위 수준 API 사이의 다리 역할을 하여 이 문제를 해결합니다.

위임이 있는 런타임

위임 선택

TensorFlow Lite는 여러 위임을 지원하며 각 대리자는 특정 플랫폼 및 특정 모델 유형에 최적화되어 있습니다. 일반적으로 두 가지 주요 기준, 즉 타겟팅하는 플랫폼 (Android 또는 iOS?)과 가속화하려는 모델 유형(부동 소수점 또는 양자화?)에 따라 사용 사례에 여러 위임을 적용할 수 있습니다.

플랫폼별 위임

교차 플랫폼 (Android 및 iOS)

  • GPU 대리자 - GPU 대리자는 Android와 iOS 모두에서 사용할 수 있습니다. GPU를 사용할 수 있는 32비트 및 16비트 부동 기반 모델을 실행하도록 최적화되어 있습니다. 또한 8비트 양자화 모델을 지원하며 부동 버전과 동등한 GPU 성능을 제공합니다. GPU 대리자에 관한 자세한 내용은 GPU의 TensorFlow Lite를 참고하세요.

iOS

  • 최신 iPhone 및 iPad의 Core ML 위임 - Neural Engine을 사용할 수 있는 최신 iPhone 및 iPad의 경우 Core ML 위임을 사용하여 32비트 또는 16비트 부동 소수점 모델의 추론 속도를 높일 수 있습니다. Neural Engine은 A12 SoC 이상이 설치된 Apple 휴대기기에서 사용할 수 있습니다. Core ML 위임 개요 및 단계별 안내는 TensorFlow Lite Core ML 위임을 참조하세요.

모델 유형별 위임

각 액셀러레이터는 특정 비트 너비의 데이터를 염두에 두고 설계되었습니다. 8비트 양자화 연산만 지원하는 대리자에 부동 소수점 모델을 제공하면 모든 연산이 거부되고 모델이 전적으로 CPU에서 실행됩니다. 이러한 예상치 못한 문제를 피하기 위해 아래 표에는 모델 유형에 따른 대리자 지원 개요가 나와 있습니다.

모델 유형 GPU CoreML
부동 소수점 (32비트)
학습 후 float16 양자화
학습 후 동적 범위 양자화 아니요
학습 후 정수 양자화 아니요
양자화 인식 학습 아니요

성능 검증

이 섹션의 정보는 애플리케이션을 개선할 수 있는 위임을 관심 목록에 추가하기 위한 대략적인 가이드라인 역할을 합니다. 하지만 각 대리자에는 미리 정의된 일련의 연산이 있으며, 대리자는 모델과 기기에 따라 다르게 실행될 수 있다는 점에 유의해야 합니다. 따라서 일반적으로 벤치마킹을 실행하여 대리자가 필요에 얼마나 유용한지 측정하는 것이 좋습니다. 또한 TensorFlow Lite 런타임에 대리자를 연결할 때 발생할 수 있는 바이너리 크기 증가를 정당화하는 데 도움이 됩니다.

TensorFlow Lite에는 개발자가 애플리케이션에서 델리게이트를 안심하고 사용하도록 지원할 수 있는 광범위한 성능 및 정확성 평가 도구가 포함되어 있습니다. 이러한 도구에 대해서는 다음 섹션에서 설명합니다.

평가 도구

지연 시간 및 메모리 사용 공간

TensorFlow Lite의 벤치마크 도구를 적절한 매개변수와 함께 사용하여 평균 추론 지연 시간, 초기화 오버헤드, 메모리 사용 공간 등 모델 성능을 예측할 수 있습니다. 이 도구는 모델에 가장 적합한 대리자 구성을 파악할 수 있도록 여러 플래그를 지원합니다. 예를 들어 --gpu_backend=gl--use_gpu로 지정하여 OpenGL로 GPU 실행을 측정할 수 있습니다. 지원되는 대리자 매개변수의 전체 목록은 상세 문서에 정의되어 있습니다.

다음은 adb를 통해 GPU를 사용하는 양자화 모델을 실행하는 예입니다.

adb shell /data/local/tmp/benchmark_model \
  --graph=/data/local/tmp/mobilenet_v1_224_quant.tflite \
  --use_gpu=true

Android, 64비트 ARM 아키텍처용 이 도구의 사전 빌드된 버전은 여기에서 다운로드할 수 있습니다(자세히 알아보기).

정확성 및 정확성

위임은 일반적으로 CPU 위임과 다른 정밀도로 계산을 수행합니다. 따라서 하드웨어 가속에 대리자를 활용하는 것과 관련하여 대체로 사소한 정확성 절충이 발생합니다. 이것이 항상 참은 아닙니다. 예를 들어 GPU는 부동 소수점 정밀도를 사용하여 양자화 모델을 실행하므로 정밀도가 약간 개선될 수 있습니다 (예: ILSVRC 이미지 분류의 Top-5 개선율 1% 미만).

TensorFlow Lite에는 특정 모델에 대해 대리자가 얼마나 정확하게 동작하는지 측정하는 두 가지 유형의 도구, 즉 작업 기반작업에 구애받지 않음이 있습니다. 이 섹션에 설명된 모든 도구는 이전 섹션의 벤치마킹 도구에서 사용하는 고급 위임 매개변수를 지원합니다. 아래의 하위 섹션은 모델 평가 (모델 자체가 작업에 적합한가?)보다는 대리자 평가 (대리자가 CPU와 같은 기능을 하나요?)에 중점을 둡니다.

작업 기반 평가

TensorFlow Lite에는 두 가지 이미지 기반 작업에 대한 정확성을 평가하는 도구가 있습니다.

이러한 도구 (Android, 64비트 ARM 아키텍처)의 사전 빌드된 바이너리와 문서는 여기에서 확인할 수 있습니다.

아래 예는 Pixel 4에서 GPU를 사용한 이미지 분류 평가를 보여줍니다.

adb shell /data/local/tmp/run_eval \
  --model_file=/data/local/tmp/mobilenet_quant_v1_224.tflite \
  --ground_truth_images_path=/data/local/tmp/ilsvrc_images \
  --ground_truth_labels=/data/local/tmp/ilsvrc_validation_labels.txt \
  --model_output_labels=/data/local/tmp/model_output_labels.txt \
  --output_file_path=/data/local/tmp/accuracy_output.txt \
  --num_images=0 # Run on all images. \
  --use_gpu=true

예상되는 출력은 1~10 사이의 Top-K 측정항목 목록입니다.

Top-1 Accuracy: 0.733333
Top-2 Accuracy: 0.826667
Top-3 Accuracy: 0.856667
Top-4 Accuracy: 0.87
Top-5 Accuracy: 0.89
Top-6 Accuracy: 0.903333
Top-7 Accuracy: 0.906667
Top-8 Accuracy: 0.913333
Top-9 Accuracy: 0.92
Top-10 Accuracy: 0.923333

특정 작업에 대한 평가

작업을 위한 기기 내 평가 도구가 없거나 커스텀 모델을 실험하는 경우 TensorFlow Lite에는 추론 오차 도구가 있습니다. (Android, 64비트 ARM 바이너리 아키텍처 바이너리는 여기를 참고하세요.)

추론 차이는 지연 시간 및 출력 값 편차 측면에서 TensorFlow Lite 실행을 다음 두 가지 설정으로 비교합니다.

  • 단일 스레드 CPU 추론
  • 매개변수로 정의되는 사용자 정의 추론

이를 위해 도구는 임의의 가우시안 데이터를 생성하고 이를 두 개의 TFLite 인터프리터를 통해 전달합니다. 하나는 단일 스레드 CPU 커널을 실행하고, 다른 하나는 사용자의 인수로 매개변수화합니다.

두 인터프리터의 지연 시간과 각 인터프리터의 출력 텐서 간의 절대 차이를 요소별로 측정합니다.

단일 출력 텐서가 있는 모델의 경우 출력은 다음과 같습니다.

Num evaluation runs: 50
Reference run latency: avg=84364.2(us), std_dev=12525(us)
Test run latency: avg=7281.64(us), std_dev=2089(us)
OutputDiff[0]: avg_error=1.96277e-05, std_dev=6.95767e-06

즉, 색인 0에 있는 출력 텐서의 경우 CPU 출력의 요소가 대리자 출력과 평균 1.96e-05 차이입니다.

이 숫자를 해석하려면 모델과 각 출력 텐서가 의미하는 바를 더 깊이 알고 있어야 합니다. 일종의 점수 또는 임베딩을 결정하는 단순한 회귀인 경우 차이가 낮아야 합니다 (그렇지 않으면 대리자의 오류임). 하지만 SSD 모델의 '감지 클래스' 출력과 같은 출력은 해석하기가 조금 더 어렵습니다. 예를 들어 이 도구를 사용하여 차이를 표시할 수 있지만 대리자에 실제로 문제가 있는 것은 아닙니다. 두 가지 (가짜) 클래스 'TV (ID: 10)', '모니터 (ID:20)'를 생각해 보세요. 대리자가 골든 정답에서 약간 벗어나고 TV 대신 모니터를 표시하는 경우 이 텐서의 출력 차이는 20~10이 될 수 있습니다.