Split View: 텍스트 생성 오픈 모델, 크기대별로 고르는 법
텍스트 생성 오픈 모델, 크기대별로 고르는 법
- 크기는 성능 등급이 아니라 배치 제약입니다
- 소형: 온디바이스와 엣지
- 중형: 단일 GPU 한 장
- 대형: 서버가 필요한 구간
- MoE는 메모리 계산 규칙이 다릅니다
- 컨텍스트 확장은 공짜가 아닙니다
- 카드가 요구하는 실행 조건을 무시하지 마세요
- 실행 예시
- 고를 때의 순서
- 직접 해보기
- 시리즈 안내
- 참고 자료
모델 정보는 2026-08-12에 Hugging Face 페이지에서 직접 확인했습니다. 모델 카드와 라이선스는 바뀔 수 있으니 사용 전 원본을 다시 확인하세요.
크기는 성능 등급이 아니라 배치 제약입니다
오픈 모델을 크기로 나누는 이유는 큰 모델이 좋은 모델이라서가 아닙니다. 크기가 결정하는 것은 어디에 올릴 수 있는지, 한 요청에 얼마나 기다릴 수 있는지, 그리고 몇 대를 띄워야 하는지입니다. 같은 과제라도 지연 예산이 300밀리초냐 3초냐에 따라 정답이 완전히 달라집니다.
그래서 이 글은 어느 모델이 더 낫다는 순위를 매기지 않습니다. 대신 각 구간에서 실제로 확인한 카드 값을 나열하고, 그 값이 배치 결정에 어떻게 쓰이는지만 짚습니다.
소형: 온디바이스와 엣지
| 저장소 | license | 파라미터 | 컨텍스트 | 카드에 적힌 특징 |
|---|---|---|---|---|
HuggingFaceTB/SmolLM2-1.7B-Instruct | apache-2.0 | 1.7B | 명시되어 있지 않음 | 주로 영어를 이해하고 생성한다고 기재 |
meta-llama/Llama-3.2-1B-Instruct | llama3.2 | 1B (1.23B) | 128k | 모바일 작성 보조와 에이전트 용도를 의도된 사용처로 기재 |
Qwen/Qwen3-4B | apache-2.0 | 4.0B (임베딩 제외 3.6B) | 32,768 (YaRN 시 131,072) | 100개 이상 언어, 사고 모드 전환 지원 |
microsoft/Phi-4-mini-instruct | MIT | 3.8B | 128K | 메모리·연산 제약 환경과 지연 민감 시나리오를 용도로 기재 |
이 구간에서 카드가 스스로 밝히는 한계를 먼저 읽어야 합니다. HuggingFaceTB/SmolLM2-1.7B-Instruct는 결정적인 정보원이 아니라 보조 도구로 쓰라고 적고, 생성물이 사실에 맞거나 논리적으로 일관되거나 편향에서 자유롭지 않을 수 있으니 중요한 정보는 검증하라고 씁니다. microsoft/Phi-4-mini-instruct는 모델 크기 탓에 담을 수 있는 사실 지식이 제한적이고, 영어 외 언어에서 품질 격차가 있으며, 코드 학습이 대부분 파이썬에 몰려 있다고 밝힙니다.
meta-llama/Llama-3.2-1B-Instruct는 파일 접근 전에 조건 동의와 연락처 공유가 필요합니다. 온디바이스 배포는 보통 CI에서 가중치를 굽는데, 이 저장소는 토큰 없는 파이프라인에서 그대로 실패합니다.
중형: 단일 GPU 한 장
| 저장소 | license | 파라미터 | 컨텍스트 | 카드에 적힌 특징 |
|---|---|---|---|---|
Qwen/Qwen3-8B | apache-2.0 | 8.2B (임베딩 제외 6.95B) | 32,768 (YaRN 시 131,072) | 100개 이상 언어, 사고 모드 |
meta-llama/Llama-3.1-8B-Instruct | llama3.1 | 8B | 128k | 영어·독일어·프랑스어·이탈리아어·포르투갈어·힌디어·스페인어·태국어 기재 |
mistralai/Mistral-7B-Instruct-v0.3 | apache-2.0 | 7B | 명시되어 있지 않음 | 조정 장치가 없다고 명시, 함수 호출 지원 |
google/gemma-3-4b-it | gemma | 4B | 128K | 140개 이상 언어, 이미지와 텍스트 입력 |
중형 구간에서 가장 자주 어긋나는 기대가 언어 지원입니다. meta-llama/Llama-3.1-8B-Instruct 카드가 공식적으로 나열하는 언어에 한국어와 일본어는 들어 있지 않습니다. 반대로 Qwen/Qwen3-8B와 google/gemma-3-4b-it은 각각 100개 이상, 140개 이상 언어를 지원한다고 적습니다. 다만 이 문장은 지원한다는 선언이고 품질 보장이 아니므로, 우리 도메인 문장으로 직접 재 봐야 합니다.
mistralai/Mistral-7B-Instruct-v0.3은 조정 장치가 전혀 없다고 카드가 밝힙니다. 사내 도구라면 문제가 없지만 고객 접점에 놓는다면 별도 필터 계층이 필요하다는 뜻입니다.
대형: 서버가 필요한 구간
| 저장소 | license | 파라미터 | 컨텍스트 | 카드에 적힌 특징 |
|---|---|---|---|---|
openai/gpt-oss-20b | apache-2.0 | 21B (활성 3.6B) | 명시되어 있지 않음 | 16GB 메모리 안에서 실행 가능, harmony 형식 필수 |
mistralai/Mistral-Small-24B-Instruct-2501 | apache-2.0 | 24B | 32k | bf16/fp16에 약 55GB GPU RAM, 양자화 시 RTX 4090 한 장 또는 32GB 맥북 |
google/gemma-3-27b-it | gemma | 27B | 입력 128K, 출력 8,192 | 조건 동의 후 접근 |
Qwen/Qwen3-32B | apache-2.0 | 32.8B (임베딩 제외 31.2B) | 32,768 (YaRN 시 131,072) | vLLM과 SGLang 실행 명령 제시 |
mistralai/Mistral-Small-24B-Instruct-2501 카드가 적은 약 55GB라는 숫자는 이 구간에서 가장 실용적인 정보입니다. 24B라는 파라미터 수만 보고 GPU 한 장을 떠올렸다가, 실제로는 bf16 기준으로 80GB급 한 장이거나 24GB급 여러 장이 필요하다는 사실을 배포 직전에 알게 되는 일이 흔하기 때문입니다.
MoE는 메모리 계산 규칙이 다릅니다
openai/gpt-oss-20b은 21B 파라미터에 활성 3.6B라고 적습니다. 여기서 헷갈리기 쉬운 지점은, 연산량은 3.6B짜리 모델처럼 움직이지만 가중치는 21B 전부가 메모리에 올라가야 한다는 것입니다. 카드가 16GB 메모리 안에서 돌아간다고 덧붙인 것은 MXFP4 양자화를 전제로 한 수치입니다.
즉 MoE 모델을 볼 때는 활성 파라미터로 속도를, 전체 파라미터와 양자화 형식으로 메모리를 따로 계산해야 합니다. 하나의 숫자로 뭉뚱그리면 어느 쪽이든 틀립니다.
컨텍스트 확장은 공짜가 아닙니다
Qwen3 계열 카드는 컨텍스트 확장에 대해 드물게 솔직합니다. Qwen/Qwen3-8B, Qwen/Qwen3-4B, Qwen/Qwen3-32B 모두 기본 32,768에서 YaRN으로 131,072까지 늘릴 수 있다고 적으면서, 오픈소스 프레임워크가 구현한 정적 YaRN은 입력 길이와 무관하게 배율이 고정되어 짧은 텍스트 성능에 영향을 줄 수 있다고 경고합니다.
실무적으로는 128K가 필요한 요청과 2K로 끝나는 요청이 같은 엔드포인트를 쓰면 안 된다는 뜻입니다. 긴 문서 처리용 배포와 일반 대화용 배포를 분리하는 편이 대개 더 싸고 안정적입니다.
카드가 요구하는 실행 조건을 무시하지 마세요
세 가지가 특히 자주 무시됩니다.
첫째, openai/gpt-oss-20b 카드는 이 모델이 harmony 응답 형식으로 학습되었으며 그 형식으로만 써야 하고 그렇지 않으면 제대로 동작하지 않는다고 적습니다. 형식을 안 맞추고 성능이 나쁘다고 결론 내리면 잘못된 판단입니다.
둘째, Qwen3 계열 카드는 사고 모드에서 탐욕적 디코딩을 쓰지 말라고 명시하며, 무한 반복으로 이어질 수 있다고 경고합니다. Qwen/Qwen3-32B는 사고 모드 권장값으로 온도 0.6, TopP 0.95를 적어 둡니다.
셋째, 기본 모델과 지시 조정 모델의 이름은 한 단어 차이입니다. 사고 모드 전환은 enable_thinking 인자와 /think, /no_think 소프트 스위치로 제어한다고 Qwen/Qwen3-4B 카드가 적고 있으니, 이 인자를 지원하지 않는 런타임을 쓰면서 모드가 안 바뀐다고 의심할 필요는 없습니다.
실행 예시
# 예시: 지시 조정 모델을 채팅 템플릿으로 호출합니다
from transformers import AutoModelForCausalLM, AutoTokenizer
repo = "Qwen/Qwen3-4B"
tok = AutoTokenizer.from_pretrained(repo)
model = AutoModelForCausalLM.from_pretrained(repo, torch_dtype="auto", device_map="auto")
messages = [{"role": "user", "content": "회의록 세 줄 요약을 만들어 주세요."}]
prompt = tok.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tok(prompt, return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=256, temperature=0.6, top_p=0.95)
print(tok.decode(out[0][inputs["input_ids"].shape[-1]:], skip_special_tokens=True))
서버로 띄울 때는 런타임이 컨텍스트와 배치를 관리합니다.
# 예시: OpenAI 호환 엔드포인트로 서빙합니다
vllm serve Qwen/Qwen3-8B --max-model-len 32768
고를 때의 순서
- 지연 예산과 배포 위치를 먼저 확정합니다. 그다음에 크기 구간이 정해집니다.
- 구간 안에서 라이선스와 게이트 여부로 후보를 거릅니다.
- 남은 후보의 언어 지원 표기를 확인하고, 우리 도메인 문장으로 직접 재 봅니다.
- 컨텍스트 요구가 기본값을 넘는지 확인하고, 넘는다면 확장 방식과 경고 문구를 읽습니다.
- 카드가 요구하는 형식과 샘플링 조건을 그대로 지킨 상태에서만 품질을 비교합니다.
직접 해보기
- LLM GPU 메모리(VRAM) 계산기 — 파라미터와 컨텍스트를 넣어 어느 구간이 우리 GPU에 맞는지 봅니다.
- LLM API 비용 계산기 — 자체 호스팅과 API 호출의 비용 구조를 비교할 때 기준선으로 씁니다.
- 브라우저 AI 실험실 — 소형 모델의 체감 지연을 직접 확인합니다.
시리즈 안내
- 이전 글: 허깅페이스 모델 카드 읽는 법
- 다음 글: 임베딩과 리랭커, RAG에서 실제로 중요한 것
참고 자료
- 표의 모든 값은 2026-08-12에 해당 모델의 Hugging Face 페이지에서 직접 읽었습니다. 페이지에 없던 항목은 명시되어 있지 않음으로 적었습니다.
- 카드에 실린 벤치마크 수치는 배포자 자체 보고이며 독립 평가가 아닙니다. 이 글은 모델 간 점수 비교표를 만들지 않습니다.
- 라이선스 전문을 직접 읽고, 상업적 사용은 법무 검토를 거치세요.
Choosing Open Text Generation Models by Size Class
- Size Is a Deployment Constraint, Not a Quality Tier
- Small: On-Device and Edge
- Mid: One Single GPU
- Large: The Server-Class Band
- MoE Changes the Memory Math
- Context Extension Is Not Free
- Do Not Ignore the Runtime Conditions the Card Demands
- Invocation Examples
- The Order to Decide In
- Try It Yourself
- Series Navigation
- References
Model details were read directly from the Hugging Face pages on 2026-08-12. Model cards and licenses change, so check the original again before you use anything.
Size Is a Deployment Constraint, Not a Quality Tier
The reason to sort open models by size is not that bigger means better. Size decides where you can put the model, how long a single request may take, and how many replicas you have to run. For the same task, a 300-millisecond latency budget and a 3-second one lead to completely different answers.
So this post does not rank models. It lists the card values actually verified in each band and points out how those values feed a deployment decision.
Small: On-Device and Edge
| Repository | license | Parameters | Context | As stated on the card |
|---|---|---|---|---|
HuggingFaceTB/SmolLM2-1.7B-Instruct | apache-2.0 | 1.7B | Not stated | States it primarily understands and generates English |
meta-llama/Llama-3.2-1B-Instruct | llama3.2 | 1B (1.23B) | 128k | Lists mobile writing assistants and agentic apps as intended use |
Qwen/Qwen3-4B | apache-2.0 | 4.0B (3.6B non-embedding) | 32,768 (131,072 with YaRN) | 100+ languages, thinking mode switching |
microsoft/Phi-4-mini-instruct | MIT | 3.8B | 128K | Lists memory and compute constrained environments and latency bound scenarios |
In this band, read the limitations the cards state about themselves first. HuggingFaceTB/SmolLM2-1.7B-Instruct says to treat it as an assistive tool rather than a definitive source of information, and that output may not be factually accurate, logically consistent, or free from biases, so important information should be verified. microsoft/Phi-4-mini-instruct states that model size limits how much factual knowledge it can store, that quality varies for non-English languages, and that the majority of its code training was Python.
meta-llama/Llama-3.2-1B-Instruct requires accepting conditions and sharing contact information before file access. On-device deployment usually bakes weights in CI, and this repository simply fails in a token-free pipeline.
Mid: One Single GPU
| Repository | license | Parameters | Context | As stated on the card |
|---|---|---|---|---|
Qwen/Qwen3-8B | apache-2.0 | 8.2B (6.95B non-embedding) | 32,768 (131,072 with YaRN) | 100+ languages, thinking mode |
meta-llama/Llama-3.1-8B-Instruct | llama3.1 | 8B | 128k | Lists English, German, French, Italian, Portuguese, Hindi, Spanish, Thai |
mistralai/Mistral-7B-Instruct-v0.3 | apache-2.0 | 7B | Not stated | States it has no moderation mechanisms; supports function calling |
google/gemma-3-4b-it | gemma | 4B | 128K | 140+ languages, text and image input |
The expectation that most often breaks in this band is language coverage. Korean and Japanese are not among the languages the meta-llama/Llama-3.1-8B-Instruct card officially lists. Qwen/Qwen3-8B and google/gemma-3-4b-it state 100+ and 140+ languages respectively. But those sentences are declarations of coverage, not quality guarantees, so you have to measure with sentences from your own domain.
The mistralai/Mistral-7B-Instruct-v0.3 card states it has no moderation mechanisms at all. Fine for an internal tool; put it at a customer touchpoint and you are committing to a separate filter layer.
Large: The Server-Class Band
| Repository | license | Parameters | Context | As stated on the card |
|---|---|---|---|---|
openai/gpt-oss-20b | apache-2.0 | 21B (3.6B active) | Not stated | Runs within 16GB of memory; harmony format required |
mistralai/Mistral-Small-24B-Instruct-2501 | apache-2.0 | 24B | 32k | About 55 GB of GPU RAM in bf16/fp16; fits one RTX 4090 or a 32GB MacBook once quantized |
google/gemma-3-27b-it | gemma | 27B | 128K input, 8,192 output | Access after accepting conditions |
Qwen/Qwen3-32B | apache-2.0 | 32.8B (31.2B non-embedding) | 32,768 (131,072 with YaRN) | Gives vLLM and SGLang launch commands |
The roughly 55 GB figure on the mistralai/Mistral-Small-24B-Instruct-2501 card is the most practical piece of information in this band. It is common to see 24B parameters, picture a single GPU, and discover right before deployment that bf16 means one 80GB-class card or several 24GB ones.
MoE Changes the Memory Math
openai/gpt-oss-20b states 21B parameters with 3.6B active. The confusing part is that compute behaves like a 3.6B model while all 21B of the weights still have to sit in memory. The card adding that it runs within 16GB assumes MXFP4 quantization.
So for an MoE model, compute speed from the active parameters and memory from the total parameters plus the quantization format, separately. Collapse them into one number and you will be wrong in one direction or the other.
Context Extension Is Not Free
The Qwen3 cards are unusually candid about extension. Qwen/Qwen3-8B, Qwen/Qwen3-4B, and Qwen/Qwen3-32B all state a 32,768 default extendable to 131,072 with YaRN, while warning that the static YaRN implemented in open-source frameworks keeps the scaling factor constant regardless of input length, which can affect performance on shorter texts.
Practically, that means requests needing 128K and requests finishing in 2K should not share an endpoint. Splitting long-document serving from general chat serving is usually cheaper and steadier.
Do Not Ignore the Runtime Conditions the Card Demands
Three get ignored most often.
First, the openai/gpt-oss-20b card states the model was trained on the harmony response format and should only be used with it, as it will not work correctly otherwise. Concluding that quality is poor without matching the format is a bad judgment.
Second, the Qwen3 cards explicitly say not to use greedy decoding in thinking mode, warning it can lead to endless repetitions. Qwen/Qwen3-32B records temperature 0.6 and TopP 0.95 as the thinking-mode settings.
Third, base and instruct variants differ by a single word in the name. The Qwen/Qwen3-4B card states that thinking-mode switching is controlled by the enable_thinking argument with /think and /no_think soft switches, so there is no mystery when a runtime that does not support the argument fails to switch modes.
Invocation Examples
# Example: call an instruct model through its chat template
from transformers import AutoModelForCausalLM, AutoTokenizer
repo = "Qwen/Qwen3-4B"
tok = AutoTokenizer.from_pretrained(repo)
model = AutoModelForCausalLM.from_pretrained(repo, torch_dtype="auto", device_map="auto")
messages = [{"role": "user", "content": "Write a three-line summary of these minutes."}]
prompt = tok.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tok(prompt, return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=256, temperature=0.6, top_p=0.95)
print(tok.decode(out[0][inputs["input_ids"].shape[-1]:], skip_special_tokens=True))
Served as an endpoint, the runtime manages context and batching for you.
# Example: serve behind an OpenAI-compatible endpoint
vllm serve Qwen/Qwen3-8B --max-model-len 32768
The Order to Decide In
- Fix the latency budget and the deployment location first. The size band falls out of that.
- Within the band, filter candidates by license and gating.
- Check the language coverage each survivor states, then measure with sentences from your own domain.
- Check whether your context requirement exceeds the default, and if so read the extension mechanism and its warnings.
- Compare quality only after honoring the format and sampling conditions the card demands.
Try It Yourself
- GPU VRAM Calculator for LLMs — enter parameters and context to see which band fits your GPU.
- LLM API Cost Calculator — use it as the baseline when comparing self-hosting against API calls.
- Browser AI Lab — feel the actual latency of a small model yourself.
Series Navigation
- Previous: How to Read a Hugging Face Model Card
- Next: Embeddings and Rerankers: What Actually Matters in RAG
References
- Every value in the tables was read directly from that model page on Hugging Face on 2026-08-12. Anything absent from the page is written as not stated.
- Benchmark numbers on the cards are self-reported by publishers and are not independent evaluations. This post builds no cross-model score comparison.
- Read the full license text yourself and put commercial use through legal review.