LiteRT 위임

위임은 다음과 같은 방법으로 LiteRT 모델의 하드웨어 가속을 사용 설정합니다. GPU 및 디지털 신호 프로세서와 같은 온디바이스 가속기 활용 (DSP).

기본적으로 LiteRT는 ARM에 최적화된 CPU 커널을 사용합니다. 네온 명령 집합으로 나뉩니다. 그러나 CPU는 복잡한 작업을 처리할 수 없는 기계에서 일반적으로 볼 수 있는 무거운 산술에 맞게 최적화되어야 합니다. 학습 모델 (예: 컨볼루션 및 밀집과 관련된 행렬 수학) 레이어)

반면에 대부분의 최신 휴대폰에는 처리하는 데 더 많은 시간을 할애할 수 있습니다. 신경망 작업에 활용하기 지연 시간 및 전력 효율성 측면에서 막대한 이점을 제공합니다. 예를 들어 GPU는 초당 최대 5배의 성능을 속도 향상 지연 시간이 단축됩니다

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

위임이 있는 런타임

위임 선택

LiteRT는 여러 위임을 지원하며, 각 위임은 특정 플랫폼 및 특정 유형의 모델을 지원합니다. 일반적으로 두 가지 주요 기준에 따라 사용 사례에 적용할 수 있는 여러 위임자를 선택합니다. 타겟팅하는 플랫폼 (Android 또는 iOS?) 및 모델 유형 (부동 소수점 또는 양자화?)인지 파악할 수 있습니다.

플랫폼별 위임

교차 플랫폼 (Android 및 iOS)

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

iOS

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

모델 유형별 위임

각 액셀러레이터는 특정 비트 너비의 데이터를 염두에 두고 설계되었습니다. 만약 8비트 양자화 처리만 지원하는 대리자에 부동 소수점 모델 제공 모든 연산이 거부되고 모델이 완전히 CPU입니다. 이러한 예상치 못한 문제를 피하기 위해 아래 표에는 모델 유형에 따른 지원을 위임합니다.

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

성능 검증

이 섹션의 정보는 위임하는 방법을 배우게 됩니다. 다만 한 가지 유의해야 할 점은 각 델리게이트가 지원하는 사전 정의된 일련의 연산이 있으며, 모델과 기기에 따라 다르게 작동합니다. 따라서 일반적으로 위임이 얼마나 유용한지 측정하기 위해 몇 가지 벤치마킹을 수행하는 것이 좋습니다. 맞춤설정할 수 있습니다 이는 또한 컨테이너와 관련된 바이너리 크기 증가를 정당화하는 데 LiteRT 런타임에 대리자 연결

LiteRT는 광범위한 성능 및 정확도 평가 도구를 제공합니다. 을 사용하면 개발자가 애플리케이션에서 안심하고 위임을 사용할 수 있습니다. 이러한 도구에 대해서는 다음 섹션에서 설명합니다.

평가 도구

지연 시간 및 메모리 사용량

LiteRT의 벤치마크 도구는 평균 추론을 포함하여 모델 성능을 추정하는 데 적합한 매개변수 초기화 오버헤드, 메모리 사용 공간 등이 포함됩니다. 이 도구는 모델에 가장 적합한 대리자 구성을 파악할 수 있습니다. 대상 인스턴스: --gpu_backend=gl--use_gpu로 지정하여 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% 미만).

LiteRT에는 위임의 정확도를 측정하는 데 사용할 수 있는 두 가지 유형의 도구가 있습니다. 작업 기반작업에 제약이 없는 모델에서 동작합니다. 모든 도구 이 섹션에 설명된 대로 고급 위임은 매개변수 벤치마킹 도구에서 사용된 모델입니다. Note that the 아래 하위 섹션에서는 대리인 평가에 중점을 둡니다 (대리인이 CPU와 동일한가?)를 제공하는 것이 더 이상적입니다. 태스크?).

작업 기반 평가

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

이러한 도구 (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

특정 작업에 대한 평가

설정된 온디바이스 평가 도구가 없거나 LiteRT는 커스텀 모델을 실험 중인 경우에 차이 있습니다. (Android, 64비트 ARM 바이너리 아키텍처 바이너리 여기)

추론 차이는 LiteRT 실행 (지연 시간 및 출력-값 편차)로 나타낼 수 있습니다.

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

이를 위해 도구는 임의의 가우시안 데이터를 생성하고 이를 두 개의 TFLite 인터프리터 - 하나는 단일 스레드 CPU 커널을 실행하고 다른 하나는 단일 스레드 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만큼 다릅니다.

이 숫자를 해석하려면 모델에 대한 더 깊은 지식이 필요하며 무엇을 의미할까요? 단순 회귀의 경우 점수 또는 임베딩 중 한 가지일 경우 그 차이가 작을 것입니다. 그렇지 않으면 오류). 그러나 '감지 클래스'와 같은 출력은 다음에서 1개 SSD 모델은 해석하기가 조금 더 어렵습니다. 예를 들어 다르긴 하지만 그것이 뭔가 잘못되었다는 의미는 아닙니다. 위임: 'TV (ID: 10)', '모니터 (ID:20)'라는 두 가지 (가짜) 클래스를 고려합니다. - 대의원이 황금률을 약간 떨어뜨렸고 TV 대신 모니터를 보여준다면 이 텐서의 출력 diff는 20-10 = 10만큼 높아질 수 있습니다.