콘텐츠로 이동

LLM 구성

범용 LLM 6종을 미리 구성했습니다. 각 LLM 모델에 맞는 최적의 구동 스크립트를 제공합니다.


구성 내용

구성 요약

LLMs 구동방식 실행 스크립트 모델 크기 Port
openai/gpt-oss-120b TensorRT-LLM start-gpt-oss-120b.sh 183GB 8355
openai/gpt-oss-20b TensorRT-LLM start-gpt-oss-20b.sh 39GB 8356
Qwen/Qwen3-30B-A3B-Instruct-2507 vLLM start-qwen3-30b.sh 57GB 8357
Qwen/Qwen3-Coder-30B-A3B-Instruct vLLM start-qwen3-corder-30b.sh 57GB 8358
Qwen/Qwen2.5-VL-32B-Instruct vLLM start-qwen2.5-vl-32b.sh 64GB 8359
nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16 vLLM start-nemotron-3-nano-30b.sh 59GB 8360
mistralai/Devstral-Small-2-24B-Instruct-2512 vLLM start-devstral-small-2-24b.sh 48GB 8361
qwen3-vl:32b Ollama start-qwen3-vl-32b.sh 20GB 11434

실행 방법

모델별 실행 스크립트를 실행하여 모델을 구동합니다.

cd ~/lab/LLMs
./start-gpt-oss-120b.sh

메모리 제약

DGX Spark의 메모리 제약으로 한 번에 하나의 모델만 구동할 수 있습니다.


[참고] 모델 다운로드 방법

새로운 모델이 필요한 경우 인터넷이 가능한 환경에서 HuggingFace 전용 유틸리티로 다운로드할 수 있습니다.

다운로드 경로

~/.cache/huggingface/hub/

1단계: HuggingFace CLI 설치

pip install -U huggingface_hub --break-system-packages

2단계: HuggingFace 로그인

hf auth login

hf 명령어를 못 찾는 경우

실행 파일 경로를 직접 지정: ~/.local/bin/hf auth login

3단계: 모델 다운로드

모델 다운로드
hf download openai/gpt-oss-120b
hf download openai/gpt-oss-20b
hf download Qwen/Qwen3-30B-A3B-Instruct-2507
hf download Qwen/Qwen3-Coder-30B-A3B-Instruct
hf download Qwen/Qwen3-VL-30B-A3B-Instruct
hf download nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16
hf download mistralai/Devstral-Small-2-24B-Instruct-2512
hf download PaddlePaddle/PaddleOCR-VL
다운로드 확인
ls -l ~/.cache/huggingface/hub/

이해를 돕기 위한 자료

아래 내용대로 DGX Spark에 이미 구성이 되어 있습니다.

과정을 설명하기 위한 자료로 작성했습니다.


TensorRT-LLM 구동 방법

openai/gpt-oss-120b

Docker 이미지 준비

nvidia에서 제공하는 TensorRT-LLM 이미지를 사용합니다.

docker pull nvcr.io/nvidia/tensorrt-llm/release:spark-single-gpu-dev

필요 파일 준비

gpt-oss-120b 모델을 실행하기 위한 추가 파일들을 준비합니다.

파일 경로 용도
extra-llm-api-config.yml ./ TensorRT-LLM Serving 추가 설정
o200k_base.tiktoken ./harmony-reqs/ GPT 계열 토큰화 라이브러리
cl100k_base.tiktoken ./harmony-reqs/ GPT 계열 토큰화 라이브러리
extra-llm-api-config.yml 내용
print_iter_log: false
kv_cache_config:
  dtype: "auto"
  free_gpu_memory_fraction: 0.9
cuda_graph_config:
  enable_padding: true
disable_overlap_scheduler: true
tiktoken 파일 다운로드
mkdir -p harmony-reqs
wget -O harmony-reqs/o200k_base.tiktoken \
  "https://openaipublic.blob.core.windows.net/encodings/o200k_base.tiktoken"
wget -O harmony-reqs/cl100k_base.tiktoken \
  "https://openaipublic.blob.core.windows.net/encodings/cl100k_base.tiktoken"

실행 스크립트

~/lab/LLMs/start-gpt-oss-120b.sh
#!/usr/bin/bash

export PORT=8355
export CONTAINER="gpt-oss-120b"
export MODEL_HANDLE="openai/gpt-oss-120b"

docker stop $CONTAINER 2>/dev/null
docker rm $CONTAINER 2>/dev/null

docker run -d \
  --name $CONTAINER \
  --gpus all \
  --ipc host \
  -p $PORT:8355 \
  -e MODEL_HANDLE="$MODEL_HANDLE" \
  -v $HOME/.cache/huggingface/:/root/.cache/huggingface/ \
  -v ./harmony-reqs/:/tmp/harmony-reqs/ \
  -v ./extra-llm-api-config.yml/:/tmp/extra-llm-api-config.yml/ \
  --restart unless-stopped \
  nvcr.io/nvidia/tensorrt-llm/release:spark-single-gpu-dev \
  bash -c '
    export TIKTOKEN_ENCODINGS_BASE="/tmp/harmony-reqs" && \
    trtllm-serve "$MODEL_HANDLE" \
      --max_batch_size 64 \
      --trust_remote_code \
      --host 0.0.0.0 \
      --port 8355 \
      --extra_llm_api_options /tmp/extra-llm-api-config.yml
  '

실행 점검

API 테스트
curl -s -X POST http://localhost:8355/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-oss-120b",
    "messages": [{"role": "user", "content": "안녕하세요. 모델 준비가 완료되었나요?"}],
  "max_tokens": 50,
  "temperature": 0.7
}' | jq

openai/gpt-oss-20b

gpt-oss-120b와 동일한 방식으로 구성했습니다. 모델명과 포트만 변경했습니다.

Docker 이미지 준비

gpt-oss-120b와 동일한 이미지를 사용합니다.

필요 파일 준비

gpt-oss-120b와 동일한 파일을 준비합니다.

실행 스크립트

~/lab/LLMs/start-gpt-oss-20b.sh
#!/usr/bin/bash

export PORT=8356
export CONTAINER="gpt-oss-20b"
export MODEL_HANDLE="openai/gpt-oss-20b"

docker stop $CONTAINER 2>/dev/null
docker rm $CONTAINER 2>/dev/null

docker run -d \
  --name $CONTAINER \
  --gpus all \
  --ipc host \
  -p $PORT:8355 \
  -e MODEL_HANDLE="$MODEL_HANDLE" \
  -v $HOME/.cache/huggingface/:/root/.cache/huggingface/ \
  -v ./harmony-reqs/:/tmp/harmony-reqs/ \
  -v ./extra-llm-api-config.yml/:/tmp/extra-llm-api-config.yml/ \
  --restart unless-stopped \
  nvcr.io/nvidia/tensorrt-llm/release:spark-single-gpu-dev \
  bash -c '
    export TIKTOKEN_ENCODINGS_BASE="/tmp/harmony-reqs" && \
    trtllm-serve "$MODEL_HANDLE" \
      --max_batch_size 64 \
      --trust_remote_code \
      --host 0.0.0.0 \
      --port 8355 \
      --extra_llm_api_options /tmp/extra-llm-api-config.yml
  '

실행 점검

API 테스트
curl -s -X POST http://localhost:8356/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-oss-120b",
    "messages": [{"role": "user", "content": "안녕하세요. 모델 준비가 완료되었나요?"}],
  "max_tokens": 50,
  "temperature": 0.7
}' | jq

vLLM 구동 방법

Qwen/Qwen3-30B-A3B-Instruct-2507

Docker 이미지

nvidia에서 제공하는 vLLM 이미지를 사용합니다.

docker pull nvcr.io/nvidia/vllm:25.12-py3

실행 스크립트

~/lab/LLMs/start-qwen3-30b.sh
#!/usr/bin/bash

export PORT=8357
export CONTAINER="qwen3-30b"
export MODEL_HANDLE="Qwen/Qwen3-30B-A3B-Instruct-2507"

docker stop $CONTAINER 2>/dev/null
docker rm $CONTAINER 2>/dev/null

docker run -d \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  --gpus all \
  -p $PORT:8000 \
  --name $CONTAINER \
  --restart unless-stopped \
  nvcr.io/nvidia/vllm:25.12-py3 \
  vllm serve $MODEL_HANDLE

실행 점검

API 테스트
curl -s -X POST http://localhost:8357/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen/Qwen3-30B-A3B-Instruct-2507",
    "messages": [{"role": "user", "content": "안녕하세요. 모델 준비가 완료되었나요?"}],
    "max_tokens": 50
  }' | jq

Qwen/Qwen3-Coder-30B-A3B-Instruct

Docker 이미지

nvidia에서 제공하는 vLLM 이미지를 사용합니다.

docker pull nvcr.io/nvidia/vllm:25.12-py3

실행 스크립트

~/lab/LLMs/start-qwen3-corder-30b.sh
#!/usr/bin/bash

export PORT=8358
export CONTAINER="qwen3-corder-30b"
export MODEL_HANDLE="Qwen/Qwen3-Coder-30B-A3B-Instruct"

docker stop $CONTAINER 2>/dev/null
docker rm $CONTAINER 2>/dev/null

docker run -d \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  --gpus all \
  -p $PORT:8000 \
  --name $CONTAINER \
  --restart unless-stopped \
  nvcr.io/nvidia/vllm:25.12-py3 \
  vllm serve $MODEL_HANDLE

실행 점검

API 테스트
curl -s -X POST http://localhost:8358/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen/Qwen3-Coder-30B-A3B-Instruct",
    "messages": [{"role": "user", "content": "안녕하세요. 모델 준비가 완료되었나요?"}],
    "max_tokens": 50
  }' | jq

Qwen/Qwen2.5-VL-32B-Instruct

Docker 이미지

nvidia에서 제공하는 vLLM 이미지를 사용합니다.

docker pull nvcr.io/nvidia/vllm:25.12-py3

실행 스크립트

~/lab/LLMs/start-qwen2.5-vl-32b.sh
#!/usr/bin/bash

export PORT=8359
export CONTAINER="qwen2.5-vl"
export MODEL_HANDLE="Qwen/Qwen2.5-VL-32B-Instruct"

docker stop $CONTAINER 2>/dev/null
docker rm $CONTAINER 2>/dev/null

docker run -d \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  --gpus all \
  -p $PORT:8000 \
  --name $CONTAINER \
  --restart unless-stopped \
  nvcr.io/nvidia/vllm:25.12-py3 \
  vllm serve $MODEL_HANDLE

실행 점검

API 테스트
curl -s -X POST http://localhost:8359/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen/Qwen2.5-VL-32B-Instruct",
    "messages": [{"role": "user", "content": "안녕하세요. 모델 준비가 완료되었나요?"}],
    "max_tokens": 50
  }' | jq

nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16

Docker 이미지

nvidia에서 제공하는 vLLM 이미지를 사용합니다.

docker pull nvcr.io/nvidia/vllm:25.12-py3

실행 스크립트

~/lab/LLMs/start-nemotron-3-nano-30b.sh
#!/usr/bin/bash

export PORT=8360
export CONTAINER="nemotron-3-nano-30b"
export MODEL_HANDLE="nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16"

docker stop $CONTAINER 2>/dev/null
docker rm $CONTAINER 2>/dev/null

docker run -d \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  --gpus all \
  -p $PORT:8000 \
  --name $CONTAINER \
  --restart unless-stopped \
  nvcr.io/nvidia/vllm:25.12-py3 \
  vllm serve $MODEL_HANDLE \
  --trust-remote-code

실행 점검

API 테스트
curl -s -X POST http://localhost:8360/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16",
    "messages": [{"role": "user", "content": "안녕하세요. 모델 준비가 완료되었나요?"}],
    "max_tokens": 50
  }' | jq

mistralai/Devstral-Small-2-24B-Instruct-2512

Docker 이미지

vLLM 공식 Nightly 이미지를 사용합니다.

docker pull vllm/vllm-openai:nightly

실행 스크립트

~/lab/LLMs/start-devstral-small-24b.sh
#!/usr/bin/bash

export PORT=8361
export CONTAINER="devstral-small-2-24b"
export MODEL_HANDLE="mistralai/Devstral-Small-2-24B-Instruct-2512"

docker stop $CONTAINER 2>/dev/null
docker rm $CONTAINER 2>/dev/null

docker run -d \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  --gpus all \
  --ipc=host \
  --ulimit memlock=-1 \
  --ulimit stack=67108864 \
  -e VLLM_USE_V1=0 \
  -e VLLM_ATTENTION_BACKEND=FLASH_ATTN \
  -p $PORT:8000 \
  --name $CONTAINER \
  --restart unless-stopped \
  vllm/vllm-openai:nightly \
  --model $MODEL_HANDLE \
  --trust-remote-code \
  --max-model-len 32768 \
  --tool-call-parser mistral \
  --enable-auto-tool-choice \
  --dtype bfloat16 \
  --enforce-eager

안정적 구동을 위한 핵심 설정

구동 중 발생하는 커널 컴파일 오류 및 아키텍처 충돌을 해결하기 위해 아래 옵션을 지정했습니다.

  • -e VLLM_USE_V1=0: 최신 아키텍처와 충돌하는 V1 엔진을 끄고 안정적인 V0 엔진을 사용합니다.
  • --enforce-eager: (중요) 커널 컴파일(Autotuning) 실패를 방지하기 위해 즉시 실행하는 Eager 모드를 강제합니다. Blackwell 하드웨어에서 현재 가장 안정적인 방법입니다.
  • -e VLLM_ATTENTION_BACKEND=FLASH_ATTN: Triton 기반 백엔드 대신 컴파일이 필요 없는 표준 FlashAttention을 사용합니다.
  • --dtype bfloat16: bfloat16 데이터 타입을 명시적으로 지정합니다.

실행 점검

API 테스트
curl -s -X POST http://localhost:8361/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "mistralai/Devstral-Small-2-24B-Instruct-2512",
    "messages": [{"role": "user", "content": "안녕하세요. 모델 준비가 완료되었나요?"}],
    "max_tokens": 50
  }' | jq

Ollama 구동 방법

qwen3-vl:32b

왜 Ollama를 사용했나?

TensorRT, vLLM 모두 구동 실패하여 Ollama로 구성합니다.

Ollama가 사전에 구성되어 있어야 합니다. 상세 설정은 Ollama 구성을 참고하세요.

모델 다운로드

ollama pull qwen3-vl:32b

실행

별도 실행 불필요. 모델명을 지정하여 11434 포트로 API 요청하면 자동 실행됩니다.

실행 점검

API 테스트
curl -s -X POST http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3-vl:32b",
    "messages": [{"role": "user", "content": "안녕하세요."}],
    "max_tokens": 50
  }' | jq

미지원 모델

PaddlePaddle/PaddleOCR-VL

구동 불가

TensorRT, vLLM 모두 구동에 실패하였으며, Ollama는 Paddle 모델을 지원하지 않습니다.