실적 측정

벤치마크 도구

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

  • 초기화 시간
  • 준비 상태의 추론 시간
  • 안정적인 상태의 추론 시간
  • 초기화 시간 중 메모리 사용량
  • 전체 메모리 사용량

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

Android 벤치마크 앱

Android에서 벤치마크 도구를 사용하는 방법에는 두 가지가 있습니다. 하나는 네이티브 벤치마크 바이너리이고 다른 하나는 Android 벤치마크 앱으로, 앱에서 모델이 작동하는 방식에 관한 더 나은 측정 기준입니다. 두 경우 모두 벤치마크 도구의 수치는 실제 앱에서 모델을 사용하여 추론을 실행할 때와 약간 다릅니다.

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

앱 다운로드 또는 빌드

아래 링크를 사용하여 야간 사전 빌드된 Android 벤치마크 앱을 다운로드합니다.

Flex 위임을 통해 TF 작업을 지원하는 Android 벤치마크 앱의 경우 아래 링크를 사용하세요.

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

벤치마크 준비

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

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_xnnpack: bool (기본값=false)
    XNNPACK 위임을 사용합니다.

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

logcat 명령어를 사용하여 결과를 확인합니다.

adb logcat | grep "Inference timings"

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

... tflite  : Inference timings in us: Init: 5685, First inference: 18535, Warmup (avg): 14462.3, Inference (avg): 14575.2

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

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

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

아래 링크에 따라 나이틀리로 사전 빌드된 네이티브 명령줄 바이너리를 다운로드합니다.

Flex 위임을 통해 TF 작업을 지원하는 야간 사전 빌드된 바이너리의 경우 아래 링크를 사용하세요.

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

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 (default='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

GPU 대리자를 사용하여 실행하려면 --use_gpu=true를 설정합니다.

아래의 성능 값은 Android 10에서 측정된 값입니다.

모델 이름 기기 CPU, 스레드 4개 GPU
Mobilenet_1.0_224(float) Pixel 3 23.9밀리초 6.45밀리초
Pixel 4 14.0밀리초 9.0 ms
Mobilenet_1.0_224 (수량) Pixel 3 13.4밀리초 ---
Pixel 4 5.0 ms ---
NASNet 모바일 Pixel 3 56 ms ---
Pixel 4 34.5밀리초 ---
SqueezeNet Pixel 3 35.8밀리초 9.5 ms
Pixel 4 23.9밀리초 11.1밀리초
Inception_ResNet_V2 Pixel 3 422 ms 99.8밀리초
Pixel 4 272.6밀리초 87.2밀리초
Inception_V4 Pixel 3 486 ms 93 ms
Pixel 4 324.1밀리초 97.6밀리초

iOS 성능 벤치마크

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

iOS 벤치마크를 실행하기 위해 벤치마크 앱이 적절한 모델을 포함하도록 수정되었고 benchmark_params.jsonnum_threads를 2로 설정하도록 수정되었습니다. GPU 대리자를 사용하기 위해 "use_gpu" : "1""gpu_wait_type" : "aggressive" 옵션도 benchmark_params.json에 추가되었습니다.

모델 이름 기기 CPU, 스레드 2개 GPU
Mobilenet_1.0_224(float) iPhone XS 14.8밀리초 3.4 ms
Mobilenet_1.0_224 (수량) iPhone XS 11ms ---
NASNet 모바일 iPhone XS 30.4밀리초 ---
SqueezeNet iPhone XS 21.1밀리초 15.5밀리초
Inception_ResNet_V2 iPhone XS 261.1밀리초 45.7밀리초
Inception_V4 iPhone XS 309 ms 54.4밀리초

TensorFlow Lite 내부 기능 추적

Android에서 TensorFlow Lite 내부 기능 추적

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

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

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

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

자바 코드에 트레이스 이벤트 추가

다음은 이미지 분류 예시 앱의 코드 스니펫입니다. 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.trace를 1로 설정하세요.

adb shell setprop debug.tflite.trace 1

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

모든 trace를 캡처한 후에는 속성 값을 0으로 설정하여 트레이싱을 사용 중지합니다.

adb shell setprop debug.tflite.trace 0

Android 스튜디오 CPU 프로파일러

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

  1. 상단 메뉴에서 Run > Profile 'app'을 선택합니다.

  2. Profiler 창이 표시되면 CPU 타임라인의 아무 곳이나 클릭합니다.

  3. CPU 프로파일링 모드 중에서 '시스템 호출 추적'을 선택하세요.

    '시스템 호출 추적'을 선택합니다.

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

  5. '중지' 버튼을 누르세요.

  6. trace 결과를 조사합니다.

    Android 스튜디오 트레이스

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

시스템 추적 앱

시스템 추적 앱에 설명된 단계에 따라 Android 스튜디오 없이 트레이스를 캡처합니다.

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

Perfetto 트레이스

iOS에서 TensorFlow Lite 내부 기능 추적

iOS 앱의 TensorFlow Lite 인터프리터에서 발생하는 내부 이벤트는 Xcode에 포함된 Instruments 도구로 캡처할 수 있습니다. 이는 iOS signpost 이벤트이므로 Swift/Objective-C 코드에서 캡처된 이벤트는 TensorFlow Lite 내부 이벤트와 함께 표시됩니다.

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

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

TensorFlow Lite 추적 사용 설정

아래 단계에 따라 debug.tflite.trace 환경 변수를 설정합니다.

  1. Xcode 상단 메뉴에서 Product(제품) > Scheme(스키마) > Edit Scheme(스키마 수정)...을 선택합니다.

  2. 왼쪽 창에서 '프로필'을 클릭합니다.

  3. '실행 작업의 인수 및 환경 변수 사용' 체크박스를 선택 해제합니다.

  4. 'Environment Variables' 섹션에 debug.tflite.trace를 추가합니다.

    환경 변수 설정

iOS 앱을 프로파일링할 때 TensorFlow Lite 이벤트를 제외하려면 환경 변수를 삭제하여 추적을 사용 중지하세요.

XCode 도구

다음 단계에 따라 트레이스를 캡처하세요.

  1. Xcode 상단 메뉴에서 Product(제품) > Profile(프로필)을 선택합니다.

  2. 계측 도구가 실행되면 프로파일링 템플릿 중에서 Logging을 클릭합니다.

  3. '시작' 버튼을 누릅니다.

  4. '중지' 버튼을 누르세요.

  5. 'os_signpost'를 클릭하여 OS 로깅 하위 시스템 항목을 펼칩니다.

  6. 'org.tensorflow.lite' OS 로깅 하위 시스템을 클릭합니다.

  7. trace 결과를 조사합니다.

    Xcode 계측 트레이스

이 예시에서는 각 연산자 시간에 대한 이벤트 및 통계의 계층 구조를 볼 수 있습니다.

추적 데이터 사용

추적 데이터를 통해 성능 병목 현상을 식별할 수 있습니다.

다음은 프로파일러에서 얻을 수 있는 통계 정보와 성능 개선을 위한 해결책입니다.

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