[Jetson 개발기] Invalid CUDA device 오류, PyTorch와 CUDA 호환성 문제 해결기
강력한 성능의 NVIDIA Jetson 보드. AI 프로젝트의 심장으로 삼고 야심 차게 개발을 시작했다. ROS 2 환경에 YOLOv8 노드를 올리고 실행 버튼을 누른 순간, 부풀었던 기대감은 차가운 에러 메시지와 함께 가라앉았다.
ValueError: Invalid CUDA 'device=0' requested.
torch.cuda.is_available(): False
분명 CUDA 코어가 탑재된 Jetson인데, PyTorch는 GPU를 전혀 인식하지 못하는 상황이다. 처음에는 단순한 설치 오류라 생각했지만, 이 문제는 Jetson이라는 특별한 개발 생태계를 깊이 이해해야만 해결할 수 있는, 본질적인 호환성에 관한 것이었다. 이 글은 그 원인을 파헤치고 해결에 도달하기까지의 과정을 담은 나의 디버깅 기록이다.
첫 번째 시도: 실패로 돌아간 표준 해결책
가장 먼저 의심한 것은 역시 PyTorch 설치였다.
# 일반적인 PC 환경에서 사용하던 방식 (Jetson에서는 실패한다)
pip3 install torch torchvision
결과는 실패였다. 이 명령어는 인텔이나 AMD CPU를 사용하는 x86_64 아키텍처 기반의 PC를 위한 것이었다. 하지만 내가 현재 사용하고 있는 Jetson 보드는 ARM64 (aarch64) 아키텍처 기반으로 동작한다. CPU의 구조 자체가 다르니, 당연히 소프트웨어도 그에 맞는 전용 버전이 필요했던 것이다. 여기서 첫 번째 교훈을 얻었다. Jetson은 PC와 다르다.
문제의 핵심: Jetson 생태계, JetPack의 이해
Jetson에서의 개발은 'JetPack'이라는 SDK(Software Development Kit) 위에서 이루어진다. JetPack은 단순히 몇 가지 툴을 모아놓은 것이 아니다. Ubuntu OS부터 NVIDIA 드라이버, CUDA, cuDNN, TensorRT에 이르기까지, 하드웨어의 성능을 온전히 끌어내기 위한 모든 소프트웨어 스택이 하나의 패키지로 묶여 제공된다.
따라서 Jetson에서 사용하는 모든 핵심 라이브러리는 이 JetPack 버전과의 호환성이 무엇보다 중요하다. 나의 개발 환경은 JetPack 5.1 (Ubuntu 20.04)이었고, 여기에는 CUDA 11.4가 내장되어 있었다. 즉, PyTorch 역시 JetPack 5.1 환경에 맞춰 특별히 빌드된 버전이 필요하다는 결론에 다다랐다. 일반 PyPI 저장소에서 내려받는 범용 패키지로는 이 특별한 생태계에서 제대로 동작할 수 없었다.
올바른 해결 과정: 단계별 가이드
문제의 본질을 파악하자, 해결의 길은 명확해졌다.
A. 기존 설치 제거: 깨끗한 시작
혹시 모를 충돌을 방지하기 위해, 기존에 잘못 설치된 PyTorch 관련 패키지를 모두 깨끗하게 제거하는 것부터 시작했다.
pip3 uninstall torch torchvision torchaudio
B. Jetson 전용 PyTorch 휠(Wheel) 찾기
NVIDIA는 개발자 포럼을 통해 Jetson 버전별 PyTorch 휠(.whl) 파일을 공식적으로 제공한다. 이곳에 바로 우리가 원하는 해결책이 있었다.
위 페이지에 접속하여 내 환경인 JetPack 5.x 섹션으로 이동했다. 그리고 내 Python 버전에 맞는 PyTorch 휠 파일의 링크를 확인했다. 나의 경우 JetPack 5.1 환경이었고, PyTorch 2.1.0 버전을 설치하기로 결정했다.
C. PyTorch 및 torchvision 설치
이제 올바른 해결책을 찾았으니, 메뉴얼에 따라 실행해볼 차례다.
# 1. 시스템 의존성 라이브러리 설치
sudo apt-get update
sudo apt-get install libopenblas-base libopenmpi-dev libomp-dev
# 2. Jetson용 PyTorch 휠 다운로드 및 설치 (PyTorch 2.1, JP 5.1 예시)
wget https://developer.download.nvidia.com/compute/redist/jp/v51/pytorch/torch-2.1.0-cp38-cp38-linux_aarch64.whl
pip3 install numpy torch-2.1.0-cp38-cp38-linux_aarch64.whl
# 3. torchvision v0.16.1 소스 코드 빌드 및 설치
sudo apt-get install libjpeg-dev zlib1g-dev
git clone --branch v0.16.1 https://github.com/pytorch/vision torchvision
cd torchvision
export BUILD_VERSION=0.16.1
python3 setup.py install --user
cd ../
여기서 중요한 점은 torchvision을 소스 코드로 직접 빌드했다는 것이다. PyTorch가 핵심 엔진이라면 torchvision은 이미지/비전 처리를 위한 도구 상자이다. 이 둘은 버전이 긴밀하게 맞물려야 제대로 작동한다. Jetson 전용으로 미리 컴파일된 torchvision 휠은 찾기 어렵거나 PyTorch 버전과 맞지 않는 경우가 많다. 따라서 내가 설치한 PyTorch 버전에 맞춰 소스 코드를 직접 컴파일(빌드)하여 완벽한 한 쌍을 만들어주는 것이 가장 확실한 방법이다.
D. 최종 확인
길었던 디버깅의 마침표를 찍을 시간이다. 터미널에 마지막 확인 명령어를 입력했다.
python3 -c "import torch; print(f'PyTorch: {torch.__version__}'); print(f'CUDA Available: {torch.cuda.is_available()}'); print(f'torchvision: {__import__(\"torchvision\").__version__}')"
결과는 완벽했다.
PyTorch: 2.1.0
CUDA Available: True
torchvision: 0.16.1
CUDA Available: True
메시지를 통해 해결 완료!!
마무리
이번 디버깅 과정은 단순한 오류 해결을 넘어 Jetson 개발 환경의 특수성을 깊이 이해하는 계기가 되었다. "Jetson에서 소프트웨어를 설치할 때는, 항상 JetPack과의 호환성을 최우선으로 고려하고 공식 제공 자료를 확인해야 한다." 는 값진 교훈을 몸으로 체득했다.
만약 Jetson에서 분명 설치되어있는데 작동하지 않는 오류를 마주한다면, 당황하지 말고 Jetson이 조금은 특별한 친구라는 사실을 기억하길 바란다. 올바른 부품(소프트웨어)을 찾아주기만 하면, Jetson은 분명 AI 프로젝트에서 강력한 성능으로 보답할 것이다.
추천글: