1P by neo 5달전 | favorite | 댓글과 토론

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_PEERGMMU_APERTURE_SYS_NONCOH로 변경
    • CPU L2 캐시와 일관성은 필요없지만 PCIe 버스로 나가야 하므로
  • 피어 주소 필드인 fldAddrPeerfldAddrSysmem으로 변경
  • 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 프레임워크의 완벽한 호환성을 기대하긴 어려울 것 같음. 안정화 될 때까지 기다려봐야 할 듯.