GN⁺: 해킹된 Nvidia 4090 GPU 드라이버, P2P 활성화
(github.com/tinygrad)NVIDIA Linux Open GPU 드라이버에 P2P 지원 추가
이 프로젝트는 NVIDIA 드라이버를 포크해서 4090 GPU에 P2P 지원을 추가한 것임.
-
./install.sh
실행으로 간단히 설치 가능 - DKMS에서 기존 드라이버를 먼저 제거해야 할 수 있음
- 시스템에 Large BAR 지원이 필요하고 IOMMU는 꺼야 함
- 모든 캐시 플러시가 올바른지는 확신할 수 없으므로, 이슈 발견 시 제보 바람
- 이는 해킹이 아니라 PCIe 스펙에 맞게 구현한 것이며, 정리만 잘하면 업스트림에 반영될 수 있을 것임
동작 원리
기존 NVIDIA P2P의 문제점
- 기존에는 MAILBOXP2P라는 하드웨어 인터페이스를 사용해서 GPU간 메모리 전송을 했음
- 4090에서는 이 하드웨어가 없거나 비활성화되어 있어서 P2P가 동작하지 않음
- 초기 드라이버에서는 잘못 동작한다고 보고했지만, 실제로는 PCIe 버스로 전송하고 있었음
- 그러나 메일박스 하드웨어가 없어서 복사한 내용이 올바른 곳으로 가지 않았고, 시스템 크래시를 일으킬 수 있었음
Large BAR 지원 추가
- 일부 3090과 모든 4090에서 NVIDIA가 Large BAR 지원을 추가함
- H100에서는 메일박스 대신 BAR을 직접 사용하는 BAR1P2P라는 PCIe 모드를 추가함
- 4090에서 이를 활성화하려면 HAL을 우회하고 GH100 메서드를 직접 호출해야 함
-
kbusEnableStaticBar1Mapping_GH100
같은 메서드로 전체 VRAM을 BAR1에 매핑 -
MapAperture
함수에서 해당 영역 사용을 비활성화해야 했음
-
P2P 활성화의 어려움
- VRAM 매핑 후에도
cuda-samples
의./simpleP2P
실행 시 MMU 오류 발생-
GMMU_APERTURE_PEER
를 매핑 타입으로 사용하는데 4090에서 지원되지 않음 - 4090에서 지원되는 타입은
GMMU_APERTURE_VIDEO
,GMMU_APERTURE_SYS_NONCOH
,GMMU_APERTURE_SYS_COH
뿐
-
-
GMMU_APERTURE_PEER
를GMMU_APERTURE_SYS_NONCOH
로 변경- CPU L2 캐시와 일관성은 필요없지만 PCIe 버스로 나가야 하므로
- 피어 주소 필드인
fldAddrPeer
를fldAddrSysmem
으로 변경 -
fabricBaseAddress
필드에BAR1
기준 주소를 설정
동작 확인
-
./simpleP2P
정상 동작 확인- GPU0와 GPU1 사이에 24GB/s 속도로 P2P 동작
-
p2pBandwidthLatencyTest
로 양방향 대역폭 확인- 920GB/s의 로컬 대역폭과 51GB/s의 P2P 대역폭 측정됨
- NCCL 테스트로 호환성 확인
- 6개 4090 GPU로 24.5GB/s의 평균 버스 대역폭 달성
GN⁺의 의견
- NVIDIA 드라이버의 대부분이 오픈소스로 공개되어 있어 개발자 커뮤니티에서 이런 시도를 할 수 있었던 것 같음. 앞으로도 더 많은 부분이 오픈소스화 되길 기대해 봄.
- 4090의 강력한 성능을 여러대 연결해서 활용할 수 있게 되면, 개인 개발자나 소규모 랩에서도 거대 규모의 AI 모델을 학습시킬 수 있게 될 것임.
- 하지만 이렇게 하드웨어 의존적이고 까다로운 부분을 개발자가 직접 만질 수 밖에 없다는 건, NVIDIA가 아직 4090 지원을 완전히 끝내지 못했다는 반증이기도 함.
- 또한 이는 Linux 드라이버에 한정된 얘기고, Windows에서의 상용 활용은 아직 요원해 보임. NVIDIA의 공식적인 지원이 하루빨리 이뤄지길 바람.
- 아무래도 4090이 워낙 최신 하드웨어다보니 CUDA, PyTorch, Tensorflow 같은 라이브러리나 ML 프레임워크의 완벽한 호환성을 기대하긴 어려울 것 같음. 안정화 될 때까지 기다려봐야 할 듯.