gpt-oss-20b(데이터 병렬)¶
이 페이지에서는 데이터 병렬로 여러 랭크에 나뉘어 실행되는 구성을 프로파일링합니다. 단일 디바이스에서의 기본 프로파일링과 트레이스 분석은 gpt-oss-20b에서 확인할 수 있습니다.
데이터 병렬로 실행하면 모델은 스크립트를 실행한 프로세스가 아니라 랭크별 워커 프로세스에서 실행됩니다. 랭크 하나는 워커 프로세스 하나이고, 디바이스 하나를 사용합니다. 이 구성에서도 프로파일링 방법은 같습니다. RBLN_PROFILER=1을 설정하고 vLLM의 start_profile()과 stop_profile()로 프로파일링 구간을 지정하면 됩니다.
이 경우 트레이스는 워커마다 하나씩 생성되므로, 랭크가 여럿이면 트레이스도 여럿입니다. 또한 랭크들이 데이터를 주고받기 위해 집합 통신(CCL)을 사용하므로, 모델 실행 한 건이 여러 개의 Device Workload 슬라이스로 나뉘고 그 사이에 집합 통신이 놓이기도 합니다.
사전 준비¶
설치¶
vllm-rbln 설치는 RBLN vLLM의 설치 방법을 따릅니다. 이 페이지의 예시 스크립트는 vllm-rbln 저장소의 examples/ 아래에 있으므로, 소스 코드 설치로 저장소를 받아 두면 함께 준비됩니다.
추론을 통한 프로파일링 데이터 추출¶
데이터 병렬 실행 구성은 vllm-rbln의 data_parallel_offline.py를 참고합니다. 프로파일링할 때는 모델에 맞는 실행 설정을 유지하고, LLM 생성 시 profiler_config를 전달합니다. 워밍업 후 start_profile()과 stop_profile()로 추론 구간을 지정합니다.
RBLN 프로파일러는 vllm model implementation에서 동작하며, LLM에 model_impl="vllm"을 지정해 선택합니다.
Tip
위 코드는 profiler_config로 PyTorch 프로파일러를 함께 켭니다. 이렇게 하면 RBLN 프로파일러가 수집한 디바이스 슬라이스가 PyTorch 프로파일러의 chrometrace로 합쳐집니다. 뒤에서 랭크별 트레이스를 병합해 볼 때 이 chrometrace를 사용합니다. 이 병합은 Rebel100™에서만 지원되며 ATOM™에서는 사용할 수 없습니다.
이 연동에는 torch-rbln이 필요합니다. 설치되어 있지 않으면 PyTorch 프로파일러 산출물인 chrometrace에 PyTorch 프레임워크 연산만 담깁니다.
--dp-size로 데이터 병렬 크기를, --enable-expert-parallel로 Expert Parallelism을 지정합니다. 아래는 랭크 2개를 실행하는 예시입니다.
실행이 끝나면 랭크 수만큼의 산출물이 남습니다. RBLN 프로파일러의 트레이스는 랭크별 디렉터리 아래에, PyTorch 프로파일러의 chrometrace는 torch_profiler_dir로 지정한 디렉터리에 랭크마다 하나씩 놓입니다.
Warning
start_profile()과 stop_profile()로 프로파일링 구간을 지정하지 않으면 트레이스를 잃을 수 있습니다. 워커가 별도 프로세스에서 실행되는 다중 프로세스 구성에서는 엔진이 종료될 때 워커가 정리되는데, 그 전에 트레이스가 기록되지 않으면 결과가 남지 않습니다. stop_profile()은 모든 워커가 기록을 마친 뒤에 반환되므로, vLLM의 프로파일링 사용법대로 프로파일링 구간을 start_profile()과 stop_profile()로 감싸야 합니다.
RBLN 프로파일러 기반 gpt-oss-20b(데이터 병렬)의 프로파일링 데이터 분석¶
MoE 모델의 집합 통신¶
여러 디바이스에 걸쳐 모델을 실행하면 랭크들이 집합 통신(CCL)으로 데이터를 주고받습니다. Expert Parallelism으로 실행한 MoE 모델에서는 ccl_all_gather_into_tensor와 ccl_reduce_scatter_tensor가 한 쌍을 이루어 모델 전체에 걸쳐 레이어마다 반복되며, 스크린샷은 그중 한 레이어를 확대한 것입니다.
레이어 하나는 Device Workload 슬라이스 두 개와 집합 통신 두 개로 나타납니다. 스크린샷에서는 i1_0_Device Workload_24 → i1_0_ccl_all_gather_into_tensor_1 → i1_0_Device Workload_25 → i1_0_ccl_reduce_scatter_tensor_1이 한 레이어이고, i1_0_Device Workload_26과 i1_0_ccl_all_gather_into_tensor_2부터 다음 레이어가 시작합니다. ccl_all_gather_into_tensor로 토큰을 모으고, 뒤따르는 Device Workload에서 라우팅과 각 랭크가 맡은 expert의 연산을 수행한 뒤, ccl_reduce_scatter_tensor로 결과를 다시 나눕니다.
앞의 Device Workload에는 input_layernorm이나 attn_qkv_proj_weight처럼 어텐션의 명령어가 놓이고, 뒤의 Device Workload에는 mlp_router_weight나 custom_moe_glu_mxfp4처럼 라우팅과 expert 연산의 명령어가 놓입니다. 스크린샷은 이 네 구간을 표시하고 칩렛을 모두 펼친 것으로, 어텐션과 MoE 모두 칩렛 4개에 나뉘어 수행되는 것을 확인할 수 있습니다.
집합 통신은 전체 실행 구간과 명령어 스트림 실행 구간으로 구분해 표시됩니다. Host 아래에서 Device Workload와 나란히 표시되는 CCL Workload 트랙은 집합 통신 한 건의 전체 실행 구간을 나타냅니다. CCL 그룹 안의 CCL Command 트랙은 같은 이름의 슬라이스로 해당 집합 통신의 명령어 스트림 실행 구간을 나타냅니다.
집합 통신은 모든 랭크가 함께 수행하는 하나의 연산이므로, 같은 이름의 슬라이스가 랭크별 트레이스에 각각 나타납니다. 이 슬라이스는 해당 랭크가 그 집합 통신에 머문 전체 구간을 나타내므로, 여러 트레이스에서 같은 이름을 비교하면 각 랭크가 다른 랭크를 기다리는 데 쓴 시간을 확인할 수 있습니다.
랭크별 트레이스 병합¶
랭크별 트레이스를 하나씩 따로 열면 랭크 사이의 관계를 보기 어렵습니다. Perfetto UI에서는 chrometrace 여러 개를 하나의 타임라인으로 병합할 수 있습니다. chrometrace는 호스트 시계를 기준으로 시각을 기록하고 파일마다 같은 기준 시각을 baseTimeNanoseconds로 함께 담으므로, 랭크가 다른 파일들도 하나의 시간축 위에 놓입니다.
병합하면 랭크별 트랙이 각각 구분된 채로 시간축만 공유합니다. 스크린샷에서는 같은 이름의 집합 통신이 두 랭크에서 같은 시간대에 끝나는 것을 확인할 수 있습니다.
플러그인 활성화를 포함한 구체적인 절차는 여러 트레이스를 하나의 타임라인에서 보기에서 설명합니다.
참고 자료¶
- RBLN 프로파일러
- Perfetto로 프로파일러 데이터 분석
- 다른 프로파일링 예제: Qwen3-1.7B(텍스트 생성), gpt-oss-20b



