본문 바로가기
Physical AI (피지컬 AI)

Nvidia Jetson Orin nano <-> 워크스테이션 (YOLOv8) 통신 테스트

by 연필 0.5 2026. 5. 23.
728x90
반응형

정상적으로 젯슨 오린 나노 보드와 서버 워크스테이션이 통신이 제대로 되는지 테스트하기 위한 실험.


1. 환경 정보


워크스테이션

OS Linux Ubuntu
GPU NVIDIA GeForce RTX 5090 (32GB VRAM)
CUDA 드라이버 580.126.09
CUDA 버전 13.0
Python 관리 Miniconda
Python 버전 3.10.20 (conda env: yolov8_env)
PyTorch 2.12.0.dev20260407+cu128 (nightly)
Ultralytics (YOLOv8) 8.4.35

Jetson Orin Nano

JetPack 6.2.2
OS Ubuntu 22.04
OpenCV 4.5.4 (apt 설치)
Python 3.x (시스템)
카메라 Logitech HD Pro Webcam C920 (/dev/video0)

2. 시스템 아키텍처


 

통신 방식: HTTP (REST POST + MJPEG Streaming)

프레임 흐름: 캡처 → JPEG 인코딩 → POST → YOLOv8 추론 → 어노테이션 → MJPEG 스트림


3. 워크스테이션 설치 과정


3.1 Conda 환경 생성

conda create -n yolov8_envpython=3.10 -y
conda activate yolov8_env

3.2 PyTorch 설치

처음에는 안정 버전(cu124)을 설치했으나 RTX 5090 호환성 문제로 nightly로 교체 (이슈 1 참조):

pip install --pretorchtorchvisiontorchaudio \\
--index-urlhttps://download.pytorch.org/whl/nightly/cu128

설치된 버전: torch-2.12.0.dev20260407+cu128

3.3 YOLOv8 및 Flask 설치

pip install ultralyticsflask

4. Jetson 설치


1. IP 확인

ip addr show | grep "inet " | grep -v 127.0.0.1

2. 필수 패키지 설치

sudo apt update
sudo apt install ffmpeg python3 -pip -y
pip3 install requests opencv-python

3. 클라이언트 파일 전송 (워크스테이션에서)

  • stream 하기위해 만든 파일을 jetson에 전송

5. 트러블슈팅


🔴 이슈 1: RTX 5090 CUDA 호환성 오류

발생 시점:

server.py 실행 후 젯슨에서 첫 프레임이 도착했을 때

 

에러 메시지:

NVIDIA GeForce RTX 5090 with CUDA capability sm_120 is not compatible
with the current PyTorch installation.
RuntimeError: CUDA error: no kernel image is available for execution on the device

 

원인 분석:

처음 설치한 PyTorch 2.6.0+cu124 정식 릴리스는 sm_50 ~ sm_90까지만 지원하여 sm_120용 커널 이미지가 바이너리에 포함되어 있지 않습니다. CUDA 드라이버는 13.0으로 최신이지만 PyTorch 바이너리 자체가 해당 아키텍처를 인식하지 못해 런타임 오류가 발생.

 

해결 방법:

PyTorch nightly 빌드(cu128)로 교체. Nightly 빌드는 최신 GPU 아키텍처(sm_120 포함)를 지원하며, CUDA 드라이버 13.0은 CUDA 12.8 런타임과 하위 호환.

pip uninstall torch torchvision torchaudio -y
pip install --pre torch torchvision torchaudio \\
--index-url <https://download.pytorch.org/whl/nightly/cu128>

결과: CUDA 정상 인식, sm_120 경고 없음, GPU 추론 정상 동작

🔴 이슈 2: Jetson에서 OpenCV 카메라 열기 실패

발생 시점:

jetson_client.py 실행 시

 

에러 메시지:

WARN: global cap_v4l.cpp:914 open VIDEOIO(V4L2:/dev/video0): can't open camera by index
WARN: backend is generally available but can't be used to capture by index
WARN: backend is generally available but can't be used to capture by name

 

원인 분석:

Jetson에 설치된 OpenCV 모두 카메라 캡처가 불가능한 것으로 확인.

  • pip opencv-python: ARM64 Linux용 바이너리에 V4L2 캡처 미포함
  • apt python3-opencv v4.5.4: 시스템 패키지임에도 V4L2·GStreamer 모두 NO로 컴파일됨
python3-c"import cv2; print(cv2.getBuildInformation())" | grep-E"V4L|GStream"
# 결과: GStreamer: NO

JetPack 기본 설치 OpenCV는 GStreamer를 지원해야 하나, 이 보드에 설치된 빌드는 해당 기능이 비활성화 상태.

 

해결 방법:

OpenCV 카메라 API를 완전히 우회하고 ffmpeg subprocess로 카메라 프레임을 직접 읽습니다. ffmpeg는 자체 V4L2 구현을 가지므로 OpenCV 빌드 상태와 무관하게 동작.

cmd = [
"ffmpeg","-f","v4l2","-input_format","mjpeg",
"-video_size","640x480","-framerate","30",
"-i","/dev/video0",
"-f","rawvideo","-pix_fmt","bgr24","-"
]
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
raw = process.stdout.read(640 *480 *3)
frame = np.frombuffer(raw, dtype=np.uint8).reshape((480,640,3))

C920은 MJPEG 포맷으로 캡처하고, 실패 시 YUYV로 자동 fallback됨.

🔴 이슈 3: 카메라 장치 점유 오류

발생 시점: ffmpeg로 카메라 테스트 시

 

에러 메시지:

/dev/video0: Device or resource busy

 

원인 분석:

이전 실행에서 OpenCV가 카메라 열기에 실패했지만, 파이썬 프로세스(PID 5444)가 /dev/video0의 파일 디스크립터를 해제하지 않은 채 백그라운드에 남아 있었습니다. lsof로 점유 확인:

lsof/dev/video0
# python  5444 jetbot  3u  CHR  81,0  /dev/video0

 

해결 방법:

점유 프로세스를 강제 종료.

sudo fuser -k /dev/video0
# 또는
kill -9 5444

6. 실행


워크스테이션

conda activate yolov8_env
cd ~/yolov8_stream
python server.py

 

정상 시작 확인:

✅ YOLOv8 서버 시작 | <http://0.0.0.0:5000>
   모델: yolov8n.pt  |  신뢰도 임계값: 0.5

Jetson Orin Nano

# 카메라 점유 해제 (필요 시)
sudo fuser -k /dev/video0

# 클라이언트 실행
python3 jetson_client.py

7. 결과


728x90
반응형