Qwen 3.5 로컬 설치 완전 가이드 — Ollama부터 vLLM까지
Qwen 3.5를 로컬에서 실행하는 4가지 방법을 단계별로 설명합니다. Ollama 5분 설치부터 llama.cpp, vLLM 프로덕션 서버, HuggingFace Transformers까지.

Qwen 3.5 로컬 설치 & 실행 완전 가이드 — Ollama부터 vLLM까지
이전 글에서 Qwen 3.5와 DeepSeek V3.2를 비교했습니다. 이번에는 Qwen 3.5를 직접 로컬에 설치하고 실행하는 과정을 단계별로 다룹니다.
Ollama로 5분 만에 돌리는 방법부터, vLLM으로 프로덕션급 API 서버를 띄우는 방법, 그리고 GPU별 최적 모델 사이즈 선택까지 빠짐없이 정리했습니다.
1. 어떤 사이즈를 골라야 할까?
Qwen 3.5는 8가지 사이즈가 있습니다. GPU에 맞는 모델을 고르는 게 첫 번째입니다.
| 모델 | 타입 | Q4_K_M 기준 VRAM | 추천 GPU | 성능 수준 |
|---|---|---|---|---|
| 0.8B | Dense | ~500MB | CPU / 아무 기기 | 간단한 텍스트 처리 |
| 2B | Dense | ~1.5GB | 아무 GPU | 가벼운 챗봇 |
| 4B | Dense | ~2.5GB | GTX 1660 이상 | GPT-3.5급 |
| 9B | Dense | ~5GB | RTX 3060 (8GB+) | 실용적 최소 사이즈 |
| 27B | Dense | ~17GB | RTX 4090 (24GB) | GPT-4 수준 접근 |
| 35B-A3B | MoE | ~20GB | RTX 4090 (24GB) | 가성비 최고 |
| 122B-A10B | MoE | GPU + 256GB RAM | GPU + CPU 오프로드 | Sonnet 4.5급 |
| 397B-A17B | MoE | ~214GB | 서버급 | 플래그십 |
추천:
- GPU 없음 → 4B (CPU로도 돌아감)
- 8GB GPU → 9B Q4
- 24GB GPU → 35B-A3B Q4_K_M (스위트스팟)
- 서버/멀티GPU → 122B-A10B
35B-A3B가 특히 매력적인 이유: 총 파라미터는 35B이지만 활성 파라미터가 3B뿐이라서 추론 속도가 매우 빠르면서도 성능은 27B Dense 모델을 능가합니다.
2. 방법 1: Ollama로 5분 설치
가장 쉬운 방법입니다. Ollama는 로컬 LLM 실행을 위한 올인원 도구입니다.
2-1. Ollama 설치
Linux/WSL:
curl -fsSL https://ollama.com/install.sh | shmacOS:
brew install ollamaWindows:
ollama.com에서 설치 파일을 다운로드하세요.
설치 확인:
ollama --version2-2. Qwen 3.5 다운로드 & 실행
# 9B 모델 (8GB GPU 추천)
ollama run qwen3.5:9b
# 35B MoE 모델 (24GB GPU 추천, 스위트스팟)
ollama run qwen3.5:35b-a3b
# 4B 모델 (가벼운 용도)
ollama run qwen3.5:4b
# 0.8B 모델 (CPU 전용도 OK)
ollama run qwen3.5:0.8b첫 실행 시 모델 다운로드가 진행됩니다. 9B Q4 기준 약 5GB, 35B-A3B Q4 기준 약 20GB입니다.
2-3. 기본 사용법
실행하면 바로 대화할 수 있습니다:
>>> 파이썬으로 피보나치 수열 생성기를 만들어줘종료는 /bye를 입력하면 됩니다.
2-4. API 서버로 사용
Ollama는 자동으로 REST API를 제공합니다:
# 모델을 백그라운드로 로드
ollama serve &
# API 호출
curl http://localhost:11434/api/generate -d '{
"model": "qwen3.5:9b",
"prompt": "Python으로 REST API 서버를 만드는 코드를 작성해줘",
"stream": false
}'OpenAI 호환 API도 지원합니다:
curl http://localhost:11434/v1/chat/completions -d '{
"model": "qwen3.5:9b",
"messages": [{"role": "user", "content": "Hello!"}]
}'이 덕분에 OpenAI SDK를 사용하는 기존 코드에서 엔드포인트만 바꾸면 로컬 모델로 전환할 수 있습니다.
3. 방법 2: llama.cpp + GGUF로 세밀한 제어
Ollama보다 더 세밀한 제어가 필요하면 llama.cpp를 직접 사용합니다.
3-1. llama.cpp 설치
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release -jCUDA 없이 CPU 전용:
cmake -B build
cmake --build build --config Release -j3-2. GGUF 모델 다운로드
HuggingFace에서 GGUF 파일을 다운로드합니다:
# huggingface-cli 설치
pip install huggingface_hub
# 35B-A3B Q4_K_M 다운로드 (스위트스팟)
huggingface-cli download bartowski/Qwen_Qwen3.5-35B-A3B-GGUF \
--include "Qwen3.5-35B-A3B-Q4_K_M.gguf" \
--local-dir ./models주요 양자화 옵션:
| 양자화 | 사이즈 (35B-A3B) | 품질 | 용도 |
|---|---|---|---|
| Q2_K | ~8GB | 낮음 | VRAM 극한 절약 |
| Q4_K_M | ~20GB | 추천 | 품질/사이즈 최적 밸런스 |
| Q6_K | ~28GB | 높음 | VRAM 여유 있을 때 |
| Q8_0 | ~35GB | 매우 높음 | 거의 원본 수준 |
3-3. 실행
./build/bin/llama-cli \
-m ./models/Qwen3.5-35B-A3B-Q4_K_M.gguf \
-c 8192 \
-ngl 99 \
--temp 0.7 \
-p "You are a helpful assistant."주요 옵션:
-c 8192: 컨텍스트 길이 (토큰 수)-ngl 99: GPU에 올릴 레이어 수 (99 = 전부)--temp 0.7: 온도 (창의성 조절)-t 8: CPU 스레드 수 (CPU 사용 시)
3-4. llama.cpp API 서버
./build/bin/llama-server \
-m ./models/Qwen3.5-35B-A3B-Q4_K_M.gguf \
-c 8192 \
-ngl 99 \
--host 0.0.0.0 \
--port 8080이제 http://localhost:8080에서 OpenAI 호환 API를 사용할 수 있습니다.
4. 방법 3: vLLM으로 프로덕션 API 서버
여러 사용자가 동시에 접속하는 API 서버를 운영하려면 vLLM이 최적입니다.
4-1. vLLM 설치
pip install vllm4-2. Qwen 3.5 서버 실행
vllm serve Qwen/Qwen3.5-35B-A3B \
--dtype auto \
--max-model-len 32768 \
--tensor-parallel-size 1 \
--gpu-memory-utilization 0.9멀티 GPU 사용 시:
vllm serve Qwen/Qwen3.5-122B-A10B \
--dtype auto \
--max-model-len 32768 \
--tensor-parallel-size 2 \
--gpu-memory-utilization 0.94-3. API 호출
vLLM은 OpenAI 호환 API를 자동으로 제공합니다:
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="not-needed"
)
response = client.chat.completions.create(
model="Qwen/Qwen3.5-35B-A3B",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Explain quantum computing in simple terms."}
],
temperature=0.7,
max_tokens=1024
)
print(response.choices[0].message.content)vLLM vs Ollama 비교
| 항목 | Ollama | vLLM |
|---|---|---|
| 설치 난이도 | 매우 쉬움 | 보통 |
| 용도 | 개인 사용, 개발 | 프로덕션 API 서버 |
| 동시 요청 | 제한적 | 우수 (continuous batching) |
| 처리량 | 보통 | 높음 (PagedAttention) |
| 양자화 | GGUF 자동 | FP16, AWQ, GPTQ |
| 추천 상황 | 빠르게 시작 | 서비스 운영 |
5. 방법 4: HuggingFace Transformers (Python)
파이썬 코드에서 직접 모델을 로드하고 싶다면:
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
model_name = "Qwen/Qwen3.5-9B"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.bfloat16,
device_map="auto"
)
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "파이썬으로 웹 스크래퍼를 만들어줘"}
]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
outputs = model.generate(
**inputs,
max_new_tokens=1024,
temperature=0.7,
do_sample=True
)
response = tokenizer.decode(outputs[0][inputs.input_ids.shape[-1]:], skip_special_tokens=True)
print(response)GPTQ 양자화 모델 사용:
model = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen3.5-35B-A3B-GPTQ-Int4",
torch_dtype=torch.bfloat16,
device_map="auto"
)6. Thinking 모드 활용
Qwen 3.5의 특별한 기능 중 하나가 Thinking 모드입니다. 복잡한 문제에서 단계별 추론을 활성화할 수 있습니다.
Ollama에서 Thinking 모드
ollama run qwen3.5:9b
>>> /set parameter num_ctx 32768
>>> Think step by step: 다음 수학 문제를 풀어줘.
>>> 1부터 100까지 자연수 중 3의 배수이면서 5의 배수가 아닌 수의 합은?Python에서 Thinking 모드
messages = [
{"role": "system", "content": "You are a helpful assistant. Think step by step before answering."},
{"role": "user", "content": "Prove that the square root of 2 is irrational."}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True,
enable_thinking=True # Thinking 모드 활성화
)Thinking 모드를 켜면 <think>...</think> 태그 안에 추론 과정이 출력되고, 그 후 최종 답변이 나옵니다. 수학, 코딩, 논리 문제에서 정확도가 크게 향상됩니다.
7. 멀티모달 사용 (이미지/비디오)
Qwen 3.5는 네이티브 멀티모달입니다. 이미지와 비디오를 직접 이해할 수 있습니다.
Python에서 이미지 분석
from transformers import AutoProcessor, AutoModelForCausalLM
import torch
model_name = "Qwen/Qwen3.5-9B"
processor = AutoProcessor.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.bfloat16,
device_map="auto"
)
messages = [
{
"role": "user",
"content": [
{"type": "image", "url": "https://example.com/chart.png"},
{"type": "text", "text": "이 차트를 분석해줘. 주요 트렌드는 뭐야?"}
]
}
]
inputs = processor.apply_chat_template(messages, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=1024)
print(processor.decode(outputs[0], skip_special_tokens=True))8. 성능 최적화 팁
GPU 메모리 절약
# Ollama: 컨텍스트 줄이기
ollama run qwen3.5:35b-a3b
>>> /set parameter num_ctx 4096
# llama.cpp: Flash Attention 활성화
./build/bin/llama-cli -m model.gguf -c 8192 -ngl 99 -faCPU 오프로드 (VRAM 부족 시)
llama.cpp에서 일부 레이어만 GPU에 올릴 수 있습니다:
# 40개 레이어만 GPU에 올리기 (나머지는 CPU)
./build/bin/llama-cli -m model.gguf -c 4096 -ngl 40KV 캐시 양자화
긴 컨텍스트 사용 시 KV 캐시가 메모리를 많이 차지합니다:
# llama.cpp: KV 캐시를 Q8로 양자화
./build/bin/llama-cli -m model.gguf -c 32768 -ngl 99 -ctk q8_0 -ctv q8_09. 트러블슈팅
"CUDA out of memory"
- 양자화 레벨을 낮추세요 (Q4_K_M → Q2_K)
- 컨텍스트 길이를 줄이세요 (-c 8192 → -c 4096)
-ngl값을 줄여서 일부 레이어를 CPU로 오프로드하세요
Ollama 모델이 느릴 때
ollama ps로 현재 로드된 모델 확인ollama stop <model>로 사용하지 않는 모델 언로드- NVIDIA GPU 드라이버가 최신인지 확인
vLLM 서버가 시작되지 않을 때
--gpu-memory-utilization을 0.8로 낮춰보세요--max-model-len을 줄여보세요- PyTorch CUDA 버전이 GPU 드라이버와 호환되는지 확인
마무리
Qwen 3.5 로컬 실행은 생각보다 쉽습니다:
- 빠르게 시작: Ollama →
ollama run qwen3.5:9b한 줄이면 끝 - 세밀한 제어: llama.cpp + GGUF로 양자화, 컨텍스트, 레이어 배치 조절
- 프로덕션: vLLM으로 동시 요청 처리 가능한 API 서버 구축
- 코드 통합: HuggingFace Transformers로 파이썬 앱에 직접 임베드
24GB GPU 하나만 있으면 35B-A3B 모델로 상용 모델에 필적하는 성능을 로컬에서 무료로 사용할 수 있습니다.
다음 편에서는 이 모델을 자신만의 데이터로 파인튜닝하는 방법을 다루겠습니다.
이 글은 오픈소스 LLM 실전 시리즈의 Part 2입니다.
- Part 1: Qwen 3.5 vs DeepSeek V3.2 비교 분석
- Part 2: Qwen 3.5 로컬 설치 & 실행 튜토리얼 (현재 글)
- Part 3: Qwen 3.5 파인튜닝 실전 가이드
이 글에서 다룬 양자화와 서빙을 GPTQ, AWQ, GGUF, QLoRA까지 코드로 직접 다뤄보고 싶다면 LLM Quantization and Compression 강의에 24강 분량으로 정리해뒀습니다. 3강까지는 무료입니다.
이메일로 받아보기
관련 포스트

llama.cpp KV 캐시 양자화: q8_0 처리량 손실이 9%에서 22%로 커지는 이유
본류 llama.cpp, A100 한 장, Qwen3-8B Q4_K_M, llama-server 동시 슬롯 1~32. 32K 프롬프트에서 q8_0은 요청당 128토큰을 생성할 때 서버 처리량의 9%를 잃었고, 1,024토큰을 생성할 때는 22%를 잃었습니다. 짧은 쪽은 프리필이 벽시계를 지배하는데 프리필은 KV 타입을 타지 않기 때문입니다. 토큰당 디코드는 34% 느렸고 이는 llama-bench 결과와 일치합니다. 시작 직후 VRAM 사용량은 64K 슬롯 4개에서 41.0 GiB에서 25.1 GiB로 내려갔습니다.

llama.cpp KV 캐시 양자화, A100 한 장에서 실측 — q8_0은 4K에서 공짜이고 64K에서는 디코드 속도 절반을 냅니다
본류 llama.cpp, Qwen3-8B, A100 한 장. -ctk q8_0 -ctv q8_0은 퍼플렉시티가 f16과 같고 32K 캐시를 2.11 GiB 줄이지만, 64K 깊이 디코드는 f16의 55%로 떨어집니다(q4_0은 50%). q5_1과 K q8_0/V q4_0 혼합은 프리필이 초당 43·63토큰으로 조용히 CPU에서 돌았습니다.

Paper of the Week #3 — FLOP이 절반이라고 시간이 절반은 아닙니다
정수 하나로 MoE expert 연산을 절반으로 줄이는 논문(arXiv 2609.04575)의 표 5를 A100 한 장에서 1점 안쪽으로 재현했습니다. 논문에 없는 속도를 쟀더니 HF transformers에서는 0, 지금 쓰는 순정 vLLM의 batch 1에서도 0, batch 8에서 1.35배였습니다. 재정규화 없이 학습된 OLMoE 대조군과 2호가 약속한 iso-cost 정산도 실었습니다.