LLM

NVIDIA Nemotron 3 Nano Omni 실전 가이드 — 문서·영상·오디오를 모델 하나로 처리하는 법

cell-devlog 2026. 6. 15. 15:13
반응형

 

에이전트를 만들다 보면 항상 같은 지점에서 막힙니다. PDF 파싱 모델, 영상 분석 모델, 음성 전사 모델을 따로 붙이고, 그 결과를 또 하나의 LLM에 넘겨서 합쳐야 하는 파이프라인입니다. 레이턴시는 3배, 컨텍스트는 쪼개집니다. Nemotron 3 Nano Omni는 이 구조 자체를 없애는 모델입니다.


아키텍처 — 왜 "진짜" 옴니모달인가

Nemotron 3 Nano Omni는 30B 총 파라미터, 포워드 패스당 약 3B 활성 파라미터의 MoE 모델입니다. 텍스트, 이미지, 영상(MP4, 최대 2분), 오디오(WAV/MP3, 최대 1시간)를 256K 토큰 컨텍스트 안에서 처리하고, 텍스트로 출력합니다. JSON, 체인오브소트 추론, 네이티브 함수 콜을 지원합니다.

"옴니모달"이라는 말이 많이 쓰이지만 실제 구현 방식은 다릅니다. 기존 멀티모달 모델 대부분은 각 모달리티를 별도 인코더로 처리하고 LLM에 이어 붙이는 구조입니다. 컨텍스트가 모달리티 경계에서 단절됩니다.

Nemotron 3 Nano Omni는 영상 처리에서 Conv3D 튜블릿 임베딩을 씁니다. 프레임을 하나씩 독립적으로 임베딩하는 대신, 연속된 두 프레임을 하나의 튜블릿으로 융합한 다음 ViT에 넘깁니다. 이렇게 하면 언어 모델이 어텐션해야 하는 비전 토큰 수가 절반으로 줄어듭니다.

여기에 더해 EVS(Efficient Video Sampling)가 추론 시점에서 중복 비디오 토큰을 제거합니다. 첫 프레임은 전체를 유지하고, 이후 프레임에서는 변화가 있는 "다이나믹" 토큰만 남기고 이전 프레임과 동일한 "스태틱" 토큰은 드롭합니다. 회의 녹화처럼 화면 대부분이 정적인 영상에서 토큰 효율이 크게 올라갑니다.

Mamba2-Transformer 하이브리드 MoE 백본이 긴 시퀀스를 상수 메모리 KV 상태로 처리합니다. 1시간짜리 오디오 트랜스크립트나 대규모 문서 배치 전체에서 일관성 있는 추론이 가능한 이유입니다.


성능 수치 — 어디서 이기나

가장 직접적인 오픈소스 경쟁 모델은 Qwen3-Omni-30B-A3B입니다. 동일한 30B-A3B MoE로 같은 4가지 모달리티를 지원하는 오픈소스 모델입니다. 문서 인텔리전스와 컴퓨터 유즈에서 Nemotron이 앞서고, 크로스모달 오디오-비디오 이해에서는 두 모델이 거의 비슷합니다.

가장 격차가 큰 영역은 GUI 자동화입니다. OSWorld 기준 Nemotron 47.4% vs Qwen3-Omni 29.0%로 63% 상대적 우위입니다. 문서 인텔리전스(MMLongBench-Doc)에서도 8포인트 앞섭니다.

처리량에서는 동급 오픈 옴니 모델 대비 멀티문서 유즈케이스 기준 7.4배, 영상 유즈케이스 기준 9.2배 높은 시스템 효율을 보입니다.


바로 쓰기 — OpenRouter 무료 API

가장 빠른 시작 경로는 OpenRouter입니다. OpenRouter에서 현재 무료로 제공되고 있습니다. 모델명은 nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free이고, extended thinking은 reasoning.enabled 파라미터로 활성화합니다.

텍스트 + 이미지 처리:

import requests
import base64

# 이미지를 base64로 인코딩
with open("document.png", "rb") as f:
    image_b64 = base64.b64encode(f.read()).decode()

response = requests.post(
    "https://openrouter.ai/api/v1/chat/completions",
    headers={
        "Authorization": "Bearer YOUR_OPENROUTER_API_KEY",
        "Content-Type": "application/json"
    },
    json={
        "model": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free",
        "messages": [
            {
                "role": "user",
                "content": [
                    {
                        "type": "image_url",
                        "image_url": {
                            "url": f"data:image/png;base64,{image_b64}"
                        }
                    },
                    {
                        "type": "text",
                        "text": "이 문서에서 핵심 수치와 날짜를 JSON 형식으로 추출해줘."
                    }
                ]
            }
        ],
        "extra_body": {
            "reasoning": {"enabled": True}  # 체인오브소트 추론 활성화
        }
    }
)

result = response.json()
print(result["choices"][0]["message"]["content"])

오디오 처리 (회의 녹음 요약):

import requests
import base64

with open("meeting.wav", "rb") as f:
    audio_b64 = base64.b64encode(f.read()).decode()

response = requests.post(
    "https://openrouter.ai/api/v1/chat/completions",
    headers={
        "Authorization": "Bearer YOUR_OPENROUTER_API_KEY",
        "Content-Type": "application/json"
    },
    json={
        "model": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free",
        "messages": [
            {
                "role": "user",
                "content": [
                    {
                        "type": "input_audio",
                        "input_audio": {
                            "data": audio_b64,
                            "format": "wav"
                        }
                    },
                    {
                        "type": "text",
                        "text": "이 회의 녹음을 전사하고, 결정 사항과 액션 아이템을 정리해줘."
                    }
                ]
            }
        ]
    }
)

print(response.json()["choices"][0]["message"]["content"])

NVIDIA NIM으로 프로덕션 배포

build.nvidia.com에서 NIM 마이크로서비스로 제공됩니다. 로컬 설정 없이 서버리스 관리형 엔드포인트로 바로 접근 가능합니다.

from openai import OpenAI
import base64

client = OpenAI(
    api_key="YOUR_NVIDIA_API_KEY",
    base_url="https://integrate.api.nvidia.com/v1"
)

# 영상 + 오디오 + 텍스트 동시 처리
with open("product_demo.mp4", "rb") as f:
    video_b64 = base64.b64encode(f.read()).decode()

response = client.chat.completions.create(
    model="nvidia/nemotron-3-nano-omni-30b-a3b-reasoning",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "video_url",
                    "video_url": {
                        "url": f"data:video/mp4;base64,{video_b64}"
                    }
                },
                {
                    "type": "text",
                    "text": "이 제품 데모 영상에서 소개된 기능을 목록으로 정리하고, "
                            "발표자가 강조한 핵심 메시지를 요약해줘."
                }
            ]
        }
    ]
)

print(response.choices[0].message.content)

로컬 배포 — 하드웨어별 선택지

Hugging Face에서 BF16, FP8, NVFP4 체크포인트를 제공합니다. 로컬 배포 시 하드웨어에 따라 정밀도를 선택해야 합니다.

정밀도 VRAM 요구량 적합 하드웨어

BF16 ~62GB H100 80GB × 1, A100 × 2
FP8 ~36GB A6000 48GB, RTX Pro
NVFP4 ~25GB RTX 4090 (타이트)

RTX 4090(24GB) 사용자라면 NVFP4가 유일한 현실적 경로입니다. FP8은 약 30GB, BF16은 약 60GB가 필요합니다.

vLLM으로 고처리량 서빙:

# NVFP4 — 최고 처리량 (Hopper/Blackwell 하드웨어)
vllm serve nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-NVFP4 \
  --tensor-parallel-size 1 \
  --max-model-len 131072 \
  --video-pruning-rate 0.5 \
  --max-num-seqs 384 \
  --reasoning-parser nemotron_v3

# RTX Pro 사용 시 MoE 백엔드 옵션 추가
# --moe-backend triton

SGLang으로 서빙:

sglang serve \
  --model-path nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-BF16 \
  --trust-remote-code

llama.cpp로 텍스트 + 이미지 + 오디오 (경량 환경):

# Unsloth GGUF 4비트 양자화 버전 사용
./llama-mtmd-cli \
  -hf unsloth/NVIDIA-Nemotron-3-Nano-Omni-30B-A3B-Reasoning-GGUF:UD-Q4_K_XL \
  --image screenshot.png \
  --audio meeting.wav \
  -p "화면에 보이는 내용과 오디오 내용을 함께 요약해줘"

실전 에이전트 패턴 — 퍼셉션 서브에이전트로 쓰기

NVIDIA의 포지셔닝은 명확합니다. Nemotron 3 Nano Omni는 에이전트 시스템의 "눈과 귀" 역할을 합니다. Nemotron 3 Super, Ultra 같은 추론 모델이나 다른 proprietary 모델과 함께 쓰도록 설계된 퍼셉션 서브에이전트입니다.

실전 패턴은 이렇습니다. Omni가 영상·오디오·문서를 인식하고 구조화된 텍스트로 변환합니다. 그 결과를 추론 모델에 넘겨서 판단하고 행동을 결정하는 구조입니다.

import requests
import base64
import json

def perception_agent(file_path: str, file_type: str, query: str) -> dict:
    """
    Nemotron Omni를 퍼셉션 서브에이전트로 사용
    멀티모달 입력 → 구조화된 컨텍스트 출력
    """
    with open(file_path, "rb") as f:
        content_b64 = base64.b64encode(f.read()).decode()

    type_map = {
        "image": ("image_url", f"data:image/png;base64,{content_b64}"),
        "audio": ("input_audio", {"data": content_b64, "format": "wav"}),
        "video": ("video_url", f"data:video/mp4;base64,{content_b64}"),
    }

    content_type, content_value = type_map[file_type]

    response = requests.post(
        "https://openrouter.ai/api/v1/chat/completions",
        headers={"Authorization": "Bearer YOUR_KEY"},
        json={
            "model": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free",
            "messages": [{
                "role": "user",
                "content": [
                    {
                        "type": content_type,
                        content_type: content_value if isinstance(content_value, str)
                                      else None,
                        **({"input_audio": content_value}
                           if file_type == "audio" else {})
                    },
                    {
                        "type": "text",
                        "text": f"{query}\n\n반드시 JSON 형식으로 답해줘."
                    }
                ]
            }],
            "extra_body": {"reasoning": {"enabled": True}}
        }
    )

    raw = response.json()["choices"][0]["message"]["content"]
    try:
        return json.loads(raw)
    except json.JSONDecodeError:
        return {"raw_output": raw}


# 사용 예시: 회의 녹음 → 구조화된 요약 → 다음 에이전트로 전달
meeting_context = perception_agent(
    file_path="weekly_standup.wav",
    file_type="audio",
    query="참석자, 논의 주제, 결정 사항, 각 담당자별 액션 아이템을 추출해줘"
)

print(json.dumps(meeting_context, ensure_ascii=False, indent=2))
# 이 결과를 태스크 관리 에이전트나 슬랙 봇에 넘기는 식으로 체이닝

어떤 경우에 써야 하나 — 판단 기준

유즈케이스 적합도

기업 문서(PDF·계약서·보고서) 대량 처리 ✅ MMLongBench-Doc 1위
회의 녹음 전사 + 요약 ✅ 1시간 오디오 단일 컨텍스트
GUI 자동화 / 스크린샷 기반 에이전트 ✅ OSWorld 47.4% (오픈소스 최고)
제품 데모·교육 영상 분석 ✅ Conv3D + EVS 효율
실시간 스트리밍 오디오 ❌ 미지원
영상 생성 ❌ 텍스트 출력만
한국어 오디오 다중 화자 환경 ⚠️ 영어 중심 학습, 비영어 성능 미검증

✅ 결론

  • 문서·영상·오디오를 하나의 추론 루프로 처리하는 첫 번째 실용적인 오픈소스 옴니모달 모델입니다
  • OpenRouter에서 지금 당장 무료로 테스트할 수 있습니다
  • 에이전트 시스템의 퍼셉션 레이어로 설계됐습니다. 단독 추론 모델이 아닌 "눈과 귀" 포지션입니다
  • GUI 자동화와 대형 문서 배치 처리에서 오픈소스 최고 수준입니다
  • RTX 4090에서 NVFP4로 돌릴 수 있지만 타이트합니다. A6000 이상이 편합니다

❌ 주의

  • 비영어 오디오 성능은 미검증입니다. 한국어 회의록 처리는 직접 테스트가 필요합니다
  • 영상 입력 최대 2분 제한이 있습니다. 긴 영상은 분할해야 합니다
  • 멀티모달 파인튜닝 시 텍스트 전용 VRAM 수치를 그대로 적용하면 OOM이 납니다

 

반응형