본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 22. 03:36

Ubuntu에서 NVIDIA peermem 'Invalid argument' 오류 — DMA-BUF를 이용한 GPUDirect RDMA 해결

요약

Ubuntu 환경에서 nvidia-peermem 모듈 로드 시 발생하는 'Invalid argument' 오류의 원인과 해결 방법을 다룹니다. 최신 NVIDIA open 드라이버와 Hopper/Blackwell GPU 사용자는 레거시 방식 대신 DMA-BUF를 통해 GPUDirect RDMA를 구현해야 합니다.

핵심 포인트

  • nvidia-peermem은 MLNX_OFED 전용 API를 사용하므로 inbox rdma-core에서는 작동하지 않음
  • 최신 GPU와 open 드라이버는 DMA-BUF를 통해 네이티브로 GPUDirect RDMA 지원
  • 해결을 위해 nvidia-drm modeset=1 활성화가 필수적임
  • 불필요한 MLNX_OFED 설치 대신 커널의 DMA-BUF 프레임워크 활용 권장

Ubuntu에서 nvidia-peermem "Invalid argument" 발생 — DMA-BUF로 GPUDirect RDMA 해결하기

요약 (TL;DR): 만약 inbox Ubuntu InfiniBand 스택 (rdma-core)을 사용하는 시스템에서 modprobe nvidia-peermem 실행 시 Invalid argument (-EINVAL) 오류가 발생한다면, 이는 모듈이 고장 난 것이 아니며 해당 모듈이 필요하지도 않습니다. nvidia-peermem은 MLNX_OFED에만 존재하는 API를 필요로 합니다. NVIDIA open 드라이버를 사용하는 Hopper/Blackwell GPU의 경우, 대신 DMA-BUF를 사용하십시오. 이는 GPUDirect RDMA를 네이티브로 지원합니다. 주의할 점 한 가지는, nvidia-drm modeset=1을 반드시 활성화해야 한다는 것입니다.

적용 대상: Ubuntu 22.04 / 24.04, inbox rdma-core 스택, NVIDIA open 커널 드라이버, H100 / H200 / B200, ConnectX-6/7 (또는 ODP를 지원하는 모든 HCA).

증상

$ sudo modprobe nvidia-peermem
modprobe: ERROR: could not insert 'nvidia_peermem': Invalid argument

dmesg를 확인하면 nvidia-peermem이 로드되었으나 아무것도 등록되지 않았거나, 로드 시 -EINVAL을 반환합니다. GPUDirect RDMA를 사용할 수 없는 상태로 보입니다.

발생 원인 (그리고 이것이 버그가 아닌 이유)

nvidia-peermem은 GPUDirect RDMA를 위한 레거시 (legacy) 경로입니다. 이는 Mellanox 전용 커널 API를 통해 InfiniBand 서브시스템에 GPU 메모리를 등록합니다:

ib_register_peer_memory_client()

이 심볼(symbol)은 MLNX_OFED의 ib_core 빌드에만 존재합니다. 메인라인 커널(mainline kernel)에는 없으며, Ubuntu의 inbox InfiniBand 스택인 rdma-core에도 없습니다.

만약 inbox 스택을 사용 중이라면, nvidia-peermem은 해당 API가 없는 상태로 컴파일되었기 때문에 결코 바인딩(bind)될 수 없으며 항상 Invalid argument를 반환합니다. 필요한 기능 자체가 존재하지 않기 때문에, 어떤 모듈 파라미터나 설정 변경으로도 해결할 수 없습니다.

단순히 nvidia-peermem을 로드하기 위해 MLNX_OFED를 설치하지 마십시오. 그렇게 하면 작동은 하겠지만 잘못된 해결 방법입니다. 구식 모듈을 살리기 위해 무거운 독점(proprietary) 스택을 추가하는 셈이기 때문입니다. 이미 커널에 네이티브 경로가 존재합니다.

해결 방법: DMA-BUF 사용

open 드라이버를 사용하는 Hopper 및 최신 GPU에서는 메인라인 Linux 프레임워크인 DMA-BUF를 통해 GPUDirect RDMA가 작동합니다. 외부 모듈이나 MLNX_OFED가 필요하지 않습니다.

요구 사항 (먼저 확인하세요)

  • NVIDIA open 커널 드라이버 (Proprietary 빌드 아님)
  • nvidia-drm modeset=1 활성화 ← 가장 흔하게 누락되는 부분
  • 다음 옵션이 포함되어 빌드된 커널:
    • CONFIG_DMA_SHARED_BUFFER=y
    • CONFIG_HMM_MIRROR=y
    • CONFIG_INFINIBAND_ON_DEMAND_PAGING=y
  • ib_uverbs 내에 ib_umem_dmabuf 심볼 존재
  • ODP (On-Demand Paging)를 지원하는 HCA (ConnectX-6/7 지원)
  • Hopper 또는 그 이후 세대 GPU (H100 / H200 / B200)

1단계 — nvidia-drm modeset 활성화

현재 상태 확인:

cat /sys/module/nvidia_drm/parameters/modeset

만약 N을 반환한다면, DMA-BUF 내보내기 (export)가 비활성화된 상태입니다. 이를 활성화하세요:

# 런타임 적용
sudo modprobe -r nvidia_drm && sudo modprobe nvidia_drm modeset=1

...

매개변수 값이 이제 Y로 읽히는지 다시 확인합니다.

2단계 — GPUDirect RDMA가 실제로 작동하는지 검증

"이제 작동할 것이다"라는 추측을 믿지 마세요. 전체 경로를 확인해야 합니다: GPU 메모리를 할당하고, 이를 DMA-BUF 파일 디스크립터 (file descriptor)로 내보낸 뒤, HCA에 등록합니다.

반드시 성공해야 하는 세 가지 호출:

  1. cudaMalloc() — GPU 메모리 할당
  2. CU_MEM_RANGE_HANDLE_TYPE_DMA_BUF_FD를 사용한 cuMemGetHandleForAddressRange() — DMA-BUF fd로 내보내기
  3. ibv_reg_dmabuf_mr() — 해당 fd를 InfiniBand HCA에 등록

세 가지 호출이 모두 성공하면, GPU 메모리는 DMA-BUF를 통해 HCA에서 직접 주소 지정이 가능하며 GPUDirect RDMA가 작동하고 있는 것입니다. 이 경우 nvidia-peermem은 필요하지 않습니다.

요약

레거시 (nvidia-peermem)현대적 방식 (DMA-BUF)
MLNX_OFED 필요 여부아니요
...

인박스 (inbox) 스택에서 nvidia-peermemInvalid argument 오류와 함께 실패한다면, 이는 예상된 결과입니다. nvidia-drm modeset=1을 활성화하고, DMA-BUF를 사용하며, 위의 세 가지 호출 테스트로 검증하십시오.

동일 장비에서 확인해 볼 만한 관련 증상

  • 모든 IB 포트가 INIT, LID 0 상태로 멈춤 → 패브릭(fabric)에 서브넷 매니저(Subnet Manager)가 없음. 다음 명령어로 시작하십시오: sudo apt install opensm && sudo systemctl start opensm. 몇 초 이내에 포트가 Active 상태로 전환됩니다.
  • 다른 포트들은 Active 상태인데 하나의 포트만 SDR에서 Down/Polling 상태임 → 스위치 측의 직접 경로(directed route)를 확인하십시오. 양쪽 끝이 모두 polling 상태라면 소프트웨어 문제가 아니라 물리적 문제(케이블 / 트랜시버 / 장착 상태)입니다. 재장착하거나 교체하십시오.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0