대리자는 GPU 및 디지털 신호 처리기(DSP)와 같은 온디바이스 가속기를 활용하여 LiteRT 모델의 하드웨어 가속을 지원합니다.
기본적으로 LiteRT는 ARM Neon 명령어 세트에 최적화된 CPU 커널을 활용합니다. 하지만 CPU는 머신러닝 모델에서 일반적으로 발견되는 무거운 산술 (예: 컨볼루션 및 밀도층과 관련된 행렬 수학)에 최적화되어 있지 않은 다목적 프로세서입니다.
반면 대부분의 최신 휴대전화에는 이러한 무거운 작업을 더 잘 처리하는 칩이 포함되어 있습니다. 신경망 작업에 이를 활용하면 지연 시간과 전력 효율성 측면에서 큰 이점을 얻을 수 있습니다. 예를 들어 GPU는 지연 시간을 최대 5배 단축할 수 있습니다.
이러한 각 가속기에는 모바일 GPU용 OpenCL 또는 OpenGL ES와 같은 맞춤 계산을 지원하는 API가 연결되어 있습니다. 일반적으로 이러한 인터페이스를 통해 신경망을 실행하려면 많은 맞춤 코드를 작성해야 합니다. 각 액셀러레이터에는 장단점이 있으며 신경망에서 모든 작업을 실행할 수 없다는 점을 고려하면 상황이 더욱 복잡해집니다. TensorFlow Lite의 대리자 API는 TFLite 런타임과 이러한 하위 수준 API 간의 브리지 역할을 하여 이 문제를 해결합니다.

위임자 선택
LiteRT는 여러 위임을 지원하며 각 위임은 특정 플랫폼과 특정 유형의 모델에 최적화되어 있습니다. 일반적으로 타겟팅하는 플랫폼 (Android 또는 iOS)과 가속화하려는 모델 유형 (부동 소수점 또는 양자화)이라는 두 가지 주요 기준에 따라 사용 사례에 적용할 수 있는 위임자가 여러 개 있습니다.
플랫폼별 위임
크로스 플랫폼 (Android 및 iOS)
- GPU 위임 - GPU 위임은 Android와 iOS 모두에서 사용할 수 있습니다. GPU를 사용할 수 있는 경우 32비트 및 16비트 부동 기반 모델을 실행하도록 최적화되어 있습니다. 또한 8비트 양자화 모델을 지원하고 부동 소수점 버전과 동등한 GPU 성능을 제공합니다. GPU 위임자에 관한 자세한 내용은 GPU의 LiteRT를 참고하세요.
iOS
- 최신 iPhone 및 iPad용 Core ML 위임 - Neural Engine을 사용할 수 있는 최신 iPhone 및 iPad의 경우 Core ML 위임을 사용하여 32비트 또는 16비트 부동 소수점 모델의 추론을 가속화할 수 있습니다. Neural Engine은 A12 SoC 이상이 적용된 Apple 휴대기기에서 사용할 수 있습니다. Core ML 위임의 개요와 단계별 안내는 LiteRT Core ML 위임을 참고하세요.
모델 유형별 대리자
각 가속기는 특정 비트 너비의 데이터를 염두에 두고 설계됩니다. 8비트 양자화 작업만 지원하는 대리자에 부동 소수점 모델을 제공하면 모든 작업을 거부하고 모델이 CPU에서 완전히 실행됩니다. 이러한 상황을 방지하기 위해 아래 표에서는 모델 유형에 따른 위임 지원을 간략하게 설명합니다.
| 모델 유형 | GPU | CoreML |
|---|---|---|
| 부동 소수점 (32비트) | 예 | 예 |
| 학습 후 float16 양자화 | 예 | 예 |
| 학습 후 동적 범위 양자화 | 예 | 아니요 |
| 학습 후 정수 양자화 | 예 | 아니요 |
| 양자화 인식 학습 | 예 | 아니요 |
성능 검증
이 섹션의 정보는 애플리케이션을 개선할 수 있는 대리인을 선정하기 위한 대략적인 가이드라인 역할을 합니다. 하지만 각 위임자에는 지원하는 사전 정의된 작업 집합이 있으며 모델과 기기에 따라 다르게 실행될 수 있습니다. 따라서 일반적으로 벤치마킹을 실행하여 필요에 따라 위임이 얼마나 유용한지 파악하는 것이 좋습니다. 이는 LiteRT 런타임에 대리자를 연결하는 것과 관련된 바이너리 크기 증가를 정당화하는 데도 도움이 됩니다.
LiteRT에는 개발자가 애플리케이션에서 대리자를 자신 있게 사용할 수 있도록 지원하는 광범위한 성능 및 정확도 평가 도구가 있습니다. 이러한 도구는 다음 섹션에서 설명합니다.
평가 도구
지연 시간 및 메모리 사용량
LiteRT의 벤치마크 도구는 적절한 매개변수와 함께 사용하여 평균 추론 지연 시간, 초기화 오버헤드, 메모리 사용 공간 등 모델 성능을 추정할 수 있습니다. 이 도구는 모델에 가장 적합한 대리자 구성을 파악하기 위해 여러 플래그를 지원합니다. 예를 들어 --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 이미지 분류에서 상위 5개 항목이 1% 미만으로 개선되었습니다.
LiteRT에는 지정된 모델에 대해 위임이 얼마나 정확하게 작동하는지 측정하는 두 가지 유형의 도구가 있습니다. 작업 기반 및 작업 무관입니다. 이 섹션에 설명된 모든 도구는 이전 섹션의 벤치마킹 도구에서 사용되는 고급 위임 매개변수를 지원합니다. 아래 하위 섹션에서는 모델 평가 (모델 자체가 작업에 적합한가?)가 아닌 위임 평가 (위임이 CPU와 동일하게 실행되는가?)에 중점을 둡니다.
작업 기반 평가
LiteRT에는 두 가지 이미지 기반 작업의 정확성을 평가하는 도구가 있습니다.
상위 K 정확도를 사용하는 ILSVRC 2012 (이미지 분류)
이러한 도구의 사전 빌드된 바이너리 (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의 상위 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
작업에 구애받지 않는 평가
기존의 기기 내 평가 도구가 없는 작업이나 맞춤 모델을 실험하는 경우 LiteRT에는 추론 차이 도구가 있습니다. (Android, 64비트 ARM 바이너리 아키텍처 바이너리 여기)
추론 차이는 두 설정에서 LiteRT 실행 (지연 시간 및 출력 값 편차 측면)을 비교합니다.
- 단일 스레드 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 = 10만큼 높을 수 있습니다.