콘텐츠로 이동

환경 변수

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 오류와 심각한 실패 경고 알림
export TORCH_RBLN_LOG_LEVEL=INFO

실행과 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 범주에 해당하지 않으며 이 변수로 오류로 바뀌지 않습니다.

# 설정 가능한 모든 fallback 범주를 비활성화합니다. 앞에서 설명한 경로는 여전히 CPU에서 실행됩니다.
export TORCH_RBLN_DISABLE_FALLBACK=all

# 미지원 연산자만 오류로 표시합니다.
export TORCH_RBLN_DISABLE_FALLBACK=unsupported_op

# 두 범주를 비활성화합니다.
export TORCH_RBLN_DISABLE_FALLBACK=compile_error,strided_copy_error

# 기본 설정으로 되돌립니다.
unset TORCH_RBLN_DISABLE_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 — 앞의 모든 검사 생략
# NaN/Inf 검사 없이 벤치마크합니다.
export TORCH_RBLN_DEV_DISABLE_OP_CPU_FALLBACK=nan_inf

# CPU fallback 없이 pdb에서 실행합니다.
export TORCH_RBLN_DEV_DISABLE_OP_CPU_FALLBACK=trace

# 여러 검사를 비활성화합니다.
export TORCH_RBLN_DEV_DISABLE_OP_CPU_FALLBACK=dtype,scalar

# 기본 설정으로 되돌립니다.
unset TORCH_RBLN_DEV_DISABLE_OP_CPU_FALLBACK

관련 문서