Qwen3-Next-80B on NVIDIA DGX Spark(GB10 Grace Blackwell GPU): μμ ν κ°μ΄λ
π κ°μ
μ΄ λ¬Έμλ NVIDIA GB10 GPUμμ Qwen3-Next-80B λͺ¨λΈμ μ€ννκΈ° μν μμ ν κ°μ΄λμ λλ€. vLLMμ νΈνμ± λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ Ollamaλ‘ μ ννκ³ , 60GB VRAMμ μ΅λν νμ©νλ μ΅μ ν μ€μ μ ν¬ν¨ν©λλ€.
μμ±μΌ: 2025-12-20
ν
μ€νΈ νκ²½: GB10 GPU (60GB VRAM), CUDA 12.1, PyTorch 2.9.x
λͺ¨λΈ: Qwen/Qwen3-Next-80B-A3B-Instruct-GGUF (Q5_K_M μμν)
π― μ£Όμ μ±κ³Ό
β
vLLM νΈνμ± λ¬Έμ ν΄κ²°: GB10μμ vLLMμ EngineCore exiting μ€λ₯λ₯Ό Ollamaλ‘ μ°ν
β
Qwen3-Next-80B Q5_K_M λͺ¨λΈ μ±κ³΅μ μΌλ‘ μ€ν: GGUF μμν λͺ¨λΈ μ¬μ©
β
μ±λ₯ μ΅μ ν: λμ μ²λ¦¬ 8κ°, Context Window 32K ν ν° μ§μ
β
ν΅ν© μμ μ€ν¬λ¦½νΈ: OllamaλΆν° NIKA μλΉμ€κΉμ§ μν΄λ¦ μμ
β οΈ vLLMμμ λ°μν λ¬Έμ
λ¬Έμ μ¦μ
EngineCore exitingμ€λ₯λ‘ λͺ¨λΈ λ‘λ© ν μ¦μ μ’ λ£RuntimeError: Engine core initialization failed- λ€μν νκ²½λ³μμ νλκ·Έ μλμλ ν΄κ²°λμ§ μμ
μλν ν΄κ²°μ± (λͺ¨λ μ€ν¨)
νκ²½λ³μ μ‘°μ
VLLM_DISABLE_CUSTOM_ALL_REDUCE=1VLLM_WORKER_MULTIPROC_METHOD=spawnVLLM_ENGINE_INIT_TIMEOUT=1200VLLM_IPC_RETRY_COUNT=20- κΈ°ν GB10 νΈνμ± κ΄λ ¨ νκ²½λ³μ λ€μ
vLLM λ²μ λ³κ²½
vllm/vllm-openai:nightly(μ΅μ κ°λ° λ²μ )vllm/vllm-openai:latest(μμ λ²μ )- μμ€ λΉλ μλ
κ²°λ‘
- GB10 μν€ν μ²μ vLLMμ IPC ν΅μ λ°©μ κ° κ·Όλ³Έμ μΈ νΈνμ± λ¬Έμ λ‘ νλ¨
- vLLM μ€ν μ μ΄κΈ°ν λ¨κ³μμ λ©μΆ€(Hang) νμ λ°μ
- λ‘κ·Έμμμ GPU κ° ν΅μ (NCCL)μ΄ λ§Ίμ΄μ§μ§ μκ³ νμμμ(Timeout) λ°μ
- Ray(λΆμ° μ²λ¦¬ νλ μμν¬)κ° μ컀 νλ‘μΈμ€μ ν΅μ νμ§ λͺ»ν΄ μ£½λ νμ
- GB10μ νΉμ μν€ν μ²μΈ **NVLink-C2C (Chip-to-Chip)**μ vLLMμ΄ μ¬μ©νλ ν΅μ λΌμ΄λΈλ¬λ¦¬(NCCL) κ°μ νΈνμ± λ¬Έμ
- κΈ°λ³Έ P2P(Peer-to-Peer) ν΅μ μ΄ ARM64 νκ²½ λλΌμ΄λ² μΆ©λλ‘ μΈν΄ μ λλ‘ μνλμ§ μμ
- "κ°μ TCP μ ν" (The TCP Workaround)
- vLLM on GB10 (ARM64): μμ§ μννΈμ¨μ΄ μνκ³(PyTorch, Triton, NCCL)κ° μλ²½νκ² GB10μ νλμ¨μ΄ νΉμ±μ λ°μμ£Όμ§ λͺ»ν¨. (νΉν μ§μ λΉλν΄μΌ νλ κ²½μ°κ° λ§μ μμ‘΄μ± μ§μ₯ λ°μ)
- Ollamaλ‘ μ ν κ²°μ
π Ollamaλ‘ μ ν
1. Ollama μ€μΉ λ° λͺ¨λΈ λ€μ΄λ‘λ
# Ollama μ€μΉ (μ΄λ―Έ μ€μΉλμ΄ μλ€λ©΄ μλ΅)
# Ubuntu/Debian
curl -fsSL https://ollama.com/install.sh | sh
# Qwen3-Next-80B Q5_K_M λͺ¨λΈ λ€μ΄λ‘λ (HuggingFace)
ollama pull hf.co/Qwen/Qwen3-Next-80B-A3B-Instruct-GGUF:Q5_K_M
2. λͺ¨λΈ μ΄λ¦ λ³κ²½ (μ νμ¬ν)
# λ€μ΄λ‘λν λͺ¨λΈμ λ μ§§μ μ΄λ¦μΌλ‘ λ±λ‘
ollama create qwen3-next-80b-q5km -f /path/to/Modelfile
3. Modelfile μμ± (ν νλ¦Ώ λ¬Έμ ν΄κ²°)
μ΄κΈ° λ€μ΄λ‘λ μ λΉ μλ΅μ΄ λ°μν μ μμ΅λλ€. μ΄λ ν νλ¦Ώ λ¬Έμ λ‘, λ€μ Modelfileμ μ¬μ©νμΈμ:
FROM qwen3-next-80b-q5km
PARAMETER num_thread 8
PARAMETER num_ctx 32768
PARAMETER stop "<|im_end|>"
PARAMETER stop "<|endoftext|>"
PARAMETER stop "<|eot_id|>"
TEMPLATE """{{- $lastUserIdx := -1 -}}
{{- range $idx, $msg := .Messages -}}
{{- if eq $msg.Role "user" }}{{ $lastUserIdx = $idx }}{{ end -}}
{{- end }}
{{- if or .System .Tools }}<|im_start|>system
{{ if .System }}{{ .System }}
{{ end }}
{{- if .Tools }}# Tools
You may call one or more functions to assist with the user query.
You are provided with function signatures within <tools></tools> XML tags:
<tools>
{{- range .Tools }}
{"type": "function", "function": {{ .Function }}}
{{- end }}
</tools>
For each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:
<tool_call>
{"name": <function-name>, "arguments": <args-json-object>}
</tool_call>
{{- end -}}
<|im_end|>
{{ end }}
{{- range $i, $_ := .Messages }}
{{- $last := eq (len (slice $.Messages $i)) 1 -}}
{{- if eq .Role "user" }}<|im_start|>user
{{ .Content }}<|im_end|>
{{ else if eq .Role "assistant" }}<|im_start|>assistant
{{ if (and $.IsThinkSet (and .Thinking (or $last (gt $i $lastUserIdx)))) -}}
<think>{{ .Thinking }}</think>
{{ end -}}
{{ if .Content }}{{ .Content }}{{ end }}
{{- if .ToolCalls }}
{{- range .ToolCalls }}
<tool_call>
{"name": "{{ .Function.Name }}", "arguments": {{ .Function.Arguments }}}
</tool_call>
{{- end }}
{{- end }}{{ if not $last }}<|im_end|>
{{ end }}
{{- else if eq .Role "tool" }}<|im_start|>user
<tool_response>
{{ .Content }}
</tool_response><|im_end|>
{{ end }}
{{- if and (ne .Role "assistant") $last }}<|im_start|>assistant
<think>
{{ end }}
{{- end }}"""
SYSTEM """You are a helpful AI assistant."""
β‘ μ±λ₯ μ΅μ ν (60GB VRAM νμ©)
ν΅μ¬ μ΅μ ν μ€μ
60GB VRAMμ΄ μΆ©λΆν λ¨μμμ λ, λ€μ μ€μ μΌλ‘ μ±λ₯μ κ·Ήλνν μ μμ΅λλ€:
1. λμ μ²λ¦¬λ μ¦κ° (OLLAMA_NUM_PARALLEL)
κ°μ₯ μ€μ: RAG μμ€ν μ λ³΄ν΅ [κ²μ β μμ½ β λ΅λ³] κ³Όμ μ κ±°μΉλ©° μ¬λ¬ λ² λͺ¨λΈμ νΈμΆν©λλ€. κΈ°λ³Έκ°(1)μ΄λΌλ©΄ μμ²μ΄ 2κ°λ§ λμμ λ€μ΄μλ ν λͺ μ μ€ μμ κΈ°λ€λ €μΌ ν©λλ€.
export OLLAMA_NUM_PARALLEL=8 # 60GBλ©΄ λλ΅ 8~10λͺ
λμ μ²λ¦¬ κ°λ₯
ν¨κ³Ό: μ§λ¬Έ 4κ°κ° λμμ λ€μ΄μλ 4κ° λ€ μ¦μ λ΅λ³ μμ (μ²΄κ° μλ 4λ°° ν₯μ)
2. Context Window νμ₯ (OLLAMA_NUM_CTX)
κΈ°λ³Έκ°(4096 ν ν°)μ A4μ©μ§ 5~6μ₯ λΆλμ λλ€. RAG λ¬Έμλ₯Ό λ§μ΄ λ£μΌλ©΄ μ립λλ€.
export OLLAMA_NUM_CTX=32768 # 32K ν ν° (κΈ°λ³Έκ°μ 8λ°°)
ν¨κ³Ό: PDF λ§€λ΄μΌ μμ νμ΄μ§λ₯Ό ν λ²μ μ λ ₯(Prompt)μΌλ‘ λ£μ΄λ OOM μμ΄ ν λ°©μ λ΅λ³ (λλ μ μ¬λ¬ λ² λ¬Όμ΄λ³Ό νμ μμ β μ 체 μκ° λ¨μΆ)
3. KV Cache μμν (μ νμ¬ν)
60GBλ λ¨κΈ° λλ¬Έμ κ΅³μ΄ μ ν΄λ λμ§λ§, λ§μ½ num_ctxλ₯Ό 128k(μ±
ν κΆ)κΉμ§ λλ¦¬κ³ μΆλ€λ©΄:
export OLLAMA_KV_CACHE_TYPE=q8_0 # KV Cache μμν
μ 체 μ΅μ ν μ€ν¬λ¦½νΈ
#!/bin/bash
# Ollama μ±λ₯ μ΅μ ν νκ²½λ³μ μ€μ
# 60GB VRAMμ νμ©ν λμ μ²λ¦¬λ λ° λ¬Έλ§₯ ν¬κΈ° μ΅μ ν
export OLLAMA_NUM_PARALLEL=8 # λμ μ²λ¦¬ μμ² μ (60GB VRAM κΈ°μ€ 8~10λͺ
κ°λ₯)
export OLLAMA_MAX_LOADED_MODELS=1
export OLLAMA_FLASH_ATTENTION=1
export OLLAMA_NUM_CTX=32768 # Context Window νμ₯ (κΈ°λ³Έ 4096 β 32768)
export OLLAMA_KV_CACHE_TYPE=q8_0 # KV Cache μμν (μ νμ¬ν, 128kκΉμ§ νμ₯ μ μ μ©)
Ollama μλ² μμ (μ΅μ ν μ€μ μ μ©)
# μ΅μ ν νκ²½λ³μ λ‘λ
source setup_ollama_optimization.sh
# Ollama μλ² μμ
nohup env OLLAMA_NUM_PARALLEL=8 \
OLLAMA_NUM_CTX=32768 \
OLLAMA_KV_CACHE_TYPE=q8_0 \
ollama serve > /tmp/ollama_server.log 2>&1 &
π μ±λ₯ λΉκ΅
μ΅μ ν μ vs ν
| νλͺ© | μ΅μ ν μ | μ΅μ ν ν | κ°μ μ¨ |
|---|---|---|---|
| λμ μ²λ¦¬ | 1κ° | 8κ° | 8λ°° |
| Context Window | 4,096 ν ν° | 32,768 ν ν° | 8λ°° |
| κΈ΄ λ¬Έμ μ²λ¦¬ | μ¬λ¬ λ² λΆν νμ | ν λ²μ μ²λ¦¬ | μκ° λ¨μΆ |
| λμ μμ² λκΈ° | νμ λ°μ | μ¦μ μ²λ¦¬ | μ²΄κ° μλ ν₯μ |
π λ¬Έμ ν΄κ²°
1. λΉ μλ΅ λ¬Έμ
μ¦μ: λͺ¨λΈμ΄ λ‘λ©λμ§λ§ μλ΅μ΄ λΉμ΄μμ
ν΄κ²°μ± : Modelfileμ TEMPLATE μΉμ μ Qwen3 νμ€ νμμΌλ‘ μμ (μμ Modelfile μμ μ°Έμ‘°)
2. OOM (Out of Memory) μ€λ₯
μ¦μ: λͺ¨λΈ λ‘λ© μ λ©λͺ¨λ¦¬ λΆμ‘±
ν΄κ²°μ± :
OLLAMA_NUM_PARALLELκ°μ μ€μ΄κΈ° (8 β 4)OLLAMA_NUM_CTXκ°μ μ€μ΄κΈ° (32768 β 16384)- λ€λ₯Έ νλ‘μΈμ€μ λ©λͺ¨λ¦¬ μ¬μ©λ νμΈ
3. API μ°κ²° μ€ν¨
μ¦μ: curl: connection refused λλ νμμμ
ν΄κ²°μ± :
# Ollama νλ‘μΈμ€ νμΈ
ps aux | grep "ollama serve"
# ν¬νΈ νμΈ
netstat -tlnp | grep 11434
# Ollama μ¬μμ
pkill -f "ollama serve"
ollama serve
π API μ¬μ© μμ
Python
import requests
url = "http://localhost:11434/api/chat"
payload = {
"model": "qwen3-next-80b-q5km",
"messages": [
{"role": "user", "content": "μλ
νμΈμ!"}
],
"options": {
"num_ctx": 32768, # Context Window νμ₯
"num_predict": 512,
"temperature": 0.7,
"top_p": 0.9
}
}
response = requests.post(url, json=payload)
print(response.json())
cURL
curl http://localhost:11434/api/chat \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3-next-80b-q5km",
"messages": [
{"role": "user", "content": "μλ
νμΈμ!"}
],
"options": {
"num_ctx": 32768,
"num_predict": 512
}
}'
π κ΄λ ¨ 리μμ€
π κ°μ¬μ λ§
μ΄ κ°μ΄λλ GB10 GPUμμ Qwen3-Next-80Bλ₯Ό μ€ννκΈ° μν΄ μλ§μ μνμ°©μ€λ₯Ό κ±°μ³ μμ±λμμ΅λλ€. vLLMμ νΈνμ± λ¬Έμ λ₯Ό Ollamaλ‘ μ°ννκ³ , 60GB VRAMμ μ΅λν νμ©νλ μ΅μ ν λ°©λ²μ μ°Ύμλμ΅λλ€.
λ€λ₯Έ μ¬λλ€μ΄ κ°μ κ³ μμ νμ§ μκΈ°λ₯Ό λ°λΌλ©° μ΄ λ¬Έμλ₯Ό 곡μ ν©λλ€.
π λΌμ΄μ μ€
μ΄ λ¬Έμλ MIT λΌμ΄μ μ€ νμ λ°°ν¬λ©λλ€. μμ λ‘κ² μ¬μ©, μμ , λ°°ν¬νμ€ μ μμ΅λλ€.
μμ±μ: NIKA κ°λ°ν
μ΅μ’
μ
λ°μ΄νΈ: 2025-12-20