<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>LiveHard</title>
    <link>https://danielzzi.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 10 Apr 2026 06:55:42 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>DanielZZI</managingEditor>
    <image>
      <title>LiveHard</title>
      <url>https://tistory1.daumcdn.net/tistory/6306240/attach/80b2ecb30dca429baa4b9274fc295037</url>
      <link>https://danielzzi.tistory.com</link>
    </image>
    <item>
      <title>DGX Spark로 OpenClaw Local LLM 구성- GPT-OSS-120B 최적화하기</title>
      <link>https://danielzzi.tistory.com/entry/DGX-Spark%EB%A1%9C-OpenClaw-Local-LLM-%EA%B5%AC%EC%84%B1-GPT-OSS-120B-%EC%B5%9C%EC%A0%81%ED%99%94%ED%95%98%EA%B8%B0</link>
      <description>&lt;h1&gt;DGX Spark에서 GPT-OSS 최적화하기&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;NVIDIA DGX Spark (GB10, SM 12.1, 128GB 통합 메모리) 환경에서&lt;br&gt;vLLM + openai/gpt-oss-120b의 추론 성능을 단계별로 최적화한 기록&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2&gt;1. 테스트 환경&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;사양&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;하드웨어&lt;/td&gt;
&lt;td&gt;NVIDIA DGX Spark (GB10 SoC)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU 아키텍처&lt;/td&gt;
&lt;td&gt;Blackwell SM 12.1 (consumer/edge)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;메모리&lt;/td&gt;
&lt;td&gt;128GB 통합 메모리 (CPU+GPU 공유), 273 GB/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;td&gt;Linux 6.17.0-1008-nvidia (aarch64)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모델&lt;/td&gt;
&lt;td&gt;openai/gpt-oss-120b (120B MoE, MXFP4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;추론 엔진&lt;/td&gt;
&lt;td&gt;vLLM (NGC 이미지: nvcr.io/nvidia/vllm:26.01-py3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;배포 방식&lt;/td&gt;
&lt;td&gt;Docker Compose&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;2. Baseline — 현재 상태&lt;/h2&gt;
&lt;h3&gt;2.1 docker-compose.yml (원본)&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;services:
  vllm:
    image: nvcr.io/nvidia/vllm:26.01-py3
    container_name: vllm
    ipc: host
    shm_size: &amp;quot;32g&amp;quot;
    restart: unless-stopped
    ulimits:
      memlock: -1
      stack: 67108864
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    ports:
      - &amp;quot;30000:8000&amp;quot;
    volumes:
      - ~/.cache/huggingface:/root/.cache/huggingface
      - ~/.cache/vllm:/root/.cache/vllm
      - ~/tiktoken_encodings:/tiktoken_encodings
    environment:
      - HF_TOKEN=${HF_TOKEN}
      - HUGGING_FACE_HUB_TOKEN=${HF_TOKEN}
      - HF_HUB_OFFLINE=1
      - TIKTOKEN_ENCODINGS_BASE=/tiktoken_encodings
      - VLLM_USE_FLASHINFER_MXFP4_MOE=1
    command: &amp;gt;
      vllm serve openai/gpt-oss-120b
      --host 0.0.0.0
      --port 8000
      --trust-remote-code
      --async-scheduling
      --swap-space 16
      --max-model-len 32000
      --tensor-parallel-size 1
      --max-num-seqs 1024
      --gpu-memory-utilization 0.7&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.2 Baseline 성능 측정&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;지표&lt;/th&gt;
&lt;th&gt;결과&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;모델 로딩 시간&lt;/td&gt;
&lt;td&gt;~7분 19초 (439.87s safetensors + 455.3s 전체)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모델 메모리 사용&lt;/td&gt;
&lt;td&gt;65.97 GiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KV 캐시 가용 메모리&lt;/td&gt;
&lt;td&gt;9.41 GiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;최대 동시 처리 (32K 토큰 기준)&lt;/td&gt;
&lt;td&gt;8.01x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TTFT (Time to First Token)&lt;/td&gt;
&lt;td&gt;179 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;생성 속도&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~34.9 tok/s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marlin 경고&lt;/td&gt;
&lt;td&gt;&amp;quot;GPU does not have native FP4... may degrade performance&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;2.3 Baseline의 문제점&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--swap-space 16&lt;/code&gt;&lt;/strong&gt;: 통합 메모리에서 CPU swap 16GB를 예약하면 GPU가 사용할 수 있는 대역폭이 줄어듦&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--max-num-seqs 1024&lt;/code&gt;&lt;/strong&gt;: 단일 사용자 환경(OpenClaw)에서 1024 시퀀스는 과도. 불필요한 메모리 예약&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;KV 캐시 기본 dtype&lt;/strong&gt;: auto(fp16)로 KV 캐시 메모리 효율이 낮음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prefix caching 미사용&lt;/strong&gt;: 동일 시스템 프롬프트를 매 요청마다 재계산&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;reasoning/tool-call parser 미설정&lt;/strong&gt;: GPT-OSS의 reasoning 토큰이 올바르게 분리되지 않음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;캐시 마운트 부족&lt;/strong&gt;: flashinfer, triton JIT 캐시가 컨테이너 재시작 시 소실&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;3. 1단계 — NGC 이미지 튜닝&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;이미지 변경 없이, 실행 파라미터와 환경 설정만으로 성능을 개선한다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;3.1 변경 사항&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;변경&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;th&gt;근거&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--swap-space&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;제거&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;통합 메모리에서 CPU swap은 GPU 대역폭 손실&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--max-num-seqs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1024&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;단일 사용자 환경에 맞게 축소, 메모리 절감&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--kv-cache-dtype&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;(auto)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;fp8&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;KV 캐시 메모리 절반 절감 → 더 많은 토큰 처리 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--enable-prefix-caching&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;추가&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;반복되는 시스템 프롬프트 캐싱으로 TTFT 단축&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--max-num-batched-tokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;(없음)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8192&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;배치 크기 제한으로 메모리 사용 안정화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--reasoning-parser&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;openai_gptoss&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GPT-OSS reasoning 토큰 올바른 파싱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--tool-call-parser&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;openai&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;tool call 올바른 파싱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--enable-auto-tool-choice&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;추가&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;자동 tool call 감지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;환경변수&lt;/td&gt;
&lt;td&gt;&lt;code&gt;VLLM_USE_FLASHINFER_MXFP4_MOE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;양쪽 모두 설정&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;버전 호환성 확보&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;캐시 마운트&lt;/td&gt;
&lt;td&gt;vllm만&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;flashinfer, triton 추가&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JIT 캐시 재시작 시 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;3.2 docker-compose.yml (1단계 튜닝)&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;services:
  vllm:
    image: nvcr.io/nvidia/vllm:26.01-py3
    container_name: vllm
    ipc: host
    shm_size: &amp;quot;32g&amp;quot;
    restart: unless-stopped
    ulimits:
      memlock: -1
      stack: 67108864
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    ports:
      - &amp;quot;30000:8000&amp;quot;
    volumes:
      - ~/.cache/huggingface:/root/.cache/huggingface
      - ~/.cache/vllm:/root/.cache/vllm
      - ~/.cache/flashinfer:/root/.cache/flashinfer
      - ~/.triton:/root/.triton
      - ~/tiktoken_encodings:/tiktoken_encodings
    environment:
      - HF_TOKEN=${HF_TOKEN}
      - HUGGING_FACE_HUB_TOKEN=${HF_TOKEN}
      - HF_HUB_OFFLINE=1
      - TIKTOKEN_ENCODINGS_BASE=/tiktoken_encodings
      - VLLM_USE_FLASHINFER_MXFP4_MOE=1
      - VLLM_USE_FLASHINFER_MOE_MXFP4_MXFP8=1
    command: &amp;gt;
      vllm serve openai/gpt-oss-120b
      --host 0.0.0.0
      --port 8000
      --trust-remote-code
      --async-scheduling
      --max-model-len 32000
      --tensor-parallel-size 1
      --max-num-seqs 8
      --gpu-memory-utilization 0.7
      --kv-cache-dtype fp8
      --enable-prefix-caching
      --max-num-batched-tokens 8192
      --reasoning-parser openai_gptoss
      --tool-call-parser openai
      --enable-auto-tool-choice
    healthcheck:
      test: [&amp;quot;CMD&amp;quot;, &amp;quot;curl&amp;quot;, &amp;quot;-f&amp;quot;, &amp;quot;http://localhost:8000/health&amp;quot;]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 600s&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.3 각 변경의 의미&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;--swap-space&lt;/code&gt; 제거&lt;/strong&gt;&lt;br&gt;일반 서버에서는 CPU RAM과 GPU VRAM이 물리적으로 분리되어 있어, CPU 쪽에 KV 캐시 swap 공간을 두면 GPU 메모리가 부족할 때 백업으로 활용된다. 하지만 DGX Spark의 통합 메모리에서는 CPU swap도 GPU와 같은 물리 메모리를 사용하므로, 16GB를 CPU swap으로 예약하면 GPU가 실제로 쓸 수 있는 메모리 대역폭이 줄어든다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;--kv-cache-dtype fp8&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;KV 캐시는 이전 토큰들의 &amp;quot;기억&amp;quot;을 저장하는 공간이다. 기본값 fp16(16비트)을 fp8(8비트)으로 바꾸면 같은 메모리에 2배의 토큰을 저장할 수 있다. 정밀도가 약간 줄지만 실제 출력 품질 차이는 거의 없다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;--enable-prefix-caching&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;OpenClaw 같은 코딩 어시스턴트는 매 요청마다 동일한 시스템 프롬프트를 보낸다. prefix caching을 켜면 이 부분의 KV 캐시를 재활용하여 두 번째 요청부터 TTFT가 단축된다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;--max-num-seqs 8&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;동시에 처리할 최대 시퀀스 수. 1024는 대규모 서비스용이고 단일 사용자 환경에서는 8이면 충분하다. 줄이면 KV 캐시를 위한 메모리 예약이 줄어 실제 사용 가능한 캐시 공간이 늘어난다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;--reasoning-parser openai_gptoss&lt;/code&gt; + &lt;code&gt;--tool-call-parser openai&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;GPT-OSS는 답변 전에 reasoning(사고 과정)을 생성한다. 파서가 없으면 reasoning과 실제 답변이 뒤섞여 나온다. tool-call 파서는 function calling(파일 읽기/쓰기 등)을 사용할 때 필요하다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;캐시 마운트 (&lt;code&gt;flashinfer&lt;/code&gt;, &lt;code&gt;triton&lt;/code&gt;)&lt;/strong&gt;&lt;br&gt;FlashInfer(어텐션 커널)와 Triton(JIT 컴파일러)은 처음 실행 시 GPU 커널을 컴파일한다. 호스트에 마운트하면 컨테이너 재시작 후에도 컴파일 결과를 재사용할 수 있다.&lt;/p&gt;
&lt;h3&gt;3.4 1단계 성능 측정&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;지표&lt;/th&gt;
&lt;th&gt;Baseline&lt;/th&gt;
&lt;th&gt;1단계&lt;/th&gt;
&lt;th&gt;변화&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;모델 로딩 시간&lt;/td&gt;
&lt;td&gt;439.87s (~7분 19초)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;408.98s (~6분 49초)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-31초&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모델 메모리 사용&lt;/td&gt;
&lt;td&gt;65.97 GiB&lt;/td&gt;
&lt;td&gt;65.97 GiB&lt;/td&gt;
&lt;td&gt;동일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KV 캐시 가용 메모리&lt;/td&gt;
&lt;td&gt;9.41 GiB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;14.89 GiB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+58%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KV 캐시 토큰 수&lt;/td&gt;
&lt;td&gt;137,024&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;433,760&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+3.2배&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;최대 동시 처리 (32K기준)&lt;/td&gt;
&lt;td&gt;8.01x&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;21.51x&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+2.7배&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TTFT (첫 요청, cold)&lt;/td&gt;
&lt;td&gt;179 ms&lt;/td&gt;
&lt;td&gt;915 ms&lt;/td&gt;
&lt;td&gt;CUDA graph 초기화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TTFT (이후 요청, warm)&lt;/td&gt;
&lt;td&gt;179 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;174 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-5ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;생성 속도&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~34.9 tok/s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~34.9 tok/s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;변화 없음&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marlin 경고&lt;/td&gt;
&lt;td&gt;있음&lt;/td&gt;
&lt;td&gt;있음&lt;/td&gt;
&lt;td&gt;동일&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;3.5 1단계 결론: 속도는 안 바뀐다&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;tok/s가 동일한 이유&lt;/strong&gt;: 생성 속도의 병목은 Marlin 커널이다.&lt;/p&gt;
&lt;p&gt;Marlin은 SM 12.1(DGX Spark)에서 FP4 네이티브 연산을 지원하지 못하고, &amp;quot;FP4 가중치를 압축 해제 → fp16으로 변환 → 일반 행렬 곱셈&amp;quot;으로 처리한다. 아무리 KV 캐시를 최적화하고 메모리를 확보해도, 가중치 연산 자체가 느린 것은 바뀌지 않는다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;생성 속도 병목 분석:

[요청] → [KV 캐시 조회] → [가중치 연산 (Marlin)] → [토큰 출력]
         ↑ 1단계 개선됨     ↑ 병목 — 여기가 안 바뀜     &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;그러나 1단계는 &lt;strong&gt;쓸모없는 것이 아니다&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;KV 캐시 3.2배 확대로 &lt;strong&gt;더 긴 대화&lt;/strong&gt;를 처리할 수 있게 됨&lt;/li&gt;
&lt;li&gt;동시 처리 능력 2.7배 증가로 &lt;strong&gt;다중 요청&lt;/strong&gt; 시 유리&lt;/li&gt;
&lt;li&gt;로딩 31초 단축, reasoning/tool-call 올바른 파싱&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tok/s를 올리려면 2단계(CUTLASS)가 필수&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;참고) KV 캐시 용량이 늘면 왜 tok/s는 안 바뀌나?&lt;/h3&gt;
&lt;p&gt;직관적으로는 &amp;quot;메모리가 많으면 빨라야지&amp;quot;가 맞지만, LLM 추론에는 두 가지 다른 종류의 &amp;quot;빠름&amp;quot;이 있다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;토큰 생성의 두 단계:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Prefill]  입력 토큰을 한꺼번에 처리 → KV 캐시에 저장
           이 단계의 속도 = TTFT (Time to First Token)
           ※ KV 캐시 용량이 중요

[Decode]   토큰을 하나씩 생성 (반복)
           이 단계의 속도 = tok/s
           ※ 가중치 연산(Marlin/CUTLASS) 속도가 중요&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;토큰 1개를 생성할 때 일어나는 일:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;KV 캐시에서 이전 토큰 정보 읽기&lt;/strong&gt; — 메모리 읽기 (~2ms)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;120B 모델의 가중치를 곱하는 행렬 연산&lt;/strong&gt; — GPU 연산 (~24ms) ← &lt;strong&gt;여기가 병목&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;다음 토큰 확률 계산, 출력&lt;/strong&gt; — (~2ms)&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;토큰 1개 생성 시간 (~28ms = 1/34.9초):

  KV 캐시 읽기:  ██ (~2ms)
  가중치 연산:   ████████████████████████ (~24ms)  ← Marlin 병목
  토큰 출력:     █ (~2ms)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;KV 캐시를 3배로 늘려도 2번의 가중치 연산 24ms는 줄어들지 않는다.&lt;br&gt;더 큰 KV 캐시는 &lt;strong&gt;&amp;quot;더 많은 걸 기억할 수 있다&amp;quot;&lt;/strong&gt;이지 &lt;strong&gt;&amp;quot;더 빨리 계산할 수 있다&amp;quot;&lt;/strong&gt;가 아니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KV 캐시 확대가 빛을 발하는 순간:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;상황&lt;/th&gt;
&lt;th&gt;Baseline (9.41 GiB)&lt;/th&gt;
&lt;th&gt;1단계 (14.89 GiB)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;단일 요청, 짧은 대화&lt;/td&gt;
&lt;td&gt;34.9 tok/s&lt;/td&gt;
&lt;td&gt;34.9 tok/s (동일)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;동시 3명&lt;/strong&gt;이 32K 대화&lt;/td&gt;
&lt;td&gt;가능 (8.01x)&lt;/td&gt;
&lt;td&gt;가능 (21.51x)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;동시 10명&lt;/strong&gt;이 32K 대화&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;불가능&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;가능&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;매우 긴 코드 파일 분석&lt;/td&gt;
&lt;td&gt;메모리 부족 가능&lt;/td&gt;
&lt;td&gt;여유&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;비유하면: KV 캐시 = &lt;strong&gt;책상 크기&lt;/strong&gt;, 가중치 연산 = &lt;strong&gt;계산 속도&lt;/strong&gt;.&lt;br&gt;책상을 3배로 키우면 서류를 더 많이 펼쳐놓을 수 있지만,&lt;br&gt;계산을 빨리 하려면 &lt;strong&gt;더 빠른 계산기(CUTLASS)&lt;/strong&gt;가 필요하다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;4. 2단계 — 커스텀 이미지 빌드 (spark-vllm-docker)&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/eugr/spark-vllm-docker&quot;&gt;eugr/spark-vllm-docker&lt;/a&gt; 프로젝트의&lt;br&gt;Experimental MXFP4 빌드를 사용하여 SM 12.1 전용 최적화를 적용한다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;4.1 커스텀 빌드가 다른 점&lt;/h3&gt;
&lt;p&gt;NGC 이미지(&lt;code&gt;nvcr.io/nvidia/vllm:26.01-py3&lt;/code&gt;)는 범용 이미지로, DGX Spark(SM 12.1)에 특화된 최적화가 없다.&lt;br&gt;&lt;code&gt;spark-vllm-docker&lt;/code&gt;의 Experimental MXFP4 빌드는 다음이 다르다:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;NGC 이미지&lt;/th&gt;
&lt;th&gt;spark-vllm-docker MXFP4 빌드&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;베이스&lt;/td&gt;
&lt;td&gt;nvcr.io/nvidia/vllm:26.01-py3&lt;/td&gt;
&lt;td&gt;nvcr.io/nvidia/pytorch:26.01-py3 (직접 빌드)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vLLM&lt;/td&gt;
&lt;td&gt;NVIDIA 사전 빌드&lt;/td&gt;
&lt;td&gt;christopherowen/vllm 포크 (MXFP4 최적화)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FlashInfer&lt;/td&gt;
&lt;td&gt;NGC 번들&lt;/td&gt;
&lt;td&gt;christopherowen/flashinfer 포크 (SM 12.1 전용)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CUTLASS&lt;/td&gt;
&lt;td&gt;NGC 번들&lt;/td&gt;
&lt;td&gt;christopherowen/cutlass 포크 (MXFP4 커널)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU 아키텍처 타겟&lt;/td&gt;
&lt;td&gt;범용&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TORCH_CUDA_ARCH_LIST=12.1a&lt;/code&gt; 전용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MXFP4 백엔드&lt;/td&gt;
&lt;td&gt;Marlin (범용 사전 컴파일)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CUTLASS&lt;/strong&gt; (SM 12.1 최적화)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모델 로딩&lt;/td&gt;
&lt;td&gt;safetensors (mmap)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;fastsafetensors&lt;/strong&gt; (멀티스레드, mmap 회피)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quantization&lt;/td&gt;
&lt;td&gt;암시적 (모델 내장)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;명시적 &lt;code&gt;--quantization mxfp4&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;4.2 GPT-OSS 전용 Recipe&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;spark-vllm-docker&lt;/code&gt;는 GPT-OSS 전용 recipe를 제공한다:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# recipes/openai-gpt-oss-120b.yaml
container: vllm-node-mxfp4
build_args:
  - --exp-mxfp4

env:
  VLLM_USE_FLASHINFER_MOE_MXFP4_MXFP8: &amp;quot;1&amp;quot;

command: |
  vllm serve openai/gpt-oss-120b \
    --tool-call-parser openai \
    --reasoning-parser openai_gptoss \
    --enable-auto-tool-choice \
    --enable-prefix-caching \
    --load-format fastsafetensors \
    --quantization mxfp4 \
    --mxfp4-backend CUTLASS \
    --mxfp4-layers moe,qkv,o,lm_head \
    --attention-backend FLASHINFER \
    --kv-cache-dtype fp8 \
    --max-num-batched-tokens 8192 \
    --gpu-memory-utilization 0.70&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;핵심 차이:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--quantization mxfp4 --mxfp4-backend CUTLASS&lt;/code&gt;: Marlin 대신 CUTLASS 백엔드로 MXFP4 연산&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--mxfp4-layers moe,qkv,o,lm_head&lt;/code&gt;: MoE뿐 아니라 attention(QKV, O)과 LM head까지 MXFP4 적용&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--attention-backend FLASHINFER&lt;/code&gt;: 커스텀 FlashInfer로 SM 12.1에서도 FlashInfer 사용 가능&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--load-format fastsafetensors&lt;/code&gt;: mmap 대신 멀티스레드 직접 로딩&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.3 빌드 방법&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/eugr/spark-vllm-docker.git
cd spark-vllm-docker

# MXFP4 전용 이미지 빌드 (20~30분 소요)
./build-and-copy.sh -t vllm-node-mxfp4 --exp-mxfp4

# 실행 (단일 노드)
./launch-cluster.sh --solo -t vllm-node-mxfp4 exec \
  vllm serve openai/gpt-oss-120b \
    --host 0.0.0.0 --port 8888 \
    --enable-auto-tool-choice \
    --tool-call-parser openai \
    --reasoning-parser openai_gptoss \
    --gpu-memory-utilization 0.70 \
    --enable-prefix-caching \
    --load-format fastsafetensors \
    --quantization mxfp4 \
    --mxfp4-backend CUTLASS \
    --mxfp4-layers moe,qkv,o,lm_head \
    --attention-backend FLASHINFER \
    --kv-cache-dtype fp8 \
    --max-num-batched-tokens 8192&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.4 빌드 소요 시간&lt;/h3&gt;
&lt;p&gt;실측 빌드 시간: &lt;strong&gt;약 65분&lt;/strong&gt; (DGX Spark ARM CPU에서)&lt;/p&gt;
&lt;p&gt;README에서는 20~30분이라고 했지만, 이는 x86 환경 기준이다.&lt;br&gt;DGX Spark의 ARM CPU(aarch64)에서는 CUDA 크로스 컴파일이 더 오래 걸린다.&lt;br&gt;다만 Docker 빌드 캐시 덕분에 &lt;strong&gt;두 번째 빌드부터는 변경된 부분만 재컴파일&lt;/strong&gt;되어 훨씬 빨라진다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;빌드 단계별 소요 시간 (실측):

[1] 베이스 이미지 풀 (pytorch:26.01-py3)     ~10분
[2] FlashInfer CUDA 커널 컴파일              ~15분
[3] CUTLASS MXFP4 커널 컴파일                ~10분
[4] vLLM 소스 빌드                           ~25분
[5] Runner 이미지 조립                        ~5분
                                     합계: ~65분&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;4.5 2단계 성능 측정&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;로그에서 확인된 핵심 변화:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[MXFP4] Using backend: CUTLASS (--mxfp4-backend)
SM12x detected - using native FlashInfer CUTLASS attention
Loading safetensors using Fastsafetensor loader
[MXFP4] lm_head quantized: BF16 -&amp;gt; FP4 (4x smaller)&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Marlin 경고(&lt;code&gt;may degrade performance&lt;/code&gt;) → &lt;strong&gt;완전히 사라짐&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;어텐션 백엔드: triton JIT → &lt;strong&gt;FlashInfer 네이티브 CUTLASS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;모델 로딩: mmap(28초/샤드) → &lt;strong&gt;fastsafetensors(3초/샤드)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;lm_head: fp16 유지 → &lt;strong&gt;MXFP4 양자화 (4배 압축)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;지표&lt;/th&gt;
&lt;th&gt;Baseline&lt;/th&gt;
&lt;th&gt;1단계&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;2단계 (실측)&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;가중치 로딩 시간&lt;/td&gt;
&lt;td&gt;439.87s (7분 19초)&lt;/td&gt;
&lt;td&gt;408.98s (6분 49초)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;46.16s (46초)&lt;/strong&gt; — &lt;strong&gt;9.5배 빨라짐&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모델 메모리&lt;/td&gt;
&lt;td&gt;65.97 GiB&lt;/td&gt;
&lt;td&gt;65.97 GiB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;61.33 GiB&lt;/strong&gt; (-4.6 GiB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TTFT (1st, cold)&lt;/td&gt;
&lt;td&gt;179 ms&lt;/td&gt;
&lt;td&gt;915 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;264 ms&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TTFT (2nd, warm)&lt;/td&gt;
&lt;td&gt;179 ms&lt;/td&gt;
&lt;td&gt;174 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;129 ms&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;생성 속도&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;34.9 tok/s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;34.9 tok/s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;56.8 tok/s (+63%)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marlin 경고&lt;/td&gt;
&lt;td&gt;있음&lt;/td&gt;
&lt;td&gt;있음&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;없음&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;4.6 왜 56.8 tok/s가 가능한가?&lt;/h3&gt;
&lt;p&gt;NGC 이미지의 Marlin 백엔드는 SM 12.1에서 FP4 네이티브 연산을 활용하지 못하고 weight-only 압축으로 동작한다.&lt;br&gt;이것이 바로 &amp;quot;may degrade performance&amp;quot; 경고의 의미다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Marlin (Baseline):
  FP4 가중치 → fp16 압축 해제 → fp16 행렬 곱셈 → 결과
  ↑ 변환 오버헤드              ↑ 정밀도 높지만 느림

CUTLASS MXFP4 (2단계):
  FP4 가중치 → 직접 FP4 행렬 곱셈 → 결과
               ↑ 변환 없이 바로 연산, SM 12.1 mma.sync 최적화&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;CUTLASS 기반 MXFP4 빌드가 빠른 이유:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;FP4 가중치를 변환 없이 직접 연산&lt;/strong&gt; — Marlin의 &amp;quot;압축 해제 → fp16 변환&amp;quot; 오버헤드 제거&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MoE뿐 아니라 QKV/O/LM-head까지 MXFP4 적용&lt;/strong&gt; → 전체 연산의 양자화 범위 확대, 메모리 4.6GiB 절감&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FlashInfer 커스텀 빌드&lt;/strong&gt;로 attention도 SM 12.1에 맞게 CUTLASS 기반 네이티브 어텐션 사용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fastsafetensors&lt;/strong&gt;로 mmap 대신 멀티스레드 직접 로딩 → 로딩 시간 9.5배 단축&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;5. 성능 비교 요약&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;지표&lt;/th&gt;
&lt;th&gt;Baseline&lt;/th&gt;
&lt;th&gt;1단계 (NGC 튜닝)&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;2단계 (MXFP4 빌드)&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;이미지&lt;/td&gt;
&lt;td&gt;NGC 26.01-py3&lt;/td&gt;
&lt;td&gt;NGC 26.01-py3&lt;/td&gt;
&lt;td&gt;spark-vllm-docker MXFP4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;생성 속도&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;34.9 tok/s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;34.9 tok/s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;56.8 tok/s (+63%)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TTFT (warm)&lt;/td&gt;
&lt;td&gt;179 ms&lt;/td&gt;
&lt;td&gt;174 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;129 ms (-28%)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모델 로딩&lt;/td&gt;
&lt;td&gt;439.87s (7분 19초)&lt;/td&gt;
&lt;td&gt;408.98s (6분 49초)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;46.16s (46초) — 9.5배&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모델 메모리&lt;/td&gt;
&lt;td&gt;65.97 GiB&lt;/td&gt;
&lt;td&gt;65.97 GiB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;61.33 GiB (-4.6GiB)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KV 캐시 용량&lt;/td&gt;
&lt;td&gt;9.41 GiB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;14.89 GiB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;fp8 + CUTLASS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;최대 동시 처리&lt;/td&gt;
&lt;td&gt;8.01x&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;21.51x&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;prefix caching&lt;/td&gt;
&lt;td&gt;미사용&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;사용&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MXFP4 백엔드&lt;/td&gt;
&lt;td&gt;Marlin (범용)&lt;/td&gt;
&lt;td&gt;Marlin (범용)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CUTLASS&lt;/strong&gt; (SM 12.1 최적화)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marlin 경고&lt;/td&gt;
&lt;td&gt;있음&lt;/td&gt;
&lt;td&gt;있음&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;없음&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;reasoning 파싱&lt;/td&gt;
&lt;td&gt;미지원&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;지원&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;난이도&lt;/td&gt;
&lt;td&gt;쉬움&lt;/td&gt;
&lt;td&gt;쉬움&lt;/td&gt;
&lt;td&gt;빌드 ~65분 (ARM)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;6. 결론 및 권장 사항&lt;/h2&gt;
&lt;h3&gt;1단계만으로 충분한가?&lt;/h3&gt;
&lt;p&gt;tok/s는 변하지 않지만, KV 캐시 3.2배 확대와 reasoning/tool-call 파싱은 의미 있는 개선이다.&lt;br&gt;단, 코딩 어시스턴트처럼 &lt;strong&gt;체감 응답 속도가 중요한 경우 2단계가 필수&lt;/strong&gt;다.&lt;/p&gt;
&lt;h3&gt;2단계의 실질적 가치&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;56.8 tok/s&lt;/strong&gt;: 사람이 읽는 속도(~5 tok/s)의 11배. 코드 생성 시 거의 실시간 체감&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;46초 로딩&lt;/strong&gt;: 컨테이너 재시작 시 1분 안에 서비스 복구 (baseline은 7분 이상)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;메모리 4.6GiB 절감&lt;/strong&gt;: 다른 서비스를 함께 돌릴 여유 확보&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Marlin 경고 해소&lt;/strong&gt;: &amp;quot;may degrade performance&amp;quot; 없이 깨끗한 운영&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;권장 사항&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;용도&lt;/th&gt;
&lt;th&gt;권장&lt;/th&gt;
&lt;th&gt;이유&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;빠른 셋업, 테스트용&lt;/td&gt;
&lt;td&gt;1단계 (NGC 튜닝)&lt;/td&gt;
&lt;td&gt;이미지 빌드 없이 즉시 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenClaw/Cursor 상시 운영&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2단계 (MXFP4 빌드)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;63% 빠른 응답, 9.5배 빠른 재시작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;다중 사용자 서비스&lt;/td&gt;
&lt;td&gt;2단계 + &lt;code&gt;--max-num-seqs&lt;/code&gt; 조정&lt;/td&gt;
&lt;td&gt;높은 동시성 + 빠른 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dual DGX Spark 클러스터&lt;/td&gt;
&lt;td&gt;2단계 + &lt;code&gt;-tp 2 --distributed-executor-backend ray&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;더 큰 모델/컨텍스트&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/eugr/spark-vllm-docker&quot;&gt;eugr/spark-vllm-docker&lt;/a&gt; — DGX Spark 전용 vLLM Docker 최적화 프로젝트&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/christopherowen/vllm&quot;&gt;christopherowen/vllm&lt;/a&gt; — MXFP4 CUTLASS 백엔드 포크&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.nvidia.com/dgx-spark/&quot;&gt;NVIDIA DGX Spark 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;./SGLANG_VS_VLLM.md&quot;&gt;이전 블로그: DGX Spark로 OpenClaw Local LLM 구성 — Provider 선정기&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI/LLM</category>
      <category>Agent</category>
      <category>agent ai</category>
      <category>AgentAI</category>
      <category>AI</category>
      <category>dgx spark</category>
      <category>fp4</category>
      <category>gpt-oss-120b</category>
      <category>local llm</category>
      <category>OpenClaw</category>
      <category>vllm</category>
      <author>DanielZZI</author>
      <guid isPermaLink="true">https://danielzzi.tistory.com/41</guid>
      <comments>https://danielzzi.tistory.com/entry/DGX-Spark%EB%A1%9C-OpenClaw-Local-LLM-%EA%B5%AC%EC%84%B1-GPT-OSS-120B-%EC%B5%9C%EC%A0%81%ED%99%94%ED%95%98%EA%B8%B0#entry41comment</comments>
      <pubDate>Wed, 25 Feb 2026 19:34:17 +0900</pubDate>
    </item>
    <item>
      <title>DGX Spark로 OpenClaw Local LLM 구성 &amp;mdash; Provider 선정기</title>
      <link>https://danielzzi.tistory.com/entry/DGX-Spark%EB%A1%9C-OpenClaw-Local-LLM-%EA%B5%AC%EC%84%B1-%E2%80%94-Provider-%EC%84%A0%EC%A0%95%EA%B8%B0</link>
      <description>&lt;h1&gt;DGX Spark로 OpenClaw Local LLM 구성 &amp;mdash; Provider 선정기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핫한 OpenClaw로 이것저것 시도해보던중 유료 LLM의 탁월한 성능과 함께 개발단계부터 비용적 한계를 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 하이브리드 구성(전략: 유료 LLM 연산/실행: Local LLM) 을 위해 먼저 local LLM&amp;nbsp; Provider로 Ollama, SGLang, vLLM 세 가지를 DGX Spark에서 테스트했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GPT-OSS-120B 모델 기준으로&amp;nbsp; DGX Spark에서 테스트해보고 내린 결론은 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개인 사용이면 Ollama(41 tok/s), 팀 공유 서버면 vLLM(35.3 tok/s)&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SGLang은 DGX Spark의 GPU(SM 12.1)가 데이터센터 Blackwell(SM 100)과 다른 명령어 세트를 사용하여 구조적으로 동작하지 않는다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 배경: OpenClaw에 로컬 LLM이 필요한 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenClaw 같은 AI 코딩 어시스턴트를 업무에 쓰려면 LLM Provider가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 API(OpenAI, Anthropic 등)를 쓸 수도 있지만, 보안/비용/레이턴시를 고려하면 &lt;b&gt;로컬 LLM 서빙&lt;/b&gt;이 매력적인 선택지다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마침 NVIDIA DGX Spark가 있으니, 128GB 통합 메모리에 120B 파라미터 모델(&lt;code&gt;openai/gpt-oss-120b&lt;/code&gt;)을 올려서 OpenClaw의 로컬 Provider로 쓸 수 있는지 테스트해보기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 &lt;b&gt;어떤 추론 엔진(Provider)을 써야 하는가&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;후보는 세 가지:&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;후보&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;th&gt;기대&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Ollama&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;llama.cpp 기반, 설정 간편, 개인용&lt;/td&gt;
&lt;td&gt;빠르게 올려서 바로 쓰기 좋을 것&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;SGLang&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;LMSYS 개발, DGX Spark 공식 가이드 존재&lt;/td&gt;
&lt;td&gt;공식 지원이니 가장 안정적일 것&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;vLLM&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;NVIDIA 공식 Docker 이미지, 프로덕션급 서빙&lt;/td&gt;
&lt;td&gt;다중 사용자 대응에 유리할 것&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론부터 말하면, 예상과 달리 &lt;b&gt;SGLang은 DGX Spark에서 아예 동작하지 않았고&lt;/b&gt;, 그 과정에서 &quot;Blackwell&quot;이라는 이름 아래 숨어있는 하드웨어 아키텍처 차이(SM 100 vs SM 12.1)를 발견했다. 이 글은 그 선정 과정의 기록이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중요 배경&lt;/b&gt;: DGX Spark의 GB10 GPU는 &quot;Blackwell&quot;이라는 브랜드명을 공유하지만, 데이터센터 Blackwell(B200, SM 100)과는 &lt;b&gt;다른 명령어 세트(ISA)&lt;/b&gt;를 사용한다(SM 12.1). 이 차이가 SGLang 실패의 근본 원인이다. 자세한 내용은 &lt;a href=&quot;#b-docker-%ED%99%98%EA%B2%BD%EA%B3%BC-%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8C-%ED%99%98%EA%B2%BD%EC%9D%98-%EC%84%B1%EB%8A%A5-%EC%B0%A8%EC%9D%B4--%EC%99%9C-sglang%EC%9D%80-%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8C%EC%97%90%EC%84%9C-%EC%84%B1%EA%B3%B5%ED%95%98%EB%8A%94%EA%B0%80&quot;&gt;부록 B&lt;/a&gt;와 &lt;a href=&quot;#11-sm-12x-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EC%83%9D%ED%83%9C%EA%B3%84-%ED%98%84%ED%99%A9%EA%B3%BC-%ED%96%A5%ED%9B%84-%EB%B0%A9%ED%96%A5&quot;&gt;11장&lt;/a&gt; 참조.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 테스트 환경&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;하드웨어&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;사양&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;장치&lt;/td&gt;
&lt;td&gt;NVIDIA DGX Spark&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU&lt;/td&gt;
&lt;td&gt;NVIDIA GB10 (Blackwell, SM 12.1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;메모리&lt;/td&gt;
&lt;td&gt;128GB 통합 메모리 (CPU/GPU 공유)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;아키텍처&lt;/td&gt;
&lt;td&gt;aarch64 (ARM64)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;스토리지&lt;/td&gt;
&lt;td&gt;3.6TB NVMe&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;소프트웨어&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;버전&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;td&gt;Ubuntu (Linux 6.17.0-1008-nvidia)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NVIDIA Driver&lt;/td&gt;
&lt;td&gt;580.126.09&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CUDA&lt;/td&gt;
&lt;td&gt;13.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;td&gt;29.1.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker Compose&lt;/td&gt;
&lt;td&gt;v5.0.1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;모델&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;값&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;모델&lt;/td&gt;
&lt;td&gt;&lt;code&gt;openai/gpt-oss-120b&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;파라미터 수&lt;/td&gt;
&lt;td&gt;120B (MoE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;양자화&lt;/td&gt;
&lt;td&gt;MXFP4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모델 크기 (디스크)&lt;/td&gt;
&lt;td&gt;~65GB (safetensors)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;포맷&lt;/td&gt;
&lt;td&gt;HuggingFace safetensors&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 후보 1: Ollama &amp;mdash; &quot;일단 빠르게 올려보자&quot;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;구성&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;값&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Docker 이미지&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ghcr.io/open-webui/open-webui:ollama&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;엔진&lt;/td&gt;
&lt;td&gt;Ollama (llama.cpp 백엔드)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;양자화&lt;/td&gt;
&lt;td&gt;MXFP4 (네이티브 4-bit)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모델 크기&lt;/td&gt;
&lt;td&gt;~65 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;메모리 관리&lt;/td&gt;
&lt;td&gt;mmap (메모리 매핑)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;docker-compose.yml&lt;/h3&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;services:
  open-webui:
    image: ghcr.io/open-webui/open-webui:ollama
    container_name: open-webui
    restart: unless-stopped
    volumes:
      - /home/username/ollama-data:/root/.ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    ports:
      - &quot;3000:8080&quot;
      - &quot;11434:11434&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결과: 성공&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 시도에서 성공. OOM 없이 안정적으로 운영되었다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메모리 사용량 (안정 상태)&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;자원&lt;/th&gt;
&lt;th&gt;사용량&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPU (모델)&lt;/td&gt;
&lt;td&gt;~65 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU RAM&lt;/td&gt;
&lt;td&gt;~2 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;합계&lt;/td&gt;
&lt;td&gt;~67 GB / 128 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;여유&lt;/td&gt;
&lt;td&gt;~61 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ollama는 llama.cpp 기반으로 &lt;b&gt;mmap&lt;/b&gt;(메모리 매핑 파일)을 사용한다. 모델 가중치를 CPU RAM에 별도 로드하지 않고 디스크에서 직접 GPU 메모리로 매핑하므로, CPU RAM 사용량이 극히 낮다. 128GB 통합 메모리 환경에서 가장 효율적인 방식이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;성능 벤치마크&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;결과&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Decode 속도&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;~41 tok/s&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Prefill 속도&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;~1,169 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모델 로딩&lt;/td&gt;
&lt;td&gt;~5초 (cold start, mmap)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Ollama의 강점과 한계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;강점:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mmap 기반으로 통합 메모리 환경에서 OOM 위험이 거의 없다&lt;/li&gt;
&lt;li&gt;CPU RAM 오버헤드가 극히 낮다 (~2GB)&lt;/li&gt;
&lt;li&gt;설정이 간단하고 Docker에서도 안정적&lt;/li&gt;
&lt;li&gt;단일 사용자 기준으로 가장 빠른 토큰 생성 속도&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한계:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;llama.cpp는 &lt;b&gt;단일 사용자 중심&lt;/b&gt; 설계로, 동시 요청 처리 시 성능이 선형으로 감소&lt;/li&gt;
&lt;li&gt;PagedAttention, Continuous Batching 등 고급 서빙 기능이 없음&lt;/li&gt;
&lt;li&gt;KV 캐시 관리가 원시적이어서 다중 세션에서 비효율적&lt;/li&gt;
&lt;li&gt;OpenAI 호환 API 지원이 제한적 (reasoning/tool-call 파싱 미지원)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 후보 2: SGLang &amp;mdash; &quot;공식 가이드가 있으니 안정적이겠지&quot;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;구성&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;값&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Docker 이미지&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lmsysorg/sglang:spark&lt;/code&gt; (23.8GB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;엔진 버전&lt;/td&gt;
&lt;td&gt;SGLang (Spark 전용 빌드)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CUDA Capability&lt;/td&gt;
&lt;td&gt;12.1 (PyTorch 지원 범위 8.0~12.0 경고 발생)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;docker-compose.yml (최종 시도)&lt;/h3&gt;
&lt;pre class=&quot;haml&quot;&gt;&lt;code&gt;services:
  sglang:
    image: lmsysorg/sglang:spark
    container_name: sglang
    ipc: host
    shm_size: &quot;32g&quot;
    restart: unless-stopped
    volumes:
      - ~/.cache/huggingface:/root/.cache/huggingface
      - ~/tiktoken_encodings:/tiktoken_encodings
    environment:
      - HF_HUB_OFFLINE=1
      - TIKTOKEN_ENCODINGS_BASE=/tiktoken_encodings
    command: &amp;gt;
      python3 -m sglang.launch_server
      --model-path openai/gpt-oss-120b
      --host 0.0.0.0
      --port 30000
      --reasoning-parser gpt-oss
      --tool-call-parser gpt-oss&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시도 과정 및 결과&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;시도 1: &lt;code&gt;--attention-backend flashinfer&lt;/code&gt;&lt;/h4&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;AssertionError: GptOssForCausalLM requires one of
['triton', 'trtllm_mha', 'fa3', 'fa4'] attention backend,
but got flashinfer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT-OSS 모델은 &lt;code&gt;flashinfer&lt;/code&gt; 백엔드를 지원하지 않아 시작 단계에서 즉시 실패했다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;시도 2: &lt;code&gt;--attention-backend triton&lt;/code&gt;, &lt;code&gt;--mem-fraction-static 0.75&lt;/code&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델 가중치 15/15 샤드 로딩 성공&lt;/li&gt;
&lt;li&gt;GPU 메모리에 62.8GB 적재 완료&lt;/li&gt;
&lt;li&gt;이후 &lt;b&gt;triton 커널 JIT 컴파일&lt;/b&gt; 단계에서 CPU RAM이 급격히 증가&lt;/li&gt;
&lt;li&gt;CPU RAM: 3.8GB &amp;rarr; 14.7GB &amp;rarr; 26.7GB &amp;rarr; 35.8GB &amp;rarr; &lt;b&gt;51.2GB&lt;/b&gt; (20분간 지속 증가)&lt;/li&gt;
&lt;li&gt;최종적으로 &lt;b&gt;OOM Kill&lt;/b&gt; 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;Out of memory: Killed process 618610 (sglang::schedul)
total-vm: 155.5GB, anon-rss: 51.2GB&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OOM 시점의 메모리 상황:&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;자원&lt;/th&gt;
&lt;th&gt;사용량&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPU (모델 가중치)&lt;/td&gt;
&lt;td&gt;62.8 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU RAM (scheduler)&lt;/td&gt;
&lt;td&gt;51.2 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;합계&lt;/td&gt;
&lt;td&gt;~114 GB / 128 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;통합 메모리 풀의 한계(128GB)에 도달하여 커널이 프로세스를 강제 종료했다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;시도 3: &lt;code&gt;--mem-fraction-static 0.40&lt;/code&gt; (KV 캐시 축소)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리 비율을 0.75 &amp;rarr; 0.40으로 낮춰 재시도&lt;/li&gt;
&lt;li&gt;동일하게 triton 커널 컴파일 중 CPU RAM 폭주&lt;/li&gt;
&lt;li&gt;컨테이너 재시작 반복 (OOM &amp;rarr; restart &amp;rarr; OOM 루프)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;시도 4: 공식 LMSYS 가이드 준수 (attention-backend/mem-fraction 제거)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://lmsys.org/blog/2025-11-03-gpt-oss-on-nvidia-dgx-spark/&quot;&gt;LMSYS 공식 블로그&lt;/a&gt; 기반으로 불필요한 옵션 제거&lt;/li&gt;
&lt;li&gt;tiktoken 인코딩 사전 다운로드, &lt;code&gt;HF_HUB_OFFLINE=1&lt;/code&gt; 추가&lt;/li&gt;
&lt;li&gt;여전히 커널 컴파일 단계에서 CPU RAM이 32GB 이상으로 증가하며 불안정&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SGLang 실패 원인 분석&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;통합 메모리 구조의 한계&lt;/b&gt;: DGX Spark의 128GB는 CPU와 GPU가 공유하는 물리 메모리 풀이다. SGLang은 PyTorch 기반으로 GPU 메모리(모델 62.8GB)와 CPU 메모리(scheduler 50GB+)를 동시에 대량 소비하여 풀 전체를 고갈시킨다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;triton 커널 JIT 컴파일&lt;/b&gt;: MoE 모델의 triton 커널을 JIT 컴파일하는 과정에서 CPU RAM 사용량이 제어 없이 증가한다. 이 과정에서 로그 출력도 없어 진행 상황 파악이 불가능하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Docker 오버헤드&lt;/b&gt;: NVIDIA 포럼의 SGLang 성공 사례는 대부분 &lt;b&gt;네이티브 설치&lt;/b&gt;(uv venv)이며, Docker 환경에서의 성공 사례는 드물다. 컨테이너 런타임의 추가 메모리 오버헤드가 128GB 통합 메모리 환경에서는 치명적이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 후보 3: vLLM &amp;mdash; &quot;SGLang이 안 되니 대안을 찾자&quot;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;구성&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;값&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Docker 이미지&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nvcr.io/nvidia/vllm:26.01-py3&lt;/code&gt; (13.1GB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;엔진 버전&lt;/td&gt;
&lt;td&gt;vLLM v0.13.0 (nv26.01)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attention 백엔드&lt;/td&gt;
&lt;td&gt;TRITON_ATTN (자동 감지)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;양자화 백엔드&lt;/td&gt;
&lt;td&gt;Marlin (MXFP4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MoE 최적화&lt;/td&gt;
&lt;td&gt;separate CUDA stream for shared_experts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;docker-compose.yml&lt;/h3&gt;
&lt;pre class=&quot;haml&quot;&gt;&lt;code&gt;services:
  vllm:
    image: nvcr.io/nvidia/vllm:26.01-py3
    container_name: vllm
    ipc: host
    shm_size: &quot;32g&quot;
    restart: unless-stopped
    ulimits:
      memlock: -1
      stack: 67108864
    volumes:
      - ~/.cache/huggingface:/root/.cache/huggingface
      - ~/.cache/vllm:/root/.cache/vllm
      - ~/tiktoken_encodings:/tiktoken_encodings
    environment:
      - HF_HUB_OFFLINE=1
      - TIKTOKEN_ENCODINGS_BASE=/tiktoken_encodings
      - VLLM_USE_FLASHINFER_MXFP4_MOE=1
    command: &amp;gt;
      vllm serve openai/gpt-oss-120b
      --host 0.0.0.0
      --port 8000
      --trust-remote-code
      --async-scheduling
      --swap-space 16
      --max-model-len 32000
      --tensor-parallel-size 1
      --max-num-seqs 1024
      --gpu-memory-utilization 0.7&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시작 로그 (주요 단계)&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;V1 LLM engine (v0.13.0+faa43dbf.nv26.01)
quantization=mxfp4, dtype=torch.bfloat16, max_seq_len=32000
Using TRITON_ATTN attention backend
Using Marlin backend (MXFP4)
Enabled separate cuda stream for MoE shared_experts

Loading safetensors: 15/15 [06:32, 26.20s/it]
Loading weights took 393.18 seconds
Model loading took 65.97 GiB memory and 408.14 seconds

Available KV cache memory: 7.69 GiB
GPU KV cache size: 112,000 tokens
Maximum concurrency for 32,000 tokens per request: 6.55x

Graph capturing finished in 21 secs
init engine (profile, create kv cache, warmup model) took 77.09 seconds

Starting vLLM API server on http://0.0.0.0:8000&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결과: 성공&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 시도에서 성공적으로 서버가 가동되었다. OOM 없이 안정적으로 운영 가능했다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메모리 사용량 (안정 상태)&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;자원&lt;/th&gt;
&lt;th&gt;사용량&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPU (모델 + KV 캐시)&lt;/td&gt;
&lt;td&gt;84.7 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU RAM&lt;/td&gt;
&lt;td&gt;6.5 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;합계&lt;/td&gt;
&lt;td&gt;~91.2 GB / 128 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;여유&lt;/td&gt;
&lt;td&gt;~37 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;성능 벤치마크&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;테스트 1: 단순 질의&lt;/h4&gt;
&lt;pre class=&quot;scilab&quot;&gt;&lt;code&gt;curl http://localhost:30000/v1/chat/completions \
  -d '{&quot;model&quot;:&quot;openai/gpt-oss-120b&quot;,
       &quot;messages&quot;:[{&quot;role&quot;:&quot;user&quot;,&quot;content&quot;:&quot;What is 2+2? Answer briefly.&quot;}],
       &quot;max_tokens&quot;:50}'&lt;/code&gt;&lt;/pre&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;결과&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;응답&lt;/td&gt;
&lt;td&gt;&quot;4.&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prompt tokens&lt;/td&gt;
&lt;td&gt;79&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Completion tokens&lt;/td&gt;
&lt;td&gt;40 (reasoning 포함)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;응답 시간&lt;/td&gt;
&lt;td&gt;&lt;b&gt;1.73초&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;테스트 2: 긴 텍스트 생성&lt;/h4&gt;
&lt;pre class=&quot;scilab&quot;&gt;&lt;code&gt;curl http://localhost:30000/v1/chat/completions \
  -d '{&quot;model&quot;:&quot;openai/gpt-oss-120b&quot;,
       &quot;messages&quot;:[{&quot;role&quot;:&quot;user&quot;,&quot;content&quot;:&quot;Generate a long story about a robot learning to cook.&quot;}],
       &quot;max_tokens&quot;:512}'&lt;/code&gt;&lt;/pre&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;결과&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Prompt tokens&lt;/td&gt;
&lt;td&gt;84&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Completion tokens&lt;/td&gt;
&lt;td&gt;512&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;소요 시간&lt;/td&gt;
&lt;td&gt;14.49초&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;토큰 생성 속도&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;35.3 tokens/sec&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 세 후보 종합 비교&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;안정성&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;Ollama&lt;/th&gt;
&lt;th&gt;SGLang&lt;/th&gt;
&lt;th&gt;vLLM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Docker 이미지&lt;/td&gt;
&lt;td&gt;&lt;code&gt;open-webui:ollama&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lmsysorg/sglang:spark&lt;/code&gt; (23.8GB)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nvcr.io/nvidia/vllm:26.01-py3&lt;/code&gt; (13.1GB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;서버 가동&lt;/td&gt;
&lt;td&gt;&lt;b&gt;성공&lt;/b&gt; (첫 시도)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;실패&lt;/b&gt; (4회 OOM)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;성공&lt;/b&gt; (첫 시도)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OOM 발생&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;반복 (커널 강제 종료)&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU RAM 사용&lt;/td&gt;
&lt;td&gt;&lt;b&gt;~2 GB&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;30~51 GB (제어 불가)&lt;/td&gt;
&lt;td&gt;6.5 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU 메모리&lt;/td&gt;
&lt;td&gt;~65 GB&lt;/td&gt;
&lt;td&gt;62.8 GB (KV 캐시 전 OOM)&lt;/td&gt;
&lt;td&gt;84.7 GB (모델 + KV 캐시)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;메모리 여유&lt;/td&gt;
&lt;td&gt;&lt;b&gt;~61 GB&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;부족 (OOM)&lt;/td&gt;
&lt;td&gt;~37 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;초기화 시간&lt;/td&gt;
&lt;td&gt;&lt;b&gt;~5초&lt;/b&gt; (mmap)&lt;/td&gt;
&lt;td&gt;측정 불가 (OOM)&lt;/td&gt;
&lt;td&gt;~8분&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메모리 효율&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;Ollama&lt;/th&gt;
&lt;th&gt;SGLang&lt;/th&gt;
&lt;th&gt;vLLM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;런타임&lt;/td&gt;
&lt;td&gt;C++ (llama.cpp)&lt;/td&gt;
&lt;td&gt;Python (PyTorch)&lt;/td&gt;
&lt;td&gt;Python (PyTorch)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모델 로딩&lt;/td&gt;
&lt;td&gt;&lt;b&gt;mmap&lt;/b&gt; (디스크 직접 매핑)&lt;/td&gt;
&lt;td&gt;전체 로드&lt;/td&gt;
&lt;td&gt;PagedAttention + Marlin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KV 캐시 관리&lt;/td&gt;
&lt;td&gt;동적 (단순)&lt;/td&gt;
&lt;td&gt;고정 비율 사전 할당&lt;/td&gt;
&lt;td&gt;&lt;b&gt;PagedAttention&lt;/b&gt; (동적 페이지)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;통합 메모리 적합성&lt;/td&gt;
&lt;td&gt;&lt;b&gt;최적&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;부적합&lt;/td&gt;
&lt;td&gt;양호&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기능 비교&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;Ollama&lt;/th&gt;
&lt;th&gt;SGLang&lt;/th&gt;
&lt;th&gt;vLLM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI 호환 API&lt;/td&gt;
&lt;td&gt;△ (기본적)&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;&lt;b&gt;O&lt;/b&gt; (완전)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reasoning/Tool Call 파싱&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;&lt;b&gt;O&lt;/b&gt; (자동 감지)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chunked Prefill&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CUDA Graph&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prefix Caching&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Continuous Batching&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Async Scheduling&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;동시 요청 처리&lt;/td&gt;
&lt;td&gt;△ (성능 선형 감소)&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;&lt;b&gt;O&lt;/b&gt; (효율적)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;성능 비교 (Docker 환경, 단일 요청)&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;엔진&lt;/th&gt;
&lt;th&gt;토큰 생성 속도&lt;/th&gt;
&lt;th&gt;환경&lt;/th&gt;
&lt;th&gt;출처&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Ollama&lt;/b&gt; (Docker)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;41 tok/s&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;td&gt;&lt;b&gt;직접 테스트&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;vLLM&lt;/b&gt; (Docker)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;35.3 tok/s&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;td&gt;&lt;b&gt;직접 테스트&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SGLang (Docker)&lt;/td&gt;
&lt;td&gt;측정 불가 (OOM)&lt;/td&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;td&gt;&lt;b&gt;직접 테스트&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고: 네이티브 환경 벤치마크&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;엔진&lt;/th&gt;
&lt;th&gt;토큰 생성 속도&lt;/th&gt;
&lt;th&gt;출처&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;llama.cpp (네이티브)&lt;/td&gt;
&lt;td&gt;~60 tok/s&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://forums.developer.nvidia.com/t/run-sglang-in-spark/348863&quot;&gt;NVIDIA 포럼&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SGLang (네이티브)&lt;/td&gt;
&lt;td&gt;~52 tok/s&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://lmsys.org/blog/2025-11-03-gpt-oss-on-nvidia-dgx-spark/&quot;&gt;LMSYS 블로그&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vLLM (네이티브)&lt;/td&gt;
&lt;td&gt;~35 tok/s&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://forums.developer.nvidia.com/t/run-vllm-in-spark/348862&quot;&gt;NVIDIA 포럼&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네이티브 설치 환경에서도 llama.cpp 계열이 가장 빠르다. 이는 C++ 네이티브 구현 + mmap의 메모리 효율이 PyTorch 기반 엔진보다 DGX Spark의 통합 메모리 구조에 본질적으로 유리하기 때문이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 결론: OpenClaw Provider로 무엇을 골랐는가&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;왜 Ollama(llama.cpp)가 가장 빠른가 &amp;mdash; 통합 메모리 구조의 이해&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;일반 서버 vs DGX Spark &amp;mdash; 메모리 구조가 근본적으로 다르다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 GPU 서버(A100, H100 등)는 CPU 메모리(RAM)와 GPU 메모리(VRAM)가 &lt;b&gt;물리적으로 분리&lt;/b&gt;되어 있다. 각자 독립된 메모리 칩과 독립된 대역폭을 가진다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;[일반 서버]

  CPU ──── RAM (256GB, DDR5)          &amp;larr; CPU 전용, 서로 간섭 없음
            │
         PCIe 연결
            │
  GPU ──── VRAM (80GB, HBM3)         &amp;larr; GPU 전용, 서로 간섭 없음

  &amp;rarr; CPU가 RAM을 많이 써도 GPU VRAM 성능에 영향 없음&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DGX Spark(GB10)는 다르다. CPU와 GPU가 &lt;b&gt;하나의 물리 메모리(128GB)&lt;/b&gt;를 함께 쓴다. 마치 하나의 수도관을 두 집이 나눠 쓰는 것과 같다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;[DGX Spark &amp;mdash; 통합 메모리]

  CPU ────┐
          ├──── 128GB 통합 메모리 (LPDDR5x, 273 GB/s)
  GPU ────┘

  &amp;rarr; CPU가 RAM을 많이 쓰면, GPU가 쓸 수 있는 대역폭이 줄어든다&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;LLM 추론의 병목: 메모리 대역폭&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM이 토큰을 생성할 때, GPU는 모델 가중치(65GB)를 메모리에서 읽어온다. 이 과정은 &lt;b&gt;계산보다 메모리 읽기가 병목&lt;/b&gt;이다 (memory-bound). 즉, 메모리를 얼마나 빨리 읽느냐 = 토큰 생성 속도다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DGX Spark의 메모리 대역폭은 273 GB/s이다. 이론적 최대 토큰 생성 속도는:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;65GB 모델 &amp;divide; 273 GB/s = 0.238초/토큰 &amp;rarr; 이론상 한계 약 4.2 tok/s... 가 아니다.

MoE 모델이므로 토큰당 활성 파라미터는 5.1B뿐이다.
5.1B &amp;times; 0.5 byte(FP4) &amp;asymp; 2.55GB

2.55GB &amp;divide; 273 GB/s = 0.0093초/토큰 &amp;rarr; 이론상 한계 약 107 tok/s&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로는 어텐션, KV 캐시 접근, 커널 오버헤드 등으로 이론치보다 낮지만, &lt;b&gt;대역폭을 얼마나 순수하게 추론에 쓸 수 있느냐&lt;/b&gt;가 핵심이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;세 엔진이 메모리를 쓰는 방식의 차이&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Ollama (llama.cpp) &amp;mdash; mmap 방식:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;128GB 통합 메모리
┌────────────────────────────────────────────────┐
│  모델 가중치 (65GB)              │ OS (2GB) │   │
│  &amp;larr; GPU가 직접 읽음 (mmap)       │          │   │
│                                  │          │   │
│                                  │  여유     │   │
│                                  │  (61GB)  │   │
└────────────────────────────────────────────────┘
  273 GB/s 대역폭 &amp;rarr; 거의 전부 GPU 추론에 사용 가능&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mmap은 운영체제의 가상 메모리 기능으로, 파일을 메모리 주소에 매핑한다. 모델 파일을 별도로 &quot;로드&quot;하지 않고, GPU가 필요한 부분을 직접 읽는다. CPU가 중간에 개입하지 않으므로 CPU RAM 오버헤드가 거의 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;vLLM (PyTorch) &amp;mdash; 전통적 로딩 방식:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;128GB 통합 메모리
┌────────────────────────────────────────────────┐
│  GPU 영역:                       │  CPU 영역: │
│  모델 가중치 (66GB)              │  PyTorch   │
│  KV 캐시 (7.7GB)                │  런타임    │
│  CUDA 컨텍스트 등                 │  (6.5GB)   │
│                                  │            │
│  총 ~84.7GB                      │  여유 37GB │
└────────────────────────────────────────────────┘
  273 GB/s 대역폭 &amp;rarr; GPU와 CPU가 나눠 사용&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PyTorch는 모델을 CPU RAM에 로드한 뒤 GPU 메모리로 복사하는 과정이 필요하고, Python 런타임 + CUDA 컨텍스트 + KV 캐시 관리 자료구조 등이 CPU RAM을 소비한다. 통합 메모리에서는 이 CPU 영역이 GPU가 쓸 수 있는 공간과 대역폭을 줄인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SGLang (PyTorch + triton JIT) &amp;mdash; 메모리 폭주:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;128GB 통합 메모리
┌────────────────────────────────────────────────┐
│  GPU 영역:                  │  CPU 영역:       │
│  모델 가중치 (63GB)         │  PyTorch 런타임  │
│                             │  triton 컴파일   │
│                             │  중간 결과물     │
│                             │  (51GB+!!)       │
│                             │                  │
│  합계: 63 + 51 = 114GB      │  &amp;larr; 128GB 초과!  │
└────────────────────────────────────────────────┘
  &amp;rarr; OOM Kill (커널이 프로세스 강제 종료)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SGLang은 MoE 모델의 triton 커널을 실시간으로 컴파일(JIT)하면서 CPU RAM을 50GB 이상 소비했다. 통합 메모리의 128GB 한도를 초과하여 운영체제가 프로세스를 강제 종료했다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;결론: 같은 하드웨어, 다른 결과의 원인&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;엔진&lt;/th&gt;
&lt;th&gt;CPU RAM 사용&lt;/th&gt;
&lt;th&gt;GPU 가용 대역폭 비율&lt;/th&gt;
&lt;th&gt;토큰 생성 속도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Ollama&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;2 GB (1.6%)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;~98%&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;41 tok/s&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vLLM&lt;/td&gt;
&lt;td&gt;6.5 GB (5.1%)&lt;/td&gt;
&lt;td&gt;~90%&lt;/td&gt;
&lt;td&gt;35.3 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SGLang&lt;/td&gt;
&lt;td&gt;51+ GB (40%+)&lt;/td&gt;
&lt;td&gt;측정 불가 (OOM)&lt;/td&gt;
&lt;td&gt;OOM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 엔진 모두 같은 128GB 통합 메모리를 쓰지만, CPU가 차지하는 몫이 작을수록 GPU가 쓸 수 있는 대역폭이 많아지고, 그만큼 토큰을 빠르게 생성한다. Ollama는 CPU 오버헤드가 거의 없어서 가장 빠르고, SGLang은 CPU가 40% 이상을 삼키다 OOM으로 아예 실행이 불가능했다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;OpenClaw Provider 선정 결과&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 엔진의 테스트를 마치고, OpenClaw의 로컬 LLM Provider를 다음과 같이 선정했다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;시나리오&lt;/th&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;이유&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;개발자 1명 + OpenClaw 단독 사용&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Ollama&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;41 tok/s로 가장 빠름, 설정 간편, &lt;code&gt;docker compose up&lt;/code&gt; 한 줄로 끝&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;개발자 1명 + 여러 도구 병렬 사용&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;vLLM&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Continuous Batching으로 OpenClaw + 린터 + 자동완성 병렬 요청 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;팀(2명+) 공유 서버&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;vLLM&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;PagedAttention으로 동시 세션 메모리 효율, OpenAI 호환 API 완전 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;빠른 응답이 최우선&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Ollama&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;단일 요청 기준 16% 빠름 (41 vs 35.3 tok/s)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SGLang은 후보에서 탈락했다.&lt;/b&gt; DGX Spark(SM 12.1)에서 구조적으로 동작하지 않기 때문이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;왜 이 선택인가?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenClaw 같은 AI 코딩 어시스턴트의 핵심 사용 패턴은 &lt;b&gt;&quot;코드를 보여주고, 수정/생성을 요청하고, 결과를 받는&quot;&lt;/b&gt; 단방향 인터랙션이다. 한 번에 하나의 요청이 오가는 경우가 대부분이므로, &lt;b&gt;단일 요청 처리 속도(tok/s)&lt;/b&gt;가 가장 중요한 지표다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Ollama(41 tok/s)&lt;/b&gt;: llama.cpp 기반이라 동시 요청이 들어오면 순차 처리한다. 2번째 요청은 1번째가 끝날 때까지 대기한다. 하지만 개인 사용에서는 이게 문제가 되지 않고, 단일 요청 속도가 16% 빠르다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;vLLM(35.3 tok/s)&lt;/b&gt;: Continuous Batching으로 여러 요청을 GPU에서 동시 처리한다. 여러 도구가 LLM을 동시에 호출하거나, 팀원들이 서버를 공유하는 환경에서는 vLLM의 이점이 크다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;범용 참고: 용도별 권장 엔진&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;용도&lt;/th&gt;
&lt;th&gt;권장 엔진&lt;/th&gt;
&lt;th&gt;이유&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;개인 사용 (단일 사용자)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Ollama&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;가장 빠르고, 설정 간편, 메모리 효율 최고&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;API 서버 (다중 동시 요청)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;vLLM&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;PagedAttention, Continuous Batching으로 동시 처리 효율적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;최대 성능 (단일 사용자)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;llama.cpp 네이티브&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Docker 없이 ~60 tok/s 달성 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;최대 성능 (서버)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;SGLang 네이티브&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;~52 tok/s + 고급 서빙 기능 (Docker 환경에서는 비권장)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;핵심 정리&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;OpenClaw 개인 사용 &amp;rarr; Ollama(41 tok/s)&lt;/b&gt; &amp;mdash; 가장 빠르고, Docker 한 줄로 설정 완료&lt;/li&gt;
&lt;li&gt;&lt;b&gt;팀 공유/다중 도구 &amp;rarr; vLLM(35.3 tok/s)&lt;/b&gt; &amp;mdash; 동시 요청 처리에 최적화&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SGLang &amp;rarr; 탈락&lt;/b&gt; &amp;mdash; SM 12.x 소프트웨어 생태계 미성숙으로 Docker에서 구조적 불가&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&quot;Blackwell 최적화&quot;에 주의&lt;/b&gt; &amp;mdash; 대부분의 &quot;Blackwell 최적화&quot; 커널은 SM 100(B200) 전용이며 DGX Spark(SM 12.1)/RTX 5090(SM 12.0)에서는 동작하지 않음&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 부록: 기술 심화&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;A. vLLM과 SGLang의 MoE 커널 처리 방식 차이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT-OSS-120B는 MoE(Mixture-of-Experts) 모델이라, 토큰마다 120B 파라미터 중 5.1B만 활성화하는 라우팅 연산이 필요하다. 이 MoE 연산을 GPU에서 실행하려면 전용 커널이 필요한데, 두 엔진이 &lt;b&gt;다른 방식&lt;/b&gt;으로 이 커널을 확보한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;vLLM &amp;mdash; Marlin 커널 (사전 컴파일)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;MXFP4 가중치 &amp;rarr; Marlin 커널 (CUDA C++, Docker 이미지에 이미 컴파일 완료)
              &amp;rarr; 바로 실행 가능, 컴파일 과정 없음
              &amp;rarr; CPU RAM 거의 안 씀&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Marlin은 CUDA C++로 작성되어, Docker 이미지 빌드 시 &lt;b&gt;사전 컴파일&lt;/b&gt;되어 포함된다. 모델 로딩 시 추가 컴파일이 없다. 단, Marlin이 사전 컴파일되는 대상은 SM 80(Ampere) 이상의 범용 &lt;code&gt;mma.sync&lt;/code&gt; 명령어 기반이며, SM 100(데이터센터 Blackwell)의 &lt;code&gt;tcgen05&lt;/code&gt; 전용 커널과는 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SGLang &amp;mdash; triton 커널 (실시간 JIT 컴파일)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;MXFP4 가중치 &amp;rarr; triton 커널 (Python 코드)
              &amp;rarr; JIT 컴파일: Python &amp;rarr; LLVM IR &amp;rarr; PTX &amp;rarr; GPU 바이너리
              &amp;rarr; 컴파일 과정에서 CPU RAM 대량 소비 (51GB+)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;triton은 Python으로 GPU 커널을 작성하는 프레임워크다. 실행 시점에 LLVM 컴파일러가 감지된 GPU 아키텍처에 맞는 바이너리를 실시간 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단, triton은 SM 12.x(DGX Spark)를 SM 80(Ampere)으로 취급하여 모든 Blackwell 관련 최적화를 비활성화한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로는 Ampere 수준의 커널이 생성되지만, MoE 모델의 Expert 레이어가 많아 컴파일할 커널 수가 많고 LLVM 중간 결과물이 CPU RAM에 누적되는 것이 OOM의 원인이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;비교 요약:&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&amp;nbsp;&lt;/th&gt;
&lt;th&gt;Marlin (vLLM)&lt;/th&gt;
&lt;th&gt;triton (SGLang)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;커널 작성 언어&lt;/td&gt;
&lt;td&gt;CUDA C++ (저수준)&lt;/td&gt;
&lt;td&gt;Python (고수준)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;컴파일 시점&lt;/td&gt;
&lt;td&gt;Docker 이미지 빌드 시 (사전)&lt;/td&gt;
&lt;td&gt;모델 로딩 시 (실시간 JIT)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;컴파일 CPU RAM&lt;/td&gt;
&lt;td&gt;0 (이미 완료)&lt;/td&gt;
&lt;td&gt;51GB+ (실시간)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SM 12.1 대응&lt;/td&gt;
&lt;td&gt;범용 &lt;code&gt;mma.sync&lt;/code&gt; 기반 (사전 컴파일)&lt;/td&gt;
&lt;td&gt;Ampere(SM 80) 호환 모드로 JIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;장점&lt;/td&gt;
&lt;td&gt;즉시 실행, 메모리 안정&lt;/td&gt;
&lt;td&gt;다양한 GPU에 자동 대응, 유연성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;단점&lt;/td&gt;
&lt;td&gt;SM 100 전용 최적화 미포함&lt;/td&gt;
&lt;td&gt;JIT 컴파일에 시간 + 메모리 대량 소비&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SGLang이 triton을 쓰는 이유는 &lt;b&gt;유연성&lt;/b&gt; 때문이다. JIT 컴파일은 다양한 GPU에 자동 대응 가능하므로 별도 빌드 없이 새로운 하드웨어를 지원할 수 있다. 반면 Marlin은 CUDA C++ 사전 컴파일이라 지원 GPU마다 별도 빌드가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, &lt;b&gt;DGX Spark(SM 12.1)에서는 triton도 Blackwell 전용 최적화를 적용하지 않으므로, &quot;JIT이라서 더 최적화된 커널을 생성한다&quot;는 주장은 성립하지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;B. Docker 환경과 네이티브 환경의 성능 차이 &amp;mdash; 왜 SGLang은 네이티브에서 성공하는가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NVIDIA 포럼 벤치마크에서 네이티브 SGLang은 ~52 tok/s를 달성했다. 같은 DGX Spark에서 Docker SGLang은 OOM으로 실행조차 안 됐다. 이 차이의 원인은 &lt;b&gt;Docker 자체의 성능 오버헤드가 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 원인은 &lt;b&gt;triton 커널 캐시&lt;/b&gt;에 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;네이티브 환경에서 SGLang이 성공하는 과정:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;[1회차 실행]
  sudo sysctl -w vm.drop_caches=3          &amp;larr; 시스템 캐시를 비워 메모리 확보
  python3 -m sglang.launch_server ...
  &amp;rarr; triton JIT 컴파일 시작
  &amp;rarr; CPU RAM 50GB+ 소비 (아슬아슬하지만, 캐시를 비운 덕에 128GB 내에서 가능)
  &amp;rarr; 컴파일된 커널을 ~/.triton/cache/ 에 디스크 저장
  &amp;rarr; 이후 정상 서빙

[2회차 이후]
  python3 -m sglang.launch_server ...
  &amp;rarr; ~/.triton/cache/ 에서 컴파일된 커널을 바로 로드
  &amp;rarr; JIT 컴파일 건너뜀
  &amp;rarr; CPU RAM 소비 최소
  &amp;rarr; 빠르게 시작&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 triton이 컴파일 결과를 &lt;b&gt;디스크에 캐시&lt;/b&gt;한다는 점이다. 네이티브 환경에서는:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;code&gt;vm.drop_caches=3&lt;/code&gt;으로 시스템 캐시를 비워 triton 컴파일에 필요한 메모리를 확보&lt;/li&gt;
&lt;li&gt;1회차 컴파일이 성공하면 &lt;code&gt;~/.triton/cache/&lt;/code&gt;에 바이너리가 저장&lt;/li&gt;
&lt;li&gt;2회차부터는 캐시된 커널을 로드하므로 JIT 컴파일 자체가 발생하지 않음&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Docker에서 실패하는 이유:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;[매번 docker compose up]
  &amp;rarr; 컨테이너 파일시스템 초기화 (이전 triton 캐시 없음)
  &amp;rarr; triton JIT 컴파일을 매번 처음부터 수행
  &amp;rarr; CPU RAM 51GB+ 소비
  &amp;rarr; 128GB 통합 메모리 한도 초과 &amp;rarr; OOM Kill
  &amp;rarr; restart &amp;rarr; 같은 상황 반복 (캐시 없으므로 다시 JIT) &amp;rarr; 무한 OOM 루프&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker 컨테이너는 재시작할 때마다 파일시스템이 초기화되므로, triton 캐시가 유지되지 않는다. 매번 JIT 컴파일을 처음부터 해야 하고, 매번 OOM이 발생한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결 가능성&lt;/b&gt;: Docker에서도 triton 캐시 디렉토리를 호스트에 마운트(&lt;code&gt;-v ~/.triton/cache:/root/.triton/cache&lt;/code&gt;)하면, 1회차 컴파일만 성공하면 이후에는 캐시를 재사용할 수 있다. 다만 1회차 컴파일 자체가 통합 메모리 128GB에서 OOM이 나는 문제가 먼저 해결되어야 하므로, &lt;code&gt;vm.drop_caches=3&lt;/code&gt; 등 수동 메모리 확보가 선행되어야 한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그렇다면 네이티브 SGLang은 왜 vLLM보다 빠른가?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NVIDIA 포럼에서 보고된 네이티브 SGLang ~52 tok/s vs vLLM ~35 tok/s 차이의 정확한 원인은 &lt;b&gt;현 시점에서 확정할 수 없다.&lt;/b&gt; 초기에 &quot;triton JIT이 Blackwell에 완벽히 최적화된 커널을 생성하기 때문&quot;이라고 기술했으나, 이는 사실과 다른 것으로 밝혀졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;del&gt;이전 분석 (오류)&lt;/del&gt;&lt;/b&gt;:&lt;/p&gt;
&lt;p&gt;&lt;del&gt;triton JIT이 Blackwell 전용 명령어(&lt;code&gt;tcgen05&lt;/code&gt;)를 사용하여 Marlin보다 최적화된 커널을 생성한다.&lt;/del&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정정&lt;/b&gt;: GB10(SM 12.1)은 데이터센터 Blackwell(SM 100)과 다른 명령어 세트를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SM 12.1은 &lt;code&gt;tcgen05&lt;/code&gt;와 TMEM이 없으며, 확장된 &lt;code&gt;mma.sync&lt;/code&gt;(Ampere 방식)을 사용한다. &lt;b&gt;triton은 SM 12.x를 SM 80(Ampere)으로 취급하여 Blackwell 관련 최적화를 전혀 적용하지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Marlin도 마찬가지로 SM 100 전용 최적화가 아닌 범용 &lt;code&gt;mma.sync&lt;/code&gt; 기반으로 동작한다. 즉, &lt;b&gt;triton과 Marlin 모두 SM 12.1에서는 동일한 하드웨어 제약 아래에 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 vLLM에서도 아래 경고가 출력되었는데:&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Your GPU does not have native support for FP4 computation
but FP4 quantization is being used.
Weight-only FP4 compression will be used leveraging the Marlin kernel.
This may degrade performance for compute-heavy workloads.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경고는 정확하다. GB10(SM 12.1)은 SM 100의 &lt;code&gt;tcgen05&lt;/code&gt; 기반 네이티브 FP4 연산을 지원하지 않으므로, Marlin은 weight-only 압축으로 우회한다. &lt;b&gt;그런데 triton도 SM 12.1을 Ampere로 취급하므로, triton 역시 네이티브 FP4를 사용하지 못한다.&lt;/b&gt; 두 엔진 모두 같은 제약 아래에 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네이티브 SGLang이 vLLM보다 빠른 가능한 원인 (추정, 검증 필요):&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;MoE 라우팅/스케줄링 최적화 차이&lt;/b&gt;: SGLang의 &lt;code&gt;triton_kernels&lt;/code&gt; 패키지가 MoE Expert 라우팅에 특화된 최적화(메모리 접근 패턴, Expert 배치 전략 등)를 포함할 수 있음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스케줄러 아키텍처 차이&lt;/b&gt;: SGLang의 zero-overhead batch scheduler와 RadixAttention이 vLLM의 V1 엔진 스케줄러보다 단일 요청 처리에 유리할 수 있음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CUDA Graph 최적화 차이&lt;/b&gt;: 두 엔진의 CUDA Graph 캡처 범위와 전략이 다를 수 있음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;소프트웨어 버전/설정 차이&lt;/b&gt;: NVIDIA 포럼의 벤치마크는 서로 다른 시점, 다른 설정으로 수행되었을 수 있어 엄밀한 비교가 아닐 수 있음&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;최종 정리:&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;환경&lt;/th&gt;
&lt;th&gt;SGLang&lt;/th&gt;
&lt;th&gt;vLLM&lt;/th&gt;
&lt;th&gt;차이 원인&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;네이티브&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;52 tok/s&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;35 tok/s&lt;/td&gt;
&lt;td&gt;MoE 스케줄링/커널 전략 차이 (추정)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Docker&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;OOM (실패)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;35.3 tok/s&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;triton 캐시 미유지 &amp;rarr; 매번 JIT &amp;rarr; OOM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker 환경 vs 네이티브 환경의 차이는 &lt;b&gt;성능 오버헤드가 아니라, triton 커널 캐시의 영속성&lt;/b&gt; 문제다. vLLM은 사전 컴파일된 Marlin을 쓰므로 Docker/네이티브 간 성능 차이가 없다(둘 다 ~35 tok/s). SGLang은 triton JIT에 의존하므로 캐시가 유지되는 네이티브에서만 제 성능을 발휘한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중요 보충 &amp;mdash; SM 12.1은 &quot;데이터센터 Blackwell&quot;이 아니다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DGX Spark의 GB10은 &quot;Blackwell&quot;이라는 이름을 공유하지만, B200/GB200(SM 100)과는 &lt;b&gt;완전히 다른 명령어 세트&lt;/b&gt;를 가진다. &lt;a href=&quot;https://www.backend.ai/blog/2026-02-is-dgx-spark-actually-a-blackwell&quot;&gt;Backend.AI 기술 블로그&lt;/a&gt; 분석에 따르면:&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&amp;nbsp;&lt;/th&gt;
&lt;th&gt;SM 100 (B200, 데이터센터)&lt;/th&gt;
&lt;th&gt;SM 12.1 (GB10, DGX Spark)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;텐서코어 명령어&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tcgen05&lt;/code&gt; (5세대 전용)&lt;/td&gt;
&lt;td&gt;확장된 &lt;code&gt;mma.sync&lt;/code&gt; (Ampere 방식)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TMEM&lt;/td&gt;
&lt;td&gt;256 KB/SM&lt;/td&gt;
&lt;td&gt;&lt;b&gt;없음&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WGMMA&lt;/td&gt;
&lt;td&gt;지원&lt;/td&gt;
&lt;td&gt;&lt;b&gt;미지원&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FP4 하드웨어&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tcgen05&lt;/code&gt; 네이티브&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mma.sync&lt;/code&gt; 확장 (제한적)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;공유 메모리/SM&lt;/td&gt;
&lt;td&gt;228 KB&lt;/td&gt;
&lt;td&gt;128 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SM 100은 텐서코어를 자율적 연산 유닛으로 만들었고(TMEM + tcgen05), SM 12.x는 Ampere의 &lt;code&gt;mma.sync&lt;/code&gt; 위에 새로운 데이터 타입(FP4, FP6)만 추가한 것이다. &quot;Blackwell&quot;이라는 마케팅 이름은 같지만, 커널 개발자 입장에서는 Hopper(SM 90), 데이터센터 Blackwell(SM 100), 소비자/엣지 Blackwell(SM 12.x) 세 가지 별도 코드패스를 유지해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 사실은 DGX Spark에서 LLM 추론 엔진을 평가할 때 &quot;Blackwell 최적화&quot;라는 표현에 주의해야 함을 의미한다. 대부분의 &quot;Blackwell 최적화&quot; 커널(FlashMLA, FA4, FlashInfer SM100 등)은 SM 100 대상이며, SM 12.1에서는 동작하지 않는다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;C. SGLang의 MoE 커널 백엔드 옵션 &amp;mdash; triton 이외의 선택지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SGLang은 &lt;code&gt;--moe-runner-backend&lt;/code&gt; 옵션으로 MoE 커널 백엔드를 수동 선택할 수 있다. &lt;a href=&quot;https://github.com/sgl-project/sglang/blob/main/docs/advanced_features/server_arguments.md&quot;&gt;SGLang 서버 인자 문서&lt;/a&gt; 참조.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;옵션&lt;/th&gt;
&lt;th&gt;백엔드&lt;/th&gt;
&lt;th&gt;JIT 필요&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;auto&lt;/code&gt; (기본값)&lt;/td&gt;
&lt;td&gt;자동 선택&lt;/td&gt;
&lt;td&gt;모델에 따라 다름&lt;/td&gt;
&lt;td&gt;GPT-OSS 감지 시 &lt;code&gt;triton_kernel&lt;/code&gt; 자동 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;triton&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Triton&lt;/td&gt;
&lt;td&gt;&lt;b&gt;예&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;범용 triton JIT 커널&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;triton_kernel&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;triton_kernels 패키지&lt;/td&gt;
&lt;td&gt;&lt;b&gt;예&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;GPT-OSS 자동 선택 대상, OOM 원인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;deep_gemm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DeepGEMM&lt;/td&gt;
&lt;td&gt;예&lt;/td&gt;
&lt;td&gt;SM90+(Hopper/Blackwell) JIT 커널&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;flashinfer_cutlass&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;FlashInfer CUTLASS&lt;/td&gt;
&lt;td&gt;&lt;b&gt;아니오&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;사전 컴파일, 범용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;flashinfer_trtllm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;FlashInfer TRT-LLM&lt;/td&gt;
&lt;td&gt;&lt;b&gt;아니오&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;사전 컴파일, TensorRT 기반&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;flashinfer_mxfp4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;FlashInfer MXFP4&lt;/td&gt;
&lt;td&gt;&lt;b&gt;아니오&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;사전 컴파일, MXFP4 전용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cutlass&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CUTLASS&lt;/td&gt;
&lt;td&gt;&lt;b&gt;아니오&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;사전 컴파일, NVIDIA 공식&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 테스트에서 SGLang 로그에 아래가 출력되었다:&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;WARNING server_args.py:979: Detected GPT-OSS model, enabling triton_kernels MOE kernel.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT-OSS 모델이 감지되면 &lt;code&gt;--moe-runner-backend&lt;/code&gt;를 &lt;b&gt;&lt;code&gt;triton_kernel&lt;/code&gt;로 강제 설정&lt;/b&gt;한다. 이것이 triton JIT 컴파일을 유발하고, 통합 메모리 128GB 환경에서 OOM의 직접적인 원인이 되었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Docker에서 SGLang OOM을 회피할 수 있었는가?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이론적으로 &lt;code&gt;--moe-runner-backend flashinfer_mxfp4&lt;/code&gt;를 명시하면, GPT-OSS 자동 감지를 우회하고 사전 컴파일된 FlashInfer MXFP4 커널을 사용할 수 있다. 이 경우 triton JIT가 발생하지 않으므로 OOM을 회피할 가능성이 있다.&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;command: &amp;gt;
  python3 -m sglang.launch_server
  --model-path openai/gpt-oss-120b
  --host 0.0.0.0
  --port 30000
  --moe-runner-backend flashinfer_mxfp4
  --reasoning-parser gpt-oss
  --tool-call-parser gpt-oss&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추가 실험 결과 (2026-02-25)&lt;/b&gt;: 실제로 &lt;code&gt;--moe-runner-backend flashinfer_mxfp4&lt;/code&gt;를 적용하여 테스트했다. MoE 커널 자체는 &lt;code&gt;flashinfer_mxfp4&lt;/code&gt;로 정상 설정되었으나, &lt;b&gt;attention 백엔드가 여전히 &lt;code&gt;triton&lt;/code&gt;으로 동작&lt;/b&gt;하여 attention 커널의 triton JIT 컴파일이 CPU RAM을 소비했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 추이:&lt;/p&gt;
&lt;table style=&quot;height: 128px;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr style=&quot;height: 23px;&quot;&gt;
&lt;th style=&quot;height: 23px;&quot;&gt;&lt;s&gt;시점 (컨테이너 시작 후)&lt;/s&gt;&lt;/th&gt;
&lt;th style=&quot;height: 23px;&quot;&gt;&lt;s&gt;RAM 사용&lt;/s&gt;&lt;/th&gt;
&lt;th style=&quot;height: 23px;&quot;&gt;&lt;s&gt;Swap 사용&lt;/s&gt;&lt;/th&gt;
&lt;th style=&quot;height: 23px;&quot;&gt;&lt;s&gt;합계&lt;/s&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;s&gt;1분&lt;/s&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;s&gt;85 GB&lt;/s&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;s&gt;0.3 GB&lt;/s&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;s&gt;85 GB&lt;/s&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;s&gt;2분&lt;/s&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;s&gt;90 GB&lt;/s&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;s&gt;1.3 GB&lt;/s&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;s&gt;91 GB&lt;/s&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;s&gt;3분&lt;/s&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;s&gt;98 GB&lt;/s&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;s&gt;3 GB&lt;/s&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;s&gt;101 GB&lt;/s&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;s&gt;4분&lt;/s&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;s&gt;102 GB&lt;/s&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;s&gt;12 GB&lt;/s&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;s&gt;114 GB&lt;/s&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;s&gt;4분 30초&lt;/s&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;s&gt;104 GB&lt;/s&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;s&gt;12 GB&lt;/s&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;s&gt;116 GB&lt;/s&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;Swap 15GB 한도 초과 직전에 수동으로 컨테이너를 종료하여 OOM Kill은 피했으나, 결론적으로 &lt;b&gt;MoE 커널만 flashinfer_mxfp4로 바꿔서는 OOM을 회피할 수 없다.&lt;/b&gt; attention 백엔드의 triton JIT도 상당한 CPU RAM을 소비하기 때문이다.&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DGX Spark의 통합메모리에서 swap-space 파라미터는 오히려 독이된다. 아무생각없이 했다가 나중에 아차 했다. 소프트웨어 레벨의 swap-space가 동작하면, &lt;b data-index-in-node=&quot;32&quot; data-path-to-node=&quot;10,1,0&quot;&gt;똑같은 물리 메모리 주소 내에서 데이터를 복사&lt;/b&gt;하는 불필요한 연산이 발생하며 CPU 사이클만 낭비하게된다. 이 글의 이후 swap-space 관련 내용은 무시하면된다...&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;sglang:spark&lt;/code&gt; 이미지에서 &lt;code&gt;triton&lt;/code&gt; 대신 사용 가능한 attention 백엔드가 없는 상태이므로, SGLang Docker에서 triton JIT를 완전히 회피하는 것은 현시점에서 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT-OSS 모델이 지원하는 attention 백엔드는 &lt;code&gt;['triton', 'trtllm_mha', 'fa3', 'fa4']&lt;/code&gt; 4가지뿐인데, SM 12.1에서의 상태는 다음과 같다:&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;백엔드&lt;/th&gt;
&lt;th&gt;SM 12.1 지원&lt;/th&gt;
&lt;th&gt;테스트 결과&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;triton&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ampere(SM 80)로 동작&lt;/td&gt;
&lt;td&gt;JIT 컴파일 &amp;rarr; OOM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;trtllm_mha&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;SM 100 전용&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ValueError: TRTLLM MHA backend is only supported on Blackwell GPUs (SM100)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fa3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;import 실패&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Can not import FA3 in sgl_kernel&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fa4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;SM 100 전용&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;시도 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추가 실험 (2026-02-25)&lt;/b&gt;: &lt;code&gt;--attention-backend trtllm_mha --moe-runner-backend flashinfer_mxfp4&lt;/code&gt; 조합으로 triton JIT를 완전히 회피하려 시도했으나, &lt;code&gt;trtllm_mha&lt;/code&gt;가 SM 100 전용이라 즉시 에러로 실패했다.&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;ValueError: TRTLLM MHA backend is only supported on Blackwell GPUs (SM100).
Please use a different backend.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론: GPT-OSS 모델이 지원하는 4개 attention 백엔드 중 SM 12.1에서 동작하는 것은 &lt;code&gt;triton&lt;/code&gt;뿐이고, triton은 JIT 컴파일로 OOM을 유발한다. &lt;b&gt;SGLang Docker + GPT-OSS + SM 12.1 조합은 현시점에서 구조적으로 불가능하다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;향후 &lt;code&gt;sglang:spark&lt;/code&gt; 이미지에 SM 12.1 호환 attention 커널(예: cuDNN SDPA 기반)이 추가되면 상황이 달라질 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;MXFP4 관련 추가 옵션&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SGLang은 FP4 GEMM 백엔드도 별도로 선택할 수 있다 (&lt;code&gt;--fp4-gemm-backend&lt;/code&gt;):&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;옵션&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;flashinfer_cutlass&lt;/code&gt; (기본값)&lt;/td&gt;
&lt;td&gt;FlashInfer CUTLASS, 범용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;flashinfer_cudnn&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;cuDNN 9.15+ 필요, CUDA 13+에서 최적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;flashinfer_trtllm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TensorRT-LLM 백엔드, 가중치 셔플링 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DGX Spark는 CUDA 13.0이므로 &lt;code&gt;flashinfer_cudnn&lt;/code&gt;이 최적일 수 있으나, cuDNN 버전 요구사항(&lt;code&gt;9.15+&lt;/code&gt;)을 &lt;code&gt;sglang:spark&lt;/code&gt; 이미지가 충족하는지 확인이 필요하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 참고 자료&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://lmsys.org/blog/2025-11-03-gpt-oss-on-nvidia-dgx-spark/&quot;&gt;LMSYS - Optimizing GPT-OSS on DGX Spark&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://forums.developer.nvidia.com/t/run-sglang-in-spark/348863&quot;&gt;NVIDIA Forum - Run SGLang in Spark&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://forums.developer.nvidia.com/t/run-vllm-in-spark/348862&quot;&gt;NVIDIA Forum - Run vLLM in Spark&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://build.nvidia.com/spark/vllm&quot;&gt;NVIDIA - vLLM for Inference on DGX Spark&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sgl-project/sglang/blob/main/docs/advanced_features/server_arguments.md&quot;&gt;SGLang Server Arguments Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.backend.ai/blog/2026-02-is-dgx-spark-actually-a-blackwell&quot;&gt;Backend.AI - Inside NVIDIA DGX Spark: Is DGX Spark Actually Blackwell?&lt;/a&gt; &amp;mdash; SM 100 vs SM 12.x 아키텍처 차이 상세 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. 작업 로그: 테스트 진행 과정 기록&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 섹션은 실제 테스트를 진행하면서 겪은 시행착오, 의사결정 과정, 트러블슈팅 흐름을 시간순으로 기록한 것이다. 단순한 결과 비교보다 &quot;왜 이 결론에 도달했는가&quot;를 이해하는 데 도움이 된다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Phase 1: SGLang Docker 환경 구성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표&lt;/b&gt;: DGX Spark에서 &lt;code&gt;openai/gpt-oss-120b&lt;/code&gt;를 SGLang Docker로 서빙&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로젝트 구조&lt;/b&gt;:&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;/home/username/projects/sglang/gpt-oss-120b/
├── docker-compose.yml
└── .env&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;초기 docker-compose.yml 구성&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지: &lt;code&gt;lmsysorg/sglang:spark&lt;/code&gt; (23.8GB, DGX Spark 전용 빌드)&lt;/li&gt;
&lt;li&gt;모델: &lt;code&gt;openai/gpt-oss-120b&lt;/code&gt; (HuggingFace 캐시에서 로드)&lt;/li&gt;
&lt;li&gt;attention-backend: &lt;code&gt;flashinfer&lt;/code&gt; (초기 선택)&lt;/li&gt;
&lt;li&gt;mem-fraction-static: &lt;code&gt;0.75&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;볼륨: &lt;code&gt;~/.cache/huggingface&lt;/code&gt; 마운트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;code&gt;--ipc host&lt;/code&gt; 필요 여부에 대한 검토&lt;/b&gt;: 초기에는 &lt;code&gt;ipc: host&lt;/code&gt;를 포함하지 않았으나, 이후 LMSYS 공식 가이드를 참고하여 PyTorch의 GPU 간 통신(실제로는 단일 GPU지만 내부 IPC)을 위해 추가했다. &lt;code&gt;shm_size: &quot;32g&quot;&lt;/code&gt; 설정과 함께 사용하면 컨테이너 내 공유 메모리 부족 문제를 예방할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Phase 2: SGLang 트러블슈팅 (4회 연속 실패)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;시도 1 &amp;mdash; flashinfer 비호환&lt;/h4&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉시 실패. 로그 확인 결과:&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;AssertionError: GptOssForCausalLM requires one of
['triton', 'trtllm_mha', 'fa3', 'fa4'] attention backend,
but got flashinfer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원인&lt;/b&gt;: GPT-OSS 모델 아키텍처는 &lt;code&gt;flashinfer&lt;/code&gt; attention 백엔드를 지원하지 않는다.&lt;br /&gt;&lt;b&gt;조치&lt;/b&gt;: &lt;code&gt;--attention-backend triton&lt;/code&gt;으로 변경&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;시도 2 &amp;mdash; triton JIT 중 OOM (mem-fraction 0.75)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 가중치 15/15 샤드 로딩까지 성공. GPU에 62.8GB 적재 완료. 이후 triton 커널 JIT 컴파일 단계에서 CPU RAM이 20분에 걸쳐 3.8GB &amp;rarr; 51.2GB까지 증가. 최종적으로 OOM Kill 발생:&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;Out of memory: Killed process 618610 (sglang::schedul)
total-vm: 155.5GB, anon-rss: 51.2GB&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;분석&lt;/b&gt;: &lt;code&gt;journalctl -k&lt;/code&gt; 로 OOM Kill 이벤트 확인. &lt;code&gt;nvidia-smi&lt;/code&gt;로 GPU 메모리 62.8GB 사용 확인. CPU RAM 51.2GB + GPU 62.8GB = 약 114GB로, 128GB 통합 메모리 한도에 근접.&lt;br /&gt;&lt;b&gt;조치&lt;/b&gt;: &lt;code&gt;--mem-fraction-static&lt;/code&gt;을 0.75 &amp;rarr; 0.40으로 낮춤 (GPU 쪽 할당 축소)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;시도 3 &amp;mdash; mem-fraction 0.40에서도 OOM&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;KV 캐시 비율을 줄였으나, OOM의 원인은 KV 캐시가 아니라 &lt;b&gt;triton JIT 컴파일의 CPU RAM 소비&lt;/b&gt;였으므로 효과 없음. 동일한 OOM &amp;rarr; restart &amp;rarr; OOM 무한 루프 발생.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 발견&lt;/b&gt;: 이 시점에서 &quot;메모리 부족은 GPU 측이 아니라 CPU 측 문제&quot;라는 것을 확인. triton의 LLVM 컴파일러가 MoE 모델의 Expert 커널을 컴파일하면서 CPU RAM을 제어 불가 수준으로 소비하고 있었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;시도 4 &amp;mdash; LMSYS 공식 가이드 기반 재구성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://lmsys.org/blog/2025-11-03-gpt-oss-on-nvidia-dgx-spark/&quot;&gt;LMSYS 블로그&lt;/a&gt;를 참고하여 전면 재구성:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;--attention-backend&lt;/code&gt;, &lt;code&gt;--mem-fraction-static&lt;/code&gt; 옵션 제거 (자동 선택)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ipc: host&lt;/code&gt;, &lt;code&gt;shm_size: &quot;32g&quot;&lt;/code&gt; 추가&lt;/li&gt;
&lt;li&gt;tiktoken 인코딩 파일 사전 다운로드 (&lt;code&gt;o200k_base.tiktoken&lt;/code&gt;, &lt;code&gt;cl100k_base.tiktoken&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HF_HUB_OFFLINE=1&lt;/code&gt; 추가 (HF_TOKEN 한글 placeholder로 인한 &lt;code&gt;UnicodeEncodeError&lt;/code&gt; 회피)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--reasoning-parser gpt-oss&lt;/code&gt;, &lt;code&gt;--tool-call-parser gpt-oss&lt;/code&gt; 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;UnicodeEncodeError 에피소드&lt;/b&gt;: &lt;code&gt;.env&lt;/code&gt; 파일의 HF_TOKEN이 &lt;code&gt;hf_여기에_토큰_입력&lt;/code&gt;(한글 placeholder)으로 설정되어 있어, HuggingFace Hub 인증 시 &lt;code&gt;latin-1&lt;/code&gt; 인코딩 에러가 발생했다. &lt;code&gt;HF_HUB_OFFLINE=1&lt;/code&gt;로 네트워크 접근 자체를 차단하여 해결.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과: 여전히 triton JIT 컴파일 중 CPU RAM 32GB+ 증가, OOM 불안정.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;SGLang 최종 판단&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4회 연속 실패 후 &lt;b&gt;SGLang Docker를 포기&lt;/b&gt;하기로 결정. 핵심 원인 정리:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;MoE 모델에 대해 &lt;code&gt;triton_kernel&lt;/code&gt; 백엔드가 자동 선택 (강제)&lt;/li&gt;
&lt;li&gt;triton JIT 컴파일이 CPU RAM 50GB+ 소비&lt;/li&gt;
&lt;li&gt;통합 메모리 128GB에서 GPU(63GB) + CPU(51GB) = 114GB &amp;rarr; OOM&lt;/li&gt;
&lt;li&gt;Docker 컨테이너 재시작 시 triton 캐시 소멸 &amp;rarr; 매번 JIT 반복&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Phase 3: Ollama와의 비교 &amp;mdash; &quot;왜 Ollama는 문제없었나?&quot;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SGLang의 반복 OOM 중, 이전에 같은 DGX Spark에서 Ollama로 동일 모델을 성공적으로 서빙했던 경험과 비교 질문이 제기되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Ollama는 왜 OOM이 없었는가?&lt;/b&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;Ollama&lt;/th&gt;
&lt;th&gt;SGLang&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;백엔드&lt;/td&gt;
&lt;td&gt;llama.cpp (C++)&lt;/td&gt;
&lt;td&gt;PyTorch + triton (Python)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모델 로딩&lt;/td&gt;
&lt;td&gt;mmap (디스크 &amp;rarr; 메모리 직접 매핑)&lt;/td&gt;
&lt;td&gt;safetensors 전체 로드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU RAM 사용&lt;/td&gt;
&lt;td&gt;~2GB (최소)&lt;/td&gt;
&lt;td&gt;51GB+ (JIT 컴파일)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JIT 컴파일&lt;/td&gt;
&lt;td&gt;없음 (사전 컴파일된 C++)&lt;/td&gt;
&lt;td&gt;있음 (triton, 실시간)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;합계 메모리&lt;/td&gt;
&lt;td&gt;~67GB / 128GB&lt;/td&gt;
&lt;td&gt;~114GB / 128GB &amp;rarr; OOM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결론&lt;/b&gt;: llama.cpp의 mmap 방식은 CPU RAM을 거의 쓰지 않아 통합 메모리 환경에서 압도적으로 유리하다. PyTorch 기반 엔진은 구조적으로 CPU RAM 오버헤드가 크고, 여기에 triton JIT까지 더해지면 128GB 한도를 쉽게 초과한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Phase 4: vLLM으로 전환&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SGLang 실패 후 대안으로 vLLM 선택.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로젝트 구조&lt;/b&gt; (SGLang 파일은 보존):&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;/home/username/projects/vllm/gpt-oss-120b/
├── docker-compose.yml
└── .env&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;vLLM 구성 결정 근거&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지: &lt;code&gt;nvcr.io/nvidia/vllm:26.01-py3&lt;/code&gt; (NVIDIA 공식 빌드, Blackwell 지원)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SGLang의 커뮤니티 이미지(23.8GB)와 달리, NVIDIA가 직접 빌드(13.1GB)하여 Marlin 커널이 사전 컴파일되어 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;s&gt;&lt;code&gt;--swap-space 16&lt;/code&gt;: vLLM 고유의 KV 캐시 CPU 스왑 기능. SGLang에는 이 기능이 없어 메모리 부족 시 대응 불가&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--gpu-memory-utilization 0.7&lt;/code&gt;: GPU 메모리를 70%만 사용하여 여유 확보&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--max-model-len 32000&lt;/code&gt;: 컨텍스트 길이 제한으로 KV 캐시 크기 제어&lt;/li&gt;
&lt;li&gt;&lt;code&gt;VLLM_USE_FLASHINFER_MXFP4_MOE=1&lt;/code&gt;: MoE 모델에 FlashInfer MXFP4 최적화 활성화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Docker 이미지 풀&lt;/b&gt;: &lt;code&gt;nvcr.io/nvidia/vllm:26.01-py3&lt;/code&gt; (13.1GB) &amp;mdash; NVIDIA NGC에서 직접 pull&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과&lt;/b&gt;: 첫 시도에서 성공. 모델 로딩 ~6분 32초, 엔진 초기화 ~77초, 총 ~8분 소요. OOM 없이 안정적 서빙 시작.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;성능 테스트&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단순 질의 (&quot;What is 2+2?&quot;): 1.73초, 40 completion tokens&lt;/li&gt;
&lt;li&gt;긴 텍스트 생성 (512 tokens): 14.49초, &lt;b&gt;35.3 tok/s&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vLLM 로그에서 주목할 경고:&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Your GPU does not have native support for FP4 computation
but FP4 quantization is being used.
Weight-only FP4 compression will be used leveraging the Marlin kernel.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Marlin 커널은 SM 100(데이터센터 Blackwell)의 &lt;code&gt;tcgen05&lt;/code&gt; 기반 네이티브 FP4를 활용하지 못하고, 범용 &lt;code&gt;mma.sync&lt;/code&gt; 기반 행렬 곱셈으로 우회한다. 단, triton도 SM 12.1을 SM 80(Ampere)으로 취급하므로, triton 역시 Blackwell 전용 최적화를 적용하지 않는다. 네이티브 SGLang(52 tok/s)이 vLLM(35 tok/s)보다 빠른 정확한 원인은 FP4 네이티브 지원 차이가 아니라, MoE 스케줄링/커널 전략 등 다른 요인으로 추정된다 (부록 B 참조).&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Phase 5: 3자 비교 및 분석&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ollama(41 tok/s), vLLM(35.3 tok/s), SGLang(OOM) 세 결과를 종합하여 기술 블로그 작성.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주요 발견 사항&lt;/b&gt;:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;통합 메모리에서 CPU RAM 오버헤드가 곧 GPU 성능 손실&lt;/b&gt;: 일반 서버에서는 CPU RAM과 GPU VRAM이 분리되어 있어 CPU 메모리 사용이 GPU 성능에 영향을 주지 않지만, DGX Spark에서는 같은 물리 메모리를 공유하므로 CPU 오버헤드가 GPU 대역폭을 직접 감소시킨다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Marlin vs triton &amp;mdash; 사전 컴파일 vs JIT&lt;/b&gt;: vLLM의 Marlin 커널은 Docker 이미지 빌드 시 사전 컴파일되어 있어 모델 로딩 시 추가 CPU RAM 소비가 없다. SGLang의 triton은 실행 시점에 JIT 컴파일하므로 CPU RAM을 대량 소비하고, Docker의 ephemeral 파일시스템으로 인해 캐시도 유지되지 않는다. 단, &lt;b&gt;SM 12.1에서는 Marlin과 triton 모두 Blackwell 전용 최적화(tcgen05, TMEM)를 사용하지 못하므로, 커널 품질 자체의 차이는 제한적&lt;/b&gt;이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Docker vs 네이티브의 핵심 차이는 성능 오버헤드가 아니라 triton 캐시 영속성&lt;/b&gt;: 네이티브 SGLang은 1회차 JIT 후 &lt;code&gt;~/.triton/cache/&lt;/code&gt;에 캐시를 저장하여 2회차부터는 JIT를 건너뛸 수 있다. Docker는 컨테이너 재시작 시 캐시가 사라지므로 매번 처음부터 컴파일해야 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SGLang의 대안 경로 (이후 검증 완료 &amp;rarr; 전부 실패)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;--moe-runner-backend flashinfer_mxfp4&lt;/code&gt;: MoE 커널의 triton JIT는 회피했으나, attention 백엔드가 &lt;code&gt;triton&lt;/code&gt;이라 attention JIT에서 여전히 OOM (4분 만에 104GB RAM )&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--attention-backend trtllm_mha&lt;/code&gt;: &lt;code&gt;ValueError: only supported on SM100&lt;/code&gt; &amp;mdash; SM 100 전용&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fa3&lt;/code&gt;, &lt;code&gt;fa4&lt;/code&gt;: 각각 import 실패, SM 100 전용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결론: GPT-OSS + SM 12.1에서 SGLang Docker는 구조적으로 불가능&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Phase 6: 외부 docker-compose.yml 비교 평가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커뮤니티에서 공유되는 SGLang docker-compose.yml과 테스트에서 사용한 버전을 비교 검토했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;커뮤니티 버전의 주요 차이점&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;image: lmsysorg/sglang:latest&lt;/code&gt; &amp;mdash; &lt;code&gt;sglang:spark&lt;/code&gt;(DGX Spark 전용)가 아닌 범용 이미지. Blackwell SM 12.1 지원 여부 불확실&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--quantization mxfp4&lt;/code&gt; &amp;mdash; GPT-OSS는 모델 자체에 양자화가 내장되어 있어 이 옵션이 불필요 (vLLM은 자동 감지)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--mem-fraction-static 0.8&lt;/code&gt; &amp;mdash; 본 테스트에서 0.75/0.40 모두 OOM 실패. 0.8은 더 위험&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--enable-paged-attention&lt;/code&gt; &amp;mdash; SGLang에 존재하지 않는 옵션 (vLLM의 기능)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--model-path /models/gpt-oss-120b&lt;/code&gt; &amp;mdash; HuggingFace 캐시 대신 로컬 모델 디렉토리 직접 지정&lt;/li&gt;
&lt;li&gt;&lt;code&gt;shm_size: '16gb'&lt;/code&gt; &amp;mdash; LMSYS 가이드는 32GB 권장&lt;/li&gt;
&lt;li&gt;&lt;code&gt;version: '3.8'&lt;/code&gt; &amp;mdash; Docker Compose v5+에서는 불필요한 레거시 키&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;평가&lt;/b&gt;: 커뮤니티 버전은 DGX Spark 특화 설정이 부족하고, 존재하지 않는 옵션(&lt;code&gt;--enable-paged-attention&lt;/code&gt;)을 포함하고 있어, 실제 실행 시 에러가 발생할 가능성이 높다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시간순 의사결정 요약&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;SGLang 시작 (flashinfer)
  &amp;darr; 에러: flashinfer 미지원
  &amp;darr;
SGLang (triton, 0.75)
  &amp;darr; OOM: CPU RAM 51GB
  &amp;darr;
SGLang (triton, 0.40)
  &amp;darr; OOM: 동일 (KV 캐시가 아닌 JIT가 원인)
  &amp;darr;
SGLang (LMSYS 가이드 준수)
  &amp;darr; OOM: 여전히 triton JIT 문제
  &amp;darr;
&quot;Ollama는 왜 됐지?&quot; &amp;rarr; mmap vs PyTorch 메모리 모델 차이 분석
  &amp;darr;
SGLang Docker 포기 &amp;rarr; vLLM으로 전환
  &amp;darr;
vLLM 첫 시도 성공 (35.3 tok/s)
  &amp;darr;
3자 비교: Ollama(41) &amp;gt; vLLM(35.3) &amp;gt; SGLang(OOM)
  &amp;darr;
근본 원인 분석: 통합 메모리 + Marlin vs triton + Docker 캐시 영속성
  &amp;darr;
SGLang 서버 인자 분석 &amp;rarr; flashinfer_mxfp4 대안 경로 발견 (미검증)
  &amp;darr;
&quot;triton JIT이 Blackwell 최적화 커널을 생성한다&quot; 주장 검증
  &amp;darr; SM 12.1 &amp;ne; SM 100 아키텍처 분석 (Backend.AI 블로그)
  &amp;darr; triton은 SM 12.1을 SM 80(Ampere)으로 취급 &amp;rarr; Blackwell 최적화 없음
  &amp;darr;
환각 정정: triton/Marlin 모두 SM 12.1에서는 동일한 하드웨어 제약
  &amp;rarr; 네이티브 SGLang의 속도 우위 원인은 &quot;FP4 네이티브&quot;가 아닌 다른 요인 (추정)
  &amp;darr;
SGLang 추가 실험: --moe-runner-backend flashinfer_mxfp4
  &amp;darr; MoE JIT는 회피했으나 attention triton JIT에서 OOM (4분 만에 116GB)
  &amp;darr;
SGLang 추가 실험: --attention-backend trtllm_mha
  &amp;darr; &quot;only supported on SM100&quot; &amp;rarr; 즉시 에러
  &amp;darr;
최종 결론: GPT-OSS attention 백엔드 4종 중 SM 12.1에서 동작하는 건 triton뿐
           &amp;rarr; triton은 JIT OOM &amp;rarr; SGLang Docker는 구조적으로 불가능&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;교훈 및 향후 과제&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;DGX Spark에서 Docker로 LLM을 서빙할 때, 통합 메모리 구조를 반드시 고려해야 한다.&lt;/b&gt; 일반 서버의 경험치를 그대로 적용하면 예상치 못한 OOM이 발생한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PyTorch 기반 엔진(SGLang, vLLM)은 CPU RAM 오버헤드가 본질적으로 존재한다.&lt;/b&gt; 통합 메모리에서는 이것이 GPU 성능에 직접 영향을 미친다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Docker 컨테이너의 ephemeral 파일시스템은 triton JIT 캐시와 충돌한다.&lt;/b&gt; 볼륨 마운트로 &lt;code&gt;~/.triton/cache/&lt;/code&gt;를 영속화하면 해결 가능하지만, 1회차 컴파일 자체의 메모리 문제는 별도 대응이 필요하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SM 12.1 &amp;ne; SM 100 &amp;mdash; &quot;Blackwell&quot; 표기에 주의&lt;/b&gt;: DGX Spark(SM 12.1)와 B200(SM 100)은 같은 &quot;Blackwell&quot;이지만 명령어 세트(ISA)가 완전히 다르다. &quot;Blackwell 최적화&quot;라고 표기된 커널(FlashMLA, FA4, FlashInfer SM100 등)은 대부분 SM 100 전용이며 SM 12.1에서는 동작하지 않는다. triton도 SM 12.1을 SM 80(Ampere)으로 취급한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;검증 완료된 대안 경로&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;del&gt;&lt;code&gt;--moe-runner-backend flashinfer_mxfp4&lt;/code&gt; 옵션으로 SGLang Docker OOM 회피&lt;/del&gt; &amp;rarr; &lt;b&gt;실패&lt;/b&gt;: attention triton JIT가 여전히 OOM 유발&lt;/li&gt;
&lt;li&gt;&lt;del&gt;&lt;code&gt;--attention-backend trtllm_mha&lt;/code&gt;로 triton 완전 회피&lt;/del&gt; &amp;rarr; &lt;b&gt;실패&lt;/b&gt;: SM 100 전용, SM 12.1 미지원&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;향후 검증 사항&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;triton 캐시 볼륨 마운트(&lt;code&gt;-v ~/.triton/cache:/root/.triton/cache&lt;/code&gt;) + &lt;code&gt;vm.drop_caches=3&lt;/code&gt; 조합으로 SGLang Docker 1회차 부팅 가능 여부&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sglang:spark&lt;/code&gt; 이미지 업데이트 후 SM 12.1 호환 attention 커널(cuDNN SDPA 기반 등) 추가 여부&lt;/li&gt;
&lt;li&gt;vLLM &lt;code&gt;--fp4-gemm-backend flashinfer_cudnn&lt;/code&gt; 옵션으로 성능 향상 여부 (cuDNN 9.15+ 필요)&lt;/li&gt;
&lt;li&gt;네이티브 SGLang(52 tok/s)이 vLLM(35 tok/s)보다 빠른 정확한 원인 규명&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;11. SM 12.x 소프트웨어 생태계 현황과 향후 방향&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026-02-25 기준&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GB10(SM 12.1)의 현실&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DGX Spark는 하드웨어적으로 FP4 연산을 지원하지만, &lt;b&gt;소프트웨어 생태계가 SM 12.x를 아직 제대로 지원하지 못하는 과도기&lt;/b&gt;에 있다. &lt;a href=&quot;https://www.backend.ai/blog/2026-02-is-dgx-spark-actually-a-blackwell&quot;&gt;Backend.AI 기술 블로그&lt;/a&gt;의 분석이 이 상황을 정확히 짚고 있다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;소프트웨어&lt;/th&gt;
&lt;th&gt;SM 12.x 지원 상태&lt;/th&gt;
&lt;th&gt;비고&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Triton&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;SM 80(Ampere)으로 취급&lt;/td&gt;
&lt;td&gt;Blackwell 최적화 전부 비활성화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;FlashAttention&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;SM 12.x 미인식&lt;/td&gt;
&lt;td&gt;&quot;Ampere GPUs or newer&quot; 에러&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;FlashAttention 4 (FA4)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;SM 100 전용&lt;/td&gt;
&lt;td&gt;SM 12.1 지원 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;FlashMLA&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;SM 100/SM 90만 지원&lt;/td&gt;
&lt;td&gt;SM 12.x 백엔드 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;FlashInfer&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;SM 100/SM 90만 지원&lt;/td&gt;
&lt;td&gt;SM 12.x 백엔드 새로 작성 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;cuDNN SDPA&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;동작 가능&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;현재 유일한 SM 12.x attention 경로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;llama.cpp&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;자체 CUDA 커널&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;외부 커널 의존 없음, 가장 안정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Marlin (vLLM)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;범용 &lt;code&gt;mma.sync&lt;/code&gt; 기반&lt;/td&gt;
&lt;td&gt;SM 12.x에서 안정 동작&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;현재 최선의 선택&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;용도&lt;/th&gt;
&lt;th&gt;권장 엔진&lt;/th&gt;
&lt;th&gt;이유&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;개인/단일 사용자&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Ollama&lt;/b&gt; (41 tok/s)&lt;/td&gt;
&lt;td&gt;llama.cpp의 자체 CUDA 커널 + mmap. SM 12.x 커널 이슈 자체가 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;API 서버 (다중 요청)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;vLLM&lt;/b&gt; (35.3 tok/s)&lt;/td&gt;
&lt;td&gt;Marlin이 범용 &lt;code&gt;mma.sync&lt;/code&gt;로 안정 동작. PagedAttention 등 서빙 기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;최대 성능 추구&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;대기&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;SM 12.x 전용 커널이 갖춰지면 성능이 큰 폭으로 상승할 여지 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SGLang Docker가 SM 12.x에서 구조적으로 불가능한 이유 (최종 확인)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT-OSS 모델이 지원하는 attention 백엔드 4가지를 SM 12.1에서 모두 테스트한 결과:&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;attention 백엔드&lt;/th&gt;
&lt;th&gt;테스트 결과&lt;/th&gt;
&lt;th&gt;원인&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;triton&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;OOM (4회 실패)&lt;/td&gt;
&lt;td&gt;JIT 컴파일 중 CPU RAM 51GB+ 소비&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;trtllm_mha&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;즉시 에러&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ValueError: only supported on SM100&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fa3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;import 실패&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sglang:spark&lt;/code&gt; 이미지에 미포함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fa4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;시도 불가&lt;/td&gt;
&lt;td&gt;SM 100 전용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MoE 백엔드도 &lt;code&gt;flashinfer_mxfp4&lt;/code&gt;로 교체하여 triton JIT를 우회하려 했으나, attention 백엔드에서 triton JIT가 여전히 발생하여 OOM을 피할 수 없었다. &lt;b&gt;GPT-OSS + SM 12.1 조합에서는 SGLang Docker를 사용할 수 없다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 DGX Spark뿐 아니라 &lt;b&gt;RTX 5090(SM 12.0)&lt;/b&gt;에서도 동일한 상황이다. SM 12.x에서 SGLang의 Blackwell 최적화 성능을 확인하는 것 자체가 현시점에서 불가능하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;향후 전망&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DGX Spark의 128GB 통합 메모리는 200B 파라미터 모델을 데스크탑에서 돌릴 수 있는 유일한 환경이다. 하드웨어의 확장 &lt;code&gt;mma.sync&lt;/code&gt;는 FP4/FP6 데이터 타입을 지원하므로, SM 12.x 전용 커널이 작성되면 현재보다 상당한 성능 향상이 예상된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주시해야 할 채널:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://forums.developer.nvidia.com/c/dgx-spark-gb10/&quot;&gt;NVIDIA DGX Spark 포럼&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sgl-project/sglang/issues&quot;&gt;SGLang GitHub Issues&lt;/a&gt; &amp;mdash; SM 12.x 관련 이슈&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vllm-project/vllm/issues&quot;&gt;vLLM GitHub Issues&lt;/a&gt; &amp;mdash; SM 12.x 관련 이슈&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.backend.ai/blog&quot;&gt;Backend.AI 블로그&lt;/a&gt; &amp;mdash; DGX Spark 관련 기술 분석&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/NVIDIA/cutlass&quot;&gt;NVIDIA CUTLASS&lt;/a&gt; &amp;mdash; &lt;code&gt;sm120f&lt;/code&gt; 타겟 커널 개발 진행 상황&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI/LLM</category>
      <category>Agent</category>
      <category>AgentAI</category>
      <category>AI</category>
      <category>Blackwell</category>
      <category>dgx spark</category>
      <category>gb10</category>
      <category>gpt-oss-120b</category>
      <category>LLM</category>
      <category>local llm</category>
      <category>OpenClaw</category>
      <author>DanielZZI</author>
      <guid isPermaLink="true">https://danielzzi.tistory.com/40</guid>
      <comments>https://danielzzi.tistory.com/entry/DGX-Spark%EB%A1%9C-OpenClaw-Local-LLM-%EA%B5%AC%EC%84%B1-%E2%80%94-Provider-%EC%84%A0%EC%A0%95%EA%B8%B0#entry40comment</comments>
      <pubDate>Wed, 25 Feb 2026 13:45:30 +0900</pubDate>
    </item>
    <item>
      <title>seedance 2.0 사용해보기</title>
      <link>https://danielzzi.tistory.com/entry/%EC%A4%91%EA%B5%AD-AI-%EC%82%B0%EC%B1%85</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;seedance 2.0 이 요즘 핫하다. 중국 AI 공부도 하고, 중국어 복습도 해볼겸. 가끔 글을 올려야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bytedance 산하의 AI플랫폼 jimeng AI ( &lt;a href=&quot;https://jimeng.jianying.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jimeng.jianying.com/&lt;/a&gt; ) 에서 해당 모델을 테스트해 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 홈페이지 메뉴 설명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1913&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnNxKH/dJMcabpEn6h/8zXQoWUDeZyoeVNByterF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnNxKH/dJMcabpEn6h/8zXQoWUDeZyoeVNByterF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnNxKH/dJMcabpEn6h/8zXQoWUDeZyoeVNByterF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnNxKH%2FdJMcabpEn6h%2F8zXQoWUDeZyoeVNByterF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1913&quot; height=&quot;492&quot; data-origin-width=&quot;1913&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;文生图 : wenshengtu -&amp;gt; Text to Image&lt;br /&gt;视频生成: shipin shengcheng&amp;nbsp; -&amp;gt; 영상 생성&lt;br /&gt;智能画布: zhineng huabu -&amp;gt; smart canvas&lt;br /&gt;探索: tansuo -&amp;gt; 다른 유저들의 작품 및 프롬프트 참고&lt;br /&gt;未来影像计划: weilai yingxiang jihua -&amp;gt; 미래 비전등을 볼수있는 페이지&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;开启即梦 : kaiqi jimeng -&amp;gt; 회원가입.&amp;nbsp; 직역하면 즉각적인 꿈만들기 (jimeng)를 시작하세요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.seedance를 활용해 영상만들&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;开启即梦 버튼 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1775&quot; data-origin-height=&quot;807&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blh6xD/dJMcadgFpcx/qJKjglkp49GQpijRepkgE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blh6xD/dJMcadgFpcx/qJKjglkp49GQpijRepkgE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blh6xD/dJMcadgFpcx/qJKjglkp49GQpijRepkgE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fblh6xD%2FdJMcadgFpcx%2FqJKjglkp49GQpijRepkgE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1775&quot; height=&quot;807&quot; data-origin-width=&quot;1775&quot; data-origin-height=&quot;807&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순서대로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agent Model&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영상생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 회원가입&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1683&quot; data-origin-height=&quot;657&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdl2eK/dJMcaajXoUH/AagGDKofkI8BVeSTEKc7R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdl2eK/dJMcaajXoUH/AagGDKofkI8BVeSTEKc7R1/img.png&quot; data-alt=&quot;3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdl2eK/dJMcaajXoUH/AagGDKofkI8BVeSTEKc7R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdl2eK%2FdJMcaajXoUH%2FAagGDKofkI8BVeSTEKc7R1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1683&quot; height=&quot;657&quot; data-origin-width=&quot;1683&quot; data-origin-height=&quot;657&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;同意协议后前往登录 ： 동의 후 로그인페이지로 이동&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0a0a0a; text-align: start;&quot; data-processed=&quot;true&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAQQAA&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;同意&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(t&amp;oacute;ngy&amp;igrave;): 동의하다, 찬성하다&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAQQAQ&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;协议&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(xi&amp;eacute;y&amp;igrave;): 계약, 약관, 동의서&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAQQAg&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;后&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(h&amp;ograve;u): ~후에, ~한 다음&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAQQAw&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;前往&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(qi&amp;aacute;nwǎng): ~로 가다, 이동하다&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAQQBA&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;登录&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(dēngl&amp;ugrave;): 로그인(Log in)&lt;/span&gt;&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;ZGaY9_17,ZGaY9_18&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=ZGaY9_16/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span data-processed=&quot;true&quot; aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;ZGaY9_17,ZGaY9_18&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=ZGaY9_16/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span data-processed=&quot;true&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;用户服务协议，隐私政策， AI功能使用须知： 이용약관,&amp;nbsp; 개인정보처리방침, AI사용시 책임 제한 안내&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;用户服务协议&lt;/b&gt;&amp;nbsp; : 서비스 이용 규칙, 사용자 권리와 의무, 서비스 제한 사항, 책임 면제, 분쟁 해결 방법 등을 다룹니다. 이를 동의해야 서비스를 이용할 수 있음.&lt;span data-processed=&quot;true&quot; aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt; 隐私政策:&lt;/b&gt;&amp;nbsp; 수집하는 정보의 종류, 목적, 보관 기간, 제3자 제공 여부, 사용자가 자신의 데이터를 관리(열람, 삭제)할 수 있는 권리 등을 설명&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AI功能使用须知&lt;/b&gt;:&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;결과물의 정확성:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;AI가 생성한 답변은 부정확하거나 사실과 다를 수 있음을 고지합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;데이터 안전:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;입력한 데이터가 모델 학습에 사용될 수 있는지 여부.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 사용 제한:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;불법, 윤리적, 위험한 콘텐츠 생성 금지.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 책임:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;AI 결과물에 대한 최종 책임은 사용자에게 있음을 명시합니다.&lt;/span&gt;&lt;span data-processed=&quot;true&quot; data-wiz-uids=&quot;AVezMb_21,AVezMb_22&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=AVezMb_20/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span data-processed=&quot;true&quot; aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddzvoy/dJMcai94GHF/mkkXihkINnIO694rqpaxM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddzvoy/dJMcai94GHF/mkkXihkINnIO694rqpaxM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddzvoy/dJMcai94GHF/mkkXihkINnIO694rqpaxM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fddzvoy%2FdJMcai94GHF%2FmkkXihkINnIO694rqpaxM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;980&quot; height=&quot;756&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;756&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;使用抖音账号登录 即梦 : douyin(중국TIKTOK명) 계정으로 jimeng 로그인하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;打开 「抖音APP」 点击左上角扫一扫 : douyin APP 열고,&amp;nbsp; 좌상단 scan(扫一扫) 클릭하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이제 보니까, 중국판 TIKTOK(douyin)을 설치하고 douyin 회원가입을 한후에 douyin app에서 인증을 해줘야하는 것이었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 douyin 앱을 설치해보자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://z.douyin.com/dpwnT&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://z.douyin.com/dpwnT&lt;/a&gt; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 안드로이드를 쓰는데 이 링크에서 파일을 다운받은후에 apk파일을 열기, 설치하기 등을 통해 설치하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우리가 흔히 쓰는 TIKTOK앱으로 먼저 해봤는데 안되더라. 아니 scan기능을 못찾았다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(참고로 iphone은 다운로드가 안되는것 같다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제는 조금 중국어 번역하기가 귀찮아져서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 douyin app 가입관련 스샷을 대충 넣었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한국은 hanguo로 H열에서 시작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;image&quot; data-ke-style=&quot;alignCenter&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nwCDx/dJMb99L5ocL/LeBo4ukLo2sPmOJ8SqhqRk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nwCDx/dJMb99L5ocL/LeBo4ukLo2sPmOJ8SqhqRk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nwCDx/dJMb99L5ocL/LeBo4ukLo2sPmOJ8SqhqRk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnwCDx%2FdJMb99L5ocL%2FLeBo4ukLo2sPmOJ8SqhqRk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;650&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2340&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 닉네임 대충짓기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGyZsN/dJMcabDawmT/4FYKD153POwXSKlchlkthK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGyZsN/dJMcabDawmT/4FYKD153POwXSKlchlkthK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGyZsN/dJMcabDawmT/4FYKD153POwXSKlchlkthK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGyZsN%2FdJMcabDawmT%2F4FYKD153POwXSKlchlkthK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;650&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2340&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 회원가입 및 로그인하면, 이제 &lt;b&gt;douyin 메인화면에서 좌상단 목록버튼 클릭 &lt;/b&gt;후&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; scan( 扫一扫 ) 기능을 클릭&lt;/b&gt;해서 아까 위의 jimeng app QR code를 인식해주자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c13o8x/dJMcacPBSf9/ADS4eKDo1fKgJKi0uqxBKK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c13o8x/dJMcacPBSf9/ADS4eKDo1fKgJKi0uqxBKK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c13o8x/dJMcacPBSf9/ADS4eKDo1fKgJKi0uqxBKK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc13o8x%2FdJMcacPBSf9%2FADS4eKDo1fKgJKi0uqxBKK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;650&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2340&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 로그인을 하고, 다시 jimeng에서 무료로 영상생성을 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-complete=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-complete=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;먼저 영어 프롬프트로 해보기로했다. 나는 이미지 두개로 처음과 끝부분을 이어지게하는 영상을 만들려고했다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9Kjiv/dJMcabDaw6J/RGv6kNuRd02HYj5yPJ4DJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9Kjiv/dJMcabDaw6J/RGv6kNuRd02HYj5yPJ4DJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9Kjiv/dJMcabDaw6J/RGv6kNuRd02HYj5yPJ4DJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9Kjiv%2FdJMcabDaw6J%2FRGv6kNuRd02HYj5yPJ4DJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1022&quot; height=&quot;280&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵션을 보자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.생성모드: 영상생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.모델 선택:&amp;nbsp; seedance 2.0 Fast&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.영상모드: 아래참고&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0a0a0a; text-align: start;&quot; data-ke-list-type=&quot;disc&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-hveid=&quot;CAEIBBAA&quot; data-complete=&quot;true&quot; data-sae=&quot;&quot;&gt;&lt;span data-sfc-cp=&quot;&quot; data-complete=&quot;true&quot;&gt;&lt;b&gt;全能参考 (전능참조):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;영상 생성 시 이미지, 텍스트 등&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;모든 요소를 종합적으로 참고&lt;/b&gt;하여 결과물을 만드는 모드입니다. 특정 스타일이나 구도를 고정하면서도 AI가 창의적으로 디테일을 채우도록 할 때 사용합니다. &lt;b&gt;seedance2.0 fast와 seedance 2.0만 사용가능&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-hveid=&quot;CAEIBBAB&quot; data-complete=&quot;true&quot; data-sae=&quot;&quot;&gt;&lt;span data-sfc-cp=&quot;&quot; data-complete=&quot;true&quot;&gt;&lt;b&gt;首尾帧 (수미프레임):&lt;/b&gt;&lt;span data-sfc-cp=&quot;&quot; data-complete=&quot;true&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;영상의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;'첫 장면(시작 프레임)'과 '마지막 장면(끝 프레임)'&lt;/b&gt;을 의미합니다. 영상 생성 도구에서 시작 이미지와 끝 이미지를 각각 지정하면, AI가 그 사이의 움직임을 자연스럽게 연결해 줍니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-hveid=&quot;CAEIBBAC&quot; data-complete=&quot;true&quot; data-sae=&quot;&quot;&gt;&lt;span data-sfc-cp=&quot;&quot; data-complete=&quot;true&quot;&gt;&lt;b&gt;智能多帧 (지능형 다중 프레임):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;AI가 여러 프레임을 분석하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;움직임을 더 부드럽고 정교하게&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;만드는 기술입니다. 프레임 간의 연속성을 높여 영상이 끊기거나 어색하게 변하는 현상을 줄여줍니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-hveid=&quot;CAEIBBAD&quot; data-complete=&quot;true&quot; data-sae=&quot;&quot;&gt;&lt;span data-sfc-cp=&quot;&quot; data-complete=&quot;true&quot;&gt;&lt;b&gt;主体参考 (주체참조):&lt;/b&gt;&lt;span data-sfc-cp=&quot;&quot; data-complete=&quot;true&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;영상 속&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;핵심 인물이나 사물(주체)&lt;/b&gt;의 형태와 특징을 그대로 유지하며 영상을 생성하는 기능입니다. 배경은 바뀌어도 주인공 캐릭터의 외형이 변하지 않게 고정할 때 유용합니다&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.프레임사이즈: 자동비율 (21:9, 16:9, 4:3, 1:1 등 선택가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그후, 생성버튼 을 클릭하면 아래와 같이 법적책임에 대한 동의가 필요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/moATs/dJMb996pVxS/9eM4kvnUSJh3mVqxvThVuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/moATs/dJMb996pVxS/9eM4kvnUSJh3mVqxvThVuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/moATs/dJMb996pVxS/9eM4kvnUSJh3mVqxvThVuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmoATs%2FdJMb996pVxS%2F9eM4kvnUSJh3mVqxvThVuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1076&quot; height=&quot;705&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;2,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,0&quot;&gt;安全确认&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;2,1&quot; data-ke-size=&quot;size16&quot;&gt;请您使用本人照片/视频或取得其充分授权，确保不存在违反法律法规、侵犯他人权益或违反公序良俗的内容。若因您不当使用本功能导致任何第三方权益受损，您将依法承担相应法律责任。&lt;/p&gt;
&lt;p data-path-to-node=&quot;2,2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,2&quot;&gt;拒绝 / 确认&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;2,2&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8&quot;&gt;주요 단어 풀이&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;安全确认 (안전확인):&lt;/b&gt; 보안 및 안전 이용 확인&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;本人 (본인):&lt;/b&gt; 자기 자신&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,2,0&quot;&gt;充分授权 (충분수권):&lt;/b&gt; 충분한 권한 부여(허가)를 받음&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,3,0&quot;&gt;违反 (위반):&lt;/b&gt; 어김&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,4,0&quot;&gt;法律法规 (법률법규):&lt;/b&gt; 법과 규정&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,5,0&quot;&gt;侵犯 (침범):&lt;/b&gt; (권리를) 침해함&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,6,0&quot;&gt;权益 (권익):&lt;/b&gt; 권리와 이익&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,7,0&quot;&gt;公序良俗 (공서양속):&lt;/b&gt; 공공의 질서와 선량한 풍속&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,8,0&quot;&gt;不当使用 (부당사용):&lt;/b&gt; 부적절한 사용&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,9,0&quot;&gt;第三方 (제3자):&lt;/b&gt; 당사자 이외의 인물&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,10,0&quot;&gt;承担 (승담):&lt;/b&gt; (책임을) 떠맡음&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,11,0&quot;&gt;法律责任 (법률책임):&lt;/b&gt; 법적 책임&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,12,0&quot;&gt;拒绝 / 确认 (거절 / 확인):&lt;/b&gt; 거부하기 / 동의(확인)하기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;11,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0&quot;&gt;안전 확인&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;11,1&quot; data-ke-size=&quot;size16&quot;&gt;본인의 사진/동영상을 사용하거나 그에 대한 충분한 권한을 취득하여, 법률 및 규정 위반, 타인의 권익 침해 또는 공공질서와 미풍양속에 어긋나는 내용이 없음을 보장해 주십시오. 귀하의 부적절한 본 기능 사용으로 인해 제3자의 권익이 손해를 입을 경우, 귀하는 법에 따라 상응하는 법적 책임을 지게 됩니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;11,2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2&quot;&gt;거절 / 확인&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;11,2&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;11,2&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;11,2&quot; data-ke-size=&quot;size16&quot;&gt;확인을 누르면 영상이 생성중인데, 대충 기다려봤는데 생성이 안되길래 다시보니&lt;/p&gt;
&lt;p data-path-to-node=&quot;11,2&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zFc8A/dJMcaaYxDOM/U0vb9ZVgh4dyWbCJ63ik11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zFc8A/dJMcaaYxDOM/U0vb9ZVgh4dyWbCJ63ik11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zFc8A/dJMcaaYxDOM/U0vb9ZVgh4dyWbCJ63ik11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzFc8A%2FdJMcaaYxDOM%2FU0vb9ZVgh4dyWbCJ63ik11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;758&quot; height=&quot;421&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;421&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;11,2&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;11,2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2&quot;&gt;이것이 바로 대륙의 기다림! &lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;11,2&quot; data-ke-size=&quot;size16&quot;&gt;해석하면&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2&quot;&gt; &quot;앞에 13856 명의 대기자 중 13713등이다. 예측시간은 47분, 고등급회원은 최고 가속을 누릴수있다.&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;11,2&quot; data-ke-size=&quot;size16&quot;&gt;앞서 기다린 시간까지 합치면 나는 무료회원은 무려 60분은 기다려야 하는거같다.&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2&quot;&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;11,2&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQ4EqG/dJMcadgFrHk/uuKvK1BGdf4TMi1DkXWH51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQ4EqG/dJMcadgFrHk/uuKvK1BGdf4TMi1DkXWH51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQ4EqG/dJMcadgFrHk/uuKvK1BGdf4TMi1DkXWH51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ4EqG%2FdJMcadgFrHk%2FuuKvK1BGdf4TMi1DkXWH51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;865&quot; height=&quot;452&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;452&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;11,2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;옆에 파란색 글자를 마우스를 대보면 위와 같이 뜬다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11&quot;&gt;중간 흰색 안내문&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,0,0&quot;&gt;제목:&lt;/b&gt; 会员生成加速 (멤버십 생성 가속)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,1,0&quot;&gt;내용:&lt;/b&gt; 开通会员, 享快速生成独立通道, 告别拥挤 (멤버십을 개통하여 독립된 빠른 생성 채널을 누리고 혼잡함과 작별하세요.)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,2,0&quot;&gt;추가 설명:&lt;/b&gt; 会员等级越高速度越快 (멤버십 등급이 높을수록 속도가 더 빠릅니다.)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,3,0&quot;&gt;버튼:&lt;/b&gt; &lt;b data-index-in-node=&quot;4&quot; data-path-to-node=&quot;12,3,0&quot;&gt;1元试用7天会员&lt;/b&gt; (1위안으로 7일 멤버십 체험하기)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13&quot;&gt;하단 회색 텍스트 (실시간 상태)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;14&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,0,0&quot;&gt;현재 순번:&lt;/b&gt; 当前 (13329/13658) 位 (현재 13,658명 중 13,329번째 순서)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,0&quot;&gt;대기 시간:&lt;/b&gt; 预计等待 &lt;b data-index-in-node=&quot;12&quot; data-path-to-node=&quot;14,1,0&quot;&gt;2 小时&lt;/b&gt; (약 2시간 대기 예상 -&amp;gt; 갑자기 바뀌었다)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,2,0&quot;&gt;무료 혜택:&lt;/b&gt; 免费加速 2 次 (무료 가속 2회 가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 멤버쉽 가입을 안해도 무료회원에게 2번의 가속기회는 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞선 파란색버튼 (免费加速2次）을 클릭하니 시간이 40분에서 27분으로 줄었다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;423&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UjbBJ/dJMcacIQRhl/Va8JfF0FZ3ggGCqmygF6Bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UjbBJ/dJMcacIQRhl/Va8JfF0FZ3ggGCqmygF6Bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UjbBJ/dJMcacIQRhl/Va8JfF0FZ3ggGCqmygF6Bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUjbBJ%2FdJMcacIQRhl%2FVa8JfF0FZ3ggGCqmygF6Bk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;730&quot; height=&quot;423&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;423&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;갑자기 4시간이 되었다. GPU가 많이 부족한지, 무료 요청대기자가 많은건지는 유료멤버쉽으로 테스트해봐야할듯&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NyQ5O/dJMcaibeikQ/5xhoWNpEZ8Y4Ul88ZnmltK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NyQ5O/dJMcaibeikQ/5xhoWNpEZ8Y4Ul88ZnmltK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NyQ5O/dJMcaibeikQ/5xhoWNpEZ8Y4Ul88ZnmltK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNyQ5O%2FdJMcaibeikQ%2F5xhoWNpEZ8Y4Ul88ZnmltK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;747&quot; height=&quot;438&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 단독 회원 한달가입을 진행했다.&amp;nbsp; 월구독은 두가지로 나뉘는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-단독 월 구독 : 79위안 (1회성 구독)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-연속 월 구독 : 69위안&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이다. 나는 단독 월구독으로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 영상은 조금씩 다르지만 fast로 할경우 3분 내외로 생성이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI/중국AI산책</category>
      <category>douyin</category>
      <category>jimeng</category>
      <category>jimengai</category>
      <category>seedance</category>
      <category>seedance2.0</category>
      <category>seedance2.0 무료</category>
      <category>seedance2.0 사용법</category>
      <category>TikTok</category>
      <category>무료</category>
      <category>사용법</category>
      <author>DanielZZI</author>
      <guid isPermaLink="true">https://danielzzi.tistory.com/39</guid>
      <comments>https://danielzzi.tistory.com/entry/%EC%A4%91%EA%B5%AD-AI-%EC%82%B0%EC%B1%85#entry39comment</comments>
      <pubDate>Mon, 16 Feb 2026 17:21:45 +0900</pubDate>
    </item>
    <item>
      <title>local llm: Open WebUI를 tailscale로 외부에서 접속하기</title>
      <link>https://danielzzi.tistory.com/entry/local-llm-Open-WebUI%EB%A5%BC-tailscale%EB%A1%9C-%EC%99%B8%EB%B6%80%EC%97%90%EC%84%9C-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0</link>
      <description>&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;  내 책상 위 AI 슈퍼컴퓨터, 외부에서 안전하게 접속하기 (Open WebUI + Tailscale)&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;집에서 local llm을 만들고 open webui로 사용해보는데, 집 밖에서도 사용해야할 경우가 있다.&lt;br /&gt;하지만 공유기 포트 포워딩은 보안상 찝찝하고 설정도 귀찮다. 이럴 때 가장 깔끔한 정답은 &lt;b&gt;Tailscale&lt;/b&gt;이다. 복잡한 VPN 설정 없이 내 기기들을 하나의 가상 네트워크로 묶고, 심지어 &lt;b&gt;HTTPS 도메인&lt;/b&gt;까지 공짜로 입히는 법을 알아보자.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Tailscale 설치 및 연동&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 고속도로부터 깔아야 한다. 접속할 llm및 open webui 호스트서버와 클라이언트(노트북) 양쪽 모두에 Tailscale을 설치하자.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;llm host 서버에서:&lt;/b&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/noble.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg &amp;gt;/dev/null
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/noble.tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.list
sudo apt update &amp;amp;&amp;amp; sudo apt install tailscale
sudo tailscale up
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;http&quot;&gt;&lt;code&gt;

* **노트북(클라이언트)에서:** [Tailscale 공식 홈페이지](https://www.google.com/search?q=https://tailscale.com/download)에서 OS에 맞는 앱을 설치하자.
* **로그인:** 양쪽 기기 모두 동일한 계정으로 로그인하면 하나의 **Tailnet**에 자동으로 연결된다. 이제 두 기기는 전용 가상 IP(100.x.x.x)로 통신할 준비가 끝났다.

---

## 2. Open WebUI 구동 (Docker)

host서버(pc 등)에서 Docker로 Open WebUI를 띄우자. 여기서는 외부 포트를 `12000`으로 바인딩했다.

```bash
docker run -d -p 12000:8080 --gpus=all \
  -v open-webui:/app/backend/data \
  -v open-webui-ollama:/root/.ollama \
  --name open-webui \
  ghcr.io/open-webui/open-webui:ollama
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;핵심:&lt;/b&gt; &lt;code&gt;-p 12000:8080&lt;/code&gt; 설정을 통해 컨테이너 내부의 8080 포트를 server 본체의 12000번 포트로 연결했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. MagicDNS와 HTTPS 활성화 (중요!)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP 주소(&lt;code&gt;100.x.x.x&lt;/code&gt;)를 외우는 건 고통스럽다. 도메인 이름을 쓰고 HTTPS를 적용하기 위해 Tailscale 관리자 페이지에서 설정을 켜자.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Tailscale Admin Console&lt;/b&gt; 접속 &amp;rarr; &lt;b&gt;DNS&lt;/b&gt; 탭 이동.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MagicDNS&lt;/b&gt; 활성화 (Enabled 확인).&lt;/li&gt;
&lt;li&gt;하단 &lt;b&gt;HTTPS Certificates&lt;/b&gt; 항목에서 &lt;b&gt;Enable HTTPS&lt;/b&gt; 버튼 클릭.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. HTTPS 서빙 설정 (Tailscale Serve)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 하이라이트다. llm host서버에서 돌아가는 open webui HTTP 서비스를 보안이 강화된 HTTPS 도메인으로 변환해주자.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# HTTPS 인증서 생성 및 백그라운드 서빙 시작
sudo tailscale serve --bg --https=443 http://localhost:12000
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;명령어 설명:&lt;/b&gt; * &lt;code&gt;--bg&lt;/code&gt;: 백그라운드에서 계속 실행한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--https=443&lt;/code&gt;: 외부에서는 표준 HTTPS 포트로 접속한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;http://localhost:12000&lt;/code&gt;: 실제로 연결할 로컬 서비스 포트다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추가 팁:&lt;/b&gt; 만약 접속이 안 된다면 llm host서버의 방화벽(&lt;code&gt;ufw&lt;/code&gt;)이 포트를 막고 있을 수 있다. &lt;code&gt;sudo ufw allow 12000/tcp&lt;/code&gt;와 &lt;code&gt;sudo ufw allow 443/tcp&lt;/code&gt;를 확인해보자.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 외부에서 도메인으로 접속하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 모든 준비가 끝났다. 밖에서 노트북 브라우저를 켜고 주소창에 내 llm hosting서버의 도메인 주소를 입력해보자.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;접속 주소:&lt;/b&gt; &lt;code&gt;https://기기이름.네트워크이름.ts.net&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장점:&lt;/b&gt; * 포트 번호(&lt;code&gt;:12000&lt;/code&gt;)를 붙일 필요가 없다.&lt;/li&gt;
&lt;li&gt;브라우저에 &lt;b&gt;자물쇠 아이콘&lt;/b&gt;이 뜨는 안전한 연결이 완성됐다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;</description>
      <category>AI/LLM</category>
      <category>openwebui</category>
      <category>tailscale</category>
      <author>DanielZZI</author>
      <guid isPermaLink="true">https://danielzzi.tistory.com/38</guid>
      <comments>https://danielzzi.tistory.com/entry/local-llm-Open-WebUI%EB%A5%BC-tailscale%EB%A1%9C-%EC%99%B8%EB%B6%80%EC%97%90%EC%84%9C-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0#entry38comment</comments>
      <pubDate>Mon, 16 Feb 2026 15:38:25 +0900</pubDate>
    </item>
    <item>
      <title>PDF Table 처리 비교</title>
      <link>https://danielzzi.tistory.com/entry/PDF-Table-%EC%B2%98%EB%A6%AC-%EB%B9%84%EA%B5%90</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;EURO Regulations관련 Annex table을 LLM에서 가장 잘이해하고 처리할 수있는 형태로 chungking하고자했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM은 일반적으로 Markdown에 더 높은 성능과 안정성을 보인다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pdf table -&amp;gt; markdown 전환시 완성도 우수&lt;/li&gt;
&lt;li&gt;pdf table -&amp;gt; markdown direct 변환(pandas 등 중간 layer x)&lt;/li&gt;
&lt;li&gt;무료 &amp;gt; 유료&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라는 조건으로 llamaparse(llamaindex), pymupdf4llm 등 RAG특화 툴과 비교적 classic한 pdfplumber, camelot+pandas 조합을 테스트해봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원본 pdf파일&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pRjz3/dJMcaiINizK/XZiPWxMHxl6PJI4LZSKKsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pRjz3/dJMcaiINizK/XZiPWxMHxl6PJI4LZSKKsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pRjz3/dJMcaiINizK/XZiPWxMHxl6PJI4LZSKKsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpRjz3%2FdJMcaiINizK%2FXZiPWxMHxl6PJI4LZSKKsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;682&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;682&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. llamaparse&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;llamaindex의 명성에 비해,, 생각보다 실망스러웠다.&lt;/p&gt;
&lt;pre id=&quot;code_1768490678907&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Step 1: LlamaParse로 PDF를 Markdown으로 변환
print(&quot;LlamaParse로 PDF를 Markdown으로 변환 중...&quot;)
print(&quot;(클라우드 처리로 시간이 걸릴 수 있습니다)&quot;)

# LlamaParse 파서 생성
# result_type: &quot;markdown&quot; 또는 &quot;text&quot;
parser = LlamaParse(
    result_type=&quot;markdown&quot;,
    verbose=True,
)

# PDF 파일 파싱
documents = parser.load_data(pdf_path)

print(f&quot;\n✓ 파싱 완료: {len(documents)}개 문서 청크&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;757&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbZUSy/dJMcafyzxGG/xF4MIlcHpR3Tpl0IfYqyfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbZUSy/dJMcafyzxGG/xF4MIlcHpR3Tpl0IfYqyfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbZUSy/dJMcafyzxGG/xF4MIlcHpR3Tpl0IfYqyfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbZUSy%2FdJMcafyzxGG%2FxF4MIlcHpR3Tpl0IfYqyfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1087&quot; height=&quot;757&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;757&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;2. pymupdf4llm&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과적으로 제일 만족스러웠다. 셀병합못한 부분과 ,other컬럼이 miss였으나 이정도면 우수하다.&lt;/p&gt;
&lt;pre id=&quot;code_1768490859139&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Step 1: PDF를 Markdown으로 변환

print(&quot;PDF를 Markdown으로 변환 중...&quot;)

md_text = pymupdf4llm.to_markdown(
    pdf_path,
    pages=range(136, 367),
    write_images=False,
)
print(&quot;변환완료&quot;)

Path(&quot;output.md&quot;).write_bytes(md_text.encode())&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;928&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nRGVH/dJMcagYwXMw/aIxRAUNvBtBw9Xcs7ZmuRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nRGVH/dJMcagYwXMw/aIxRAUNvBtBw9Xcs7ZmuRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nRGVH/dJMcagYwXMw/aIxRAUNvBtBw9Xcs7ZmuRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnRGVH%2FdJMcagYwXMw%2FaIxRAUNvBtBw9Xcs7ZmuRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1115&quot; height=&quot;928&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;928&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;3. camelot+pandas&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드도 길었고, 중간에 pandas를 끼는것도 복잡해지고, 속도처리도 느렸다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 무엇보다 결과가 안좋았다.&lt;/p&gt;
&lt;pre id=&quot;code_1768491094492&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Step 1: Camelot으로 PDF에서 테이블 추출
# Annex III가 있는 페이지 범위 (137-367 페이지)
# pages 파라미터: &quot;1-10&quot; 또는 &quot;1,3,5&quot; 또는 &quot;all&quot;

print(&quot;Camelot으로 PDF에서 테이블 추출 중...&quot;)
print(&quot;(페이지 수에 따라 시간이 걸릴 수 있습니다)&quot;)

# lattice 모드: 테이블 경계선이 있는 경우
# stream 모드: 경계선 없이 공백으로 구분된 테이블
tables = camelot.read_pdf(
    pdf_path,
    pages=&quot;137-367&quot;,  # Annex III 페이지 범위
    flavor=&quot;lattice&quot;,  # 또는 &quot;stream&quot;
)

print(f&quot;\n✓ 추출 완료: {len(tables)}개 테이블&quot;)

# 중간 생략

# Step 4: 모든 테이블을 Markdown으로 변환하여 저장
output_file = Path(&quot;output3.md&quot;)

with open(output_file, &quot;w&quot;, encoding=&quot;utf-8&quot;) as f:
    
    for i, table in enumerate(tables):
        
        # DataFrame을 Markdown 테이블로 변환
        df = table.df
        f.write(df.to_markdown(index=False))
        f.write(&quot;\n\n---\n\n&quot;)

print(f&quot;✓ Markdown 파일 저장 완료: {output_file}&quot;)
print(f&quot;  파일 크기: {output_file.stat().st_size / 1024:.2f} KB&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;951&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NuPoR/dJMcagdbgDm/k8ik2KuvkMtIftcdPyv5Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NuPoR/dJMcagdbgDm/k8ik2KuvkMtIftcdPyv5Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NuPoR/dJMcagdbgDm/k8ik2KuvkMtIftcdPyv5Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNuPoR%2FdJMcagdbgDm%2Fk8ik2KuvkMtIftcdPyv5Xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1082&quot; height=&quot;951&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;951&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;3. pyplumber + pandas&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;camelot과 큰차이 없었다.&lt;/p&gt;
&lt;pre id=&quot;code_1768492927471&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Step 1: pdfplumber로 PDF에서 테이블 추출
# Annex III가 있는 페이지 범위 (137-367 페이지, 0-indexed: 136-366)

print(&quot;pdfplumber로 PDF에서 테이블 추출 중...&quot;)
print(&quot;(페이지 수에 따라 시간이 걸릴 수 있습니다)&quot;)

all_tables = []

with pdfplumber.open(pdf_path) as pdf:
    total_pages = len(pdf.pages)
    print(f&quot;총 페이지 수: {total_pages}&quot;)
    
    # Annex III 페이지 범위 (0-indexed)
    start_page = 136
    end_page = min(367, total_pages)
    
    for page_num in range(start_page, end_page):
        page = pdf.pages[page_num]
        tables = page.extract_tables()
        
        if tables:
            for table in tables:
                all_tables.append({
                    'page': page_num + 1,  # 1-indexed로 저장
                    'data': table
                })

print(f&quot;\n✓ 추출 완료: {len(all_tables)}개 테이블&quot;)

# 중간 생략

# Step 3: 첫 번째 테이블 미리보기 (DataFrame)
if all_tables:
    print(&quot;--- 첫 번째 테이블 (DataFrame) ---\n&quot;)
    first_table = all_tables[0]['data']
    
    # 첫 행을 헤더로 사용
    if first_table and len(first_table) &amp;gt; 1:
        df = pd.DataFrame(first_table[1:], columns=first_table[0])
    else:
        df = pd.DataFrame(first_table)
    
    print(df.head(10))
    print(f&quot;\n크기: {df.shape}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;635&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HCgTw/dJMcadgp6xc/wWUYlyEwK5KmQ5pfaGCZkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HCgTw/dJMcadgp6xc/wWUYlyEwK5KmQ5pfaGCZkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HCgTw/dJMcadgp6xc/wWUYlyEwK5KmQ5pfaGCZkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHCgTw%2FdJMcadgp6xc%2FwWUYlyEwK5KmQ5pfaGCZkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;989&quot; height=&quot;635&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;635&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>AI/RAG</category>
      <category>Camelot</category>
      <category>chungking</category>
      <category>llamaparse</category>
      <category>LLM</category>
      <category>PDF</category>
      <category>pdfplumber</category>
      <category>pymupdf4llm</category>
      <category>Rag</category>
      <author>DanielZZI</author>
      <guid isPermaLink="true">https://danielzzi.tistory.com/37</guid>
      <comments>https://danielzzi.tistory.com/entry/PDF-Table-%EC%B2%98%EB%A6%AC-%EB%B9%84%EA%B5%90#entry37comment</comments>
      <pubDate>Fri, 16 Jan 2026 00:22:06 +0900</pubDate>
    </item>
    <item>
      <title>NVIDIA vGPU GPU Operator install</title>
      <link>https://danielzzi.tistory.com/entry/vGPU-%EC%9A%A9-helm</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 내용은 gpu operator 페이지에 다있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718533529465&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/&quot; data-og-description=&quot;&quot; data-og-host=&quot;docs.nvidia.com&quot; data-og-source-url=&quot;https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/&quot; data-og-url=&quot;https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.nvidia.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.vGPU드라이버 다운로드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vGPU드라이버는 유료라이센스. 전용페이지에서 다운&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.준비물&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;driver(.run) 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vGPUDriverCatalog.yaml&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gridd.conf&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.tok파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.환경변수설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.driver 이미지 빌드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;준비물포함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.configmap 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- licensing-config&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vGPU 라이센스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- metrics-config&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DCGM exporter의 커스텀 메트릭 사용을 위한 csv파일 다운로드후 configmap으로 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6.helm install&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;helm install&amp;nbsp; 시 -f add_values.yaml 로 overwrite&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-- vGPU helm 주요 옵션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;operator.defaultRuntime : 나의 경우 containerd를 cri로 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;driver.image: 커스텀이미지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;driver.licensingConfig.configMapName: 라이센스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dcgmexporter.config, env: 커스텀 메트릭 사용시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rdma,gds, gdrcopy : 지원가능여부에 따라 함께 사용시 강려크.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>MLOps/GPU</category>
      <category>GPU Operator</category>
      <category>helm</category>
      <category>vGPU</category>
      <author>DanielZZI</author>
      <guid isPermaLink="true">https://danielzzi.tistory.com/36</guid>
      <comments>https://danielzzi.tistory.com/entry/vGPU-%EC%9A%A9-helm#entry36comment</comments>
      <pubDate>Sun, 16 Jun 2024 19:15:56 +0900</pubDate>
    </item>
    <item>
      <title>gpu operator helm 주요 파라미터</title>
      <link>https://danielzzi.tistory.com/entry/gpu-operator-helm-%EC%A3%BC%EC%9A%94-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# redhat openshift 여부&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;platform: &lt;br /&gt;&amp;nbsp;&amp;nbsp;openshift:&amp;nbsp;false &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# node feature discovery 사용여부. node의 정보(cpu, gpu, mem등)을 수집&lt;br /&gt;nfd: &lt;br /&gt;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;true &lt;br /&gt;&amp;nbsp;&amp;nbsp;nodefeaturerules:&amp;nbsp;false &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# pod security admission 사용여부&lt;br /&gt;psa: &lt;br /&gt;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;false &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# containder device interface 사용여부/ true로 하면 default runtime class(nvidia)외에&amp;nbsp; 2개의 runtime class(nvidia-cdi, nvidia-legacy)를 모두 사용가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# cri에서 nvidia gpu같은 복잡한 device를 활용하는데 있어서 표준 스펙을 만듬.&lt;br /&gt;cdi: &lt;br /&gt;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;default:&amp;nbsp;false &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# KubeVirt, Kata Container, Confidential Containers 기능 사용시 필요. 노드별 gpu환경구성이 주로 어떤걸로 이뤄지는지.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# container, vm-passthrough, vm-vgpu 중 가장 많이 사용하는것으로 선택&lt;br /&gt;sandboxWorkloads: &lt;br /&gt;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;defaultWorkload:&amp;nbsp;&quot;container&quot; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;daemonsets: &lt;br /&gt;&amp;nbsp;&amp;nbsp;labels:&amp;nbsp;{} &lt;br /&gt;&amp;nbsp;&amp;nbsp;annotations:&amp;nbsp;{} &lt;br /&gt;&amp;nbsp;&amp;nbsp;priorityClassName:&amp;nbsp;system-node-critical &lt;br /&gt;&amp;nbsp;&amp;nbsp;tolerations: &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;key:&amp;nbsp;nvidia.com/gpu &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;operator:&amp;nbsp;Exists &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;effect:&amp;nbsp;NoSchedule &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;configuration&amp;nbsp;for&amp;nbsp;controlling&amp;nbsp;update&amp;nbsp;strategy(&quot;OnDelete&quot;&amp;nbsp;or&amp;nbsp;&quot;RollingUpdate&quot;)&amp;nbsp;of&amp;nbsp;GPU&amp;nbsp;Operands &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;note&amp;nbsp;that&amp;nbsp;driver&amp;nbsp;Daemonset&amp;nbsp;is&amp;nbsp;always&amp;nbsp;set&amp;nbsp;with&amp;nbsp;OnDelete&amp;nbsp;to&amp;nbsp;avoid&amp;nbsp;unintended&amp;nbsp;disruptions &lt;br /&gt;&amp;nbsp;&amp;nbsp;updateStrategy:&amp;nbsp;&quot;RollingUpdate&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;configuration&amp;nbsp;for&amp;nbsp;controlling&amp;nbsp;rolling&amp;nbsp;update&amp;nbsp;of&amp;nbsp;GPU&amp;nbsp;Operands &lt;br /&gt;&amp;nbsp;&amp;nbsp;rollingUpdate: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;maximum&amp;nbsp;number&amp;nbsp;of&amp;nbsp;nodes&amp;nbsp;to&amp;nbsp;simultaneously&amp;nbsp;apply&amp;nbsp;pod&amp;nbsp;updates&amp;nbsp;on. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;can&amp;nbsp;be&amp;nbsp;specified&amp;nbsp;either&amp;nbsp;as&amp;nbsp;number&amp;nbsp;or&amp;nbsp;percentage&amp;nbsp;of&amp;nbsp;nodes.&amp;nbsp;Default&amp;nbsp;1. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;maxUnavailable:&amp;nbsp;&quot;1&quot; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# gpu validator는 Daemonset으로 실행, 모든 GPU 노드에서 모든 구성 요소가 예상대로 작동하는지 확인.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# 각 구성 요소에 대해 InitContainers를 통해 검증을 수행하고, 결과로 /run/nvidia/validations 디렉터리 아래에 상태 파일을 작성한다.&lt;br /&gt;validator: &lt;br /&gt;&amp;nbsp;&amp;nbsp;repository:&amp;nbsp;nvcr.io/nvidia/cloud-native &lt;br /&gt;&amp;nbsp;&amp;nbsp;image:&amp;nbsp;gpu-operator-validator &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;If&amp;nbsp;version&amp;nbsp;is&amp;nbsp;not&amp;nbsp;specified,&amp;nbsp;then&amp;nbsp;default&amp;nbsp;is&amp;nbsp;to&amp;nbsp;use&amp;nbsp;chart.AppVersion &lt;br /&gt;&amp;nbsp;&amp;nbsp;#version:&amp;nbsp;&quot;&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullPolicy:&amp;nbsp;IfNotPresent &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullSecrets:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;env:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;args:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;resources:&amp;nbsp;{} &lt;br /&gt;&amp;nbsp;&amp;nbsp;plugin: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;env: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;WITH_WORKLOAD &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;false&quot; &lt;br /&gt;&lt;br /&gt;operator: &lt;br /&gt;&amp;nbsp;&amp;nbsp;repository:&amp;nbsp;nvcr.io/nvidia &lt;br /&gt;&amp;nbsp;&amp;nbsp;image:&amp;nbsp;gpu-operator &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;If&amp;nbsp;version&amp;nbsp;is&amp;nbsp;not&amp;nbsp;specified,&amp;nbsp;then&amp;nbsp;default&amp;nbsp;is&amp;nbsp;to&amp;nbsp;use&amp;nbsp;chart.AppVersion &lt;br /&gt;&amp;nbsp;&amp;nbsp;#version:&amp;nbsp;&quot;&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullPolicy:&amp;nbsp;IfNotPresent &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullSecrets:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;priorityClassName:&amp;nbsp;system-node-critical &lt;br /&gt;&amp;nbsp;&amp;nbsp;defaultRuntime:&amp;nbsp;docker &lt;br /&gt;&amp;nbsp;&amp;nbsp;runtimeClass:&amp;nbsp;nvidia&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# redhat openshift의 driver toolkit사용여부&lt;br /&gt;&amp;nbsp;&amp;nbsp;use_ocp_driver_toolkit:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;cleanup&amp;nbsp;CRD&amp;nbsp;on&amp;nbsp;chart&amp;nbsp;un-install &lt;br /&gt;&amp;nbsp;&amp;nbsp;cleanupCRD:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;upgrade&amp;nbsp;CRD&amp;nbsp;on&amp;nbsp;chart&amp;nbsp;upgrade,&amp;nbsp;requires&amp;nbsp;--disable-openapi-validation&amp;nbsp;flag &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;to&amp;nbsp;be&amp;nbsp;passed&amp;nbsp;during&amp;nbsp;helm&amp;nbsp;upgrade. &lt;br /&gt;&amp;nbsp;&amp;nbsp;upgradeCRD:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;initContainer: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;image:&amp;nbsp;cuda &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;repository:&amp;nbsp;nvcr.io/nvidia &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;12.4.1-base-ubi8 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imagePullPolicy:&amp;nbsp;IfNotPresent &lt;br /&gt;&amp;nbsp;&amp;nbsp;tolerations: &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;key:&amp;nbsp;&quot;node-role.kubernetes.io/master&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;operator:&amp;nbsp;&quot;Equal&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;effect:&amp;nbsp;&quot;NoSchedule&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;key:&amp;nbsp;&quot;node-role.kubernetes.io/control-plane&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;operator:&amp;nbsp;&quot;Equal&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;effect:&amp;nbsp;&quot;NoSchedule&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;annotations: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;openshift.io/scc:&amp;nbsp;restricted-readonly &lt;br /&gt;&amp;nbsp;&amp;nbsp;affinity: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nodeAffinity: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;preferredDuringSchedulingIgnoredDuringExecution: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;weight:&amp;nbsp;1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;preference: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;matchExpressions: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;key:&amp;nbsp;&quot;node-role.kubernetes.io/master&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;operator:&amp;nbsp;In &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;values:&amp;nbsp;[&quot;&quot;] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;weight:&amp;nbsp;1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;preference: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;matchExpressions: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;key:&amp;nbsp;&quot;node-role.kubernetes.io/control-plane&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;operator:&amp;nbsp;In &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;values:&amp;nbsp;[&quot;&quot;] &lt;br /&gt;&amp;nbsp;&amp;nbsp;logging: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;Zap&amp;nbsp;time&amp;nbsp;encoding&amp;nbsp;(one&amp;nbsp;of&amp;nbsp;'epoch',&amp;nbsp;'millis',&amp;nbsp;'nano',&amp;nbsp;'iso8601',&amp;nbsp;'rfc3339'&amp;nbsp;or&amp;nbsp;'rfc3339nano') &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;timeEncoding:&amp;nbsp;epoch &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;Zap&amp;nbsp;Level&amp;nbsp;to&amp;nbsp;configure&amp;nbsp;the&amp;nbsp;verbosity&amp;nbsp;of&amp;nbsp;logging.&amp;nbsp;Can&amp;nbsp;be&amp;nbsp;one&amp;nbsp;of&amp;nbsp;'debug',&amp;nbsp;'info',&amp;nbsp;'error',&amp;nbsp;or&amp;nbsp;any&amp;nbsp;integer&amp;nbsp;value&amp;nbsp;&amp;gt;&amp;nbsp;0&amp;nbsp;which&amp;nbsp;corresponds&amp;nbsp;to&amp;nbsp;custom&amp;nbsp;debug&amp;nbsp;levels&amp;nbsp;of&amp;nbsp;increasing&amp;nbsp;verbosity &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;level:&amp;nbsp;info &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;Development&amp;nbsp;Mode&amp;nbsp;defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;Production&amp;nbsp;Mode&amp;nbsp;defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;develMode:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;resources: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;limits: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cpu:&amp;nbsp;500m &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memory:&amp;nbsp;350Mi &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;requests: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cpu:&amp;nbsp;200m &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memory:&amp;nbsp;100Mi &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# multi-instance gpu를 1개 디바이스로만 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# 모든 노드가 mig를 사용하는게 아니라면 mixed로 설정해야함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mig: &lt;br /&gt;&amp;nbsp;&amp;nbsp;strategy:&amp;nbsp;single &lt;br /&gt;&lt;br /&gt;driver: &lt;br /&gt;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;true&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#clusterplicy crd가 아닌 nvidia driver crd 사용. 각 노드별 서로다른 gpu driver와 os로 셋업해 cluster구성가능&lt;br /&gt;&amp;nbsp;&amp;nbsp;nvidiaDriverCRD: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;deployDefaultCR:&amp;nbsp;true &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;driverType:&amp;nbsp;gpu &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nodeSelector:&amp;nbsp;{}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# GDS사용시,&amp;nbsp; &lt;span style=&quot;background-color: #ffffff; color: #1a1a1a; text-align: start;&quot;&gt;GDS driver version 2.17.5 or newer버전은 open kernel module사용필요.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;useOpenKernelModules:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;use&amp;nbsp;pre-compiled&amp;nbsp;packages&amp;nbsp;for&amp;nbsp;NVIDIA&amp;nbsp;driver&amp;nbsp;installation. &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;only&amp;nbsp;supported&amp;nbsp;for&amp;nbsp;as&amp;nbsp;a&amp;nbsp;tech-preview&amp;nbsp;feature&amp;nbsp;on&amp;nbsp;ubuntu22.04&amp;nbsp;kernels.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#인터넷환경이 제약적인경우, precompiled된 driver사용.&lt;br /&gt;&amp;nbsp;&amp;nbsp;usePrecompiled:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;repository:&amp;nbsp;nvcr.io/nvidia &lt;br /&gt;&amp;nbsp;&amp;nbsp;image:&amp;nbsp;driver &lt;br /&gt;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;&quot;550.90.07&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullPolicy:&amp;nbsp;IfNotPresent &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullSecrets:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;startupProbe: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;initialDelaySeconds:&amp;nbsp;60 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;periodSeconds:&amp;nbsp;10 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;nvidia-smi&amp;nbsp;can&amp;nbsp;take&amp;nbsp;longer&amp;nbsp;than&amp;nbsp;30s&amp;nbsp;in&amp;nbsp;some&amp;nbsp;cases &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;ensure&amp;nbsp;enough&amp;nbsp;timeout&amp;nbsp;is&amp;nbsp;set &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;timeoutSeconds:&amp;nbsp;60 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;failureThreshold:&amp;nbsp;120&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# RDMA 사용여부. 별도로 다룸&lt;br /&gt;&amp;nbsp;&amp;nbsp;rdma: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;false&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#rdma를 위한 mofed설치를 직접host에 설치한경우 true, network operator를 통해 설치할 경우 false.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;useHostMofed:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;upgradePolicy: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;global&amp;nbsp;switch&amp;nbsp;for&amp;nbsp;automatic&amp;nbsp;upgrade&amp;nbsp;feature &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;if&amp;nbsp;set&amp;nbsp;to&amp;nbsp;false&amp;nbsp;all&amp;nbsp;other&amp;nbsp;options&amp;nbsp;are&amp;nbsp;ignored &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;autoUpgrade:&amp;nbsp;true &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;how&amp;nbsp;many&amp;nbsp;nodes&amp;nbsp;can&amp;nbsp;be&amp;nbsp;upgraded&amp;nbsp;in&amp;nbsp;parallel &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;0&amp;nbsp;means&amp;nbsp;no&amp;nbsp;limit,&amp;nbsp;all&amp;nbsp;nodes&amp;nbsp;will&amp;nbsp;be&amp;nbsp;upgraded&amp;nbsp;in&amp;nbsp;parallel &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;maxParallelUpgrades:&amp;nbsp;1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;maximum&amp;nbsp;number&amp;nbsp;of&amp;nbsp;nodes&amp;nbsp;with&amp;nbsp;the&amp;nbsp;driver&amp;nbsp;installed,&amp;nbsp;that&amp;nbsp;can&amp;nbsp;be&amp;nbsp;unavailable&amp;nbsp;during &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;the&amp;nbsp;upgrade.&amp;nbsp;Value&amp;nbsp;can&amp;nbsp;be&amp;nbsp;an&amp;nbsp;absolute&amp;nbsp;number&amp;nbsp;(ex:&amp;nbsp;5)&amp;nbsp;or &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;a&amp;nbsp;percentage&amp;nbsp;of&amp;nbsp;total&amp;nbsp;nodes&amp;nbsp;at&amp;nbsp;the&amp;nbsp;start&amp;nbsp;of&amp;nbsp;upgrade&amp;nbsp;(ex: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;10%).&amp;nbsp;Absolute&amp;nbsp;number&amp;nbsp;is&amp;nbsp;calculated&amp;nbsp;from&amp;nbsp;percentage&amp;nbsp;by&amp;nbsp;rounding &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;up.&amp;nbsp;By&amp;nbsp;default,&amp;nbsp;a&amp;nbsp;fixed&amp;nbsp;value&amp;nbsp;of&amp;nbsp;25%&amp;nbsp;is&amp;nbsp;used.' &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;maxUnavailable:&amp;nbsp;25% &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;options&amp;nbsp;for&amp;nbsp;waiting&amp;nbsp;on&amp;nbsp;pod(job)&amp;nbsp;completions &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;waitForCompletion: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;timeoutSeconds:&amp;nbsp;0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;podSelector:&amp;nbsp;&quot;&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;options&amp;nbsp;for&amp;nbsp;gpu&amp;nbsp;pod&amp;nbsp;deletion &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gpuPodDeletion: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;force:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;timeoutSeconds:&amp;nbsp;300 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;deleteEmptyDir:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;options&amp;nbsp;for&amp;nbsp;node&amp;nbsp;drain&amp;nbsp;(`kubectl&amp;nbsp;drain`)&amp;nbsp;before&amp;nbsp;the&amp;nbsp;driver&amp;nbsp;reload &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;this&amp;nbsp;is&amp;nbsp;required&amp;nbsp;only&amp;nbsp;if&amp;nbsp;default&amp;nbsp;GPU&amp;nbsp;pod&amp;nbsp;deletions&amp;nbsp;done&amp;nbsp;by&amp;nbsp;the&amp;nbsp;operator &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;are&amp;nbsp;not&amp;nbsp;sufficient&amp;nbsp;to&amp;nbsp;re-install&amp;nbsp;the&amp;nbsp;driver &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;drain: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;enable:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;force:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;podSelector:&amp;nbsp;&quot;&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;It's&amp;nbsp;recommended&amp;nbsp;to&amp;nbsp;set&amp;nbsp;a&amp;nbsp;timeout&amp;nbsp;to&amp;nbsp;avoid&amp;nbsp;infinite&amp;nbsp;drain&amp;nbsp;in&amp;nbsp;case&amp;nbsp;non-fatal&amp;nbsp;error&amp;nbsp;keeps&amp;nbsp;happening&amp;nbsp;on&amp;nbsp;retries &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;timeoutSeconds:&amp;nbsp;300 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;deleteEmptyDir:&amp;nbsp;false&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# 다양한 운영 체제 및 커널 버전과 호환되는 드라이버를 자동으로 선택하고 배포, 업그레이드 등 수행&lt;br /&gt;&amp;nbsp;&amp;nbsp;manager: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;image:&amp;nbsp;k8s-driver-manager &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;repository:&amp;nbsp;nvcr.io/nvidia/cloud-native &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;When&amp;nbsp;choosing&amp;nbsp;a&amp;nbsp;different&amp;nbsp;version&amp;nbsp;of&amp;nbsp;k8s-driver-manager,&amp;nbsp;DO&amp;nbsp;NOT&amp;nbsp;downgrade&amp;nbsp;to&amp;nbsp;a&amp;nbsp;version&amp;nbsp;lower&amp;nbsp;than&amp;nbsp;v0.6.4 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;to&amp;nbsp;ensure&amp;nbsp;k8s-driver-manager&amp;nbsp;stays&amp;nbsp;compatible&amp;nbsp;with&amp;nbsp;gpu-operator&amp;nbsp;starting&amp;nbsp;from&amp;nbsp;v24.3.0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;v0.6.8 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imagePullPolicy:&amp;nbsp;IfNotPresent&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#작업시 노드에 pod유지/퇴출에 관한 설정들..&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;env: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;ENABLE_GPU_POD_EVICTION &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;true&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;ENABLE_AUTO_DRAIN &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;false&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;DRAIN_USE_FORCE &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;false&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;DRAIN_POD_SELECTOR_LABEL &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;DRAIN_TIMEOUT_SECONDS &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;0s&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;DRAIN_DELETE_EMPTYDIR_DATA &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;false&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;env:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;resources:&amp;nbsp;{} &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;Private&amp;nbsp;mirror&amp;nbsp;repository&amp;nbsp;configuration &lt;br /&gt;&amp;nbsp;&amp;nbsp;repoConfig: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;configMapName:&amp;nbsp;&quot;&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;custom&amp;nbsp;ssl&amp;nbsp;key/certificate&amp;nbsp;configuration &lt;br /&gt;&amp;nbsp;&amp;nbsp;certConfig: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name:&amp;nbsp;&quot;&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;vGPU&amp;nbsp;licensing&amp;nbsp;configuration&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# vGPU 사용시 필수&lt;br /&gt;&amp;nbsp;&amp;nbsp;licensingConfig: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;configMapName:&amp;nbsp;&quot;&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nlsEnabled:&amp;nbsp;true &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;vGPU&amp;nbsp;topology&amp;nbsp;daemon&amp;nbsp;configuration &lt;br /&gt;&amp;nbsp;&amp;nbsp;virtualTopology: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;config:&amp;nbsp;&quot;&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;kernel&amp;nbsp;module&amp;nbsp;configuration&amp;nbsp;for&amp;nbsp;NVIDIA&amp;nbsp;driver &lt;br /&gt;&amp;nbsp;&amp;nbsp;kernelModuleConfig: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name:&amp;nbsp;&quot;&quot; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#host에 container toolkit직접 설치시, false&lt;br /&gt;toolkit: &lt;br /&gt;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;true &lt;br /&gt;&amp;nbsp;&amp;nbsp;repository:&amp;nbsp;nvcr.io/nvidia/k8s &lt;br /&gt;&amp;nbsp;&amp;nbsp;image:&amp;nbsp;container-toolkit &lt;br /&gt;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;v1.15.0-ubuntu20.04 &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullPolicy:&amp;nbsp;IfNotPresent &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullSecrets:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;env:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;resources:&amp;nbsp;{} &lt;br /&gt;&amp;nbsp;&amp;nbsp;installDir:&amp;nbsp;&quot;/usr/local/nvidia&quot; &lt;br /&gt;&lt;br /&gt;devicePlugin: &lt;br /&gt;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;true &lt;br /&gt;&amp;nbsp;&amp;nbsp;repository:&amp;nbsp;nvcr.io/nvidia &lt;br /&gt;&amp;nbsp;&amp;nbsp;image:&amp;nbsp;k8s-device-plugin &lt;br /&gt;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;v0.15.0-ubi8 &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullPolicy:&amp;nbsp;IfNotPresent &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullSecrets:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;args:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;env: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;PASS_DEVICE_SPECS &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;true&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;FAIL_ON_INIT_ERROR &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;true&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;DEVICE_LIST_STRATEGY &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;envvar &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;DEVICE_ID_STRATEGY &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;uuid &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;NVIDIA_VISIBLE_DEVICES &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;all &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;NVIDIA_DRIVER_CAPABILITIES &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;all &lt;br /&gt;&amp;nbsp;&amp;nbsp;resources:&amp;nbsp;{} &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;Plugin&amp;nbsp;configuration &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;Use&amp;nbsp;&quot;name&quot;&amp;nbsp;to&amp;nbsp;either&amp;nbsp;point&amp;nbsp;to&amp;nbsp;an&amp;nbsp;existing&amp;nbsp;ConfigMap&amp;nbsp;or&amp;nbsp;to&amp;nbsp;create&amp;nbsp;a&amp;nbsp;new&amp;nbsp;one&amp;nbsp;with&amp;nbsp;a&amp;nbsp;list&amp;nbsp;of&amp;nbsp;configurations(i.e&amp;nbsp;with&amp;nbsp;create=true). &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;Use&amp;nbsp;&quot;data&quot;&amp;nbsp;to&amp;nbsp;build&amp;nbsp;an&amp;nbsp;integrated&amp;nbsp;ConfigMap&amp;nbsp;from&amp;nbsp;a&amp;nbsp;set&amp;nbsp;of&amp;nbsp;configurations&amp;nbsp;as &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;part&amp;nbsp;of&amp;nbsp;this&amp;nbsp;helm&amp;nbsp;chart.&amp;nbsp;An&amp;nbsp;example&amp;nbsp;of&amp;nbsp;setting&amp;nbsp;&quot;data&quot;&amp;nbsp;might&amp;nbsp;be: &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;config: &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp;name:&amp;nbsp;device-plugin-config &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp;create:&amp;nbsp;true &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp;data: &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;default:&amp;nbsp;|- &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;v1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flags: &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;migStrategy:&amp;nbsp;none &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mig-single:&amp;nbsp;|- &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;v1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flags: &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;migStrategy:&amp;nbsp;single &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mig-mixed:&amp;nbsp;|- &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;v1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flags: &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;migStrategy:&amp;nbsp;mixed &lt;br /&gt;&amp;nbsp;&amp;nbsp;config: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;Create&amp;nbsp;a&amp;nbsp;ConfigMap&amp;nbsp;(default:&amp;nbsp;false) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;create:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;ConfigMap&amp;nbsp;name&amp;nbsp;(either&amp;nbsp;exiting&amp;nbsp;or&amp;nbsp;to&amp;nbsp;create&amp;nbsp;a&amp;nbsp;new&amp;nbsp;one&amp;nbsp;with&amp;nbsp;create=true&amp;nbsp;above) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name:&amp;nbsp;&quot;&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;Default&amp;nbsp;config&amp;nbsp;name&amp;nbsp;within&amp;nbsp;the&amp;nbsp;ConfigMap &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;default:&amp;nbsp;&quot;&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;Data&amp;nbsp;section&amp;nbsp;for&amp;nbsp;the&amp;nbsp;ConfigMap&amp;nbsp;to&amp;nbsp;create&amp;nbsp;(i.e&amp;nbsp;only&amp;nbsp;applies&amp;nbsp;when&amp;nbsp;create=true) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data:&amp;nbsp;{} &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;MPS&amp;nbsp;related&amp;nbsp;configuration&amp;nbsp;for&amp;nbsp;the&amp;nbsp;plugin &lt;br /&gt;&amp;nbsp;&amp;nbsp;mps: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;MPS&amp;nbsp;root&amp;nbsp;path&amp;nbsp;on&amp;nbsp;the&amp;nbsp;host &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;root:&amp;nbsp;&quot;/run/nvidia/mps&quot; &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;standalone&amp;nbsp;dcgm&amp;nbsp;hostengine&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# dcgm은 기본적으로 dcgm exporter내 hostengine을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# 단독 standalone으로 사용필요시 true&lt;br /&gt;dcgm: &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;disabled&amp;nbsp;by&amp;nbsp;default&amp;nbsp;to&amp;nbsp;use&amp;nbsp;embedded&amp;nbsp;nv-hostengine&amp;nbsp;by&amp;nbsp;exporter &lt;br /&gt;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;repository:&amp;nbsp;nvcr.io/nvidia/cloud-native &lt;br /&gt;&amp;nbsp;&amp;nbsp;image:&amp;nbsp;dcgm &lt;br /&gt;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;3.3.5-1-ubuntu22.04 &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullPolicy:&amp;nbsp;IfNotPresent &lt;br /&gt;&amp;nbsp;&amp;nbsp;args:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;env:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;resources:&amp;nbsp;{} &lt;br /&gt;&lt;br /&gt;dcgmExporter: &lt;br /&gt;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;true &lt;br /&gt;&amp;nbsp;&amp;nbsp;repository:&amp;nbsp;nvcr.io/nvidia/k8s &lt;br /&gt;&amp;nbsp;&amp;nbsp;image:&amp;nbsp;dcgm-exporter &lt;br /&gt;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;3.3.5-3.4.1-ubuntu22.04 &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullPolicy:&amp;nbsp;IfNotPresent &lt;br /&gt;&amp;nbsp;&amp;nbsp;env: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;DCGM_EXPORTER_LISTEN &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;:9400&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;DCGM_EXPORTER_KUBERNETES &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;true&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;DCGM_EXPORTER_COLLECTORS &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;/etc/dcgm-exporter/dcp-metrics-included.csv&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;resources:&amp;nbsp;{} &lt;br /&gt;&amp;nbsp;&amp;nbsp;serviceMonitor: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;interval:&amp;nbsp;15s &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;honorLabels:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;additionalLabels:&amp;nbsp;{} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;relabelings:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;-&amp;nbsp;source_labels: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;__meta_kubernetes_pod_node_name &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp;regex:&amp;nbsp;(.*) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp;target_label:&amp;nbsp;instance &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp;replacement:&amp;nbsp;$1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp;action:&amp;nbsp;replace &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#gpu feature discovery 사용여부. 필수&lt;br /&gt;gfd: &lt;br /&gt;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;true &lt;br /&gt;&amp;nbsp;&amp;nbsp;repository:&amp;nbsp;nvcr.io/nvidia &lt;br /&gt;&amp;nbsp;&amp;nbsp;image:&amp;nbsp;k8s-device-plugin &lt;br /&gt;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;v0.15.0-ubi8 &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullPolicy:&amp;nbsp;IfNotPresent &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullSecrets:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;env: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;GFD_SLEEP_INTERVAL &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;60s &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;GFD_FAIL_ON_INIT_ERROR &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;true&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;resources:&amp;nbsp;{} &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#mig 사용시 mig config설정&lt;br /&gt;migManager: &lt;br /&gt;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;true &lt;br /&gt;&amp;nbsp;&amp;nbsp;repository:&amp;nbsp;nvcr.io/nvidia/cloud-native &lt;br /&gt;&amp;nbsp;&amp;nbsp;image:&amp;nbsp;k8s-mig-manager &lt;br /&gt;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;v0.7.0-ubuntu20.04 &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullPolicy:&amp;nbsp;IfNotPresent &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullSecrets:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;env: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;WITH_REBOOT &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;false&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;resources:&amp;nbsp;{} &lt;br /&gt;&amp;nbsp;&amp;nbsp;config: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name:&amp;nbsp;&quot;default-mig-parted-config&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;default:&amp;nbsp;&quot;all-disabled&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;gpuClientsConfig: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name:&amp;nbsp;&quot;&quot; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#굳이필요없어보임.&lt;br /&gt;nodeStatusExporter: &lt;br /&gt;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;repository:&amp;nbsp;nvcr.io/nvidia/cloud-native &lt;br /&gt;&amp;nbsp;&amp;nbsp;image:&amp;nbsp;gpu-operator-validator &lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;If&amp;nbsp;version&amp;nbsp;is&amp;nbsp;not&amp;nbsp;specified,&amp;nbsp;then&amp;nbsp;default&amp;nbsp;is&amp;nbsp;to&amp;nbsp;use&amp;nbsp;chart.AppVersion &lt;br /&gt;&amp;nbsp;&amp;nbsp;#version:&amp;nbsp;&quot;&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullPolicy:&amp;nbsp;IfNotPresent &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullSecrets:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;resources:&amp;nbsp;{} &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#별도로 다룸&lt;br /&gt;gds: &lt;br /&gt;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;repository:&amp;nbsp;nvcr.io/nvidia/cloud-native &lt;br /&gt;&amp;nbsp;&amp;nbsp;image:&amp;nbsp;nvidia-fs &lt;br /&gt;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;&quot;2.17.5&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullPolicy:&amp;nbsp;IfNotPresent &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullSecrets:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;env:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;args:&amp;nbsp;[] &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# NVIDIA GPU와 호스트 시스템 간의 메모리 복사 성능을 최적화하기 위해 개발된 라이브러리.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# GDRCopy는 특히 GPU Direct RDMA (Remote Direct Memory Access) 기술을 활용하여 GPU와 호스트 메모리 간의 데이터를 효율적으로 복사할 수있도록한다. HPC (High-Performance Computing) 및 데이터 집약적인 응용 프로그램에서 중요한 역할.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#RDMA사용시 추가적옵션.&lt;br /&gt;gdrcopy: &lt;br /&gt;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;repository:&amp;nbsp;nvcr.io/nvidia/cloud-native &lt;br /&gt;&amp;nbsp;&amp;nbsp;image:&amp;nbsp;gdrdrv &lt;br /&gt;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;&quot;v2.4.1&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullPolicy:&amp;nbsp;IfNotPresent &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullSecrets:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;env:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;args:&amp;nbsp;[] &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#vm host에 설치하여 vgpu할당/생성해주는 매니저. k8s cluster위의 vm생성시 필요(KubeVirt)&lt;br /&gt;vgpuManager: &lt;br /&gt;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;repository:&amp;nbsp;&quot;&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;image:&amp;nbsp;vgpu-manager &lt;br /&gt;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;&quot;&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullPolicy:&amp;nbsp;IfNotPresent &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullSecrets:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;env:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;resources:&amp;nbsp;{} &lt;br /&gt;&amp;nbsp;&amp;nbsp;driverManager: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;image:&amp;nbsp;k8s-driver-manager &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;repository:&amp;nbsp;nvcr.io/nvidia/cloud-native &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;When&amp;nbsp;choosing&amp;nbsp;a&amp;nbsp;different&amp;nbsp;version&amp;nbsp;of&amp;nbsp;k8s-driver-manager,&amp;nbsp;DO&amp;nbsp;NOT&amp;nbsp;downgrade&amp;nbsp;to&amp;nbsp;a&amp;nbsp;version&amp;nbsp;lower&amp;nbsp;than&amp;nbsp;v0.6.4 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;to&amp;nbsp;ensure&amp;nbsp;k8s-driver-manager&amp;nbsp;stays&amp;nbsp;compatible&amp;nbsp;with&amp;nbsp;gpu-operator&amp;nbsp;starting&amp;nbsp;from&amp;nbsp;v24.3.0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;v0.6.8 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imagePullPolicy:&amp;nbsp;IfNotPresent &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;env: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;ENABLE_GPU_POD_EVICTION &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;false&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;ENABLE_AUTO_DRAIN &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;false&quot; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# vgpu device 관리&lt;br /&gt;vgpuDeviceManager: &lt;br /&gt;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;true &lt;br /&gt;&amp;nbsp;&amp;nbsp;repository:&amp;nbsp;nvcr.io/nvidia/cloud-native &lt;br /&gt;&amp;nbsp;&amp;nbsp;image:&amp;nbsp;vgpu-device-manager &lt;br /&gt;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;&quot;v0.2.6&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullPolicy:&amp;nbsp;IfNotPresent &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullSecrets:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;env:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;config: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name:&amp;nbsp;&quot;&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;default:&amp;nbsp;&quot;default&quot; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# vm환경에서 gpu passthrough를 통한 직접 vgpu사용시, vfio-pci를 로드하고(vf는 sr-iov등을 통한 가상화된 디바이스),&amp;nbsp; 노드의 모든 gpu에 바인딩해주는 매니저&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# vm gpu passthrough사용시 필수&lt;br /&gt;vfioManager: &lt;br /&gt;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;true &lt;br /&gt;&amp;nbsp;&amp;nbsp;repository:&amp;nbsp;nvcr.io/nvidia &lt;br /&gt;&amp;nbsp;&amp;nbsp;image:&amp;nbsp;cuda &lt;br /&gt;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;12.4.1-base-ubi8 &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullPolicy:&amp;nbsp;IfNotPresent &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullSecrets:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;env:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;resources:&amp;nbsp;{} &lt;br /&gt;&amp;nbsp;&amp;nbsp;driverManager: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;image:&amp;nbsp;k8s-driver-manager &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;repository:&amp;nbsp;nvcr.io/nvidia/cloud-native &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;When&amp;nbsp;choosing&amp;nbsp;a&amp;nbsp;different&amp;nbsp;version&amp;nbsp;of&amp;nbsp;k8s-driver-manager,&amp;nbsp;DO&amp;nbsp;NOT&amp;nbsp;downgrade&amp;nbsp;to&amp;nbsp;a&amp;nbsp;version&amp;nbsp;lower&amp;nbsp;than&amp;nbsp;v0.6.4 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;to&amp;nbsp;ensure&amp;nbsp;k8s-driver-manager&amp;nbsp;stays&amp;nbsp;compatible&amp;nbsp;with&amp;nbsp;gpu-operator&amp;nbsp;starting&amp;nbsp;from&amp;nbsp;v24.3.0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;v0.6.8 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imagePullPolicy:&amp;nbsp;IfNotPresent &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;env: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;ENABLE_GPU_POD_EVICTION &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;false&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;ENABLE_AUTO_DRAIN &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;false&quot; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# 주요 용어 페이지 참고&lt;br /&gt;kataManager: &lt;br /&gt;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;config: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;artifactsDir:&amp;nbsp;&quot;/opt/nvidia-gpu-operator/artifacts/runtimeclasses&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;runtimeClasses: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;kata-nvidia-gpu &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nodeSelector:&amp;nbsp;{} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;artifacts: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url:&amp;nbsp;nvcr.io/nvidia/cloud-native/kata-gpu-artifacts:ubuntu22.04-535.54.03 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pullSecret:&amp;nbsp;&quot;&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;kata-nvidia-gpu-snp &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nodeSelector: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;nvidia.com/cc.capable&quot;:&amp;nbsp;&quot;true&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;artifacts: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url:&amp;nbsp;nvcr.io/nvidia/cloud-native/kata-gpu-artifacts:ubuntu22.04-535.86.10-snp &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pullSecret:&amp;nbsp;&quot;&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;repository:&amp;nbsp;nvcr.io/nvidia/cloud-native &lt;br /&gt;&amp;nbsp;&amp;nbsp;image:&amp;nbsp;k8s-kata-manager &lt;br /&gt;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;v0.2.0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullPolicy:&amp;nbsp;IfNotPresent &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullSecrets:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;env:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;resources:&amp;nbsp;{} &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# kubevirt사용시 vm환경에서 gpu자원 사용을 도움&lt;br /&gt;sandboxDevicePlugin: &lt;br /&gt;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;true &lt;br /&gt;&amp;nbsp;&amp;nbsp;repository:&amp;nbsp;nvcr.io/nvidia &lt;br /&gt;&amp;nbsp;&amp;nbsp;image:&amp;nbsp;kubevirt-gpu-device-plugin &lt;br /&gt;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;v1.2.7 &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullPolicy:&amp;nbsp;IfNotPresent &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullSecrets:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;args:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;env:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;resources:&amp;nbsp;{} &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# confidential container환경에서 사용&lt;br /&gt;ccManager: &lt;br /&gt;&amp;nbsp;&amp;nbsp;enabled:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;defaultMode:&amp;nbsp;&quot;off&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;repository:&amp;nbsp;nvcr.io/nvidia/cloud-native &lt;br /&gt;&amp;nbsp;&amp;nbsp;image:&amp;nbsp;k8s-cc-manager &lt;br /&gt;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;v0.1.1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullPolicy:&amp;nbsp;IfNotPresent &lt;br /&gt;&amp;nbsp;&amp;nbsp;imagePullSecrets:&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;env: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;CC_CAPABLE_DEVICE_IDS &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;0x2339,0x2331,0x2330,0x2324,0x2322,0x233d&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;resources:&amp;nbsp;{} &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#gpu, cpu, mem등 노드 상태를 수집.&lt;br /&gt;node-feature-discovery: &lt;br /&gt;&amp;nbsp;&amp;nbsp;enableNodeFeatureApi:&amp;nbsp;true &lt;br /&gt;&amp;nbsp;&amp;nbsp;gc: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;enable:&amp;nbsp;true &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;replicaCount:&amp;nbsp;1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serviceAccount: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name:&amp;nbsp;node-feature-discovery &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;create:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;worker: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serviceAccount: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name:&amp;nbsp;node-feature-discovery &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;disable&amp;nbsp;creation&amp;nbsp;to&amp;nbsp;avoid&amp;nbsp;duplicate&amp;nbsp;serviceaccount&amp;nbsp;creation&amp;nbsp;by&amp;nbsp;master&amp;nbsp;spec&amp;nbsp;below &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;create:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tolerations: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;key:&amp;nbsp;&quot;node-role.kubernetes.io/master&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;operator:&amp;nbsp;&quot;Equal&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;effect:&amp;nbsp;&quot;NoSchedule&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;key:&amp;nbsp;&quot;node-role.kubernetes.io/control-plane&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;operator:&amp;nbsp;&quot;Equal&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value:&amp;nbsp;&quot;&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;effect:&amp;nbsp;&quot;NoSchedule&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;key:&amp;nbsp;nvidia.com/gpu &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;operator:&amp;nbsp;Exists &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;effect:&amp;nbsp;NoSchedule &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;config: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sources: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pci:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;#03이&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;deviceClassWhitelist: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- &quot;02&quot; # 모든 네트워크 컨트롤러 허용 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- &quot;0200&quot; # 이더넷 컨트롤러 허용 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- &quot;0207&quot; # Infiniband 컨트롤러 허용 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- &quot;0300&quot; # VGA 호환 그래픽 컨트롤러 허용 (주로 GPU) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- &quot;0302&quot; # VGA 호환이 아닌 3D 그래픽 컨트롤러 허용 (주로 고성능 GPU) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;deviceLabelFields: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;vendor &lt;br /&gt;&amp;nbsp;&amp;nbsp;master: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serviceAccount: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name:&amp;nbsp;node-feature-discovery &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;create:&amp;nbsp;true &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;config: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;extraLabelNs:&amp;nbsp;[&quot;nvidia.com&quot;] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;noPublish:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;resourceLabels:&amp;nbsp;[&quot;nvidia.com/feature-1&quot;,&quot;nvidia.com/feature-2&quot;] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;enableTaints:&amp;nbsp;false &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;labelWhiteList:&amp;nbsp;&quot;nvidia.com/gpu&quot;&lt;/p&gt;</description>
      <category>MLOps/GPU</category>
      <category>GPU Operator</category>
      <category>helm</category>
      <author>DanielZZI</author>
      <guid isPermaLink="true">https://danielzzi.tistory.com/35</guid>
      <comments>https://danielzzi.tistory.com/entry/gpu-operator-helm-%EC%A3%BC%EC%9A%94-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0#entry35comment</comments>
      <pubDate>Sun, 16 Jun 2024 18:51:17 +0900</pubDate>
    </item>
    <item>
      <title>NVIDIA GPU Operator 용어</title>
      <link>https://danielzzi.tistory.com/entry/NVIDIA-GPU-Operator-%EC%9A%A9%EC%96%B4</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;GPU Driver CRD (NVIDIA Driver CRD)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개별 노드에 GPU driver type과 버전을 지정할 수 있는 nvidia custom driver, custom resource를 생성할 수 있다.&lt;br /&gt;노드셀렉터를 통해 노드별 os에 따른 드라이버설정 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-- Cluster Policy CRD와 NVIDIA Driver CRD 비교&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;331&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z7MRC/btsH1jvTT4g/RgAay6AkfXTayZVGh4XmWk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z7MRC/btsH1jvTT4g/RgAay6AkfXTayZVGh4XmWk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z7MRC/btsH1jvTT4g/RgAay6AkfXTayZVGh4XmWk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ7MRC%2FbtsH1jvTT4g%2FRgAay6AkfXTayZVGh4XmWk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1134&quot; height=&quot;331&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;331&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/gpu-driver-configuration.html&quot;&gt;https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/gpu-driver-configuration.html&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;KubeVirt&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;k8s cluster상 VM환경 생성성하고 관리하게 해주는 기술.&lt;br /&gt;VM과 Container를 위한 개별 클러스터를 구성할 필요 없이 하나의 k8s cluster에서 모두 사용가능하게 해주는 기술&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 아래와 같은 노드별 GPU환경을 구동하려고 한다.&lt;br /&gt;node A: container구동&lt;br /&gt;node B: GPU PassThrough방식의 VM사용&lt;br /&gt;node C: vGPU방식의 VM사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 구성요소는&lt;br /&gt;node A:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NVIDIA Datacenter Driver: GPU Driver설치&lt;/li&gt;
&lt;li&gt;NVIDIA Container toolkit: CRI에서 GPU 활용하게 해준다.&lt;/li&gt;
&lt;li&gt;NVIDIA k8s Device Plugin: GPU자원을 발견&lt;/li&gt;
&lt;li&gt;NVIDIA DCGM Exporter: GPU 모니터링&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node B:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VFIO Manger : vfio-pci 로딩 및 GPU바인딩&lt;/li&gt;
&lt;li&gt;Sandbox Device Plugin: GPU자원을 발견&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node C:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NVIDIA vGPU Manager: vGPU driver설치&lt;/li&gt;
&lt;li&gt;NVIDIA vGPU Device Manager: vGPU 생성할당 위해 host에 설치&lt;/li&gt;
&lt;li&gt;Sandbox Device Plugin: vGPU device 발견&lt;br /&gt;위 와같은 구성요소를 설치하여 각 k8s의 worker node는 라벨링을 통해 용도를 구분하여 전용 workloads를 처리할 수있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Kata Containers&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker container와 다르게 kernel과 유저공간을 모두 격리한다.&lt;br /&gt;kata runtime은 QEMU와 같은 hypervisor를 사용하여 vm을 제공하고, 그 위에서 kata container를 실행한다.&lt;br /&gt;NVIDIA는 Confidentail Container를 통해 KATA runtime과 QEMU를 설치하고, kata container를 지원한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Confidential Container&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;computing측면에서 GPU workloads와 코드의 보안강화/격리를 위한 컨테이너기술&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;RDMA&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별도로 다룸&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;GDS(GPU Direct Storage)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별도로 다룸&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;NFD(Node Feature Discovery)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NFD의 구성 요소&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;nfd-master:&lt;br /&gt;NFD의 중앙 구성 요소로, 각 노드에서 수집된 기능 정보를 수신하고 이를 기반으로 노드에 라벨을 적용&lt;/li&gt;
&lt;li&gt;nfd-worker:&lt;br /&gt;각 노드에서 실행되며, 하드웨어 및 소프트웨어 기능을 검색하여 이를 nfd-master에 보고&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NFD의 작동 방식&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;nfd-worker 실행: NFD 데몬셋이 각 노드에서 nfd-worker를 실행. nfd-worker는 노드의 하드웨어 및 소프트웨어 상태를 검사&lt;/li&gt;
&lt;li&gt;기능 검색: nfd-worker는 노드의 다양한 기능을 검색. 여기에는 GPU, CPU, 메모리, 네트워크 인터페이스, 커널 모듈 등이 포함.&lt;/li&gt;
&lt;li&gt;라벨 생성: 발견된 기능 정보를 기반으로 라벨을 생성. 예를 들어, GPU가 감지되면 nvidia.com/gpu.present=true와 같은 라벨이 생성된다.&lt;/li&gt;
&lt;li&gt;nfd-master 보고: nfd-worker는 검색된 기능 정보를 nfd-master에 보고.&lt;/li&gt;
&lt;li&gt;노드 라벨링: nfd-master는 수신된 정보를 바탕으로 노드에 적절한 라벨을 추가.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;GFD(GPU Feature Discovery)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GFD는 노드에 GPU의 세부정보(gpu 모델, 메모리크기, cuda버전, 드라이버 버전..)를 수집하여 k8s노드에 레이블을 추가해준다.&lt;br /&gt;NFD(Node Feature Discovery) 마스터에 수집정보를 알린다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SR-IOV(Single Root I/O Virtualization)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 PCI Express(PCIe) endpoint가 여러 개별 디바이스로 사용될 수 있게 해주는기술&lt;br /&gt;하나의 PCIe장치를 여러개의 가상PCIe장치로 보이게 만드는 기술&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NVIDIA Ampere아키텍쳐에서 vGPU활용위해 필수&lt;br /&gt;The virtualization and IOMMU extensions (Intel VT-d or AMD IOMMU) are enabled in the BIOS.&lt;br /&gt;The host is booted with intel_iommu=on or amd_iommu=on on the kernel command line.&lt;br /&gt;If planning to use NVIDIA vGPU, SR-IOV must be enabled in the BIOS if your GPUs are based on the NVIDIA Ampere architecture or later. Refer to the NVIDIA vGPU Documentation to ensure you have met all of the prerequisites for using NVIDIA vGPU.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;NVIDIA Driver Manager for k8s (k8s-driver-manager)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gpu operator의 구성요소로 vfio manager, vGPU manager 등에서 이미지로 쓰임. 아래역할을 수행하는 중요한 component&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #0d1117; color: #e6edf3; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Check for already installed kernel modules.&lt;/li&gt;
&lt;li&gt;Perform Drain on the node ignoring Daemonset pods.&lt;/li&gt;
&lt;li&gt;Evict GPU Operator components like Device-Plugin, GPU Feature Discovery, DCGM Exporter etc.&lt;/li&gt;
&lt;li&gt;Unload kernel-modules.&lt;/li&gt;
&lt;li&gt;Unmount Driver root filesystem mounted on the host previously under /run/nvidia/driver.&lt;/li&gt;
&lt;li&gt;Uncordon the node.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>MLOps/GPU</category>
      <category>gfd</category>
      <category>gpu-operator</category>
      <category>nvidia</category>
      <category>vGPU</category>
      <author>DanielZZI</author>
      <guid isPermaLink="true">https://danielzzi.tistory.com/34</guid>
      <comments>https://danielzzi.tistory.com/entry/NVIDIA-GPU-Operator-%EC%9A%A9%EC%96%B4#entry34comment</comments>
      <pubDate>Sun, 16 Jun 2024 17:28:35 +0900</pubDate>
    </item>
    <item>
      <title>GPUDirect RDMA와 vGPU</title>
      <link>https://danielzzi.tistory.com/entry/GPUDirect-RDMA%EC%99%80-vGPU</link>
      <description>&lt;p&gt;먼저 RDMA부터 알아보자&lt;/p&gt;
&lt;h3&gt;RDMA (Remote Direct Memory Access)&lt;/h3&gt;
&lt;p&gt;RDMA는 네트워크를 통해 데이터 전송 시, CPU의 개입을 최소화하고 메모리 대 메모리 전송을 직접 수행하는 기술입니다. 주요 특징은 다음과 같습니다:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;낮은 지연 시간&lt;/strong&gt;: 데이터 전송 중에 CPU가 관여하지 않기 때문에 지연 시간이 매우 짧습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;높은 대역폭&lt;/strong&gt;: 네트워크 인터페이스 카드(NIC)가 직접 메모리에 접근하여 데이터를 전송하기 때문에 높은 대역폭을 제공합니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;낮은 CPU 오버헤드&lt;/strong&gt;: CPU의 개입이 최소화되어 CPU 사용률이 낮아집니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;제로 카피&lt;/strong&gt;: 데이터가 직접 전송되므로 추가적인 데이터 복사가 필요 없습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;RDMA는 &lt;strong&gt;인피니밴드(InfiniBand)&lt;/strong&gt;, &lt;strong&gt;RoCE (RDMA over Converged Ethernet)&lt;/strong&gt;, &lt;strong&gt;iWARP (Internet Wide Area RDMA Protocol)&lt;/strong&gt; 등의 프로토콜을 통해 구현됩니다.&lt;/p&gt;
&lt;p&gt;다음 GPUDirect RDMA를 알아보자&lt;/p&gt;
&lt;h3&gt;GPUDirect RDMA&lt;/h3&gt;
&lt;p&gt;GPUDirect RDMA는 NVIDIA의 기술로, RDMA를 GPU 메모리에 직접 적용하여 GPU와 네트워크 장치 간의 데이터 전송을 효율화합니다. 주요 특징은 다음과 같습니다:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;GPU와 네트워크 장치 간의 직접 데이터 전송&lt;/strong&gt;: 데이터가 GPU와 네트워크 장치 간에 직접 전송되므로, CPU 메모리로의 불필요한 전송 단계를 제거합니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;낮은 지연 시간&lt;/strong&gt;: 데이터 전송 중에 CPU 개입을 최소화하여 지연 시간을 줄입니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;높은 대역폭&lt;/strong&gt;: GPU 메모리와 네트워크 장치 간의 고속 데이터 전송을 가능하게 합니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;효율적인 자원 사용&lt;/strong&gt;: CPU 자원 사용을 줄이고, 데이터 전송 효율성을 극대화합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;GPUDirect RDMA를 사용하기위해서는 다음과 같은 것들이 필요하다.&lt;/p&gt;
&lt;p&gt;1.GPU &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RDMA 지원 NVIDIA GPU like Tesla, Quadro, A시리즈 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2.NIC&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Infiniband, RoCE를 지원하는 NIC.  대표적으로 Mellanox의 ConnetX시리즈를 많이 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3.SW &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linux kernel특정버전 호환성 확인필요&lt;/li&gt;
&lt;li&gt;driver 및 library: Nvidia GPU Driver, CUDA 툴킷, Mellanox OFED 드라이버(MOFED) 등&lt;br&gt;-&amp;gt; NVIDIA GPU Operator 및 Netwokr Operator를 통해 container로 셋업가능하다.&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;vGPU와 GPUDirect RDMA 활용&lt;/h3&gt;
&lt;p&gt;먼저 VM 구성시 옵션을 통한  RoCE또는 물리적 NIC 연결필요&lt;/p&gt;
&lt;p&gt;pciPassthru.allowP2P = true: PCI 장치 간의 P2P 통신 허용.&lt;br&gt;pciPassthru.RelaxACSforP2P = true: ACS 규칙을 완화하여 P2P 통신 허용.&lt;br&gt;pciPassthru.use64bitMMIO = true: 64비트 MMIO 주소 공간 사용.&lt;br&gt;pciPassthru.64bitMMIOSizeGB = 128: 64비트 MMIO 주소 공간 크기를 128GB로 설정.&lt;/p&gt;
&lt;p&gt;SR-IOV 설정&lt;br&gt;SR-IOV는 물리적 NIC를 여러 가상 NIC(VF)로 나누어 VM이 직접 NIC에 접근할 수 있게 하는 기술&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;커널파라미터 설정&lt;br&gt;he host is booted with intel_iommu=on or amd_iommu=on on the kernel command line.&lt;br&gt;/etc/default/grub 파일을 편집하여 커널 파라미터에 IOMMU 설정을 추가합니다.&lt;br&gt;bash&lt;br&gt;코드 복사&lt;br&gt;GRUB_CMDLINE_LINUX=&amp;quot;... intel_iommu=on&amp;quot;  # Intel&lt;br&gt;GRUB_CMDLINE_LINUX=&amp;quot;... amd_iommu=on&amp;quot;    # AMD&lt;br&gt;그런 다음, GRUB 설정을 업데이트하고 시스템을 재부팅합니다.&lt;br&gt;bash&lt;br&gt;코드 복사&lt;br&gt;sudo grub2-mkconfig -o /boot/grub2/grub.cfg&lt;br&gt;sudo reboot&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;물리 NIC에서 SR-IOV VF(가상스위치)생성&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;1.command로 생성&lt;br&gt;echo 8 &amp;gt; /sys/class/net/&amp;lt;PF 인터페이스 이름&amp;gt;/device/sriov_numvfs&lt;/p&gt;
&lt;p&gt;2.ui를 통한 생성 참고&lt;br&gt;&lt;a href=&quot;https://www.juniper.net/documentation/kr/ko/software/vmx/vmx-vmware/topics/task/vmx-sriov-enabling-vmware.html&quot;&gt;https://www.juniper.net/documentation/kr/ko/software/vmx/vmx-vmware/topics/task/vmx-sriov-enabling-vmware.html&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VF를 VM에 할당&lt;br&gt;&lt;a href=&quot;https://www.juniper.net/documentation/kr/ko/software/vmx/vmx-vmware/topics/task/vmx-sriov-enabling-vmware.html&quot;&gt;https://www.juniper.net/documentation/kr/ko/software/vmx/vmx-vmware/topics/task/vmx-sriov-enabling-vmware.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;완벽하진 않으나, 일단 정리..&lt;/p&gt;</description>
      <category>MLOps/GPU</category>
      <category>gpu-operator</category>
      <category>gpudirect rdma</category>
      <category>network-operator</category>
      <category>rdma</category>
      <category>vGPU</category>
      <author>DanielZZI</author>
      <guid isPermaLink="true">https://danielzzi.tistory.com/32</guid>
      <comments>https://danielzzi.tistory.com/entry/GPUDirect-RDMA%EC%99%80-vGPU#entry32comment</comments>
      <pubDate>Tue, 11 Jun 2024 03:53:41 +0900</pubDate>
    </item>
    <item>
      <title>keydb</title>
      <link>https://danielzzi.tistory.com/entry/keydb</link>
      <description>&lt;h1&gt;1. keydb vs redis&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 keydb는 redis에서 fork되어 개선하고자 탄생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 keydb는 기존 redis에서 더 발전한 HA구성이 돋보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 reids처럼 master-slave 구성도 지원하지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Active-Replica와 Multi-Master 이 두가지 특성이 Redis보다 발전된 load balancing 기능을 지원한다.&lt;br /&gt;이 경우 keydb에서 sentinel을 사용할 필요가 없어진다.(redis-sentinel-HA proxy 더이상 안써도되나!!!)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Active-Replica:&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Active-Replica 모드는 하나의 마스터 노드와 여러 Replica노드를 허용하는 Redis의 일반적인 Master-Slave replica 모델을 개선한 것이다.&lt;/li&gt;
&lt;li&gt;Active-Repllica 모드에서는 모든 노드가 읽기 및 쓰기 요청을 처리할 수 있다.&lt;/li&gt;
&lt;li&gt;데이터가 한 노드에서 업데이트 되면 다른 노드로 전파된다. 이를 위해서 각 노드는 비동기적으로 서로 데이터를 복제한다.&lt;/li&gt;
&lt;li&gt;업데이트가 발생하면 변경사항이 나머지 노드로 전파되고, 이 과정에서 지연이 발생할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Multi-Master:&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Multi-Master모드에서는 모든 노드가 완전한 마스터로 동작한다. 즉, 각노드가 데이터를 독립적으로 수정하고, 이러한 변경사항이 다른 모든 노드로 동기화된다.&lt;/li&gt;
&lt;li&gt;이 모드에서는 노드 간의 데이터 충돌을 방지하기위해 CRDT(Conflict-free Replicated Data Types)와 같은 알고리즘을 사용하여 데이터충돌을 해결한다.&lt;/li&gt;
&lt;li&gt;데이터가 어느 한 노드에서 업데이트 되면 , 해당 업데이트가 다른 모든 노드에 복제되어 일관성을 유지한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;고성능 및 멀티스레드 아키텍쳐&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;keydb는 멀티스레드 아키텍쳐를 통해 Redis의 싱글스레드 제한을 극복하고 성능극대화를 할수있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;2. 현재 내가 사용하고 있는 구성을 보자&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/Enapter/charts/tree/master&quot;&gt;https://github.com/Enapter/charts/tree/master&lt;/a&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;k8s 구성&lt;br /&gt;replica 3의 statefulset으로 구성되어있고, 각 pod는 독립적인 keydb instance를 실행하며 ,이들간의 비동기 데이터 동기화를 이루고 있다.&lt;br /&gt;data볼륨을 EmptyDir volume으로 하여 해당pod유실시 기본적으로 데이터는 없어진다.&lt;/li&gt;
&lt;li&gt;active-replica &quot;yes&quot; 로 active 레플리카를&lt;/li&gt;
&lt;li&gt;multi-master &quot;yes&quot;로 멀티마스터구조를&lt;/li&gt;
&lt;li&gt;repl-diskless-sync &quot;yes&quot;로 비동기적인 sync를&lt;/li&gt;
&lt;li&gt;repl-diskless-sync-delay 5 로 비동기주기를 5초로&lt;/li&gt;
&lt;li&gt;repl-diskless-load disabled 옵션을 통해 memory기반이 아닌 disk기반 비동기 sync를&lt;br /&gt;설정하고 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해서 keydb의 3개 pod가 서로간 sync될 충분한 시간(5초+동기화시간)없이 pod가 전부 다운될경우 데이터가 유실될수 있음을 유의해야한다.&lt;/p&gt;</description>
      <category>data engineering/redis(keydb)</category>
      <category>k8s</category>
      <category>keydb</category>
      <category>keydb ha</category>
      <category>multimaster</category>
      <category>REDIS</category>
      <author>DanielZZI</author>
      <guid isPermaLink="true">https://danielzzi.tistory.com/31</guid>
      <comments>https://danielzzi.tistory.com/entry/keydb#entry31comment</comments>
      <pubDate>Wed, 22 May 2024 22:09:05 +0900</pubDate>
    </item>
  </channel>
</rss>