장비·런타임 이슈#
특정 장비나 런타임에서만 나타나는 문제. 학습 결과의 신뢰도에 직접 영향을 준다.
conv2d 결과가 틀린 워크스테이션#
증상: 크래시 없이 값만 틀린다. 같은 conv2d 를 반복해 결과를 비교하면 출력 동적 범위의 30~80% 에 해당하는 차이가 산발적으로 나온다. 같은 dtype, 같은 커널이므로 반올림으로 설명되지 않는다. CPU 기준 계산과 cuDNN 을 끈 GPU 경로는 정상 실행 결과와 일치한다. 같은 카드로 전처리 fp32 를 만들면 RBF 단계에서 산발적인 illegal access 나 NaN 이 나온다.
범위: 특정 장비 하나. 그 장비에서 실행한 모든 모델에 해당한다.
| 장비 | GPU | WSL2 | Windows |
|---|---|---|---|
| CFD4 | Quadro RTX 6000 | 비트 단위 일치 | 비트 단위 일치 |
| CFD3 | RTX 4080 SUPER | 비트 단위 일치 | — |
| DESKTOP-AL7E6K8 (server) | Quadro RTX 6000 | 기본 클럭에서 틀림, 클럭을 낮추면 비트 단위 일치 | 기본 클럭에서 일치하지 않음 |
동일한 torch·cuDNN 조합에서 다른 장비는 정상이고, cuDNN 버전·드라이버·WSL2 는 각각 A/B 로 배제됐다. 원인은 이 카드의 불량이다. 같은 세대인 CFD4 는 정상이므로 GPU 세대와도 무관하다.
발현 조건: 큰 텐서와 적은 채널 수의 conv2d 에서 호출의 1% 미만. conv1d·conv3d·행렬곱·풀링은 훨씬 많은
표본에서도 깨끗했고 일반 스트레스 도구와 메모리 검사도 통과한다. 그래서 오래 눈에 띄지 않았다.
reg-256-base 와 3D 회귀가 정확히 그 조건에 들어간다.
대응: 불량 카드는 클럭을 낮춘다. server 는 클럭을 낮춘 뒤 conv2d 불일치와 전처리의 illegal access·NaN 이 모두 나오지 않는다.
scripts/etc/check_cudnn.py 가 검출기다. 새 장비에서 결과를 신뢰하기 전에 실행한다.
cuDNN 을 끄는 것은 해결책이 아니다 — 끈 상태에서도 같은 conv 를 비트 단위로 재현하지 못한다.
정상 장비는 이 conv 를 정확히 재현하므로 검출기는 크기 임계값이 아니라 0 이 아닌 차이 자체를 실패로 본다.
3D 회귀의 illegal memory access#
증상: 학습이 임의의 스텝에서 CUDA error: an illegal memory access was encountered 로 중단된다.
파이썬 프레임은 다음 동기화 지점이 어디냐에 따라 달라진다. CUDA_LAUNCH_BLOCKING=1 로 보면
Depth3x3Conv 가 내려가는 융합 scatter/gather 커널에서 발생하며 순전파와 역전파 모두에서 나타난다.
2D 회귀에서는 관측되지 않았다.
필요조건은 torch.compile 하나다.
| 조건 | 실행 스텝 | 크래시 |
|---|---|---|
| 컴파일 (torch 2.12.0 / 2.12.1 / 2.13.0) | 약 34,500 | 15 |
| 컴파일, 문제 커널만 컴파일 제외 | 7,877 | 1 |
| eager (컴파일 끔) | 15,000 | 0 |
버전 고정은 해결책이 아니다(세 버전 모두 실패). 특정 커널을 컴파일에서 빼도 여전히 실패한다. 개별 성공 실행은 근거가 되지 않는다 — 같은 조건에서 3,000 스텝을 넘긴 뒤 67 스텝에서 죽은 적이 있다. "고쳐졌다"는 판단에는 최소 15,000 스텝 이상이 필요하다.
배제된 원인 (각각 A/B 로 확인): 데이터 경로(합성 텐서로도 발생), 8비트 옵티마이저, inductor 옵션 몇 가지, torch 버전, 인덱스 범위(디버그 빌드에서 경계 검사가 발동하지 않음), 다른 곳의 메모리 침범(카나리 버퍼 무손상), 할당자 동작(실행 중 반환·재시도·OOM 없음), GPU 연산 자체(동일 온도·전력에서 대규모 비교 검사 통과). conv2d 문제 와도 무관하다 — 그쪽이 정상인 장비에서도 이 크래시는 그대로 난다.
따라서 원인은 유효한 입력에 대해 컴파일러가 생성한 코드나 그 실행 경로 안에 있다.
대응: 크래시가 결정론적이지 않고 epoch 단위 checkpoint 로 재개되므로 재시작 루프로 진행할 수 있다. 비용은 진행 중이던 epoch 이다. 다만 크래시하지 않은 스텝에서의 조용한 기울기 손상은 배제되지 않았으므로, 원인이 밝혀지기 전까지 장시간 3D 회귀 학습 결과는 의심하고 본다.
h5 읽기 중 네이티브 segfault#
증상: 학습 중 h5 읽기에서 압축 라이브러리(blosc2/hdf5)가 간헐적으로 프로세스를 죽인다. 파이썬 예외가 아니라 네이티브 크래시라 재시도 로직이 잡지 못한다.
성격: 환경 문제이며 모델 로직과 무관하다.
대응: fold 단위 재개로 복구한다. Dataset 에 OSError 재시도가 있지만 네이티브 크래시는 우회하지 못한다.