Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
tensorflow
GitHub Repository: tensorflow/docs-l10n
Path: blob/master/site/ko/lite/performance/measurement.md
38956 views

μ„±λŠ₯ μΈ‘μ •

벀치마크 도ꡬ

TensorFlow Lite 벀치마크 λ„κ΅¬λŠ” ν˜„μž¬ λ‹€μŒκ³Ό 같은 μ€‘μš”ν•œ μ„±λŠ₯ μ§€ν‘œμ— λŒ€ν•œ 톡계λ₯Ό μΈ‘μ •ν•˜κ³  κ³„μ‚°ν•©λ‹ˆλ‹€.

  • μ΄ˆκΈ°ν™” μ‹œκ°„

  • μ›Œλ°μ—… μƒνƒœμ˜ μΆ”λ‘  μ‹œκ°„

  • 정상 μƒνƒœμ˜ μΆ”λ‘  μ‹œκ°„

  • μ΄ˆκΈ°ν™” μ‹œκ°„ λ™μ•ˆμ˜ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰

  • 전체 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰

벀치마크 λ„κ΅¬λŠ” Android 및 iOS용 벀치마크 μ•±κ³Ό κΈ°λ³Έ λͺ…령쀄 λ°”μ΄λ„ˆλ¦¬λ‘œ μ‚¬μš©ν•  수 있으며, λͺ¨λ‘ λ™μΌν•œ 핡심 μ„±λŠ₯ μΈ‘μ • λ‘œμ§μ„ κ³΅μœ ν•©λ‹ˆλ‹€. λŸ°νƒ€μž„ ν™˜κ²½μ˜ 차이둜 인해 μ‚¬μš© κ°€λŠ₯ν•œ μ˜΅μ…˜ 및 좜λ ₯ ν˜•μ‹μ΄ μ•½κ°„ λ‹€λ¦…λ‹ˆλ‹€.

Android 벀치마크 μ•±

Androidμ—μ„œ 벀치마크 도ꡬλ₯Ό μ‚¬μš©ν•˜λŠ” λ°λŠ” 두 κ°€μ§€ μ˜΅μ…˜μ΄ μžˆμŠ΅λ‹ˆλ‹€. ν•˜λ‚˜λŠ” κΈ°λ³Έ 벀치마크 λ°”μ΄λ„ˆλ¦¬μ΄κ³  λ‹€λ₯Έ ν•˜λ‚˜λŠ” Android 벀치마크 μ•±μœΌλ‘œ, 이 두 λ²ˆμ§Έκ°€ λͺ¨λΈμ΄ μ•±μ—μ„œ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ 보닀 잘 λ‚˜νƒ€λ‚΄μ€λ‹ˆλ‹€. μ–΄λŠ μͺ½μ΄λ“ , 벀치마크 λ„κ΅¬μ˜ μˆ˜μΉ˜λŠ” μ‹€μ œ μ•±μ—μ„œ λͺ¨λΈλ‘œ 좔둠을 μ‹€ν–‰ν•  λ•Œμ™€ μ—¬μ „νžˆ μ•½κ°„ λ‹€λ¦…λ‹ˆλ‹€.

이 Android 벀치마크 μ•±μ—λŠ” UIκ°€ μ—†μŠ΅λ‹ˆλ‹€. adb λͺ…λ Ήμ–΄λ‘œ μ„€μΉ˜ 및 μ‹€ν–‰ν•˜κ³  adb logcat λͺ…λ Ήμ–΄λ‘œ κ²°κ³Όλ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.

μ•± λ‹€μš΄λ‘œλ“œ λ˜λŠ” λΉŒλ“œ

μ•„λž˜ 링크λ₯Ό μ‚¬μš©ν•˜μ—¬ μ•Όκ°„ 사전 λΉŒλ“œλœ Android 벀치마크 앱을 λ‹€μš΄λ‘œλ“œν•©λ‹ˆλ‹€.

Flex delegateλ₯Ό 톡해 TF 연산을 μ§€μ›ν•˜λŠ” Android 벀치마크 μ•±μ˜ 경우, μ•„λž˜ 링크λ₯Ό μ‚¬μš©ν•˜μ„Έμš”.

λ‹€μŒ 지침에 따라 μ†ŒμŠ€μ—μ„œ 앱을 λΉŒλ“œν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

μ°Έκ³ : x86 CPU λ˜λŠ” Hexagon λŒ€λ¦¬μžμ—μ„œ Android 벀치마크 apkλ₯Ό μ‹€ν–‰ν•˜λ €λŠ” 경우 λ˜λŠ” λͺ¨λΈμ— 일뢀 TF μ—°μ‚°μž λ˜λŠ” μ‚¬μš©μž μ§€μ • μ—°μ‚°μžκ°€ ν¬ν•¨λœ 경우 μ†ŒμŠ€μ—μ„œ 앱을 λΉŒλ“œν•΄μ•Ό ν•©λ‹ˆλ‹€.

벀치마크 μ€€λΉ„

벀치마크 앱을 μ‹€ν–‰ν•˜κΈ° 전에 λ‹€μŒκ³Ό 같이 앱을 μ„€μΉ˜ν•˜κ³  λͺ¨λΈ νŒŒμΌμ„ μž₯μΉ˜μ— ν‘Έμ‹œν•©λ‹ˆλ‹€.

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(κΈ°λ³Έκ°’=κ±°μ§“)
    GPU λŒ€λ¦¬μžλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

  • use_nnapi: bool(κΈ°λ³Έκ°’=κ±°μ§“)
    NNAPI λŒ€λ¦¬μžλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

  • use_xnnpack: bool(κΈ°λ³Έκ°’= false)
    XNNPACK λŒ€λ¦¬μžλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

  • use_hexagon: bool(κΈ°λ³Έκ°’= false)
    Hexagon λŒ€λ¦¬μžλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

μ‚¬μš© 쀑인 μž₯μΉ˜μ— 따라 μ΄λŸ¬ν•œ μ˜΅μ…˜ 쀑 일뢀λ₯Ό μ‚¬μš©ν•˜μ§€ λͺ»ν•˜κ±°λ‚˜ νš¨κ³Όκ°€ 없을 수 μžˆμŠ΅λ‹ˆλ‹€. 벀치마크 μ•±μœΌλ‘œ μ‹€ν–‰ν•  수 μžˆλŠ” μΆ”κ°€ μ„±λŠ₯ λ§€κ°œλ³€μˆ˜μ— λŒ€ν•΄μ„œλŠ” λ§€κ°œλ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

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 연산을 μ§€μ›ν•˜λŠ” μ•Όκ°„ 사전 λΉŒλ“œλœ λ°”μ΄λ„ˆλ¦¬μ˜ 경우, μ•„λž˜ 링크λ₯Ό μ‚¬μš©ν•˜μ„Έμš”.

TensorFlow Lite Hexagon λŒ€λ¦¬μžμ™€ λ²€μΉ˜λ§ˆν‚Ήν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ libhexagon_interface.so νŒŒμΌλ„ 미리 λΉŒλ“œν–ˆμŠ΅λ‹ˆλ‹€(이 νŒŒμΌμ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ μ—¬κΈ° μ°Έμ‘°). μ•„λž˜ λ§ν¬μ—μ„œ ν•΄λ‹Ή ν”Œλž«νΌμ˜ νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œν•œ ν›„ 파일λͺ…을 libhexagon_interface.so둜 λ³€κ²½ν•΄μ£Όμ„Έμš”.

μ»΄ν“¨ν„°μ˜ μ†ŒμŠ€μ—μ„œ κΈ°λ³Έ 벀치마크 λ°”μ΄λ„ˆλ¦¬λ₯Ό λΉŒλ“œν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

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

Android NDK 툴체인으둜 λΉŒλ“œν•˜λ €λ©΄ λ¨Όμ € 이 κ°€μ΄λ“œμ— 따라 λΉŒλ“œ ν™˜κ²½μ„ μ„€μ •ν•˜κ±°λ‚˜ 이 κ°€μ΄λ“œμ˜ μ„€λͺ…에 따라 도컀 이미지λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

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

μ°Έκ³ : 이것은 λ²€μΉ˜λ§ˆν‚Ήμ„ μœ„ν•΄ Android μž₯μΉ˜μ—μ„œ 직접 λ°”μ΄λ„ˆλ¦¬λ₯Ό ν‘Έμ‹œν•˜κ³  μ‹€ν–‰ν•˜λŠ” μœ νš¨ν•œ μ ‘κ·Ό λ°©μ‹μ΄μ§€λ§Œ μ‹€μ œ Android μ•± λ‚΄μ—μ„œ μ‹€ν–‰ν•˜λŠ” 것에 λΉ„ν•΄ μ„±λŠ₯에 λ―Έμ„Έν•œ(κ·ΈλŸ¬λ‚˜ κ΄€μ°° κ°€λŠ₯ν•œ) 차이가 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. 특히 Android의 μŠ€μΌ€μ€„λŸ¬λŠ” μŠ€λ ˆλ“œ 및 ν”„λ‘œμ„ΈμŠ€ μš°μ„  μˆœμœ„λ₯Ό 기반으둜 λ™μž‘μ„ μ‘°μ •ν•©λ‹ˆλ‹€. μ΄λŠ” μ „κ²½ ν™œλ™/μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό adb shell ...을 톡해 μ‹€ν–‰λ˜λŠ” 일반 λ°±κ·ΈλΌμš΄λ“œ λ°”μ΄λ„ˆλ¦¬ 간에 차이가 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ λ§žμΆ€ν˜• λ™μž‘μ€ TensorFlow Lite둜 닀쀑 μŠ€λ ˆλ“œ CPU 싀행을 ν™œμ„±ν™”ν•  λ•Œ κ°€μž₯ λΆ„λͺ…ν•©λ‹ˆλ‹€. λ”°λΌμ„œ μ„±λŠ₯ μΈ‘μ •μ—λŠ” Android 벀치마크 앱이 ꢌμž₯λ©λ‹ˆλ‹€.

벀치마크 μ‹€ν–‰

μ»΄ν“¨ν„°μ—μ„œ 벀치마크λ₯Ό μ‹€ν–‰ν•˜λ €λ©΄ μ…Έμ—μ„œ λ°”μ΄λ„ˆλ¦¬λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.

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 μž₯μΉ˜μ—μ„œ 벀치마크λ₯Ό μ‹€ν–‰ν•˜λ €λ©΄ μ†ŒμŠ€μ—μ„œ 앱을 λΉŒλ“œν•΄μ•Ό ν•©λ‹ˆλ‹€. μ†ŒμŠ€ 트리의 benchmark_data 디렉터리에 TensorFlow Lite λͺ¨λΈ νŒŒμΌμ„ λ„£κ³  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λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. GPU λŒ€λ¦¬μžλ‘œ μ‹€ν–‰ν•˜λ €λ©΄ --use_gpu=trueλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.

μ•„λž˜ μ„±λŠ₯ 값은 Android 10μ—μ„œ μΈ‘μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λͺ¨λΈ 이름 μž₯치 CPU, 4 μŠ€λ ˆλ“œ GPU NNAPI
Mobilenet_1.0_224(float) Pixel 3 23.9 ms 6.45 ms 13.8 ms
Pixel 4 14.0 ms 9.0 ms 14.8 ms
Mobilenet_1.0_224 (quant) Pixel 3 13.4 ms --- 6.0 ms
Pixel 4 5.0 ms --- 3.2 ms
NASNet mobile Pixel 3 56 ms --- 102 ms
Pixel 4 34.5 ms --- 99.0 ms
SqueezeNet Pixel 3 35.8 ms 9.5 ms 18.5 ms
Pixel 4 23.9 ms 11.1 ms 19.0 ms
Inception_ResNet_V2 Pixel 3 422 ms 99.8 ms 201 ms
Pixel 4 272.6 ms 87.2 ms 171.1 ms
Inception_V4 Pixel 3 486 ms 93 ms 292 ms
Pixel 4 324.1 ms 97.6 ms 186.9 ms

iOS μ„±λŠ₯ 벀치마크

μ΄λŸ¬ν•œ μ„±λŠ₯ 벀치마크 μˆ˜μΉ˜λŠ” iOS 벀치마크 μ•±μœΌλ‘œ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

iOS 벀치마크λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ μ μ ˆν•œ λͺ¨λΈμ„ ν¬ν•¨ν•˜λ„λ‘ 벀치마크 앱을 μˆ˜μ •ν–ˆμœΌλ©° num_threadsλ₯Ό 2둜 μ„€μ •ν•˜λ„λ‘ benchmark_params.json을 μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€. GPU λŒ€λ¦¬μžλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ benchmark_params.json에 "use_gpu" : "1" 및 "gpu_wait_type" : "aggressive" μ˜΅μ…˜λ„ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λͺ¨λΈ 이름 μž₯치 CPU, 2 μŠ€λ ˆλ“œ GPU
Mobilenet_1.0_224(float) iPhone XS 14.8 ms 3.4 ms
Mobilenet_1.0_224 (quant) iPhone XS 11 ms ---
NASNet mobile 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

TensorFlow Lite λ‚΄λΆ€ 좔적

Androidμ—μ„œ TensorFlow Lite λ‚΄λΆ€ 좔적

μ°Έκ³ : 이 κΈ°λŠ₯은 Tensorflow Lite v2.4λΆ€ν„° μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Android μ•±μ˜ TensorFlow Lite 인터프리터 λ‚΄λΆ€ μ΄λ²€νŠΈλŠ” Android 좔적 λ„κ΅¬λ‘œ μΊ‘μ²˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” Android Trace API와 λ™μΌν•œ μ΄λ²€νŠΈμ΄λ―€λ‘œ Java/Kotlin μ½”λ“œμ—μ„œ 캑처된 μ΄λ²€νŠΈκ°€ TensorFlow Lite λ‚΄λΆ€ μ΄λ²€νŠΈμ™€ ν•¨κ»˜ ν‘œμ‹œλ©λ‹ˆλ‹€.

이벀트의 λͺ‡ κ°€μ§€ μ˜ˆλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • μ—°μ‚°μž 호좜

  • λŒ€λ¦¬μžμ— μ˜ν•œ κ·Έλž˜ν”„ μˆ˜μ •

  • ν…μ„œ ν• λ‹Ή

좔적 캑처λ₯Ό μœ„ν•œ λ‹€μ–‘ν•œ μ˜΅μ…˜ μ€‘μ—μ„œ 이 κ°€μ΄λ“œμ—μ„œλŠ” Android Studio 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.traceλ₯Ό 1둜 μ„€μ •ν•©λ‹ˆλ‹€.

adb shell setprop debug.tflite.trace 1

TensorFlow Lite 인터프리터가 μ΄ˆκΈ°ν™”λ  λ•Œ 이 속성이 μ„€μ •λœ 경우, μΈν„°ν”„λ¦¬ν„°μ˜ μ£Όμš” 이벀트(예: μ—°μ‚°μž 호좜)κ°€ μΆ”μ λ©λ‹ˆλ‹€.

λͺ¨λ“  좔적을 μΊ‘μ²˜ν•œ ν›„μ—λŠ” 속성 값을 0으둜 μ„€μ •ν•˜μ—¬ 좔적을 λΉ„ν™œμ„±ν™”ν•©λ‹ˆλ‹€.

adb shell setprop debug.tflite.trace 0

Android Studio CPU ν”„λ‘œνŒŒμΌλŸ¬

μ•„λž˜ 단계에 따라 Android Studio CPU ν”„λ‘œνŒŒμΌλŸ¬λ‘œ 좔적을 μΊ‘μ²˜ν•©λ‹ˆλ‹€.

  1. 상단 λ©”λ‰΄μ—μ„œ **Run(μ‹€ν–‰) > Profile 'app'('μ•±' ν”„λ‘œνŒŒμΌλ§)**을 μ„ νƒν•©λ‹ˆλ‹€.

  2. ν”„λ‘œνŒŒμΌλŸ¬ 창이 λ‚˜νƒ€λ‚˜λ©΄ CPU νƒ€μž„λΌμΈμ˜ 아무 κ³³μ΄λ‚˜ ν΄λ¦­ν•©λ‹ˆλ‹€.

  3. CPU ν”„λ‘œνŒŒμΌλ§ λͺ¨λ“œ 쀑 'Trace System Calls(μ‹œμŠ€ν…œ 호좜 좔적)'λ₯Ό μ„ νƒν•©λ‹ˆλ‹€.

    'μ‹œμŠ€ν…œ 호좜 좔적' 선택

  4. 'Record(기둝)' λ²„νŠΌμ„ λˆ„λ¦…λ‹ˆλ‹€.

  5. 'Stop(쀑지)' λ²„νŠΌμ„ λˆ„λ¦…λ‹ˆλ‹€.

  6. 좔적 κ²°κ³Όλ₯Ό μ‘°μ‚¬ν•©λ‹ˆλ‹€.

    Android Studio 좔적

이 μ˜ˆμ—μ„œ μŠ€λ ˆλ“œμ˜ 이벀트 계측 ꡬ쑰와 각 μ—°μ‚°μž μ‹œκ°„μ— λŒ€ν•œ 톡계λ₯Ό λ³Ό 수 있으며, μŠ€λ ˆλ“œ 간에 전체 μ•±μ˜ 데이터 흐름도 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

μ‹œμŠ€ν…œ 좔적 μ•±

μ‹œμŠ€ν…œ 좔적 앱에 μ„€λͺ…λœ 단계에 따라 Android Studio 없이 좔적을 μΊ‘μ²˜ν•©λ‹ˆλ‹€.

이 μ˜ˆμ—μ„œλŠ” λ™μΌν•œ TFLite μ΄λ²€νŠΈκ°€ μΊ‘μ²˜λ˜μ–΄ Android μž₯치 버전에 따라 Perfetto λ˜λŠ” Systrace ν˜•μ‹μœΌλ‘œ μ €μž₯λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 캑처된 좔적 νŒŒμΌμ€ Perfetto UIμ—μ„œ μ—΄ 수 μžˆμŠ΅λ‹ˆλ‹€.

Perfetto 좔적

iOSμ—μ„œ TensorFlow Lite λ‚΄λΆ€ 좔적

μ°Έκ³ : 이 κΈ°λŠ₯은 Tensorflow Lite v2.5λΆ€ν„° μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

iOS μ•±μ˜ TensorFlow Lite 인터프리터 λ‚΄λΆ€ μ΄λ²€νŠΈλŠ” Xcode에 ν¬ν•¨λœ Instruments λ„κ΅¬λ‘œ μΊ‘μ²˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” iOS signpost μ΄λ²€νŠΈμ΄λ―€λ‘œ Swift/Objective-C μ½”λ“œμ—μ„œ 캑처된 μ΄λ²€νŠΈλŠ” TensorFlow Lite λ‚΄λΆ€ μ΄λ²€νŠΈμ™€ ν•¨κ»˜ ν‘œμ‹œλ©λ‹ˆλ‹€.

이벀트의 λͺ‡ κ°€μ§€ μ˜ˆλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • μ—°μ‚°μž 호좜

  • λŒ€λ¦¬μžμ— μ˜ν•œ κ·Έλž˜ν”„ μˆ˜μ •

  • ν…μ„œ ν• λ‹Ή

TensorFlow Lite 좔적 μ‚¬μš©

μ•„λž˜ 단계에 따라 ν™˜κ²½ λ³€μˆ˜ debug.tflite.traceλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.

  1. Xcode의 상단 λ©”λ‰΄μ—μ„œ **Product(μ œν’ˆ) > Scheme(방식) > Edit Scheme(방식 νŽΈμ§‘)...**을 μ„ νƒν•©λ‹ˆλ‹€.

  2. μ™Όμͺ½ μ°½μ—μ„œ 'Profile(ν”„λ‘œνŒŒμΌ)'을 ν΄λ¦­ν•©λ‹ˆλ‹€.

  3. 'Use the Run action's arguments and environment variables(μ‹€ν–‰ λ™μž‘μ˜ 인수 및 ν™˜κ²½ λ³€μˆ˜ μ‚¬μš©)' ν™•μΈλž€μ„ 선택 μ·¨μ†Œν•©λ‹ˆλ‹€.

  4. 'Environment Variables(ν™˜κ²½ λ³€μˆ˜)' μ„Ήμ…˜ μ•„λž˜μ— debug.tflite.traceλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

    ν™˜κ²½ λ³€μˆ˜ μ„€μ •

iOS 앱을 ν”„λ‘œνŒŒμΌλ§ν•  λ•Œ TensorFlow Lite 이벀트λ₯Ό μ œμ™Έν•˜λ €λ©΄ ν™˜κ²½ λ³€μˆ˜λ₯Ό μ œκ±°ν•˜μ—¬ 좔적을 λΉ„ν™œμ„±ν™”ν•˜μ„Έμš”.

XCode Instruments

μ•„λž˜ 단계에 따라 좔적을 μΊ‘μ²˜ν•©λ‹ˆλ‹€.

  1. Xcode의 상단 λ©”λ‰΄μ—μ„œ **Product(μ œν’ˆ) > Profile(ν”„λ‘œνŒŒμΌ)**을 μ„ νƒν•©λ‹ˆλ‹€.

  2. Instruments 도ꡬ가 μ‹œμž‘λ  λ•Œ ν”„λ‘œνŒŒμΌλ§ ν…œν”Œλ¦Ώ μ€‘μ—μ„œ λ‘œκΉ…μ„ ν΄λ¦­ν•©λ‹ˆλ‹€.

  3. 'Start(μ‹œμž‘)' λ²„νŠΌμ„ λˆ„λ¦…λ‹ˆλ‹€.

  4. 'Stop(쀑지)' λ²„νŠΌμ„ λˆ„λ¦…λ‹ˆλ‹€.

  5. 'os_signpost'λ₯Ό ν΄λ¦­ν•˜μ—¬ OS λ‘œκΉ… ν•˜μœ„ μ‹œμŠ€ν…œ ν•­λͺ©μ„ ν™•μž₯ν•©λ‹ˆλ‹€.

  6. 'org.tensorflow.lite' OS λ‘œκΉ… ν•˜μœ„ μ‹œμŠ€ν…œμ„ ν΄λ¦­ν•©λ‹ˆλ‹€.

  7. 좔적 κ²°κ³Όλ₯Ό μ‘°μ‚¬ν•©λ‹ˆλ‹€.

    Xcode Instruments 좔적

이 μ˜ˆμ—μ„œλŠ” 이벀트의 계측 ꡬ쑰와 각 μ—°μ‚°μž μ‹œκ°„μ— λŒ€ν•œ 톡계λ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

좔적 데이터 μ‚¬μš©

좔적 데이터λ₯Ό μ‚¬μš©ν•˜λ©΄ μ„±λŠ₯ 병λͺ© ν˜„μƒμ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒμ€ ν”„λ‘œνŒŒμΌλŸ¬λ‘œλΆ€ν„° 얻을 수 μžˆλŠ” 톡찰λ ₯의 λͺ‡ κ°€μ§€ μ˜ˆμ™€ μ„±λŠ₯ κ°œμ„ μ„ μœ„ν•œ 잠재적 μ†”λ£¨μ…˜μž…λ‹ˆλ‹€.

  • μ‚¬μš© κ°€λŠ₯ν•œ CPU μ½”μ–΄ μˆ˜κ°€ μΆ”λ‘  μŠ€λ ˆλ“œ μˆ˜λ³΄λ‹€ μž‘μœΌλ©΄ CPU μŠ€μΌ€μ€„λ§ μ˜€λ²„ν—€λ“œλ‘œ 인해 μ„±λŠ₯이 μ €ν•˜λ  수 μžˆμŠ΅λ‹ˆλ‹€. λͺ¨λΈ μΆ”λ‘ κ³Ό κ²ΉμΉ˜μ§€ μ•Šλ„λ‘ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ‹€λ₯Έ CPU 집약적 μž‘μ—…μ˜ 일정을 μ‘°μ •ν•˜κ±°λ‚˜ 인터프리터 μŠ€λ ˆλ“œ 수λ₯Ό μ‘°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • μ—°μ‚°μžκ°€ μ™„μ „νžˆ μœ„μž„λ˜μ§€ μ•Šμ€ 경우, λͺ¨λΈ κ·Έλž˜ν”„μ˜ μΌλΆ€λŠ” μ˜ˆμƒ ν•˜λ“œμ›¨μ–΄ 가속기가 μ•„λ‹Œ CPUμ—μ„œ μ‹€ν–‰λ©λ‹ˆλ‹€. μ§€μ›λ˜μ§€ μ•ŠλŠ” μ—°μ‚°μžλ₯Ό μœ μ‚¬ν•œ μ§€μ›λ˜λŠ” μ—°μ‚°μžλ‘œ λŒ€μ²΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€.