벤치마크 도구
현재 LiteRT 벤치마크 도구는 다음과 같은 중요한 성능 측정항목을 살펴보겠습니다.
- 초기화 시간
- 준비 상태 추론 시간
- 안정적인 상태의 추론 시간
- 초기화 시간 중 메모리 사용량
- 전체 메모리 사용량
벤치마크 도구는 Android 및 iOS용 벤치마크 앱으로, 그리고 네이티브 명령줄 바이너리로 제공되며, 모두 동일한 핵심 성능을 공유합니다. 측정 로직에 영향을 줍니다. 사용 가능한 옵션과 출력 형식은 런타임 환경의 차이로 인해 약간 다를 수 있습니다
Android 벤치마크 앱
Android에서 벤치마크 도구를 사용하는 방법에는 두 가지가 있습니다. 하나는 네이티브 벤치마크 바이너리이고 다른 하나는 Android인 경우 벤치마크 앱보다 훨씬 효과적일 수 있습니다. 둘 중 하나 벤치마크 도구의 수치는 여전히 타겟 CPA를 사용했을 때와 실제 앱에서 모델로 추론을 실행합니다.
이 Android 벤치마크 앱에는 UI가 없습니다. adb
를 사용하여 설치하고 실행합니다.
adb logcat
명령어를 사용하여 결과를 검색할 수 있습니다.
앱 다운로드 또는 빌드
아래 링크를 사용하여 야간에 사전 빌드된 Android 벤치마크 앱을 다운로드하세요.
TF 작업을 지원하는 Android 벤치마크 앱의 경우 Flex 대리자를 통해 아래 링크를 사용하세요.
다음 단계에 따라 소스에서 앱을 빌드할 수도 있습니다. 안내를 따르세요.
벤치마크 준비
벤치마크 앱을 실행하기 전에 앱을 설치하고 모델 파일을 기기에서 다음 단계를 따르세요.
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
로도 제공됩니다. 다음을 수행할 수 있습니다.
리눅스, 맥, 내장 디바이스 및 윈도우와 같은 셸 커맨드 라인에서 이 툴을
Android 기기
바이너리 다운로드 또는 빌드
다음 단계에 따라 나이틀리 사전 빌드된 네이티브 명령줄 바이너리를 다운로드합니다. 다음 링크를 클릭하세요.
TF 작업을 지원하는 야간 사전 빌드된 바이너리의 경우 Flex 대리자를 통해 아래 링크를 사용하세요.
또한 다음 위치에서 네이티브 벤치마크 바이너리를 빌드할 수 있습니다. 출처 하세요.
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 기기에서 벤치마크를 실행하려면 다음에서 앱을 빌드해야 합니다.
소스.
LiteRT 모델 파일을
benchmark_data
디렉터리를 만들고 benchmark_params.json
파일을 수정합니다. 이러한
파일이 앱에 패키징되고 앱은 디렉터리에서 데이터를 읽습니다. 다음 페이지를 방문하세요.
iOS 벤치마크 앱
참조하세요.
잘 알려진 모델의 성능 벤치마크
이 섹션에는 제대로 실행될 때의 LiteRT 성능 벤치마크가 나와 있습니다. 일부 Android 및 iOS 기기에서 알려진 모델을 볼 수 있습니다.
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 ms | 6.45 ms |
Pixel 4 | 14.0 ms | 9.0 ms | |
Mobilenet_1.0_224 (수량) | Pixel 3 | 13.4 ms | --- |
Pixel 4 | 5.0 ms | --- | |
NASNet 모바일 | Pixel 3 | 56 ms | --- |
Pixel 4 | 34.5 ms | --- | |
SqueezeNet | Pixel 3 | 35.8 ms | 9.5 ms |
Pixel 4 | 23.9 ms | 11.1 ms | |
Inception_ResNet_V2 | Pixel 3 | 422 ms | 99.8 ms |
Pixel 4 | 272.6 ms | 87.2 ms | |
Inception_V4 | Pixel 3 | 486 ms | 93 ms |
Pixel 4 | 324.1 ms | 97.6 ms |
iOS 성능 벤치마크
이러한 성능 벤치마크 수치는 iOS 벤치마크 앱.
iOS 벤치마크를 실행하기 위해 적절한
benchmark_params.json
를 수정하여 num_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 ms | 3.4 ms |
Mobilenet_1.0_224 (수량) | iPhone XS | 11ms | --- |
NASNet 모바일 | iPhone XS | 30.4 ms | --- |
SqueezeNet | iPhone XS | 21.1 ms | 15.5 ms |
Inception_ResNet_V2 | iPhone XS | 261.1 ms | 45.7 ms |
Inception_V4 | iPhone XS | 309 ms | 54.4 ms |
Trace LiteRT 내부
Android의 Trace LiteRT 내부 함수
Android 앱의 LiteRT 인터프리터에서 발생하는 내부 이벤트는 다음과 같을 수 있습니다. 캡처한 사람 Android 추적 도구: Android에서도 동일한 이벤트임 Trace API이므로 Java/Kotlin 코드에서 캡처된 이벤트가 LiteRT와 함께 확인됨 내부 이벤트
이벤트의 몇 가지 예는 다음과 같습니다.
- 연산자 호출
- 위임별 그래프 수정
- 텐서 할당
트레이스 캡처의 다양한 옵션 중에서 이 가이드에서는 Android 스튜디오 CPU 프로파일러 및 시스템 추적 앱 다음을 참고하세요. Perfetto 명령줄 도구 또는 Systrace 명령줄 도구 를 참조하세요.
Java 코드에 트레이스 이벤트 추가
이 코드는
이미지 분류
예시 앱 LiteRT 인터프리터는
recognizeImage/runInference
섹션. 이 단계는 선택사항이지만
추론 호출이 실행되는 위치를 확인하는 데 도움이 됩니다.
Trace.beginSection("recognizeImage");
...
// Runs the inference call.
Trace.beginSection("runInference");
tflite.run(inputImageBuffer.getBuffer(), outputProbabilityBuffer.getBuffer().rewind());
Trace.endSection();
...
Trace.endSection();
LiteRT 추적 사용 설정
LiteRT 추적을 사용 설정하려면 Android 시스템 속성을 설정하세요.
debug.tflite.trace
에서 1로 변경한 후 Android 앱을 시작합니다.
adb shell setprop debug.tflite.trace 1
LiteRT 인터프리터가 초기화될 때 이 속성이 설정된 경우 인터프리터의 주요 이벤트 (예: 연산자 호출)가 추적됩니다.
모든 트레이스를 캡처한 후 속성 값을 설정하여 트레이싱을 사용 중지합니다. 0으로 설정합니다.
adb shell setprop debug.tflite.trace 0
Android 스튜디오 CPU 프로파일러
다음을 사용하여 트레이스 캡처 Android 스튜디오 CPU 프로파일러 방법은 다음과 같습니다.
실행 > Profile 'app'을 선택합니다.
Profiler 창이 나타나면 CPU 타임라인의 아무 곳이나 클릭합니다.
'시스템 호출 추적'을 선택합니다. CPU 프로파일링 모드 중에서 선택할 수 있습니다.
'녹화'를 누릅니다. 버튼을 클릭합니다.
'중지'를 누릅니다. 버튼을 클릭합니다.
trace 결과를 조사합니다.
이 예에서는 스레드에 있는 이벤트의 계층 구조와 전체 앱의 데이터 흐름을 확인할 수 있습니다. 스레드가 필요합니다.
시스템 추적 앱
다음에 설명된 단계에 따라 Android 스튜디오 없이 트레이스를 캡처합니다. 시스템 추적 앱.
이 예에서는 동일한 TFLite 이벤트가 캡처되어 Perfetto에 저장되었습니다. Systrace 형식을 따라야 합니다. 캡처된 트레이스 파일은 Perfetto UI에서 열 수 있습니다.
iOS의 Trace LiteRT 내부 기능
iOS 앱의 LiteRT 인터프리터에서 발생하는 내부 이벤트는 다음과 같을 수 있습니다. 캡처한 사람 악기 사용할 수 있습니다. 이들은 iOS signpost Swift/Objective-C 코드에서 캡처된 이벤트가 함께 표시됩니다. (LiteRT 내부 이벤트 포함)
이벤트의 몇 가지 예는 다음과 같습니다.
- 연산자 호출
- 위임별 그래프 수정
- 텐서 할당
LiteRT 추적 사용 설정
아래 단계에 따라 환경 변수 debug.tflite.trace
를 설정합니다.
제품 > 스키마 > Edit Scheme...을 클릭합니다.
'프로필'을 클릭합니다. 를 클릭합니다.
'실행 작업의 인수 및 환경 변수 사용'을 선택 해제합니다. 체크박스를 선택합니다.
'환경 변수'에
debug.tflite.trace
를 추가합니다. 섹션으로 이동합니다.
iOS 앱을 프로파일링할 때 LiteRT 이벤트를 제외하려면 환경 변수를 제거하여 추적을 사용 중지합니다.
XCode 계측기
트레이스를 캡처하려면 다음 단계를 따르세요.
제품 > Profile(프로필)을 선택합니다.
Instruments Tool이 실행될 때 프로파일링 템플릿 사이에서 Logging을 클릭합니다.
'시작'을 누릅니다. 버튼을 클릭합니다.
'중지'를 누릅니다. 버튼을 클릭합니다.
'os_signpost'를 클릭합니다. OS 로깅 하위 시스템 항목을 확장합니다.
'org.tensorflow.lite'를 클릭합니다. OS 로깅 하위 시스템
trace 결과를 조사합니다.
이 예에서는 이벤트의 계층 구조와 각 연산자 시간을 나타냅니다.
추적 데이터 사용
추적 데이터를 사용하면 성능 병목 현상을 식별할 수 있습니다.
다음은 프로파일러에서 얻을 수 있는 유용한 정보의 예입니다. 실적 개선을 위한 잠재적 솔루션:
- 사용 가능한 CPU 코어 수가 추론 수보다 적은 경우 CPU 스케줄링 오버헤드로 인해 성능이 저조할 수 있습니다. 애플리케이션에서 CPU 집약적인 다른 작업의 일정을 변경하여 모델 추론과 겹치거나 인터프리터 수를 조정하면 됩니다. 스레드가 필요합니다.
- 연산자가 완전히 위임되지 않은 경우 모델 그래프의 일부분이 CPU에서 실행됩니다. 나 는 지원되지 않는 연산자를 지원되는 유사한 연산자로 대체할 수 있습니다.