콘텐츠로 이동

Rebel100™ 프로파일링

torch.rbln.explain()은 fallback, 재컴파일, 호스트 왕복 전송처럼 코드에 직접 작성하지 않은 백엔드 동작을 보여줍니다. 각 프로그램에 디바이스가 얼마나 시간을 썼는지는 torch.profiler로 확인합니다. Rebel100™ NPU에서 프로세스를 시작하기 전에 RBLN_PROFILER=1을 설정하면 런타임이 디바이스 활동을 기록합니다. RBLN PyTorch의 Kineto 브리지는 이 기록을 ATen 호출과 함께 PrivateUse1 이벤트로 트레이스에 전달합니다. ATOM™ NPU에서는 브리지가 활성화되지 않으므로 같은 트레이스에 호스트 활동만 표시됩니다.

사전 준비

  • Rebel100™ NPU(RBLN-CR 카드)가 있고 RBLN Driver가 설치된 호스트. ATOM™ 호스트에서도 스크립트는 실행되지만 트레이스에 디바이스 행이 표시되지 않습니다.
  • Python: 3.10–3.14
  • 설치에 따라 설치한 torch, torch-rbln, rebel-compiler
  • 3단계에서 사용할 트레이스 뷰어: Perfetto 또는 chrome://tracing

1단계: 트레이스 기록

profile_matmul.py는 행렬 곱셈을 한 번 실행해 워밍업한 뒤, 호스트와 디바이스 활동을 모두 활성화해 곱셈 세 번을 더 프로파일링합니다. 집계 표와 디바이스 이벤트 목록을 출력하고 Chrome 트레이스도 저장합니다.

profile_matmul.py
import torch
from torch.profiler import DeviceType, ProfilerActivity, profile

x = torch.randn(512, 512, dtype=torch.float16, device="rbln")
with torch.inference_mode():
    (x @ x).cpu()  # warm-up: compile outside the profiled region

activities = [ProfilerActivity.CPU, ProfilerActivity.PrivateUse1]
with torch.inference_mode(), profile(activities=activities) as prof:
    for _ in range(3):
        (x @ x).cpu()

print(prof.key_averages().table(sort_by="cpu_time_total", row_limit=10))

device_events = [e for e in prof.events() if e.device_type == DeviceType.PrivateUse1]
print(
    f"{len(device_events)} device events, for example:",
    [e.name for e in device_events[:4]],
)

prof.export_chrome_trace("trace.json")  # open in chrome://tracing or Perfetto

런타임은 시작할 때 RBLN_PROFILER를 읽으므로 스크립트 내부가 아닌 명령줄에서 설정합니다.

$ RBLN_PROFILER=1 python3 profile_matmul.py

표에 Self RBLN 열이 없고 스크립트가 0 device events를 출력하면 프로세스를 시작할 때 RBLN_PROFILER=1이 설정되지 않은 것입니다.

표에 앞서 런타임이 자체 RBLN Profiler Generation Status Report와 저장한 프로파일 파일 이름(rbln_<timestamp>.pb)을 출력합니다. 이 파일은 RBLN Profiler 도구의 입력이며 여기서는 사용하지 않습니다. 이어서 torch.profiler 출력이 나옵니다. 다음은 일부를 발췌한 결과로, 시간은 시스템마다 다릅니다.

-----------------------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------
                         Name    Self CPU %      Self CPU   CPU total %     CPU total  CPU time avg     Self RBLN   Self RBLN %    RBLN total  RBLN time avg    # of Calls
-----------------------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------
                     aten::mm        36.69%       1.590ms       161.84%       7.015ms       1.169ms       0.000us         0.00%       0.000us       0.000us             6
                 aten::matmul         0.11%       4.919us        81.31%       3.524ms       1.175ms       0.000us         0.00%       0.000us       0.000us             3
                    aten::abs        10.76%     466.546us        21.34%     925.134us      77.095us       0.000us         0.00%       0.000us       0.000us            12
                  aten::isinf         0.36%      15.809us        17.35%     751.945us     125.324us       0.000us         0.00%       0.000us       0.000us             6
                     aten::to         0.22%       9.583us        16.01%     694.167us      46.278us       0.000us         0.00%       0.000us       0.000us            15
               aten::_to_copy         0.45%      19.339us        15.79%     684.584us      45.639us       0.000us         0.00%       0.000us       0.000us            15
                  aten::copy_         0.46%      19.738us        15.17%     657.494us      31.309us       0.000us         0.00%       0.000us       0.000us            21
             aten::_copy_from        14.71%     637.756us        14.71%     637.756us      70.862us       0.000us         0.00%       0.000us       0.000us             9
                  aten::isnan         0.12%       5.391us         6.85%     296.958us      49.493us       0.000us         0.00%       0.000us       0.000us             6
                     aten::ne         6.73%     291.567us         6.73%     291.567us      48.595us       0.000us         0.00%       0.000us       0.000us             6
-----------------------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------
Self CPU time total: 4.335ms
Self RBLN time total: 36.959us

18 device events, for example: ['i1_0_W0_args_0_0', 'i1_0_W0_args_0_1', 'i1_0_W0_args_0_2', 'i1_0_W0_mm_0']

2단계: 표 읽기

  • 각 행은 호스트 작업을 나타냅니다. 행렬 곱셈 세 번에서 발생한 모든 ATen 호출이 CPU 시간과 함께 표시됩니다. 여기에는 aten::mm 디스패치와 .cpu() 다운로드(aten::to, aten::_to_copy, aten::copy_, aten::_copy_from)도 포함됩니다.
  • NaN/Inf 검사도 표시됩니다. 스크립트에는 aten::abs, aten::isinf, aten::isnan, aten::ne가 없습니다. 이 호출은 TORCH_RBLN_DEPLOY가 설정되지 않았을 때 eager 입력의 유효하지 않은 값을 찾는 디스패치 전 검사입니다. 이처럼 작은 연산자에서는 호스트 시간 중 측정 가능한 비중을 차지합니다. TORCH_RBLN_DEPLOY=ON을 설정하면 이 검사를 생략합니다. 자세한 내용은 실행 방식 › 디스패치 전 검사에서 확인할 수 있습니다.
  • 디바이스 시간은 별도 이벤트에 기록됩니다. 연산자별 Self RBLN 열은 0이지만 하단의 Self RBLN time total은 0이 아닙니다. 이번 릴리스의 브리지는 디바이스 작업을 실행한 ATen 행에 시간을 연결하지 않고 별도 이벤트로 기록합니다. 따라서 디바이스 시간은 연산자별 열이 아닌 이벤트나 트레이스에서 확인합니다.

3단계: 디바이스 이벤트와 트레이스 읽기

디바이스 이벤트 18개는 행렬 곱셈 세 번의 디바이스 작업을 나타냅니다. 이벤트 이름은 컴파일된 프로그램의 단계를 뜻합니다. 접두사 i1_0, i1_1, i1_2는 세 번의 호출을 구분하며 각 호출에는 args 단계 세 개와 mm 단계 세 개가 있습니다. 이벤트 이름은 컴파일된 프로그램에서 정해지며 릴리스마다 달라질 수 있습니다. 각 이벤트에는 디바이스 실행 시간이 있으며 스크립트를 확장해 e.device_time_total로 읽을 수 있습니다.

trace.json은 같은 이벤트를 타임라인에 표시합니다. Perfetto 또는 chrome://tracing에서 열면 호스트 스레드 행에 ATen 호출이, 별도의 디바이스 행에 디바이스 이벤트가 표시됩니다. 호스트 행에서 작업을 실행한 시점과 디바이스 행에 해당 이벤트가 나타난 시점 사이의 간격은 제출 지연이며 explain()에서는 확인할 수 없습니다.

도구별 확인할 수 있는 정보

확인할 내용 도구
연산자가 fallback하거나 재컴파일되었는지, 호스트를 거쳐 복사했는지 torch.rbln.explain(). 실행 및 디버깅 참고
NaN/Inf 검사와 다운로드를 포함해 ATen 호출별로 호스트가 사용한 시간 torch.profiler의 CPU 행
프로그램 단계별로 디바이스가 사용한 시간 torch.profiler의 디바이스 이벤트 또는 .pb 파일을 사용하는 RBLN Profiler
프로그램 내부에서 NPU가 유휴 상태인 구간 RBLN Profiler

다음 단계