2025년 6월 18일 수요일

NVIDIA Jetson Orin Nano Developer Kit와 AI Programming(#1)

이번 시간에는 NVIDIA Jetson Orin Nano Developer Kit를 해부해 보고, 느낀 점을 독자 여러분과 공유해 보고자 한다. 😎


목차
1. NVIDIA Jetson Orin Nano Developer Kit 소개
2. Target Board Booting Sequence
3. SDK Manager를 이용하여 OS 설치하기
4. Deep Dive into Jetson Linux BSP
5. Jetson AI - LLM 돌려 보기
6. 그 밖의 주제
   6.1 CUDA Programming
   6.2 Yocto project using meta-tegra
7. References


필자는 사실 AI에 관해서는 문외한이다. 😂 이거 뭐, 30년 가까이 개발을 해 오고 있는데, 뭔가를 새로 시작해야 한다니... 시절이 시절인 만큼 AI에 대한 전문 지식이 필요함을 절실하게 느낀다. 과연, 단기간에 AI를 master할 수 있을지는 잘 모르겠지만, 그래도 용기를 내어 도전해 본다. 😋


1. NVIDIA Jetson Orin Nano Developer Kit 소개
AI를 study하기 위한 개발 환경이 필요하여 고민하던 중, NVIDIA의 Jetson Dev Kit가 눈에 들어왔다. 사실 Jetson Dev Kit를 검토하기 전에, AI를 이해해 보기 위하여 아래와 같은 내용을 수박 겉핥기 식으로 나마 잠시 들여다 보고 있던 터였다. 💣

1) CUDA Programming
  -> PC(NVIDIA GeForce Graphic Card 장착) + CUDA programming + Ubuntu 
2) LLM Agent 만들기
  -> OpenAI API + Python
3) OLLAMA 사용해 보기
  -> 몇가지 Open Source LLM 설치
[https://ollama.com/]
4) Machine Learning & Deep Learning에 대한 이해
  -> TensorFlow, PyTorch 사용해 보기

본격적으로 AI를 study 하기 위해서는 아무래도 PC 환경보다는 Embedded 환경이 좀 더 그럴싸해 보여, 큰 맘먹고 NVIDIA Jetson Orin Nano Developer Kit를 하나 주문했다. 💰 드디어, 주문한지 1주일만에 기다리던 Jetson O/N Dev Kit가 도착했다. 포장을 뜯어 보니, 당초 생각했던 것 보다는 좀 더 묵찍한 녀석이 눈에 보인다. 💢
[그림 1.1] Jetson Orin Nano Super Developer Kit(1)
📌 얘네들이 한국형 전원 플러그를 기본으로 제공해 주지 않고 있으므로, 구매시 주의를 요한다. 😈

[그림 1.2] Jetson Orin Nano Super Developer Kit(2)

아래 그림은 Jetson Orin Nano 8GB Module(SoM)로, Carrier Board와는 260 pin SODIMM connector를 통해 연결된다. 그림 중앙에 NVIDIA logo가 박힌 부분이 Jetson Orin SoC가 되겠다. 👀

[그림 1.3] Jetson Orin Nano Module(SOM - System on Module)

참고로, (좀 난해한 부분이긴 하지만) NVIDIA Jetson Orin SoC의 Block Diagram은 다음과 같다. 처음 생각에는 ARM Cortex-A78AE CPU core와 Ampere GPU core가 별도의 SoC으로 분리되어 있지 않을까 싶었지만, 실제로는 하나의 SoC로 통합되어 있음을 알 수 있다. 💢

[그림 1.4] Jetson Orin Series SoC Block Diagram [출처 - 참고문헌 8]
📌 (크게 중요한 부분은 아닐 수 있지만) 위의 그림을 보면, Boot Power Managemet와 Real-time Camera용 MCU로 RISC-V R5 chip이 사용되고 있음을 알 수 있다.

Jetson Orin Nano 8GB Module과 Reference Carrier Board를 포함한 전체 H/W 스펙은 다음과 같다.

[그림 1.5] Jetson Orin Nano Developer Kit H/W Specification [출처 - 참고문헌 1]

한편, 아래에 표시된 Jetson Orin Nano Module 및 Carrier Board의 Block Diagram을 살펴 보면, SoC와 주변장치들의 연결 관계를 한눈에 파악할 수 있다.

[그림 1.6] Jetson Orin Nano Module Block Diagram [출처 - 참고문헌 6]

[그림 1.7] Jetson Orin Nano Carrier Board Block Diagram [출처 - 참고문헌 5]

아래 2개의 그림은 Jetson Orin Nano Carrier Board의 전면(Top) 및 후면(Bottom) 모습을 보여준다. 주요 주변 장치와 확장 PIN의 위치를 파악하기 위해서는 아래 내용을 주의깊게 살펴 보아야 한다.

[그림 1.8] Jetson Orin Nano Carrier Board Top view [출처 - 참고문헌 5]
📌 Jetson Orin Nano Carrier Board에는 (주변 장치 연결을 위해) J12 40-pin 확장 header 외에도 J14 9-pin button header가 있다.

[그림 1.9] Jetson Orin Nano Carrier Board Bottom view [출처 - 참고문헌 5]
📌 J10 connector에는 Realtek Wi-FI/Bluetooth PCIe module이 기본으로 장착되어 있다.

J12 40-pin 확장 header의 Pinmap을 살펴 보면 다음과 같다. 확장 pin은 (당연한 거지만) GPIO, UART, I2C, SPI 등을 이용하여 주변 장치를 연결하고자 할 경우에 사용된다.

[그림 1.10] Jetson Orin Nano Carrier Board J12 40-pin 확장 헤더 [출처 - 참고문헌 5]

이 밖에도 Carrier Board 전면(top view) 상단을 보면 J14 9-pin button 헤더가 보인다. 이 pin은 주로 recovery mode로 전환할 경우나 system reset을 하는 경우, 아니면 serial console cable을 연결하기 위해 사용된다.

[그림 1.11] Jetson Orin Nano Carrier Board J14 9-pin button 헤더 [출처 - 참고문헌 5]

마지막으로, Jetson Orin Nano Carrier Board의 Power diagram을 살펴 보는 것으로 이번 장을 마치고자 한다. 아래 그림을 보면, 좌측의 DC 19V 입력이 Power Mux, DC-DC Converter 및 LDO regulator 등을 거쳐 Jetson Orin Nano module 및 각각의 주변 장치로 전달됨을 알 수가 있다.


[그림 1.12] Jetson Orin Nano Carrier Board Power Diagram [출처 - 참고문헌 5]
📌 대충 이런게 있다 정도로 언급하고 넘어가지만, 실제로 power 처리 부분은 매우 중요하다고 말하고 싶다.

이상으로 NVIDIA Jetson Orin Nano Dev Kit을 구매한 후, H/W 관련 주요 스펙을 간략히 살펴 보았다. 보다 구체적인 사항은 아래 문서를 함께 참조해 주기 바란다.

    [5] Jetson Orin Nano Developer Kit Carrier Board, SP-11324-001_v1.3 pdf
    [6] Jetson Orin NX Series and Jetson Orin Nano Series Product Design Guide
    [7] Jetson Orin NX Series and Jetson Orin Nano Series Pin and Function Names Guide
    [8] NVIDIA Orin Series System-on-Chip Technical Reference Manual


2. Target Board Booting Sequence
이번 장에서는 Jetson Orin Nano Dev Kit를 실제로 돌려 보고, 어떤 식으로 부팅이 되는지를 살펴 보고자 한다. 이번 장에서 소개하는 내용은 대부분 아래 site의 내용을 기초로 하였다.


2.1 Booting image 설치하기
먼저, 다양한 AI application을 돌리기 위해 충분한 disk 공간(miscroSD 64GB로는 부족)이 필요할 듯하여, (주문하는 김에) PCIe 4.0 NVMe SSD(2TB)도 같이 주문했다. 이래저래 money가 좀 많이 든다. 😓

[그림 2.1] PCIe 4.0 NVMe SSD(2TB)를 장착한 모습
📌 중앙(세로로 길죽한 것)에 위치한 녀석이 NVMe이며, 우측에 있는 PCIe 장치가 Wi-Fi/Bluetooth 모듈이다.
chyi@jetsonai:~$ lspci
0001:00:00.0 PCI bridge: NVIDIA Corporation Device 229e (rev a1)
0001:01:00.0 Network controller: Realtek Semiconductor Co., Ltd. RTL8822CE 802.11ac PCIe Wireless Network Adapter
0004:00:00.0 PCI bridge: NVIDIA Corporation Device 229c (rev a1)
0004:01:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd Device a80c
0008:00:00.0 PCI bridge: NVIDIA Corporation Device 229c (rev a1)
0008:01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)



<저장 장치 관련 참고 사항>
1) Bootloader는 (Jetson Orin Nano SOM 내에 있는) QSPI NOR flash에 저장한다.
2) UEFI, Kernel image, DTB binary, root file system 등은 microSD에 저장한다.
3) NVMe는 OS 확장용(ext4 file system)으로 사용한다(docker, AI application을 돌리기 위한 공간).
📌 물론, microSD 없이 NMVe에 2, 3)의 내용을 모두 담을 수도 있다. 이 부분은 3장에서 소개한다.
__________________________________________________

NVMe SSD를 인식시키는 방법(file system 생성 후, mount, 부팅 후에도 자동 mount)과 관해서는 아래 site에 자세히 소개되어 있다. 어려운 내용이 아니니 별도로 정리하지는 않는다. 😋

다음으로, 아래 site에서 OS image를 download 받는다. 

jp62-orin-nano-sd-card-image.zip => sd-blob.img

이후, 위의 image를 Etcher program(or dd 명령)을 이용하여 microSD 카드에 설치(wrting)하도록 한다.

[그림 2.2] Etcher 프로그램으로 microSD에 OS image 설치하기
📌 이미 이전 posting에서 여러 차례 소개한 바 있으므로, 여기서는 간략히 소개하고 넘어가기로 한다.

2.2 Target Board 부팅하기
이 상태에서 Serial Console, Ethernet, USB cable, DP cable(to monitor) 등을 연결한 후, DC(19V) 전원을 넣어 보도록 하자.

[그림 2.3] Jetson Orin Nano Kit 구동 모습
📌 특이하게도, 모니터와 연결 cable은 단순 HDMI(19 pin)는 아니고, DP(20 pin)라는 type의 cable을 사용한다(정확하게는 target board쪽은 DP port, monitor 쪽은 HDMI인 cable 사용). 😀

[출처 - https://blog.naver.com/artmukorea/222392298303]

참고로, Serial console 연결을 위해서는 J14 9-pin button 헤더의 3(UART2_RXD), 4(UART2_TXD) 및 7(GND)번 pin이 사용된다.

[그림 2.4] Debug UART connections(1) - 3(UART2_RXD), 4(UART2_TXD), 7(GND) [출처 - 참고문헌 11]


[그림 2.5] Jetson Orin Nano Dev Kit - Debug UART connections(2) [출처 - 참고문헌 6]

이후, 부팅되는 모습을 모니터를 통해 확인해 보면 다음과 같다. 최초 부팅 시, Ubuntu 환경 설정 과정이 있으나, 아래 내용에서는 생략하기로 한다.



[그림 2.6] Jetson Orin Nano Dev Kit 부팅 모습

부팅 내용은 Serial console을 통해서도 확인 가능한데, 그 내용은 다음과 같다.

minicom -D /dev/ttyUSB0 -b 115200

[그림 2.7] Serial Console에서 부팅 모습 확인

위의 두가지 내용을 토대로, 대략적인 booting sequence를 예상해 보면 다음과 같다.

BootROM -> QSPI NOR flash -> microSD(w/ NVMe SSD)

2.3 Jetson Bootloader 소개
(모니터에서 보는 것과는 달리) Console에서 확인해 본 booting 과정은 매우 복잡한 느낌이다. Kernel이 시작되기 전까지 너무 많은 내용이 정신 없이 출력(글씨가 깨지기도 하고, 콘솔 상에 공백 라인이 많이 출력되기도 함)되어, 각 단계를 일일히 capture하기도 쉽지가 않다. 이전 posting에서 소개했던 BeaglePlay와 견주어도 결코 밀리지(?) 않을 정도로 아주 복잡하다.


그렇다면 Jetsok Kit의 부팅 과정이 왜 이렇게 복잡한 것일까 ? 아래 2개의 그림은 이 질문에 대한 대답으로 Jetson Orin Nano Kit의 booting sequence를 표현한 것인다. 휴~ 그런데 도대체 이게 뭐냐~ 😓

[그림 2.8] Jetson Orin Nano Kit Boot Sequence(1) [출처 - 참고문헌 9]
📌 J
etson Orin Nano Kit의 booting sequence는 역대급으로 복잡한 느낌이다. 💣💣💣
[그림 2.9] Jetson Orin Nano Kit Boot Sequence(2) [출처 - 참고문헌 9]

중간에 R5 RISC-V chip도 보이고, ... 위의 그림을 단순히 이해하기란 쉽지가 않다. 😓 좀 더 추가 설명이 필요할 듯하여, 위의 내부 처리 과정을 4단계로 확장하여 다시 정리해 보면 다음과 같다. 오히려 이게 복잡도를 더 증가시키려나 ? 💣

[그림 2.10] Jetson Bootloader Step#1 - BootRom to PSCROM [출처 - 참고문헌 9]

[그림 2.11] Jetson Bootloader Step#2 - PSCROM to MB1 [출처 - 참고문헌 9]


[그림 2.12] Jetson Bootloader Step#3 - MB1 to MB2 [출처 - 참고문헌 9]


[그림 2.13] Jetson Bootloader Step#4 - UEFI [출처 - 참고문헌 9]
📌 (그나마도) MB2에서 UEFI로 전환되는 과정에 대한 그림이 빠져 있다. 😓

암튼, (bootloader 관련) 전체 source code도 제공하지 않는 것 같고, (관련 문서를 들여다 보니) 약간의 설명과 위의 그림만 덩그러니 제공하고 있어, 전체 booting flow를 제대로 이해하는 것은 다소 무리가 있어 보인다. 그나마 다행인 것은, nvidia UEFI source code가 아래의 위치에 있다는 점 이랄까~ 💤


지금까지 Jetson Orin Nano Dev Kit의 전원을 켜고, 부팅하는 모습을 살펴 보았다. 궁금한 점이 한두가지가 아니지만, 아쉬움을 뒤로 하고, 다음 장으로 넘어가 보도록 하자. Go Go~ 🚀



3. SDK Manager를 이용하여 OS 설치하기
이전 장에서는 Jetson Orin Nano Dev Kit용 설치 이미지(sd-blob.img)를 이용하여, 편하게 부팅해 보았다면, 이번 장에서는 SDK Manager를 이용하여 좀 더 단계적으로 OS를 설치하는 방법을 알아보기로 하자.



[그림 3.1] SDK Manager를 이용한 firmware 설치 과정(1)


[그림 3.2] SDK Manager를 이용한 firmware 설치 과정(2)

SDK Manager를 이용하여 image 설치 과정을 확인하기 위해, (이번에는 편의상) microSD를 제거한 상태에서 NVMe SSD에 firmware를 설치하도록 하겠다.

<Ubuntu 22.04 LTS Desktop>
 -> Target board가 아닌 PC에서 아래 명령을 실행하도록 하자.
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
$ sudo dpkg -i cuda-keyring_1.1-1_all.deb
$ sudo apt-get update
$ sudo apt-get -y install sdkmanager

$ sdkmanager
 -> sdkmanager 명령을 실행하니, 아래의 UI 화면이 뜬다.

[그림 3.3] SDK Manager 실행 모습(1)

이후 사용자 로긴을 진행한다.

[그림 3.4] SDK Manager 실행 모습(2) - Login 이후 모습
📌 SDK Manager를 사용하려면 사전에 nvidia 계정이 있어야 한다.

SDK Manager를 이용하여 원격으로 Target board에 firmware를 설치하기 위해서는, target board를 recovery mode로 전환시켜 두어야 한다. (전원을 끈 상태에서) 아래 그림과 같이 J14 header 9(GND), 10(Factory Reset) pin을 jumper cable을 이용하여 연결(short) 시켜야 한다.

[그림 3.5] Jetson Orin Nano Dev Kit - Recovery Mode 설정(1) [출처 - 참고문헌 12]
📌 9, 10번 pin을 short한다는 의미는 실제로, 10(Factory reset) pin을 0(low)으로 설정하는 것과 동일하다.

[그림 3.6] Jetson Orin Nano Dev Kit - Recovery Mode 설정(2) - 주황색 케이블

이후, 전원을 다시 켜고, SDK Manager 화면으로 돌아와 Target Harware(2번째 줄, 우측 사각형)만을 선택한다.

[그림 3.7] SDK Manager 실행 모습(3) - Target Hardware Selection 모습

이후, CONTINUE 버튼을 선택한다.

[그림 3.8] SDK Manager 실행 모습(4) - Step2 진행(1)

이 상태에서 (다른 특별한 선택 없이) 다시 CONTINUE 버튼을 선택하자.

[그림 3.9] SDK Manager 실행 모습(5) - Step2 진행(2)
📌 서버로 부터 관련 파일 즉, BSP package와 RootFS package를 download하기 시작한다.

Download가 끝난 후에는 설치용 OS image를 만드는 작업을 한다.

[그림 3.10] SDK Manager 실행 모습(6) - Step2 진행(3)

이후, 아래 화면에서 2가지 설정 변경을 한 후, FLASH 버튼을 선택하자.
1. OEM Configuration : Runtime
2. Storage Device: NVMe

[그림 3.11] SDK Manager 실행 모습(7) - Step3 진행(1)

Flash(여기서는 NVMe SSD) writing이 시작된다.

[그림 3.12] SDK Manager 실행 모습(8) - Step3 진행(2)

Flash writing 괴정은 minicom을 통해서도 확인 가능하다.

[그림 3.13] flash writing하는 모습 - minicom에서 확인

일정 시간 경과 후, 아래 화면이 뜨는데, 옆에 있는 모니터를 보니, target board가 부팅이 되고 있다.

[그림 3.14] SDK Manager 실행 모습(9) - Step3 진행(3)

(부팅 후) 이 상태에서 모니터 화면을 보면서 Ubuntu 환경 설정을 진행한다(간단한 내용이라 자세한 내용은 생략).

 
...
[그림 3.15] Ubuntu 환경 설정 진행 모습

이후, 다시 SDK Manager 화면으로 돌아와 Ubuntu 사용자 id/password를 입력한 후, 나머지 설치 작업을 진행하도록 한다.

[그림 3.16] SDK Manager 실행 모습(10) - Step3 진행(4)
📌 여기서 부터는 (내부적으로) ssh로 로긴(scp로 복사)하여, 다양한 debian package를 설치하는 것 같다.

[그림 3.17] SDK Manager 실행 모습(11) - Step3 진행(5)
📌 한참 동안 설치를 진행하는데, 설치 내용은 우측의 TERMINAL tab을 통해서도 확인 가능하다.

드디어 설치가 끝났다. FINISH 버튼을 눌러 sdkmanager를 종료하자.

[그림 3.18] SDK Manager 실행 모습(12) - Step4(Finish)

이후, 전원을 끄고, Recovery mode를 해제한 후, 다시 부팅을 시도하면 된다. 부팅 후, 확인해 보니, NVMe에 OS가 정상적으로 설치되어 있음을 알 수 있다.

[그림 3.19] NVMe SSD에 OS가 설치된 모습

지금까지 SDK Manager를 이용하여 서버로 부터 OS image(package)를 download 받아, USB-C를 통해 원격으로 s/w를 설치하는 과정을 살펴 보았다. 다음 장에서는Jetson Linux BSP 개발 관련 내용을 분석해 보면서, 좀 더 어렵게 부팅하는 방법을 알아보기로 하자.

내용이 길어지는 관계로, 나머지 부분은 다음 시간을 기약하기로 하자. 😎


4. Deep Dive into Jetson Linux BSP

5. Jetson AI - LLM 돌려 보기

6. 그 밖의 주제

To be continued...

7. References
[1] jetson-orin-datasheet-nano-developer-kit-3475392-r2.pdf
  -> 제품 brochure
[2] https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-orin/nano-super-developer-kit/
  -> Jetson Orin Nano Super Developer Kit 공식 site
[3] https://docs.nvidia.com/jetson/archives/r36.4.3/DeveloperGuide/
  -> NVIDIA Jetson Linux developer guide 문서 *****
[4] https://www.jetson-ai-lab.com/initial_setup_jon.html
  -> Initial setup guide for etson Orin Nano Developer Kit *****
[5] Jetson Orin Nano Developer Kit Carrier Board, SP-11324-001_v1.3 pdf
[6] Jetson Orin NX Series and Jetson Orin Nano Series Product Design Guide
[7] Jetson Orin NX Series and Jetson Orin Nano Series Pin and Function Names Guide
[8] NVIDIA Orin Series System-on-Chip Technical Reference Manual
[9] NVIDIA Jetson Orin Nano Series Modules Data Sheet - Ampere GPU + Arm Cortex-A78AE CPU + LPDDR5
  -> Jetson Orin Nano Developer Kit 관련 h/w 문서
[10] https://docs.nvidia.com/jetson/archives/r35.4.1/DeveloperGuide/text/AR/BootArchitecture/JetsonOrinSeriesBootFlow.html
  -> Jetson Orin Nano Boot Flow
[11] https://www.jetson-ai-lab.com/index.html
[12] https://www.jetson-ai-lab.com/initial_setup_jon.html
[13] https://www.jetson-ai-lab.com/tutorial-intro.html
  -> ai-lab & Initial setup guide

[14] https://docs.nvidia.com/deeplearning/tensorrt/latest/getting-started/quick-start-guide.html
  -> TensorRT guide

[15] CUDA C++ Programming Guide, Release 12.9, NVIDIA Corportation
[16] https://developer.ridgerun.com/wiki/index.php/Yocto_Support_for_NVIDIA_Jetson_Platforms_-_Setting_up_Yocto
[17] https://github.com/OE4T/tegra-demo-distro#tegra-demo-distro

[18] And, Google and Gemini ~


Slowboot