콘텐츠로 이동

CUDA/cuDNN 버전 불일치

CUDA/cuDNN 버전 불일치 진단·해결

GPU 가속을 켰는데 추론이 CPU로 떨어지거나 초기화에서 실패하나요? GPU 환경에서 가장 흔한 원인은 드라이버·CUDA·cuDNN·ONNX 런타임 사이의 버전 불일치입니다. 이 문서로 짚어봐요.

증상

  • executionProvidergpu로 설정했는데 GPU 실행 프로바이더 초기화에서 실패합니다.
  • 서버는 CPU로 폴백해 동작하지만 GPU 가속을 받지 못합니다.
  • 기동 로그에 CUDA/cuDNN 관련 라이브러리 로드 오류가 보입니다.

원인

바른의 GPU 추론은 ONNX 런타임의 GPU 실행 프로바이더 위에서 동작합니다. 이 스택은 아래 층들이 서로 호환돼야 합니다.

graph TD
  DRV[GPU 드라이버] --> CUDA[CUDA 런타임];
  CUDA --> CUDNN[cuDNN];
  CUDNN --> ORT[ONNX 런타임 GPU EP];
  ORT --> BAREUN[바른 추론];

한 층이라도 버전이 어긋나면 GPU EP 초기화에 실패하고, GPU 실행이 CPU로 떨어질 때에서 설명한 대로 CPU 폴백이 일어납니다.

원인 설명
드라이버 구버전 GPU 드라이버가 요구 CUDA를 지원하지 않음
CUDA/cuDNN 불일치 CUDA와 cuDNN 버전 조합이 맞지 않음
ORT 빌드 불일치 설치한 ONNX 런타임이 기대하는 CUDA/cuDNN과 다름

해결

  1. 로그에서 어느 라이브러리가 실패했는지 확인하세요. CUDA 런타임인지 cuDNN인지에 따라 고칠 지점이 달라집니다. 폴백 직전의 경고가 단서입니다.

  2. 드라이버 → CUDA → cuDNN → ONNX 런타임 순으로 호환을 맞추세요. 위 그림의 위에서 아래 순서로 점검합니다. 드라이버가 너무 낮으면 상위 층이 모두 깨지므로 드라이버부터 보세요.

  3. CPU로 정상 동작을 먼저 확인하세요. executionProvidercpu로 바꿔 서버가 정상 기동하면, 문제는 GPU 스택에 한정된 것입니다. 원인을 좁히는 데 도움이 돼요.

    {
      "executionProvider": "cpu"
    }
    
  4. 호환을 맞춘 뒤 다시 gpu로 전환하고 로그를 확인하세요. 폴백 경고가 사라지고 GPU 사용률이 올라가면 해결된 것입니다.

버전은 '최신'이 아니라 '호환'이 중요해요

무조건 최신으로 올린다고 해결되지 않습니다. 드라이버·CUDA·cuDNN·ONNX 런타임은 서로 검증된 조합으로 맞춰야 합니다. 한 층만 임의로 올리면 오히려 깨질 수 있어요.

예방·팁

  • GPU 노드를 새로 구성할 때 스택 버전을 문서로 고정해두면, 다음 배포에서 같은 조합을 재현하기 쉽습니다.
  • GPU가 꼭 필요하지 않은 워크로드라면 cpu로 운영하는 편이 트러블슈팅 부담이 적습니다.

자주 묻는 질문

Q. CUDA/cuDNN 버전이 안 맞으면 어떻게 되나요?

GPU 실행 프로바이더 초기화에 실패하고, 바른은 CPU로 자동 폴백합니다. 서버는 동작하지만 GPU 가속을 받지 못하며, 기동 로그에 라이브러리 로드 오류가 남습니다.

Q. 어디부터 점검해야 하나요?

GPU 드라이버 → CUDA → cuDNN → ONNX 런타임 순으로 위에서 아래로 점검하세요. 드라이버가 낮으면 상위 층이 모두 깨지므로 드라이버를 먼저 확인하고, CPU 실행으로 문제 범위를 GPU 스택에 한정하면 진단이 쉬워집니다.

Q. 최신 버전으로 올리면 해결되나요?

꼭 그렇지는 않아요. 버전은 '최신'이 아니라 '호환'이 중요합니다. 드라이버·CUDA·cuDNN·ONNX 런타임은 서로 검증된 조합으로 맞춰야 하며, 한 층만 임의로 올리면 오히려 GPU 실행 프로바이더 초기화가 깨질 수 있습니다.

Q. CUDA 오류 로그에서 무엇을 봐야 하나요?

폴백 직전의 경고에서 어떤 라이브러리가 실패했는지 보세요. CUDA 런타임인지 cuDNN인지에 따라 고칠 지점이 달라집니다. 그 단서를 기준으로 드라이버부터 ONNX 런타임까지 호환을 맞추면 됩니다.

도움이 되었나요?