콘텐츠로 이동

RBLN 프로파일러 시작하기

이 페이지에서는 RBLN 프로파일러를 사용하는 기본적인 방법을 설명합니다. 먼저 RBLN Model Zoo의 PyTorch BERT 모델을 예시로 RBLN 프로파일러 API를 설명하고, 이어서 optimum-rbln과 vllm-rbln에서 프로파일링 데이터를 추출하는 방법을 알아봅니다.

RBLN PyTorch에서 torch.profiler를 사용하는 방법은 Rebel100™ 프로파일링에서 확인할 수 있습니다.

사전 준비

시작하기에 앞서 아래의 파이썬 패키지들이 설치되어 있는지 확인합니다:

Note

RBLN 프로파일러는 rebel-compiler에서 제공하는 기능 중 하나입니다. 따라서, rebel-compiler를 설치할 때 함께 설치되며 따로 설치할 필요가 없습니다.

RBLN 프로파일러 API

RBLN 프로파일러는 rebel-compiler의 런타임 API를 통해 동작하며, 이 API가 RBLN 프로파일러를 사용하는 모든 방법의 기반이 됩니다. 이 절에서는 질의 응답을 위해 훈련된 BERT-base 모델을 rebel-compiler로 컴파일하고, RBLN 런타임 API를 직접 호출하여 프로파일링 데이터를 추출하는 예제로 API의 사용법을 설명합니다.

RBLN 프로파일러 API는 아래 두 가지 역할로 나뉩니다.

  • 프로파일링 대상 지정: 런타임을 생성할 때 activate_profiler=True를 지정하면, 그 런타임이 실행하는 추론이 프로파일링 대상이 됩니다. 환경 변수 RBLN_PROFILER=1로도 지정할 수 있습니다.
  • 프로파일링 구간 지정: rebel.profiler의 start()와 done()으로 기록할 구간의 시작과 끝을 정합니다. with profile(...)은 이 두 호출로 코드 구간을 감쌉니다.

모델 컴파일

아래 명령어를 통해 rebel-compiler를 사용하여 BERT-base 모델을 컴파일할 수 있습니다. 모델 컴파일이 끝나면 디렉터리에 bert-base.rbln 파일이 생성된 것을 확인할 수 있습니다.

1
2
3
$ cd rbln-model-zoo/ATOM/pytorch/nlp/bert/qa
$ pip3 install -r requirements.txt
$ python3 compile.py --model_name base

RBLN 프로파일러 활성화

코드 내부에서 런타임 모듈을 생성할 때 rebel.Runtime에서 activate_profiler=True 인자를 사용하거나, 추론을 수행할 때 환경 변수 RBLN_PROFILER=1을 설정하면 대상 모델을 프로파일링할 수 있습니다. 프로파일러를 켠 상태에서 생성한 런타임은 컴파일된 모델에 포함된 프로파일링 정보를 불러와 프로파일링을 준비하며, 이후 이 런타임으로 실행하는 추론이 기록됩니다. 프로파일러를 켜지 않고 생성한 런타임은 프로파일링되지 않습니다.

  • RBLN Runtime API 사용: activate_profiler=True를 설정하여 프로파일러를 활성화합니다.

    1
    2
    3
    4
    5
    6
    7
    # `inference.py` 파일을 아래와 같이 수정합니다.
    ...
    # RBLN runtime module을 이용하여 컴파일한 모델을 불러옵니다.
    module = rebel.Runtime(
        f"bert-{args.model_name}.rbln", tensor_type="pt", activate_profiler=True
    )
    ...
    

  • 환경 변수 사용: 환경 변수 RBLN_PROFILER=1을 설정하면, 프로세스가 생성하는 모든 런타임에 activate_profiler=True를 지정한 것과 같습니다. 코드를 고치지 않고 프로파일링할 수 있습니다.

    $ RBLN_PROFILER=1 python3 inference.py --model_name base
    

두 설정 중 하나만 지정하면 됩니다. 둘 중 하나라도 켜져 있으면 프로파일러가 켜지므로, RBLN_PROFILER=1이 설정된 상태에서는 activate_profiler=False로 프로파일러를 끌 수 없습니다.

Note

비동기 런타임(rebel.AsyncRuntime)에서는 RBLN 프로파일러를 사용할 수 없습니다.

추론을 통한 프로파일링 데이터 추출

  • 일반적으로, 아래와 같이 아무런 설정을 지정하지 않아도 프로파일링 데이터를 얻을 수 있습니다. 이 경우 프로파일러가 수집한 데이터는 프로세스가 정상 종료될 때 기본 경로(./)에 기록됩니다:
    1
    2
    3
    4
    5
    # RBLN 런타임 모듈을 이용하여 추론을 실행합니다.
    ...
    # 프로파일링 데이터를 기본 경로("./")에 저장합니다.
    out = module.run(**inputs)
    ...
    
  • with profile(...)을 사용하면 지정한 코드 구간만 프로파일링할 수 있습니다:
    1
    2
    3
    4
    5
    6
    7
    ...
    # 프로파일링 구역을 설정하고, 프로파일링 데이터의 저장 경로를 "./profile_out"로 지정합니다.
    from rebel.profiler import profile
    
    with profile(output_dir="./profile_out"):
        out = module.run(**inputs)
    ...
    

특정 구간을 프로파일링하려면, RBLN 프로파일러 활성화의 방법으로 프로파일러를 켠 상태에서 그 구간을 with profile(...)로 감싸야 합니다. with profile(...)은 RBLN 런타임이 실행되는 프로세스에서 호출해야 합니다.

Warning

RBLN 프로파일러는 수집한 데이터를 프로세스가 정상 종료될 때 *.pb 파일로 기록합니다. os._exit() 등으로 프로세스가 강제 종료되거나 비정상 종료되면 결과 파일이 생성되지 않습니다.

with profile(...)로 프로파일링 구역을 설정하면 구역이 끝나는 시점에 결과 파일이 생성됩니다.

프로파일링 결과 확인하기

위에서 설명한 방법대로 RBLN 프로파일러를 사용하면 아래와 같은 프로파일링 결과를 확인할 수 있습니다.

생성 상태 보고서의 터미널 출력. 세 범주의 표가 있고 실패한 패스는 없다. 생성 상태 보고서의 터미널 출력. 세 범주의 표가 있고 실패한 패스는 없다.

RBLN Profiler Generation Status Report는 프로파일러가 트레이싱 과정과 Protocol Buffer 파일을 생성하는 과정에서 발생하는 모든 상태 정보를 아래의 세 가지 카테고리로 보여줍니다.

  • System Passes: 일반적인 시스템 이상을 모니터링하고, 메모리 할당 상태를 확인하며, Command Processor에서 생성된 프로파일 데이터를 검증합니다.

  • Compilation Passes: RBLN 컴파일러에 의해 생성된 프로파일 정보를 검증하고 명령어 의존성 위반 여부를 탐지합니다.

  • Tracing Passes: Command Processor로부터 프로파일링 데이터를 수집하고 검증하며, 이에 대한 분석을 수행하고, 데이터 분석을 통해 시각화 전처리를 수행합니다. 또, Protocol Buffer 파일 생성 및 직렬화(serialize)를 위해 레이아웃을 재구성하고 구조를 변환합니다.

Note

프로파일링 결과에서 지속적으로 Failed가 발생할 시, client_support@rebellions.ai로 연락하시기 바랍니다.

  • 생성된 파일명
    • Multi Stream(전체 로그): rbln_{date}_{time}.pb
      • 위 파일은 단일 프로파일러 인스턴스 상에서 발생한 모든 추론 과정의 트레이싱 정보들을 하나의 plot에 표현하며, 단일 *.pb 파일에 기록됩니다.
    • Single Stream(sequence 별 로그): rbln_{date}_{time}_{sequence_index}.pb
      • 위 파일들은 단일 프로파일러 인스턴스 상에서 실행된 모듈의 단일 추론에 대한 트레이싱 정보를 하나의 plot에 표현합니다. 즉, 단일 스트림의 경우, 모듈 개수와 모듈마다의 추론 횟수만큼의 *.pb 파일들이 생성됩니다.

생성된 *.pb 파일들은 Perfetto를 통해 시각화할 수 있습니다.

다음 단계

RBLN Optimum과 RBLN vLLM에서의 프로파일링

RBLN Optimum(optimum-rbln)과 RBLN vLLM(vllm-rbln)은 내부에서 RBLN 프로파일러 API로 런타임을 생성하고 실행합니다. 따라서 위에서 설명한 프로파일링 대상 지정과 구간 지정이 그대로 적용되며, 각 패키지는 이를 패키지의 사용 방식에 맞는 형태로 제공합니다.

옵션 1: optimum-rbln을 사용하는 경우

optimum-rbln을 사용하는 경우 아래와 같은 방법으로 프로파일링 데이터를 추출할 수 있습니다.

모델 컴파일

아래 명령어를 통해 optimum-rbln을 이용하여 모델을 컴파일할 수 있습니다. 모델 컴파일이 끝나면 bert-base-cased-squad2 디렉터리가 생성된 것을 확인할 수 있습니다.

1
2
3
$ cd rbln-model-zoo/ATOM/huggingface/transformers/question-answering/bert
$ pip3 install -r requirements.txt
$ python3 compile.py --model_name base

RBLN 프로파일러 활성화

추론을 수행할 때 환경 변수 RBLN_PROFILER=1을 설정하거나, 코드 내부에서 런타임 모듈을 생성할 때 optimum-rbln API에서 rbln_activate_profiler=True 인자를 사용하면 대상 모델을 프로파일링할 수 있습니다.

  • 환경 변수 사용: 환경 변수 RBLN_PROFILER=1을 설정하여 RBLN 프로파일러를 활성화합니다.
    $ RBLN_PROFILER=1 python3 inference.py --model_name base
    
  • optimum-rbln API 사용: rbln_activate_profiler=True를 설정하여 프로파일러를 활성화합니다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # `inference.py` 파일을 아래와 같이 수정합니다.
    ...
    # 컴파일한 모델을 불러옵니다.
    model = RBLNBertForQuestionAnswering.from_pretrained(
        model_id=os.path.basename(model_id),
        export=False,
        rbln_activate_profiler=True,
    )
    ...
    

추론을 통한 프로파일링 데이터 추출

  • Runtime API 사용 예제와 마찬가지로, 어떠한 설정을 지정하지 않아도 프로파일링 데이터를 얻을 수 있습니다:

    1
    2
    3
    4
    # optimum-rbln API를 이용하여 추론을 실행합니다.
    ...
    # 프로파일링 데이터를 기본 경로("./")에 저장합니다.
    answer = pipe(question=args.question, context=args.context)
    

  • 또한, optimum-rbln API를 사용하는 경우에도 아래와 같이 구역이 지정된 프로파일링 메서드를 사용할 수 있습니다:

    1
    2
    3
    4
    5
    6
    7
    ...
    # 프로파일링 구역을 설정하고, 프로파일링 데이터의 저장 경로를 "./profile_out"로 지정합니다.
    from rebel.profiler import profile
    
    with profile(output_dir="./profile_out"):
        answer = pipe(question=args.question, context=args.context)
    ...
    

다음 단계

optimum-rbln으로 실행한 모델의 분석 사례는 다음과 같습니다.

옵션 2: vllm-rbln을 사용하는 경우

vllm-rbln을 사용하는 경우 아래와 같은 방법으로 프로파일링 데이터를 추출할 수 있습니다. vLLM의 프로파일링 사용법을 그대로 따라 start_profile()과 stop_profile()로 구간을 지정하며, RBLN 프로파일러는 RBLN_PROFILER=1로 활성화합니다. 설치와 모델 준비 방법은 RBLN vLLM에 정리되어 있습니다.

RBLN 프로파일러 활성화

추론을 수행할 때 환경 변수 RBLN_PROFILER=1을 설정하면 RBLN 프로파일러를 활성화할 수 있습니다. RBLN 프로파일러는 vllm model implementation에서 동작하며, LLM에 model_impl="vllm"을 지정해 선택합니다.

$ cd vllm-rbln
$ RBLN_PROFILER=1 python3 examples/vllm/features/profiling/simple_profiling_offline.py

이 예제 스크립트는 profiler_config에 "profiler": "torch"를 이미 지정하고 있습니다. profiler_config 설정에 따라 start_profile()과 stop_profile()이 제어하는 프로파일러가 달라집니다.

  • 전달하지 않은 경우: RBLN 프로파일러가 단독으로 동작하여 *.pb 파일을 생성합니다.
    # profiler_config를 지정하지 않습니다.
    llm = LLM(model="/path/to/model", model_impl="vllm")
    
  • "profiler": "torch"를 전달한 경우: PyTorch 프로파일러가 프로파일링 세션을 관리하며, RBLN 프로파일러가 수집한 디바이스 구간이 PyTorch 프로파일러의 산출물인 chrometrace에 병합되어 들어갑니다. 이 병합은 Rebel100™에서만 동작하며, ATOM™에서는 지원되지 않습니다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # PyTorch 프로파일러를 함께 켜고 트레이스 저장 경로를 지정합니다.
    llm = LLM(
        model="/path/to/model",
        model_impl="vllm",
        profiler_config={
            "profiler": "torch",
            "torch_profiler_dir": "/path/to/save/trace",
        },
    )
    

profiler_config의 나머지 옵션은 프로파일링 가이드에서 확인할 수 있습니다.

추론을 통한 프로파일링 데이터 추출

generate()를 start_profile()과 stop_profile()로 감싸면 그 구간만 트레이스에 남습니다. 첫 번째 generate() 호출은 컴파일된 모델을 초기화하므로, 측정 구간보다 먼저 실행하여 트레이스에서 제외합니다.

1
2
3
4
5
6
7
8
9
# vllm-rbln/examples/vllm/features/profiling/simple_profiling_offline.py
...
# 첫 번째 실행의 초기화를 트레이스에서 제외합니다.
llm.generate(prompts, SamplingParams(temperature=0.0, max_tokens=2))

llm.start_profile()
outputs = llm.generate(prompts, sampling_params)
llm.stop_profile()
...

stop_profile()은 모든 워커가 트레이스 기록을 마친 뒤에 반환됩니다. 워커가 별도 프로세스에서 실행되는 구성에서는 엔진이 종료될 때 워커가 정리되므로, 이 구간 지정이 없으면 트레이스가 남지 않을 수 있습니다.

트레이스 파일은 워커마다 하나씩 생성되며, 형식은 프로파일링 결과 확인하기에서 설명한 것과 같습니다.

다음 단계

vllm-rbln으로 실행한 모델의 트레이스 분석 방법과 분석 사례는 다음과 같습니다.