콘텐츠로 이동

문제해결

Debug Dump Binaries (DDB)

DDB 파일은 RBLN NPU의 기능적인 문제해결을 위한 정보들을 담고있는 파일로, RBLN 컴파일러의 입력정보와 각 컴파일 단계에서의 에러 로그 정보 등을 포함하고 있습니다. 모든 DDB 파일들은 안전하게 암호화되어 있습니다.

DDB 파일을 생성하기 위해서는 RBLN_DEBUG_LEVEL 환경변수를 설정해야 합니다:

  • RBLN_DEBUG_LEVEL=1: DDB 파일 생성시 모델 파라미터 제외
  • RBLN_DEBUG_LEVEL=2: DDB 파일 생성시 모델 파라미터 포함

RBLN_DEBUG_LEVEL=2DDB 파일을 생성하는 것이 빠른 문제해결에 더 도움이 되지만, 보안상의 이슈로 모델 파라미터를 제외해야하는 경우 RBLN_DEBUG_LEVEL=1DDB 파일을 생성할 수 있습니다.

RBLN 모델주에서 제공하는 파이토치 ResNet50 모델을 이용하여 DDB 파일을 생성하는 예제입니다:

1
2
3
$ cd rbln_model_zoo/pytorch/torchvisions
$ RBLN_DEBUG_LEVEL=2 python3 main.py --model_name resnet50
$ ls ./debug_mm_dd_yyyy_hh_mm_ss/

위 명령어를 통해 아래와 유사한 파일들이 생성된 것을 확인할 수 있습니다:

0_graph.json.gz.enc  100_graph.json.gz.enc  error_log.txt.enc  progress.txt.enc

문제 해결에 도움이 필요한 경우, 생성된 모든 DDB 파일들을 압축하여 자세한 설명과 함께 RBLN Portal > Technical Supports에 업로드해 주시기 바랍니다:

$ tar -zcvf debug_mm_dd_yyyy_hh_mm_ss.tar.gz debug_mm_dd_yyyy_hh_mm_ss/

성능 튜닝 (Performance Tuning)

컴파일된 모델의 대부분은 NPU 연산자로 구성되어 있지만 일부 CPU 연산자가 포함되어 있을 수 있습니다. 이런 경우 CPU 연산자들은 CPU 호스트 환경에 따라 성능이 달라질 수 있습니다.

CPU 연산자들의 성능을 최적화하기 위해 아래 방법 중 하나를 사용하여 스레드 개수를 조정할 수 있습니다.

1. 스레드 개수 설정하기

옵션 1. 환경 변수 사용하기

모델 실행 전에 환경 변수를 설정하여 원하는 스레드 개수를 지정할 수 있습니다.

1
2
3
4
5
# 환경 변수 설정
$ export RBLN_NUM_THREADS=<number_of_threads>

# 모델 실행
$ python run_model.py

다음과 같이 한 줄로 실행할 수도 있습니다:

$ RBLN_NUM_THREADS=<number_of_threads> python run_model.py

옵션 2. Runtime 속성 변경하기

Python의 Runtime API를 사용하여 직접 스레드 개수를 설정할 수 있습니다:

module = rebel.Runtime(f"{rbln_file_name}.rbln")
module.num_threads = <number_of_threads>

2. 최적의 스레드 개수 찾기

최적의 스레드 개수는 사용자의 CPU 호스트 환경에 따라 달라집니다. 수동으로 조정할 수도 있지만, 이를 자동으로 찾아주는 유틸리티 함수인 search_num_threads()를 제공합니다:

1
2
3
4
from rebel.core.tools import search_num_threads

module = rebel.Runtime(f"{rbln_file_name}.rbln")
search_num_threads(module)

이 함수를 사용해 다양한 스레드 개수를 테스트하고 평균 실행 시간을 출력하여 최적의 값을 선택할 수 있습니다.

INFO [rebel-compiler] Max Concurrency = 48
INFO [rebel-compiler] Current num threads = 24
INFO [rebel-compiler] Testing with 1 threads.
INFO [rebel-compiler] 200 runs: Average execution time = 143.10 µs
INFO [rebel-compiler] Testing with 2 threads.
INFO [rebel-compiler] 200 runs: Average execution time = 80.15 µs
INFO [rebel-compiler] Testing with 4 threads.
INFO [rebel-compiler] 200 runs: Average execution time = 49.03 µs
INFO [rebel-compiler] Testing with 8 threads.
INFO [rebel-compiler] 200 runs: Average execution time = 43.47 µs
INFO [rebel-compiler] Testing with 16 threads.
INFO [rebel-compiler] 200 runs: Average execution time = 39.80 µs
INFO [rebel-compiler] Testing with 32 threads.
INFO [rebel-compiler] 200 runs: Average execution time = 44.66 µs

이 예제에서는 16개 스레드 개수가 가장 좋은 성능을 보이는 것을 확인할 수 있습니다. 이처럼 각 시스템에 맞게 벤치마크를 실행하여 최적의 스레드 개수를 찾을 수 있습니다.