환경 변수¶
RBLN PyTorch는 환경 변수에서 설정을 읽습니다. TORCH_RBLN_* 변수는 torch-rbln의 설정입니다. 디바이스 매핑에 사용하는 RBLN_* 변수는 RBLN 런타임의 설정이지만 torch-rbln이 해석하므로 이 문서에서도 다룹니다. 런타임에 읽는다고 명시된 변수를 제외하면 프로세스를 시작하기 전에 설정해야 합니다.
변수를 읽는 시점에 따라 설정 변경이 반영되는 시점도 달라집니다.
| 읽는 시점 | 의미 | 변수 |
|---|---|---|
| import 시점 | import torch가 확장을 로드할 때 한 번 읽음 | TORCH_RBLN_LOG_LEVEL, TORCH_RBLN_LOG, TORCH_RBLN_LOG_PATH, TORCH_RBLN_DIAGNOSE, TORCH_RBLN_SKIP_ABI_CHECK |
| 디바이스 최초 사용 | 디바이스 매핑을 확정할 때 읽고 이후에는 고정 | RBLN_VISIBLE_DEVICES, RBLN_DEVICES, RBLN_NPUS_PER_DEVICE, RBLN_DEVICE_MAP |
| 매 디스패치, 검사, 할당 | 매번 읽으며 다음 연산자나 할당부터 변경을 반영 | TORCH_RBLN_DEPLOY, TORCH_RBLN_DEV_DISABLE_OP_CPU_FALLBACK, TORCH_RBLN_EAGER_MALLOC |
| 범주별로 다름 | unsupported_op는 확장 로드 시 고정. compile_error와 strided_copy_error는 검사할 때마다 읽음 | TORCH_RBLN_DISABLE_FALLBACK |
| 프로세스 그룹 생성 | init_process_group을 실행할 때 읽음 | RBLN_ROOT_IP, RBLN_LOCAL_IP, RBLN_FORCE_LOOPBACK_CONTROL_PLANE, RBLN_RDMA_IP, RBLN_RDMA_HCA, RBLN_DISABLE_AUTO_RDMA_IP, TORCH_RBLN_C10D_ASYNC |
| RBLN 런타임 | torch-rbln이 아닌 RBLN 런타임(librbln.so)이 읽음. 프로세스를 시작하기 전에 설정 | RBLN_FORCE_NPU_NAME, RBLN_PROFILER, RBLN_PROFILER_DIR, RBLN_OFFLOAD_DIR |
로깅과 진단¶
| 변수 | 설명 | 기본값 |
|---|---|---|
TORCH_RBLN_LOG_LEVEL | 로그 수준: DEBUG, INFO, WARNING, ERROR. CPU fallback 알림은 INFO 수준으로 기록합니다. | WARNING |
TORCH_RBLN_LOG_PATH | 로그 파일 경로. 디버그 빌드에서만 사용합니다. | ./torch_rbln.log |
TORCH_RBLN_LOG | TORCH_RBLN_LOG_LEVEL의 더 이상 권장하지 않는 별칭. 둘 다 설정하면 TORCH_RBLN_LOG_LEVEL이 우선합니다. | 미설정 |
TORCH_RBLN_DIAGNOSE | 1을 설정하면 import torch가 확장 초기화를 생략하므로 import에 실패하는 상황에서도 진단을 실행할 수 있습니다. python -m torch_rbln.diagnose는 자체적으로 이 모드에 진입합니다. 모듈이 시작하기 전에 import가 실패할 때만 이 변수를 설정해야 합니다. | 미설정 |
| 수준 | 설명 | 용도 |
|---|---|---|
DEBUG | 내부 상태, 함수 진입과 종료, 매개변수 값 | 디버그 빌드에서 개발 |
INFO | CPU fallback 알림을 포함한 런타임 정보 | CPU에서 실행되는 연산자 확인 |
WARNING | 실행에 영향을 줄 수 있는 상태 | 기본값 |
ERROR | 오류와 심각한 실패 | 경고 알림 |
실행과 fallback¶
| 변수 | 설명 | 기본값 |
|---|---|---|
TORCH_RBLN_DEPLOY | 정확히 ON을 설정하면(대소문자 구분) 연산자 입력의 NaN/Inf 검사를 생략합니다. 이 검사는 유효하지 않은 값이 있는 텐서를 CPU로 보내며 다른 값을 설정하면 계속 수행합니다. 배포 시 검사 오버헤드를 줄이는 데 사용합니다. 매 디스패치마다 읽습니다. | 미설정 |
TORCH_RBLN_DISABLE_FALLBACK | 비활성화할 fallback 범주를 쉼표로 구분합니다. 비활성화한 범주에서는 CPU로 fallback하는 대신 예외가 발생합니다. 범주별로 변수를 읽는 시점은 다음 표와 같습니다. | 미설정 |
fallback 범주¶
| 범주 | 기본 동작 | 비활성화 시 |
|---|---|---|
compile_error | torch.compile에 실패하면 CPU 실행으로 fallback | 컴파일 오류 발생 |
unsupported_op | RBLN 구현이 없는 연산자는 CPU에서 실행 | 연산자 이름을 명시한 오류 발생 |
non_blocking_copy | 범주 이름으로는 허용하지만 이번 릴리스에서는 참조하는 코드 경로가 없음 | 영향 없음 |
strided_copy_error | 배치 strided 복사에 실패하면 CPU로 fallback | 원래 오류 발생 |
all | — | 앞의 모든 범주 비활성화 |
unsupported_op는 확장을 로드할 때 한 번 평가하므로 프로세스를 실행하기 전에 환경에 설정해야 합니다. compile_error와 strided_copy_error는 검사할 때마다 읽으므로 Python에서 특정 코드 경로 전후로 설정하거나 해제할 수 있습니다. CPU fallback 경로에 명시적으로 등록된 연산자는 unsupported_op의 영향을 받지 않습니다. CPU에 고정된 연산자에서 확인할 수 있습니다. 디스패치 전 검사는 dtype, 모든 입력이 스칼라인 경우, NaN/Inf 값 때문에 연산자를 CPU로 보내기도 합니다. 이 검사는 fallback 범주에 해당하지 않으며 이 변수로 오류로 바뀌지 않습니다.
Warning
RBLN 연산자 디스패치가 진행 중이지 않을 때만 TORCH_RBLN_DEPLOY와 fallback 변수를 변경해야 합니다. 환경 변경과 디스패치를 동시에 수행하는 것은 지원하지 않습니다.
디바이스 매핑¶
기본적으로 각 물리 NPU는 논리 디바이스 rbln:N에 1:1로 매핑됩니다. ATOM™에서 Rebellions Scalable Design(RSD)을 사용해 여러 NPU를 하나의 논리 디바이스로 묶으려면 그룹 설정 변수 중 하나를 설정합니다. Rebel100™에서는 이 변수를 설정해서는 안 됩니다. 카드 내부 칩렛 네 개가 고정된 RSD-4 그룹을 이루며 여러 카드는 rbln-ccl로 연결합니다(튜토리얼: rbln-ccl 집합 통신). 다음의 모든 ID는 RBLN_VISIBLE_DEVICES가 노출한 NPU 목록의 인덱스입니다.
| 변수 | 설명 | 기본값 |
|---|---|---|
RBLN_VISIBLE_DEVICES | 이 프로세스에 보이는 물리 NPU의 ID를 쉼표로 구분한 목록. RBLN 런타임의 변수입니다. RBLN_DEVICES는 더 이상 권장하지 않는 별칭이며 둘 다 설정하면 이 별칭이 우선합니다. | 미설정(호스트의 모든 NPU) |
RBLN_NPUS_PER_DEVICE | 노출된 NPU를 논리 디바이스당 N개씩 균등하게 묶습니다. N은 1, 2, 4, 8, 16, 32 중 하나여야 합니다. 남은 NPU는 사용하지 않으며 경고를 출력합니다. | 미설정(1) |
RBLN_DEVICE_MAP | 그룹을 명시적으로 지정합니다. 예: "[0,1],[2,3,4,5]". 각 그룹 크기는 1, 2, 4, 8, 16, 32 중 하나여야 합니다. RBLN_NPUS_PER_DEVICE보다 우선합니다. | 미설정 |
우선순위: RBLN_DEVICE_MAP > RBLN_NPUS_PER_DEVICE > 기본 1:1 매핑.
NPU 네 개가 노출된 경우의 예입니다.
| 설정 | 결과 |
|---|---|
| 미설정 | rbln:0..rbln:3, 각각 NPU 하나 |
RBLN_NPUS_PER_DEVICE=2 | rbln:0 = NPU [0, 1], rbln:1 = NPU [2, 3] |
RBLN_NPUS_PER_DEVICE=4 | rbln:0 = NPU [0, 1, 2, 3] |
RBLN_DEVICE_MAP="[0,1],[2,3]" | RBLN_NPUS_PER_DEVICE=2와 같은 매핑을 명시적으로 지정 |
RBLN_VISIBLE_DEVICES=4,5,6,7 + RBLN_NPUS_PER_DEVICE=2 | rbln:0 = 물리 NPU 4, 5. 매핑의 ID는 노출된 NPU 목록을 기준으로 함 |
NPU 여섯 개가 노출되고 RBLN_NPUS_PER_DEVICE=4이면 rbln:0 = NPU [0, 1, 2, 3]입니다. NPU 4, 5는 사용하지 않으며 경고가 표시됩니다.
매핑이 적용되는 시점¶
| 단계 | 동작 | 실행 계기 |
|---|---|---|
| 계획 | 변수를 파싱하고 검증한 뒤 논리-물리 매핑 표를 계산합니다. NPU를 점유하지 않습니다. | torch.rbln.is_available(), torch.rbln.device_count() 등 조회 API |
| 확정 | 계획한 각 논리 디바이스를 런타임에 등록하고 매핑된 모든 NPU에 컨텍스트를 엽니다. 이후 프로세스가 종료될 때까지 매핑이 고정됩니다. | 최초의 실제 디바이스 사용: 할당, synchronize(), 집합 통신. set_device()는 매핑을 확정하지 않음. |
확정 전에는 변수를 변경하면 매핑도 바뀝니다. 확정 후에는 변경을 무시하며 변수를 해제해도 노출되는 NPU 범위가 넓어지지 않습니다. 런처는 import torch 이후에도 RBLN_VISIBLE_DEVICES를 설정할 수 있지만 프로세스가 디바이스를 처음 사용하기 전에 설정해야 합니다. fork() 이후 디바이스 사용은 지원하지 않으며 감지하지도 않습니다. 실행 방식 › 프로세스와 fork()에서 확인할 수 있습니다.
torch.rbln.device_summary()로 적용된 토폴로지를 출력할 수 있습니다.
[RBLN] Device Topology Initialized:
+----------------+------------------+---------------------+
| Logical Device | Physical NPU IDs | Status |
+----------------+------------------+---------------------+
| rbln:0 | [ 0, 1 ] | Active (Aggregated) |
| rbln:1 | [ 2, 3 ] | Active (Aggregated) |
+----------------+------------------+---------------------+
그룹을 구성하고 NPU가 남으면 남은 NPU는 Unused 행에 표시되고 표 뒤에 경고가 출력됩니다. 예를 들어 NPU 세 개가 노출된 상태에서 RBLN_NPUS_PER_DEVICE=2를 설정하면 이 경우에 해당합니다.
[RBLN] Device Topology Initialized:
+----------------+------------------+---------------------+
| Logical Device | Physical NPU IDs | Status |
+----------------+------------------+---------------------+
| rbln:0 | [ 0, 1 ] | Active (Aggregated) |
| - | [ 2 ] | Unused |
+----------------+------------------+---------------------+
[Warning] 1 physical NPU(s) are unused due to grouping constraints.
분산 실행¶
제어 평면 변수는 import 시점이 아니라 torch.distributed.init_process_group(backend="rbln-ccl")이 프로세스 그룹을 만들 때 읽습니다.
| 변수 | 설명 | 기본값 |
|---|---|---|
RBLN_ROOT_IP | rank 0의 제어 평면 주소. 기본값은 단일 호스트용이므로 여러 노드에서 실행할 때는 init_process_group 전에 설정해야 합니다. RBLN 런타임의 변수입니다. | 127.0.0.1 |
RBLN_LOCAL_IP | 해당 rank의 제어 평면 주소. RBLN_ROOT_IP와 같은 설정 규칙을 따릅니다. RBLN 런타임의 변수입니다. | 127.0.0.1 |
RBLN_FORCE_LOOPBACK_CONTROL_PLANE | 1이면 단일 노드 디버깅용으로 두 주소를 기존 설정과 관계없이 127.0.0.1로 강제합니다. | 미설정 |
RBLN_RDMA_IP | RDMA 데이터 평면 인터페이스의 IPv4 주소. 직접 설정하거나 RBLN_RDMA_HCA로 인터페이스를 지정해 프로세스 그룹이 주소를 찾도록 합니다. 둘 다 설정하지 않으면 이 변수는 미설정 상태로 남습니다. 단일 호스트에서는 필요하지 않습니다. RBLN 런타임의 변수입니다. | 미설정 |
RBLN_RDMA_HCA | /sys/class/infiniband에 표시된 RDMA 디바이스 이름. 예: mlx5_0, rocep99s0. :<PORT> 접미사는 허용하지만 무시합니다. RBLN_RDMA_IP가 미설정이면 디바이스에 처음 연결된 네트워크 인터페이스의 IPv4 주소를 RBLN_RDMA_IP에 기록합니다. 디바이스를 자동으로 선택하지 않으므로 여러 RDMA 벤더의 장치가 있는 호스트에서는 이 변수로 NIC를 지정합니다. 주소를 찾지 못하면 로그를 기록하고 RBLN_RDMA_IP를 미설정 상태로 둡니다. | 미설정 |
RBLN_DISABLE_AUTO_RDMA_IP | 1이면 앞의 RBLN_RDMA_HCA 주소 조회를 생략합니다. 직접 지정한 RBLN_RDMA_IP가 항상 우선하므로 RBLN_RDMA_IP는 없고 RBLN_RDMA_HCA만 설정된 경우에 영향을 줍니다. | 미설정 |
TORCH_RBLN_C10D_ASYNC | 1이면 rbln-ccl 프로세스 그룹이 비동기 모드로 실행되며 집합 통신은 완료를 기다릴 작업 핸들을 반환합니다. 미설정이거나 다른 값이면 집합 통신을 동기 방식으로 실행합니다. | 미설정 |
단일 호스트에서는 기본값으로 충분합니다. torchrun으로 NPU당 프로세스 하나를 실행하고 디바이스 최초 사용 전에 RBLN_VISIBLE_DEVICES로 각 프로세스에 NPU 하나를 지정한 뒤 init_process_group(backend="rbln-ccl")을 호출합니다. 실행 방법은 튜토리얼: rbln-ccl 집합 통신에서 확인할 수 있습니다. 여러 호스트에서는 모든 rank에서 init_process_group 전에 RBLN_ROOT_IP와 RBLN_LOCAL_IP를 설정합니다. 호스트에 RDMA 인터페이스가 여러 개 있으면 RBLN_RDMA_HCA 또는 RBLN_RDMA_IP로 데이터 평면 NIC도 지정합니다.
프로파일링¶
| 변수 | 설명 | 기본값 |
|---|---|---|
RBLN_PROFILER | 1이면 RBLN 런타임의 디바이스 프로파일링을 활성화합니다. Rebel100™ NPU에서는 이 설정을 통해 Kineto 브리지가 torch.profiler 트레이스에 RBLN 디바이스 행을 추가합니다. 런타임 시작 전에 설정해야 합니다. ATOM™ NPU에서는 이 설정과 관계없이 브리지가 비활성 상태로 유지됩니다. RBLN 런타임의 변수입니다. RBLN Profiler에서 확인할 수 있습니다. | 미설정 |
RBLN_PROFILER_DIR | 런타임이 프로파일 파일을 저장하는 디렉터리. RBLN 런타임의 변수입니다. | 런타임 기본값 |
프로세스에 RBLN_PROFILER=1을 설정하면 torch.profiler.profile(activities=[ProfilerActivity.CPU, ProfilerActivity.PrivateUse1]) 영역에서 ATen 호출과 함께 RBLN 디바이스 이벤트를 기록합니다. 프로세스가 종료될 때 런타임은 RBLN Profiler 도구에서 사용할 자체 프로파일 파일(rbln_<timestamp>.pb)도 저장합니다. 실행 예는 튜토리얼: Rebel100™ 프로파일링에서 확인할 수 있습니다.
ABI 검사¶
import torch는 torch-rbln 빌드와 로드한 librbln.so가 같은 rebel ABI 규약을 사용하는지 확인합니다. 관련 메시지는 문제 해결에서 확인할 수 있습니다.
| 변수 | 설명 | 기본값 |
|---|---|---|
TORCH_RBLN_SKIP_ABI_CHECK | 1, ON, TRUE, YES 중 하나를 설정하면 핸드셰이크를 생략해 ABI가 맞지 않는 조합도 함께 로드합니다. 호환되는 wheel을 빌드하는 동안 시스템을 임시로 사용하기 위한 설정입니다. | 미설정 |
Warning
검사를 생략해도 호환성 문제는 사라지지 않으며 진단만 표시되지 않습니다. 가려진 불일치는 import 시 undefined symbol 오류나 런타임 내부 데이터 손상으로 나타날 수 있습니다.
메모리¶
| 변수 | 설명 | 기본값 |
|---|---|---|
RBLN_OFFLOAD_DIR | torch.rbln.offload()가 사용하는 프로세스별 파일 오프로드 저장소의 디렉터리. RBLN 런타임의 변수입니다. | $HOME/.cache/rbln_cache/offload |
TORCH_RBLN_EAGER_MALLOC | 1이면 디바이스 연산이 처음 사용할 때가 아니라 텐서 스토리지를 등록할 때 NPU 메모리를 할당합니다. 할당 실험과 프로파일링 전용이므로 애플리케이션에서는 설정해서는 안 됩니다. 할당할 때마다 읽습니다. 지연 할당 방식은 실행 방식 › 지연 할당 디바이스 텐서에 설명되어 있습니다. | 미설정(지연 할당) |
개발 전용 옵션¶
개발 전용
프로덕션이나 배포 환경에서는 이 옵션을 사용해서는 안 됩니다. CPU fallback 검사를 생략하면 디바이스가 처리하지 못하는 입력에서 감지되지 않는 수치 오류, 멈춤, 크래시가 발생할 수 있습니다. 해당 변수를 처음 확인할 때 프로세스당 한 번 런타임 경고를 출력합니다.
| 변수 | 설명 | 기본값 |
|---|---|---|
TORCH_RBLN_DEV_DISABLE_OP_CPU_FALLBACK | eager 디스패치에서 생략할 연산자별 fallback 검사를 쉼표로 구분합니다. 원래 fallback할 조건에서도 연산자를 디바이스로 보냅니다. 매 디스패치마다 읽습니다. | 미설정 |
| 검사 | 기본 동작 | 비활성화 시 |
|---|---|---|
dispatch_mode | 인프라용이 아닌 TorchDispatchMode가 활성화되면 fallback | 무한 재귀 위험 |
trace | Python 트레이서(pdb, coverage)가 활성화되면 fallback | 트레이서 아래에서 torch.compile이 실행될 수 있음 |
reentrant | 이미 RBLN 컴파일 연산자 안에 있으면(print, repr, 중첩 연산자) 경고와 함께 fallback | 무한 재귀 위험 |
dtype | 지원하지 않거나 서로 맞지 않는 텐서 dtype이면 fallback | 잘못된 결과가 나올 수 있음 |
scalar | 모든 입력이 0차원 스칼라이면 fallback | 컴파일러 내부에서 실패할 수 있음 |
storage_offset | 연속 텐서의 storage_offset != 0이면 fallback | 잘못된 데이터를 읽을 수 있음 |
nan_inf | 입력에 NaN 또는 Inf가 있으면 fallback(배포 모드가 아닐 때만) | 유효하지 않은 값이 디바이스에 전달됨 |
all | — | 앞의 모든 검사 생략 |
관련 문서¶
- 실행 방식 - 각 변수가 바꾸는 동작
- 문제 해결 - 증상별로 사용할 변수
- RBLN Compiler › 문제 해결 - 런타임에서
RBLN_VISIBLE_DEVICES로 디바이스 선택 - RBLN Profiler -
RBLN_PROFILER와 프로파일러 출력