이번주는 저번에 공부했던 Unreal Engine에서 CUDA와 OpenCV 사용시에 격었던 시행착오에 대해 알아보고 GPT와 함께 그 해결 방법을 알아보자
1. 파이썬 버전문제 (버전 11)
왜 Python 3.13이 안 됐는가?
- 아직 많은 라이브러리(특히 PyTorch, TensorFlow, ONNX Runtime 등)가 Python 3.13을 공식 지원하지 않아요.
- 그래서 pip로 설치하려고 하면 "버전을 찾을 수 없다"는 오류가 떴던 거예요.
🔹 Python 3.11로 바꾼 게 왜 잘 됐는가?
- Python 3.11은 현재 가장 널리 지원되는 안정 버전이라, PyTorch, OpenCV, ONNX 등 대부분이 빌드되어 있어요.
- Python 3.13을 그냥 제거하면, python 명령이 자동으로 3.11을 가리키게 되고 정상 작동하게 돼요.
즉, 굳이 환경 설정을 직접 바꾸지 않고도 3.13을 지워버리면 시스템이 남아 있는 3.11을 사용하게 되는 거예요.
🔹 더 확실하게 확인하는 방법
1.터미널에서
python --version
→ Python 3.11.x 가 나와야 함.
2. pip도 같은 버전을 따라가야 한다.
python -m pip --version
→ Python 3.11 경로가 보이면 정상 연결됨.
👉 그래서 지금처럼 3.13 삭제 → 3.11 설치 후 사용하는 게 가장 안전하고 흔한 방법이에요.
추가로, 앞으로 충돌 방지하려면 PATH 환경변수에 Python 3.11만 남아 있는지 확인해주면 더 깔끔해요.
⚠️ 하지만 저처럼 3.13 버전을 그대로 두고 3.11 버전을 설치한 뒤에 3.13 버전을 그냥 삭제해버린다면 PATH 경로에 3.13 버전이 그대로 남아있을 수 있어 더 귀찮은 일이 벌어질 수 있습니다!
그러므로 다음과 같은 방법으로 Python 버전 관리해주기!
🐍 Python 여러 버전 안전하게 관리하는 방법
1️⃣ Windows용 Python Launcher (py) 사용
- Python 설치할 때 기본으로 같이 설치되는 런처예요.
- 버전별로 실행할 수 있습니다:
py -3.11 # Python 3.11 실행
py -3.13 # Python 3.13 실행
py -3.9 # Python 3.9 실행
py -3.11 -m pip install torch
👉 이렇게 하면 PATH 꼬임 문제 없이 원하는 버전을 자유롭게 쓸 수 있어요.
2️⃣ PATH 충돌 방지
- 굳이 PATH에 여러 버전을 다 등록할 필요 없음.
- 기본 PATH에는 주로 쓸 하나의 버전만 두고, 나머지는 py 명령어로 관리하는 게 안전함.
3️⃣ 가상환경(venv) 적극 활용
- 프로젝트별로 다른 Python 버전 & 라이브러리 필요할 때 유용:
py -3.11 -m venv myenv # Python 3.11 가상환경 생성
myenv\\Scripts\\activate # 가상환경 진입
pip install numpy torch opencv-python
- 이렇게 하면 시스템 Python이랑 프로젝트 Python이 분리돼서 충돌이 거의 없음.
4️⃣ 권장 워크플로우
- 시스템에는 최신 안정 버전(예: 3.11) 하나만 PATH에 두기
- 다른 버전 필요하면 py -3.xx로 실행
- 프로젝트 단위에서는 무조건 venv 사용
👉 요약:
- py 런처 쓰면 버전 충돌 없음
- PATH는 한 버전만
- 프로젝트는 venv로 독립
2. 쿠다의 버전&설치 방법 (왜 터미널에서 설치할까)
Chat GPT 왈
NVIDIA 공식 설치 관리자(그래픽 UI)에서 문제가 발생했을 때
- 우리가 보통 "다음 → 다음" 하는 방식
- 여기서 오류가 났다는 건 설치 중 일부가 실패했을 수 있다는 뜻
제가 말한 UI 문제라는 건 "설치 프로그램의 그래픽 인터페이스(윈도우 창)"에서만 오류가 나고, 실제로 내부적으로는 정상 설치가 되는 경우를 말하는 거예요.
🔹 예를 들어
- NVIDIA에서 제공하는 CUDA 설치 관리자는 두 가지 방식이 있어요:
- GUI(그래픽 설치 관리자) → 창이 뜨고 "다음(next)" 버튼 눌러서 설치하는 방식
- CLI(명령 프롬프트 설치) → exe를 실행할 때 옵션을 줘서 진행하는 방식
- 가끔 GUI 설치에서 UI 충돌, 권한 문제, 레지스트리 읽기 오류 같은 게 생겨서 설치 실패 메시지가 뜨기도 해요.
- 하지만 CLI 방식(프롬프트)에서는 이런 UI 의존성이 없으니까 실제 CUDA Toolkit과 드라이버가 정상적으로 설치될 수 있어요.
🔹 쉽게 말하면
- UI 설치 실패 = 겉에서 "설치 실패" 알림만 뜬 경우
- 실제 내부 설치 = 파일 복사, 환경 변수 등록 같은 건 정상적으로 완료된 경우
즉, 설치 창에서는 실패처럼 보여도 CUDA 자체는 잘 깔려 있을 수 있다는 뜻이에요
3. onnxr 다운로드 파일이 따로 있는 이유( gpu버전과 소스코드)
ONNX Runtime GPU 버전 주의점
1️⃣ CUDA와 cuDNN 버전 호환성
- onnxruntime-gpu는 내부적으로 CUDA와 cuDNN을 사용함.
- 따라서 ONNX Runtime 빌드가 지원하는 CUDA 버전과 실제 설치된 CUDA Toolkit이 맞아야 함.
- 예시:
- onnxruntime-gpu 1.22.1 → CUDA 12.2 지원
- CUDA 13.0 설치 상태라면 아직 호환 안 될 수도 있음
ONNX Runtime 공식 Release Note 확인해서 버전 맞추기.
2️⃣ GPU 메모리 부족 문제
- GPU 버전은 CPU보다 메모리를 많이 씀.
- RTX 3090 같은 대형 GPU는 괜찮지만, 메모리 작은 GPU에서는 OOM(Out of Memory) 오류 발생 가능.
- 특히 YOLO, Transformer 계열은 메모리 관리 신경 써야 함.
- providers=["CUDAExecutionProvider", "CPUExecutionProvider"] 같이 CPU fallback 추가
- Batch size 줄이기
3️⃣ 추론 코드에서 ExecutionProvider 지정
- onnxruntime-gpu를 설치해도, 기본적으로 CPU provider만 잡히는 경우가 있음.
- 반드시 코드에서 GPU를 명시해야 함:
import onnxruntime as ort
GPU 우선, GPU 사용 불가시 CPU로 fallback
sess = ort.InferenceSession("model.onnx", providers=["CUDAExecutionProvider", "CPUExecutionProvider"])
print(sess.get_providers())
3. 왜 언리얼에서 OpenCV 파일이 안 보였을까?
1️⃣ 언리얼은 "외부 라이브러리 코드"를 자동으로 보여주지 않음
- UE 프로젝트는 기본적으로 자기 자신의 C++ 소스 코드만 관리해요.
- OpenCV 같은 외부 라이브러리를 가져다 쓰는 경우, 보통은 .lib + .dll + 헤더파일(.h) 경로를 빌드 세팅에만 추가합니다.
- 그래서 OpenCV 내부 소스(.cpp) 파일들은 언리얼의 C++ Classes나 Source 폴더에서 보이지 않는 게 정상이에요.
2️⃣ "경로 추가"만 했을 경우
- Build.cs 파일에서 OpenCV 경로를 PublicIncludePaths / PublicAdditionalLibraries 등에 추가하면 → 언리얼은 "컴파일할 때 OpenCV를 참조하겠다" 정도만 알아요.
- 하지만 언리얼 에디터나 Visual Studio 솔루션에서 실제 OpenCV 소스 파일 구조는 안 보임.
- 대신 헤더(.h) 파일은 include 경로로 열 수 있어요.
3️⃣ 저장/빌드 후 보였던 이유
- 언리얼은 C++ 코드 구조를 변경하거나 외부 경로를 추가하면,
- 프로젝트 리빌드 & Visual Studio 솔루션 리젠(re-generate) 과정을 거쳐야 새 파일들이 Solution Explorer에 반영돼요.
- 그래서 경로 세팅 후 "저장 → 언리얼이 VS 솔루션 리빌드" → 그제야 OpenCV 관련 헤더들이 External Dependencies 같은 노드에 표시됐을 거예요.
📌 정리
- 언리얼에서 OpenCV 같은 라이브러리는 파일 탐색기처럼 내부 소스가 다 보이는 게 아님
- 보통은 #include <opencv2/opencv.hpp> 식으로 필요한 헤더만 열 수 있음
- 빌드 세팅(.Build.cs)에 경로 추가 후 저장해야 Visual Studio에서 External Dependencies에 헤더들이 반영됨
- 실제 .cpp 소스들은 언리얼 프로젝트에 직접 포함되지 않기 때문에, 보이지 않는 게 정상