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

성능 측정

벤치 마크 도구

TensorFlow Lite 벤치 마크 도구는 현재 다음과 같은 중요한 성능 측정 항목에 대한 통계를 측정하고 계산합니다.

  • 초기화 시간
  • 워밍업 상태 추론 시간
  • 정상 상태의 추론 시간
  • 초기화 시간 동안 메모리 사용량
  • 전체 메모리 사용량

벤치 마크 도구는 Android 및 iOS 용 벤치 마크 앱과 기본 명령 줄 바이너리로 사용할 수 있으며 모두 동일한 핵심 성능 측정 로직을 공유합니다. 사용 가능한 옵션 및 출력 형식은 런타임 환경의 차이로 인해 약간 다릅니다.

Android 벤치 마크 앱

Android에서 벤치 마크 도구를 사용하는 두 가지 옵션이 있습니다. 하나는 네이티브 벤치 마크 바이너리 이고 다른 하나는 Android 벤치 마크 앱으로, 앱에서 모델이 어떻게 작동하는지 더 잘 측정합니다. 어느 쪽이든 벤치 마크 도구의 수치는 실제 앱에서 모델로 추론을 실행할 때와 약간 다를 것입니다.

이 Android 벤치 마크 앱에는 UI가 없습니다. adb 명령을 사용하여 설치 및 실행하고 adb logcat 명령을 사용하여 결과를 검색합니다.

앱 다운로드 또는 빌드

아래 링크를 사용하여 사전 제작 된 야간 Android 벤치 마크 앱을 다운로드하세요.

다음 안내 에 따라 소스에서 앱을 빌드 할 수도 있습니다.

벤치 마크 준비

벤치 마크 앱을 실행하기 전에 다음과 같이 앱을 설치하고 모델 파일을 기기에 푸시합니다.

adb install -r -d -g android_aarch64_benchmark_model.apk
adb push your_model.tflite /data/local/tmp

벤치 마크 실행

adb shell am start -S \
  -n org.tensorflow.lite.benchmark/.BenchmarkModelActivity \
  --es args '"--graph=/data/local/tmp/your_model.tflite \
              --num_threads=4"'

graph 는 필수 매개 변수입니다.

  • graph : string
    TFLite 모델 파일의 경로입니다.

벤치 마크 실행을 위해 더 많은 선택적 매개 변수를 지정할 수 있습니다.

  • num_threads : int (기본값 = 1)
    TFLite 인터프리터를 실행하는 데 사용할 스레드 수입니다.
  • use_gpu : bool (기본값 = false)
    GPU 대리자를 사용합니다.
  • use_nnapi : bool (기본값 = false)
    NNAPI 대리자를 사용하십시오.
  • use_xnnpack : bool (기본값 = false )
    XNNPACK 대리자를 사용하십시오.
  • use_hexagon : bool (기본값 = false )
    육각 대리자를 사용합니다.

사용중인 장치에 따라 이러한 옵션 중 일부를 사용할 수 없거나 효과가 없을 수 있습니다. 벤치 마크 앱으로 실행할 수있는 추가 성능 매개 변수는 매개 변수 를 참조하십시오.

logcat 명령을 사용하여 결과를 logcat .

adb logcat | grep "Average inference"

벤치 마크 결과는 다음과 같이보고됩니다.

... tflite  : Average inference timings in us: Warmup: 91471, Init: 4108, Inference: 80660.1

네이티브 벤치 마크 바이너리

벤치 마크 도구는 네이티브 바이너리 benchmark_model 로도 제공됩니다. Linux, Mac, 임베디드 장치 및 Android 장치의 셸 명령 줄에서이 도구를 실행할 수 있습니다.

바이너리 다운로드 또는 빌드

아래 링크를 따라 야간 사전 빌드 된 기본 명령 줄 바이너리를 다운로드합니다.

컴퓨터의 소스 에서 네이티브 벤치 마크 바이너리를 빌드 할 수도 있습니다.

bazel build -c opt //tensorflow/lite/tools/benchmark:benchmark_model

Android NDK 도구 모음으로 빌드하려면 먼저이 가이드를 따라 빌드 환경을 설정하거나이 가이드에 설명 된대로 Docker 이미지를 사용해야합니다.

bazel build -c opt --config=android_arm64 \
  //tensorflow/lite/tools/benchmark:benchmark_model

벤치 마크 실행

컴퓨터에서 벤치 마크를 실행하려면 셸에서 바이너리를 실행합니다.

path/to/downloaded_or_built/benchmark_model \
  --graph=your_model.tflite \
  --num_threads=4

네이티브 명령 줄 바이너리에서 위에서 언급 한 것과 동일한 매개 변수 집합을 사용할 수 있습니다.

모델 작업 프로파일 링

벤치 마크 모델 바이너리를 사용하면 모델 작업을 프로파일 링하고 각 연산자의 실행 시간을 가져올 수도 있습니다. 이렇게하려면 호출 중에 --enable_op_profiling=true 플래그를 benchmark_model 전달합니다. 자세한 내용은 여기 에 설명되어 있습니다 .

단일 실행으로 여러 성능 옵션을위한 기본 벤치 마크 바이너리

편리하고 간단한 C ++ 바이너리도 제공되어 한 번의 실행으로 여러 성능 옵션벤치 마크 할 수 있습니다 . 이 바이너리는 한 번에 하나의 성능 옵션 만 벤치 마크 할 수있는 앞서 언급 한 벤치 마크 도구를 기반으로 빌드되었습니다. 동일한 빌드 / 설치 / 실행 프로세스를 공유하지만이 바이너리의 BUILD 대상 이름은 benchmark_model_performance_options 이며 몇 가지 추가 매개 변수가 필요합니다. 이 바이너리의 중요한 매개 변수는 다음과 같습니다.

perf_options_list : string (기본값 = 'all')
벤치마킹 할 TFLite 성능 옵션의 쉼표로 구분 된 목록입니다.

다음과 같이이 도구에 대해 사전 빌드 된 야간 바이너리를 얻을 수 있습니다.

iOS 벤치 마크 앱

iOS 기기에서 벤치 마크를 실행하려면 소스 에서 앱을 빌드해야합니다. TensorFlow Lite 모델 파일을 소스 트리의 benchmark_data 디렉터리에 넣고 benchmark_params.json 파일을 수정합니다. 이러한 파일은 앱에 패키징되고 앱은 디렉터리에서 데이터를 읽습니다. 자세한 지침은 iOS 벤치 마크 앱 을 참조하십시오.

잘 알려진 모델의 성능 벤치 마크

이 섹션에는 일부 Android 및 iOS 기기에서 잘 알려진 모델을 실행할 때 TensorFlow Lite 성능 벤치 마크가 나열되어 있습니다.

Android 성능 벤치 마크

이러한 성능 벤치 마크 수치는 네이티브 벤치 마크 바이너리 로 생성되었습니다.

Android 벤치 마크의 경우 CPU 어피 니티는 분산을 줄이기 위해 기기의 큰 코어를 사용하도록 설정됩니다 ( 세부 정보 참조 ).

모델이 /data/local/tmp/tflite_models 디렉토리에 다운로드되고 압축이 풀렸다 고 가정합니다. 벤치 마크 바이너리는 이러한 지침을 사용하여 빌드되며 /data/local/tmp 디렉토리에 있다고 가정합니다.

벤치 마크를 실행하려면 :

adb shell /data/local/tmp/benchmark_model \
  --num_threads=4 \
  --graph=/data/local/tmp/tflite_models/${GRAPH} \
  --warmup_runs=1 \
  --num_runs=50

nnapi 위임으로 실행하려면 --use_nnapi=true 설정 --use_nnapi=true . GPU 위임으로 실행하려면 --use_gpu=true 설정 --use_gpu=true .

아래 성능 값은 Android 10에서 측정되었습니다.

모델명 장치 CPU, 4 스레드 GPU NNAPI
Mobilenet_1.0_224 (float) Pixel 3 23.9ms 6.45ms 13.8ms
Pixel 4 14.0ms 9.0ms 14.8ms
Mobilenet_1.0_224 (quant) Pixel 3 13.4ms --- 6.0ms
Pixel 4 5.0ms --- 3.2ms
NASNet 모바일 Pixel 3 56ms --- 102ms
Pixel 4 34.5ms --- 99.0ms
SqueezeNet Pixel 3 35.8ms 9.5ms 18.5ms
Pixel 4 23.9ms 11.1ms 19.0ms
Inception_ResNet_V2 Pixel 3 422ms 99.8ms 201ms
Pixel 4 272.6ms 87.2ms 171.1ms
Inception_V4 Pixel 3 486ms 93ms 292ms
Pixel 4 324.1ms 97.6ms 186.9ms

iOS 성능 벤치 마크

이러한 성능 벤치 마크 수치는 iOS 벤치 마크 앱 에서 생성되었습니다.

아이폰 OS 벤치 마크를 실행하려면, 벤치 마크 앱이 적절한 모델과 포함하도록 수정했다 benchmark_params.json 설정에 수정 된 num_threads GPU의 대리인, 사용하려면 2에 "use_gpu" : "1""gpu_wait_type" : "aggressive" 옵션이 있었다 benchmark_params.json 에도 추가되었습니다.

모델명 장치 CPU, 2 스레드 GPU
Mobilenet_1.0_224 (float) 아이폰 XS 14.8ms 3.4ms
Mobilenet_1.0_224 (quant) 아이폰 XS 11ms ---
NASNet 모바일 아이폰 XS 30.4ms ---
SqueezeNet 아이폰 XS 21.1ms 15.5ms
Inception_ResNet_V2 아이폰 XS 261.1ms 45.7ms
Inception_V4 아이폰 XS 309ms 54.4ms

Android에서 TensorFlow Lite 내부 추적

Android 앱의 TensorFlow Lite 인터프리터의 내부 이벤트는 Android 추적 도구 로 캡처 할 수 있습니다. Android Trace API와 동일한 이벤트이므로 Java / Kotlin 코드에서 캡처 된 이벤트가 TensorFlow Lite 내부 이벤트와 함께 표시됩니다.

이벤트의 몇 가지 예는 다음과 같습니다.

  • 연산자 호출
  • 대리자에 의한 그래프 수정
  • 텐서 할당

추적 캡처를위한 다양한 옵션 중에서이 가이드는 Android 스튜디오 CPU 프로파일 러 및 시스템 추적 앱을 다룹니다. 다른 옵션은 Perfetto 명령 줄 도구 또는 Systrace 명령 줄 도구 를 참조하십시오.

Java 코드에 추적 이벤트 추가

이것은 이미지 분류 예제 앱의 코드 조각입니다. TensorFlow Lite 인터프리터는 recognizeImage/runInference 섹션에서 실행됩니다. 이 단계는 선택 사항이지만 추론 호출이 발생한 위치를 파악하는 데 유용합니다.

  Trace.beginSection("recognizeImage");
  ...
  // Runs the inference call.
  Trace.beginSection("runInference");
  tflite.run(inputImageBuffer.getBuffer(), outputProbabilityBuffer.getBuffer().rewind());
  Trace.endSection();
  ...
  Trace.endSection();

TensorFlow Lite 추적 활성화

TensorFlow Lite 추적을 활성화하려면 Android 앱을 시작하기 전에 Android 시스템 속성 debug.tflite.tracing 을 1로 설정합니다.

adb shell setprop debug.tflite.trace 1

TensorFlow Lite 인터프리터가 초기화 될 때이 속성이 설정되면 인터프리터의 주요 이벤트 (예 : 연산자 호출)가 추적됩니다.

모든 추적을 캡처 한 후 속성 값을 0으로 설정하여 추적을 비활성화합니다.

adb shell setprop debug.tflite.trace 0

Android Studio CPU 프로파일 러

아래 단계에 따라 Android 스튜디오 CPU 프로파일 러로 트레이스를 캡처합니다.

  1. 상단 메뉴에서 실행> 프로필 '앱' 을 선택합니다.

  2. 프로파일 러 창이 나타나면 CPU 타임 라인의 아무 곳이나 클릭합니다.

  3. CPU 프로파일 링 모드 중 'Trace System Calls'를 선택합니다.

    'Trace System Calls'를 선택하십시오.

  4. '녹화'버튼을 누릅니다.

  5. '중지'버튼을 누릅니다.

  6. 추적 결과를 조사하십시오.

    Android Studio 추적

이 예제에서는 스레드의 이벤트 계층 구조와 각 연산자 시간에 대한 통계를 볼 수 있으며 스레드 간 전체 앱의 데이터 흐름도 볼 수 있습니다.

시스템 추적 앱

System Tracing 앱에 설명 된 단계에 따라 Android 스튜디오없이 추적을 캡처합니다.

이 예에서는 동일한 TFLite 이벤트가 캡처되어 Android 기기 버전에 따라 Perfetto 또는 Systrace 형식으로 저장되었습니다. 캡처 된 추적 파일은 Perfetto UI 에서 열 수 있습니다.

Perfetto 추적

추적 데이터 사용

추적 데이터를 사용하면 성능 병목 현상을 식별 할 수 있습니다.

성능 향상을 위해 프로파일 러 및 잠재적 인 솔루션에서 얻을 수있는 통찰력의 몇 가지 예는 다음과 같습니다.

  • 사용 가능한 CPU 코어 수가 추론 스레드 수보다 적 으면 CPU 스케줄링 오버 헤드로 인해 성능이 떨어질 수 있습니다. 모델 추론과 겹치지 않도록 애플리케이션에서 다른 CPU 집약적 작업을 다시 예약하거나 인터프리터 스레드 수를 조정할 수 있습니다.
  • 연산자가 완전히 위임되지 않으면 모델 그래프의 일부가 예상 하드웨어 가속기가 아닌 CPU에서 실행됩니다. 지원되지 않는 연산자를 유사한 지원되는 연산자로 대체 할 수 있습니다.