AEGLOSLAB 엔비디아 기술 스택

제9부 로보틱스

9.2 JetPack·L4T I — 플래싱·부팅

9.2.1 이 장에서 배우는 것 / 선수 지식

9.1에서 Jetson 모듈을 골랐다. 이제 그것을 동작시키는 소프트웨어 — JetPack(SDK)과 L4T(Linux for Tegra) — 와 그것을 모듈에 탑재하는 플래싱·부팅 을 본다. Jetson은 PC가 아니라 임베디드 시스템이라, "OS를 설치"가 아니라 완전한 이미지를 플래시한다 — 이 과정·부트 흐름·버전 호환·커스텀 캐리어의 디바이스 트리가 임베디드 개발의 출발점이다.

핵심 통찰: Jetson 소프트웨어는 "버전이 묶인 스택" 이다 — JetPack 버전이 L4T(OS·BSP) + CUDA + TensorRT + 드라이버를 한 묶음으로 고정한다(5.2의 버전 종속과 동형). 그리고 플래싱은 PC와 다르다 — 모듈을 recovery 모드로 두고 호스트 PC에서 부트로더·커널·rootfs·펌웨어 전체를 일괄 플래시한다. 커스텀 캐리어 보드(9.1)를 쓰면 디바이스 트리로 하드웨어를 커널에 알려줘야 한다.

배우는 것:

  • JetPack — Jetson SDK(L4T + CUDA/TensorRT/VPI/멀티미디어 + 도구), 무엇을 묶나.
  • L4T(Linux for Tegra) — BSP(커널·부트로더·드라이버·rootfs), JetPack의 OS 층.
  • 플래싱 — recovery 모드·호스트 PC·SDK Manager, PC 설치와 다른 점.
  • 부트 흐름 — 임베디드 다단계 부트(Boot ROM→부트로더→커널→userspace), 파티션·secure boot.
  • 버전 호환 — JetPack=L4T+CUDA+TensorRT 묶음, 모듈·SDK 정합.
  • 디바이스 트리·커스텀 BSP — 커스텀 캐리어 보드의 하드웨어를 커널에 기술.

선수 지식: 9.1(Jetson 모듈·SoM·캐리어 보드)·5.2(TensorRT 버전 종속)·8.2(Tegra SoC). 컨테이너·배포는 9.3, Isaac은 9.7. 환경은 Jetson·호스트 PC.

정직: JetPack·L4T 버전·SDK Manager·플래싱 절차는 세대·모듈·버전 의존이다 — 이 장은 플래싱·부팅·버저닝의 개념·흐름을 가르치고 구체 명령·버전은 "그 시점 문서·모듈로 확인". 모듈마다(eMMC vs SD·세대) 절차가 다르다. secure boot·커스텀 BSP는 고급·제품 단계.

9.2.2 JetPack·L4T — 소프트웨어 스택

JetPack (Jetson SDK) AI: CUDA·cuDNN· TensorRT(5.2)· DLA 지원(8.4) 비전·멀티미디어: VPI(8.5)· 카메라·코덱·ISP (8.2) 개발 도구: 프로파일러· 디버거·샘플 L4T(Linux for Tegra) = BSP 부트로더 · 리눅스 커널(Tegra) · 드라이버 · rootfs

JetPack = L4T(OS/BSP) + AI/비전/멀티미디어 라이브러리 + 도구.

  • L4T(Linux for Tegra): Jetson의 BSP(Board Support Package) — Tegra SoC(8.2)용 리눅스 커널·부트로더·디바이스 드라이버·rootfs. JetPack의 OS 층. (Tegra는 SoC family명.)
  • JetPack: L4T 위에 CUDA·TensorRT·VPI·멀티미디어·도구를 묶은 SDK — 데이터센터·DRIVE와 같은 CUDA/TensorRT(8.3 연속).
  • 묶음 버전: JetPack 버전이 L4T + CUDA + TensorRT + 드라이버 버전을 함께 고정 — 정합이 중요(9.2.6).

핵심: JetPack은 "Jetson에 까는 전체 스택"이고, L4T는 그 안의 OS·BSP다. 데이터센터에서 익힌 CUDA·TensorRT(제1~5부)가 그대로 들어 있어(8.3), 학습한 모델을 같은 도구로 엣지에 배포. 단 버전이 묶여 있어 정합이 핵심.

9.2.3 플래싱 — PC 설치와 다르다

Jetson은 PC처럼 "OS를 설치"하지 않는다 — 완전한 이미지를 모듈에 플래시한다:

방법 PC: OS 설치 프로그램이 디스크에 OS를 설치 (BIOS/UEFI 위) Jetson (임베디드) 모듈 (SoC+스토 리지)에 '완전한 이미지'를 일괄 플래시 이미지 = 부트로더 + 커널 + rootfs + 펌웨어 + 파티션 호스트 PC에서 USB로 (recovery 모드) — eMMC 모듈· 일반적 SD 카드 (일부 devkit) — SD에 이미지를 써서 부팅 OTA(현장 업데이트) — 배포 후

플래싱 흐름(호스트 PC, 개념):

1) Jetson을 'recovery 모드'로(force-recovery 핀/버튼) → USB로 호스트 PC 연결 → 모듈이 호스트의 명령을 받는 상태(자기 OS로 부팅 안 함) 2) 호스트 PC에서 플래시 · SDK Manager(NVIDIA GUI 도구): 이미지 플래시 + JetPack 컴포넌트 설치 · 또는 flash 스크립트(L4T)로 직접 → 부트로더·파티션·커널·rootfs를 모듈 스토리지에 굽기 3) 첫 부팅: 모듈이 구운 이미지로 부팅·초기 설정 (oem-config)
  • recovery 모드: 모듈을 자기 OS로 부팅하지 않고 호스트의 플래시 명령을 받는 상태. 핀/버튼으로 진입.
  • SDK Manager: 플래시 + JetPack 라이브러리(CUDA·TensorRT 등) 설치를 GUI로. 호스트 PC(보통 Ubuntu)에서.
  • 호스트 필요: eMMC 모듈은 호스트 PC에서 USB로 플래시(SD처럼 빼서 못 씀). devkit은 SD/간편 플래시도.

핵심: 플래싱은 "recovery 모드 → 호스트 PC에서 완전 이미지 굽기 → 첫 부팅" 이다. PC의 OS 설치와 달리 모듈에 부트로더·커널·rootfs·펌웨어 전체를 일괄 플래시. SDK Manager가 플래시+SDK 설치를 묶어 준다. 모듈·세대마다 절차가 다르니 그 모듈 문서로.

9.2.4 부트 흐름 — 임베디드 다단계

Jetson 부트는 PC(BIOS→부트로더→OS)와 다른 임베디드 다단계 흐름이다:

초기 부트로더 로드·검증 펌웨어·디바이스 트리 로드 커널 로드 디바이스 트리로 하드웨어 인식 드라이버 로드 Boot ROM (SoC 내장, 변경 불가) 부트로더 (다단계: 예 MB1/MB2/CBoot/UEFI 등, 세대 의존) 리눅스 커널 (Tegra, L4T) init(systemd) → userspace(rootfs) 앱·서비스 (JetPack 런타임·CUDA·앱)

(옵션) secure boot: 각 단계의 서명을 검증해 변조를 방지한다(제품 단계).

  • 다단계 부트로더: Boot ROM(SoC 내장)이 초기 부트로더를 로드·검증하고, 다단계 부트로더가 펌웨어·디바이스 트리·커널을 로드. PC의 단일 BIOS와 다름.
  • 디바이스 트리: 커널에 하드웨어 구성(어떤 디바이스가 어디에)을 알려주는 데이터 — 부트로더가 로드. 커스텀 캐리어(9.2.7)에 결정적.
  • secure boot(옵션): 각 단계의 서명을 검증해 변조된 펌웨어·커널을 막음 — 제품 보안(2.11 사이버보안 연결).

핵심: 임베디드 부트는 Boot ROM → 다단계 부트로더 → 커널(디바이스 트리) → userspace 다. 디바이스 트리가 하드웨어를 커널에 기술하므로, 표준 devkit이 아닌 커스텀 하드웨어는 디바이스 트리를 맞춰야 부팅·드라이버가 동작한다(9.2.7).

9.2.5 워크스루 — 플래시·검증

플래싱·검증 흐름(명령·버전은 모듈·시점 의존, 문서로).

   1) 환경: 호스트 PC(보통 Ubuntu) + USB 케이블 + Jetson(devkit/모듈)
   2) recovery 모드 진입: force-recovery 핀/버튼 + 전원 → USB 연결
        lsusb로 호스트가 모듈을 인식하는지 확인(NVIDIA Corp 장치)
   3) SDK Manager(또는 flash.sh)로 플래시 + JetPack 설치:
        SDK Manager: 모듈·JetPack 버전 선택 → 플래시 → 컴포넌트(CUDA·TensorRT) 설치
   4) 첫 부팅: 모듈이 부팅, 초기 설정
   5) 검증(모듈에서):
        cat /etc/nv_tegra_release      # L4T 버전
        dpkg -l | grep nvidia-jetpack  # JetPack 버전(확인 방법 버전별)
        nvcc --version                 # CUDA
        dpkg -l | grep -i tensorrt     # TensorRT 버전 (DLA는 trtexec --useDLACore로 확인, 5.2·8.4)
        jetson_release(또는 jtop)      # 종합 정보(커뮤니티 도구 jtop 유용)
CUDA 샘플 실행 GPU 동작 trtexec로 간단 엔진 빌드 TensorRT·DLA (5.2·8.4) 카메라·센서 SAL/드라이버 (8.13 유사) jtop으로 GPU·DLA· 전력·온도 모니터 (9.4 전력 운영)

실무: SDK Manager가 플래시+SDK를 묶어 가장 쉬운 출발점이다. 모듈·JetPack 버전을 고르면 정합된 스택을 설치. jtop(커뮤니티) 같은 도구로 GPU·DLA·전력을 모니터(9.4). 첫 부팅 후 버전을 확인해 의도한 JetPack인지 검증.

9.2.6 버전 호환 — 묶음

JetPack의 핵심 주의: 버전이 묶여 있다(5.2의 엔진 종속과 동형):

버전 정합 JetPack 버전 = L4T + CUDA + cuDNN + TensorRT + 드라이버 (정합된 묶음) 주의 모듈·세대마다 지원 JetPack 범위가 다름(구세대는 신 JetPack 미지원 가능) TensorRT 엔진은 그 JetPack의 TensorRT·GPU·DLA용 (5.2) — JetPack 바뀌면 재빌드 앱·라이브러리는 그 CUDA·TensorRT 버전에 빌드 '모듈 + JetPack + 앱'의 버전 정합을 맞춰야
  • 묶음 정합: JetPack 버전이 L4T·CUDA·TensorRT를 함께 고정 — 임의로 섞으면 호환 깨짐.
  • 모듈 지원 범위: 모듈·세대마다 지원 JetPack이 다름 — 구세대 모듈은 최신 JetPack을 못 쓸 수 있음(확인).
  • 엔진 재빌드(5.2): TensorRT 엔진은 그 JetPack의 TensorRT·GPU·DLA용 — JetPack 업그레이드 시 재빌드. 데이터센터에서 빌드한 엔진을 Jetson에 못 쓰고(GPU 다름), Jetson 타깃으로 빌드.

핵심: "모듈 + JetPack 버전 + 앱/엔진"의 정합이 임베디드 운영의 기본이다 — JetPack이 스택을 묶으므로 버전을 고정·관리하고, TensorRT 엔진은 타깃 JetPack으로 빌드(5.2). 데이터센터-엣지 연속이되 엔진은 타깃별 재빌드(GPU·DLA·버전 종속).

9.2.7 커스텀 캐리어·디바이스 트리

표준 devkit이 아니라 커스텀 캐리어 보드(9.1 — 자기 로봇의 I/O·센서)에 SoM을 통합하면, 하드웨어가 다르므로 소프트웨어를 맞춰야 한다:

커스텀 캐리어 devkit과 다른 I/O(카메라 수·핀·포트·전원) 필요 · 디바이스 트리(Device Tree): 커널에 '이 보드의 하드웨어 구성'을 기술 → devkit과 다른 카메라·핀·디바이스를 커널이 인식하도록 맞춤 · 커스텀 BSP: 커널·부트로더를 그 보드에 맞게 (드라이버·핀 설정) · 커스텀 rootfs: 앱·설정 제품 단계의 작업(BSP 커스터마이징)
  • 디바이스 트리: 하드웨어를 커널에 기술하는 데이터 — 커스텀 캐리어의 카메라·센서·핀이 devkit과 다르면 디바이스 트리를 수정해야 인식·동작.
  • 커스텀 BSP: L4T를 그 보드에 맞게(커널 설정·드라이버·부트로더 핀). 제품화의 큰 일.
  • devkit→제품: devkit으로 개발하되, 제품(커스텀 캐리어)은 디바이스 트리·BSP 커스터마이징이 필요 — 이것이 SoM 통합의 소프트웨어 측면.

견해: 표준 devkit은 그대로 부팅·동작하지만, 커스텀 캐리어는 디바이스 트리·BSP를 맞춰야 한다 — 하드웨어(센서·핀)가 다르면 소프트웨어가 그것을 알아야. 이것이 SoM 통합(9.1)의 소프트웨어 작업이고, 제품화의 난점. 표준 카메라·구성을 쓰면 줄지만, 커스텀 하드웨어는 BSP 작업이 따른다.

9.2.8 중간 점검 (체크포인트)

  • [ ] JetPack(SDK = L4T + CUDA/TensorRT/VPI + 도구) 과 L4T(BSP·OS 층) 를 구분한다.
  • [ ] Jetson 플래싱이 PC 설치와 다름(완전 이미지·recovery 모드·호스트 PC·SDK Manager)을 안다.
  • [ ] 임베디드 다단계 부트 흐름(Boot ROM→부트로더→커널(디바이스 트리)→userspace)을 안다.
  • [ ] JetPack 버전 묶음(L4T·CUDA·TensorRT 정합)과 모듈 지원 범위·엔진 재빌드(5.2)를 안다.
  • [ ] 커스텀 캐리어에 디바이스 트리·BSP 커스터마이징이 필요함을 안다.

증상→의심: 모듈이 안 부팅 → 플래시 실패·이미지 손상·잘못된 모듈/JetPack → 재플래시·버전 확인. 호스트가 모듈 인식 못 함 → recovery 모드·USB·드라이버 → lsusb·recovery 재진입. CUDA/TensorRT 버전 불일치 → JetPack 묶음 → 정합 버전. TensorRT 엔진 로드 실패 → 다른 GPU/버전 빌드(5.2) → Jetson 타깃 재빌드. 커스텀 보드 카메라 인식 안 됨 → 디바이스 트리 → 맞춤. 구세대 모듈에 신 JetPack 설치 실패 → 지원 범위 → 확인. secure boot로 커스텀 커널 거부 → 서명 → 키·서명.

9.2.9 트레이드오프·대안

결정트레이드오프
SDK Manager vs 스크립트쉬움·GUI vs 자동화·CI·제어
표준 devkit vs 커스텀 캐리어바로 동작 vs 제품·디바이스 트리·BSP
최신 JetPack vs 안정신기능·CUDA vs 검증·모듈 지원
SD vs eMMC간편·교체 vs 신뢰·양산
secure boot on/off보안·복잡 vs 단순·개발

견해: 개발은 devkit + SDK Manager로 빠르게, 제품은 커스텀 캐리어 + 디바이스 트리·BSP + (CI용) flash 스크립트로. JetPack 버전은 모듈 지원·앱 호환으로 고정·관리(묶음). 양산 제품은 eMMC·secure boot. 데이터센터에서 빌드한 모델을 Jetson 타깃으로 엔진 재빌드(5.2·8.3). 임베디드는 버전 정합·BSP가 PC보다 까다로우니 그 모듈 문서로.

비엔비디아 정직: 임베디드 플래싱·BSP·디바이스 트리는 임베디드 리눅스 일반의 개념(다른 SoC·보드도 유사). JetPack/L4T의 강점은 CUDA/TensorRT/VPI·AI 스택을 묶고 SDK Manager로 통합·데이터센터 연속(8.3). 임베디드 리눅스 경험이 있으면 친숙하고, 디바이스 트리·BSP는 다른 SoC와 같은 작업. 구체 절차는 모듈·세대 의존 — 그 시점 문서로.

9.2.10 흔한 함정

  • PC처럼 OS 설치 가정. Jetson은 완전 이미지를 플래시 — recovery 모드·호스트 PC·SDK Manager.
  • JetPack 버전 섞기. L4T·CUDA·TensorRT가 묶임 — 임의로 섞으면 호환 깨짐. 정합 버전.
  • 모듈 지원 범위 무시. 구세대 모듈에 최신 JetPack이 안 될 수 있음 → 지원 매트릭스 확인.
  • 데이터센터 엔진을 Jetson에. TensorRT 엔진은 GPU·버전 종속(5.2) — Jetson 타깃 재빌드.
  • 커스텀 캐리어에 devkit 이미지. 디바이스 트리가 안 맞아 하드웨어 인식 실패 → 디바이스 트리·BSP.
  • recovery 모드 안 들어감. force-recovery 핀/버튼·전원 순서 — 모듈별 절차.
  • secure boot 무시(제품). 변조 방지가 필요한 제품은 secure boot — 단 키·서명 관리.
  • 절차를 버전 불문. 플래싱·SDK Manager가 세대·모듈마다 다름 — 그 모듈 문서.

9.2.11 연습문제

연습 1 (JetPack·L4T). JetPack과 L4T의 관계를 설명하고, 왜 "버전이 묶여 있다"가 임베디드 운영에 중요한지 답하라.

정답

관계: L4T(Linux for Tegra) = Jetson의 BSP — Tegra SoC(8.2)용 리눅스 커널·부트로더·디바이스 드라이버·rootfs(OS 층). JetPack = L4T 위에 CUDA·cuDNN·TensorRT(5.2)·VPI(8.5)·멀티미디어·개발 도구를 묶은 SDK. 즉 JetPack = L4T(OS) + AI/비전/멀티미디어 라이브러리 + 도구. "버전이 묶여 있다"의 중요성: JetPack 버전이 L4T + CUDA + cuDNN + TensorRT + 드라이버를 함께 고정한다 — 정합된 묶음. 임의로 한 컴포넌트만 바꾸면(예: TensorRT만 다른 버전) 호환이 깨질 수 있다. 임베디드 운영에 중요한 이유: ① 앱·엔진이 그 버전에 빌드 — TensorRT 엔진은 그 JetPack의 TensorRT·GPU·DLA용(5.2)이라 JetPack 바뀌면 재빌드, 라이브러리도 그 CUDA에 링크. ② 모듈 지원 범위 — 모듈·세대마다 지원 JetPack이 달라(구세대는 최신 미지원 가능) "모듈+JetPack+앱"의 정합을 맞춰야. ③ 재현·관리 — production에서 JetPack 버전을 고정·관리해야 빌드·배포가 일관. 데이터센터에서 빌드한 엔진을 Jetson에 못 쓰고(GPU 다름) Jetson 타깃으로 빌드(8.3 연속이되 엔진은 타깃별). 그래서 임베디드는 PC보다 버전 정합이 까다롭고, JetPack 버전을 핀하고 그에 맞춰 앱·엔진을 빌드·관리한다.

연습 2 (플래싱). Jetson 플래싱이 PC OS 설치와 어떻게 다른지, recovery 모드·SDK Manager의 역할과 함께 설명하라.

정답

차이: PC는 OS 설치 프로그램이 BIOS/UEFI 위에서 디스크에 OS를 설치한다. Jetson(임베디드)은 모듈(SoC+스토리지)에 완전한 이미지 전체를 일괄 플래시 — 이미지 = 부트로더 + 커널 + rootfs + 펌웨어 + 파티션. PC처럼 "설치"가 아니라 모듈 스토리지에 전체 시스템을 플래시한다. recovery 모드의 역할: Jetson을 자기 OS로 부팅하지 않고 호스트 PC의 플래시 명령을 받는 상태로 둠 — force-recovery 핀/버튼 + 전원으로 진입, USB로 호스트 연결. eMMC 모듈은 SD처럼 빼서 못 쓰므로 recovery 모드로 호스트에서 플래시해야. SDK Manager의 역할: NVIDIA의 GUI 도구로 ① 모듈·JetPack 버전 선택, ② 이미지 플래시(부트로더·파티션·커널·rootfs), ③ JetPack 컴포넌트 설치(CUDA·TensorRT 등)를 한 번에 — 호스트 PC(보통 Ubuntu)에서. 흐름: recovery 모드 진입 → 호스트가 모듈 인식(lsusb) → SDK Manager로 플래시+SDK 설치 → 첫 부팅·초기 설정 → 버전 검증. 즉 "OS 설치"가 아니라 "recovery 모드에서 호스트가 완전 이미지를 굽고 SDK를 설치". devkit은 SD 카드·간편 플래시도 있으나, 일반 eMMC 모듈은 호스트+recovery. 모듈·세대마다 절차가 달라 그 모듈 문서로(확인 필요). SDK Manager가 가장 쉬운 출발점, CI엔 flash 스크립트.

연습 3 (부트 흐름). Jetson의 임베디드 다단계 부트 흐름을 단계로 설명하고, 디바이스 트리의 역할을 강조하라.

정답

부트 흐름(다단계): ① Boot ROM — SoC에 내장된 변경 불가 코드, 전원 시 가장 먼저 실행, 초기 부트로더를 로드·검증(secure boot면 서명 확인). ② 부트로더(다단계) — 예 MB1/MB2/CBoot/UEFI 등(세대 의존), 펌웨어·디바이스 트리·커널을 로드. PC의 단일 BIOS와 달리 다단계. ③ 리눅스 커널(Tegra, L4T) — 디바이스 트리로 하드웨어를 인식하고 드라이버 로드. ④ init(systemd) → userspace(rootfs) — 서비스·앱(JetPack 런타임·CUDA·앱). (옵션 secure boot: 각 단계 서명 검증으로 변조 방지.) 디바이스 트리의 역할(강조): 디바이스 트리(Device Tree)는 커널에 "이 보드의 하드웨어 구성" (어떤 디바이스가 어느 주소·핀에, 카메라·센서·버스)을 기술하는 데이터 — 부트로더가 로드해 커널에 전달. 왜 중요: 커널은 하드웨어를 직접 모르고 디바이스 트리로 알므로, 하드웨어가 표준 devkit과 다르면(커스텀 캐리어, 9.1) 디바이스 트리를 맞춰야 카메라·센서·핀이 인식·동작한다. 디바이스 트리가 틀리면 그 디바이스가 부팅돼도 인식 안 됨. 그래서 표준 devkit은 그대로 부팅하지만, 커스텀 캐리어는 디바이스 트리(+BSP) 커스터마이징이 필수 — 제품화의 소프트웨어 작업(9.2.7). 임베디드 부트는 PC와 다른 다단계 + 디바이스 트리 기반 하드웨어 기술이 핵심.

연습 4 (커스텀 캐리어). 표준 devkit으로 개발하다 커스텀 캐리어 보드(다른 카메라·I/O)로 제품화할 때 소프트웨어 측면에서 무엇을 해야 하나?

정답

커스텀 캐리어는 devkit과 하드웨어(카메라 수·종류·핀·포트·전원·센서)가 다르므로, 소프트웨어가 그 하드웨어를 알도록 맞춰야: ① 디바이스 트리(Device Tree) 수정 — 커널에 "이 보드의 하드웨어 구성"을 기술하는데, devkit과 다른 카메라(CSI 레인·I2C 주소)·센서·핀·디바이스를 디바이스 트리에 반영해야 커널이 인식·드라이버 로드. devkit 디바이스 트리 그대로면 커스텀 카메라가 인식 안 됨. ② 커스텀 BSP — L4T(커널·부트로더)를 그 보드에 맞게: 커널 설정(필요 드라이버·모듈), 부트로더 핀·전원 설정, 보드별 드라이버(커스텀 센서·카메라 드라이버 추가). ③ 커스텀 rootfs — 앱·설정·서비스. ④ 카메라/센서 드라이버 — devkit과 다른 카메라 센서면 그 센서의 드라이버·튜닝(ISP). ⑤ 플래시 이미지 빌드 — 위를 반영한 커스텀 L4T 이미지를 빌드해 플래시. ⑥ 검증 — 커스텀 보드에서 모든 디바이스·카메라·센서가 인식·동작하는지. 이것이 SoM 통합(9.1)의 소프트웨어 측면이자 제품화의 난점 — 하드웨어(SoM)는 검증됐지만 캐리어가 다르면 BSP·디바이스 트리 작업이 따른다. 줄이는 법: 표준 카메라·구성을 쓰면 디바이스 트리 작업이 줄고, NVIDIA/파트너의 카메라 모듈·레퍼런스를 쓰면 드라이버 재사용. 임베디드 리눅스의 일반 작업(다른 SoC도 디바이스 트리·BSP)이라 임베디드 경험이 도움. devkit으로 빠르게 개발하되 제품은 BSP 커스터마이징을 계획. 자격·시간이 드는 일이라 제품 일정에 반영.

연습 5 (연속 스택). 데이터센터에서 학습·빌드한 TensorRT 엔진을 Jetson에 그대로 못 쓰는 이유와, 올바른 배포 흐름을 설명하라.

정답

못 쓰는 이유(5.2 엔진 종속): TensorRT 엔진(plan)은 빌드 시 그 GPU 아키텍처·TensorRT 버전·정밀도에 특화되어 굳혀진다(5.2 오토튜닝). 데이터센터 GPU(예: H100, Hopper)와 Jetson GPU(임베디드 Ampere급 등)는 아키텍처가 다르고, TensorRT 버전(JetPack 묶음 9.2.6)도 다르며, Jetson은 DLA(8.4)도 있다. 그래서 데이터센터에서 빌드한 엔진은 Jetson에서 로드 실패나 미동작 — GPU·버전·DLA가 안 맞음. 올바른 배포 흐름(8.3 연속이되 엔진은 타깃별): ① 데이터센터에서 학습(제4~6부, NeMo 6.2) — 모델을 ONNX 등 이식 가능한 포맷으로(가중치·구조). ② Jetson 타깃으로 엔진 빌드 — 그 Jetson의 JetPack(TensorRT 버전)·GPU·DLA를 타깃으로 TensorRT 엔진을 빌드(trtexec/API, 5.2), DLA 오프로드(--useDLACore, 8.4)·정밀도(INT8/FP16, 5.4)를 엣지에 맞게. 빌드는 그 Jetson에서(또는 같은 구성에서). ③ 배포 — 빌드한 엔진을 Jetson 앱에 탑재해 추론(JetPack 런타임). ④ 검증 — 정확도(5.4)·성능·전력. 핵심: 모델(이식 가능)은 데이터센터-엣지 연속이되, 엔진은 타깃별로 재빌드(GPU·DLA·버전 종속). CUDA·TensorRT가 같은 스택이라(8.3) 코드·워크플로는 재사용하되 엔진만 타깃 빌드. 데이터센터(학습·개발)→Jetson(엣지 배포)이 단절이 아니라 이어지는 것이 엔비디아 풀스택의 가치이되, 엔진 종속(5.2)은 임베디드에서도 동일. JetPack 버전을 핀하고 그에 맞춰 빌드.

9.2.12 요약 · 다음 장

  • JetPack(SDK) = L4T(BSP·OS: 부트로더·커널·드라이버·rootfs) + CUDA/TensorRT/VPI/멀티미디어 + 도구. 데이터센터·DRIVE와 같은 CUDA/TensorRT(8.3), 단 버전이 묶여 정합이 중요.
  • Jetson 플래싱은 PC 설치와 다르다 — 완전 이미지를 recovery 모드에서 호스트 PC(SDK Manager)로 플래시한다. 모듈·세대마다 절차가 다름.
  • 부트는 임베디드 다단계(Boot ROM→부트로더→커널(디바이스 트리)→userspace) — 디바이스 트리가 하드웨어를 커널에 기술. secure boot 옵션.
  • JetPack 버전 묶음(L4T·CUDA·TensorRT 정합)·모듈 지원 범위를 관리하고, TensorRT 엔진은 Jetson 타깃으로 재빌드(5.2). 데이터센터-엣지 연속이되 엔진은 타깃별.
  • 커스텀 캐리어는 디바이스 트리·BSP 커스터마이징이 필요(하드웨어가 devkit과 다르면) — SoM 통합(9.1)의 소프트웨어 측면·제품화 난점.
  • 정직: 플래싱·버전·BSP는 세대·모듈 의존(그 모듈 문서), 임베디드 리눅스 일반 개념(도구 중립).

다음 장: 9.3 JetPack·L4T II — 컨테이너·배포. 플래시·부팅한 Jetson에 애플리케이션을 컨테이너로 배포·운영하는 법 — NGC 컨테이너·L4T 베이스 이미지·엣지 컨테이너 런타임·OTA 업데이트를, 데이터센터 컨테이너(제7부)와의 공통·차이와 함께 본다(실습).