이 글은 최대한 이해하기 쉽게 작성되어, 초보자도 로컬 모델 배포와 워크플로우 구축을 쉽게 마스터할 수 있도록 돕는 것을 목표로 합니다.
올해 국내 오픈소스 대형 언어 모델(LLM) 시장이 매우 활발합니다. DeepSeek, Qwen, Kimi, GLM, MiniMax... 새로운 모델들이 계속해서 등장하고 있으며, 지속적으로 가중치를 공개하고 미국의 폐쇄형 모델들과 치열한 경쟁을 펼치고 있습니다.
하지만 모델이 많아질수록 한 가지 특정 질문에 더 집중하게 됩니다. 이 모델들이 웹 페이지와 API에만 머물지 않고, 실제로 우리 컴퓨터에 설치되어 로컬 파일, 도구, 워크플로우에 연결될 수 있을까?
API 토큰의 단가가 전반적으로 낮아지고 있지만, 고빈도 호출과 긴 텍스트를 처리할 때는 여전히 비용이 많이 듭니다. 여기에 프라이버시, 네트워킹, 데이터 통제 등의 문제까지 더해져, 로컬 배포는 점점 더 많은 개발자와 기업의 선택이 되고 있습니다.
그래서 이번에는 단일 머신 배포에 적합하면서도 도전적인 크기의 대표적인 모델을 선택하여 완전한 로컬 배포 과정을 처음부터 끝까지 진행해 보려고 합니다.
최종적으로 선택한 주인공은 Ant Bailing이 오픈소스로 공개한 Ling-3.0-flash입니다. 총 1,240억 개의 파라미터를 가진 Mixture of Experts (MoE) 모델이죠. 마침 제게 NVIDIA DGX Spark이 있어서 이 모델을 실행하기에 딱 좋습니다.
더 이상의 설명은 생략하고, 본론으로 바로 들어가겠습니다.

01 용어 설명
시작하기 전에, 모델 관련 용어를 몇 가지 소개해 드리겠습니다. 모두가 이해할 수 있도록 말이죠 ✌🏻
모델 정밀도
동일한 모델이라도 종종 다른 정밀도 또는 양자화 버전을 제공하며, 이는 모델 크기와 실행 임계값에 직접적인 영향을 미칩니다.

이번에는 공식 Ling INT4 버전을 사용하며, 크기는 약 71.75GB입니다.
Dense 또는 MoE

참고로 5.1B는 추론당 활성화되는 파라미터 수일 뿐이며, 전체 1,240억 개의 가중치는 여전히 메모리에 로드되어야 합니다.
추론 엔진
추론 엔진은 가중치 로드, 컨텍스트 및 동시성 관리, 인터페이스 제공을 담당합니다. 이는 모델을 실행하기 위한 도구이지 모델 자체가 아닙니다.

이번에는 vLLM을 선택했습니다. 현재 공식 적응이 Ling-3.0-flash의 INT4 가중치와 MTP 추측 디코딩을 지원하기 때문입니다.
02 모델 설치 및 배포
먼저 설치 환경을 소개하겠습니다. 저는 NVIDIA DGX Spark을 사용하며, GB10 칩과 121.6GB 통합 메모리를 갖추고 있고, ARM64 아키텍처에서 Ubuntu 24.04를 실행합니다. 배포는 Ling-3.0-flash-INT4이며, 이후 처리량 테스트에서는 로컬 Qwen 3.8-27B를 참조용으로 사용합니다.
공식에서는 기본 버전과 FP8, FP4, INT4 등 다양한 정밀도 버전을 제공합니다. 하드웨어에 따라 선택할 수 있습니다.
8B 크기의 Ling-3.0-tiny와 FP8, INT4 버전도 있습니다. 일반 Mac 또는 단일 4090을 사용하는 사용자는 Tiny의 저정밀도 버전을 우선 시도해 볼 수 있습니다.

1단계: 모델 다운로드. 이번에는 공식 INT4 버전을 사용했습니다. 다운로드 링크는 다음과 같습니다 👇🏻
- Hugging Face: Ling-3.0-flash-int4
- ModelScope: Ling-3.0-flash-int4
Hugging Face 접속이 불편하다면 ModelScope에서 수동으로 다운로드할 수 있습니다. 다운로드 후에는 총 24개의 safetensors 샤드가 있으며, 총 약 71.75GB입니다. 또한 런타임 중 추론 엔진과 KV Cache를 위한 공간도 확보해야 합니다.
2단계: 환경 준비. Ling-3.0-flash의 BailingMoeV3 아키텍처는 상당히 새로운 편입니다. GGUF를 llama.cpp와 함께 사용해 보았지만, unknown model architecture: 'bailingmoe3' 오류가 발생했습니다. 따라서 이번에는 공식적으로 적용된 vLLM 브랜치를 직접 사용했습니다.
1pip install uv2uv venv ~/my_ling_env3source ~/my_ling_env/bin/activate45git clone -b ling_3_0 https://github.com/inclusionAI/vllm-ling-v3.git6cd vllm-ling-v37VLLM_USE_PRECOMPILED=1 uv pip install --editable . --torch-backend=auto
3단계: 추론 서비스 시작. 모델 경로를 로컬에 다운로드한 INT4 가중치 경로로 바꿔주세요.
1vllm serve /path/to/Ling-3.0-flash-int4 \2 --served-model-name ling-int4 \3 --host 127.0.0.1 \4 --port 30000 \5 --trust-remote-code \6 --max-model-len 16384 \7 --gpu-memory-utilization 0.8 \8 --max-num-seqs 8 \9 --reasoning-parser ling3 \10 --speculative-config '{"method":"bailing_hybrid_v3_mtp","num_speculative_tokens":1}'
⚠️
명령어의 경로를 실제 머신의 경로로 바꿔주세요.
여기서 컨텍스트 제한은 16K, 동시성은 8로 설정하고 MTP 추측 디코딩을 활성화했습니다.
참고: MTP(Multi-Token Prediction)를 사용하면 모델이 한 번에 여러 토큰을 예측할 수 있습니다. 올바르게 예측된 부분은 바로 채택되어 토큰을 하나씩 생성하는 계산 과정을 줄여 출력 속도를 높일 수 있습니다.
4단계: 서비스 확인. 시작이 완료되면 간단한 요청을 보내 확인합니다.
1curl -s http://127.0.0.1:30000/v1/chat/completions \2 -H "Content-Type: application/json" \3 -d '{"model":"ling-int4",4 "messages":[{"role":"user","content":"안녕하세요, 한 문장으로 자신을 소개해주세요."}],5 "stream":true}'
터미널이 스트리밍 방식으로 내용을 반환하기 시작하면, 이 1,240억 개 파라미터 모델이 로컬에서 실행되고 있다는 의미입니다.

03 모델 성능 및 기능 테스트
- 토큰 처리량 모델이 처음 시작되었을 때, vLLM에 내장된 벤치마크를 사용하여 한 라운드 테스트를 실행했습니다. 20개의 요청이 모두 완료되었으며, 출력 처리량은 84.34 tok/s, 총 토큰 처리량은 133.10 tok/s, MTP 수용률은 67.35%였습니다.

원본 로그 출력 👇🏻
1============ Serving Benchmark Result ============2Successful requests: 203Failed requests: 04Request rate configured (RPS): 2.005Benchmark duration (s): 60.716Total input tokens: 29607Total generated tokens: 51208Request throughput (req/s): 0.339Output token throughput (tok/s): 84.3410Peak output token throughput (tok/s): 61.0011Peak concurrent requests: 20.0012Total token throughput (tok/s): 133.1013---------------Time to First Token----------------14Mean TTFT (ms): 19692.9815Median TTFT (ms): 18877.9916P99 TTFT (ms): 40039.0217-----Time per Output Token (excl. 1st token)------18Mean TPOT (ms): 44.6119Median TPOT (ms): 44.0920P99 TPOT (ms): 49.6821---------------Inter-token Latency----------------22Mean ITL (ms): 74.0923Median ITL (ms): 72.3924P99 ITL (ms): 280.7125---------------Speculative Decoding---------------26Acceptance rate (%): 67.3527Acceptance length: 1.6728Drafts: 305129Draft tokens: 305130Accepted tokens: 205531Per-position acceptance (%):32 Position 0: 67.3533==================================================
이후 Ling과 로컬 Qwen 3.8-27B에 대한 동시성 테스트를 수행했습니다. 동시성 8에서 Ling의 총 처리량은 141.38 tok/s였고, Qwen 3.8은 32.61 tok/s로, 이번 라운드에서 약 4.34배의 차이를 보였습니다.
🔥🔥🔥Ling-3.0-Flash Vs Qwen3.8-27B 부하 테스트 비교

Ling-3.0-flash

Qwen 3.8 -27B


어떤 분들은 이렇게 의문을 가질 수도 있습니다. Ling의 단일 동시성 속도는 34.77 tok/s에 불과한데, 동시성 8에서는 어떻게 141.38 tok/s가 되는 걸까? 기술적인 분들은 또한 이 단일 동시성 점수가 공식 데이터에 비해 느린 것 아닌지 물을 수도 있습니다.
여기서 구체적인 테스트 방법과 평가 방법에 따른 속도 차이를 설명해야 합니다.
- 테스트 방법 및 실제 종단 간 링크: 이 테스트는 로컬 OpenAI 호환 인터페이스를 사용하며, 서비스 프레임워크에서 분리된 오프라인 추론 테스트가 아닌 HTTP 스트리밍 요청을 통한 부하 테스트입니다. 각 Ling 요청은 약 150 토큰의 긴 텍스트 프롬프트를 사용하여 최대 512 토큰을 생성합니다. 타이밍은 클라이언트의 HTTP 요청부터 스트리밍 응답이 완료될 때까지 측정되므로, 로컬 HTTP 호출, 서비스 스케줄링, Tokenizer 처리, Prefill, 토큰별 디코딩, 스트리밍 반환 시간이 모두 포함됩니다.
- 단일 스트림 출력 속도 vs. 머신 총 처리량: 단일 스트림 속도(실제 사용자 경험): $c=1$에서 종단 간 출력 속도는 약 35.34 tok/s(실제 단일 대화 테스트에서는 38+ tok/s)로, 초당 35자 이상의 한글을 출력하는 셈으로 시각적으로 매우 빠릅니다. 총 처리량(동시성 하의 총 출력): 동시성이 증가함에 따라 vLLM은 Continuous Batching을 사용하여 여러 요청을 GPU 계산에 결합하여 Blackwell의 통합 메모리 대역폭을 최대한 활용합니다. 동시성 8에서 머신의 총 처리량은 141.38 tok/s로 급증했습니다.
일부 공식 벤치마크와 다른 이유는 테스트 기준의 차이 때문입니다. 모델 정밀도, 추론 엔진, 컨텍스트 길이, 입력/출력 토큰 수, 동시성 규모, 오프라인 추론 또는 HTTP 서비스 사용 여부 등이 모두 최종 결과에 영향을 미칩니다. 이러한 조건들이 기본적으로 일치해야만 숫자를 직접 비교하는 것이 적절합니다.
간단히 말해: 평가 방법에 따라 속도가 다릅니다. 매우 높은 동시성(예: 32/64)이나 네트워크 프로토콜이 없는 순수 컴퓨팅 환경에서 테스트하면 총 처리량 숫자가 더 높아 보입니다. 일상적인 단일 사용자 대화 또는 코딩 프로덕션 호출에서 Ling의 단일 스트림 35+ tok/s와 220ms 미만의 첫 번째 토큰 지연 시간은 이미 매우 부드럽고 끊김 없이 느껴집니다.
단일 동시성에서 Ling의 평균 단일 스트림 속도는 약 35.34 tok/s입니다. 동시성 8에서 총 처리량은 141.38 tok/s에 도달합니다. Qwen3.8의 동시성 8에서 총 처리량은 32.61 tok/s입니다. 이번 라운드에서 Ling의 장점은 주로 출력 속도와 동시 처리량에서 나타나며, 실제 사용 시 응답이 눈에 띄게 빠릅니다.
2. 실제 기능
벤치마크는 성능의 일부만 반영합니다. 실제 사용성은 특정 문제에 대한 모델의 성능에 달려 있습니다. 세 가지 방향을 선택하여 간단히 테스트했습니다.
(1) 논리적 추론
닭과 토끼 문제의 변형, 고전적인 세차 문제, 세차기 문제를 준비했습니다. 주로 조건을 정확히 이해하는지, 익숙해 보이는 답변을 적용하지는 않는지 확인하기 위함입니다. 그중 닭과 토끼 문제에는 다리가 세 개인 기계 새 4마리가 포함되어 기존 패턴을 깨뜨리도록 했습니다.

(2) 안전 경계: 다음으로 고위험 작업에 대한 반응을 테스트했습니다. 직접 실행하는지, 위험을 식별하고 사용자에게 확인하며 더 안전한 대안을 제시하는지 확인했습니다.

(3) 긴 텍스트
마지막으로 긴 텍스트 테스트를 한 라운드 진행했습니다. 긴 컨텍스트에 핵심 정보를 숨기고, 이를 정확히 찾아내어 답변하는지 확인하는 동시에 긴 텍스트에서의 출력 속도와 안정성을 관찰했습니다.

04 API에서 TUI로, 그리고 Tool Calling으로
모델 배포와 기능 테스트를 완료했지만, 일반 사용자에게 curl은 인터페이스 확인에는 적합하지만 일상적인 사용에는 불편합니다. 로컬 모델과 오랫동안 대화하려면 더 편리한 상호 작용 인터페이스가 필요합니다.
그래서 먼저 간단한 TUI, 즉 터미널에서 실행되는 채팅 인터페이스를 만들었습니다. 복잡한 소프트웨어는 아니며, AI를 사용하여 로컬 인터페이스 호출, 스트리밍 출력, 대화 기록을 캡슐화하는 Python 스크립트를 작성하고 한 줄의 명령어로 시작했습니다.
1python3 ling-3.0-chat.py
이제 매번 curl을 작성할 필요가 없습니다. 터미널을 열고 바로 대화하면 됩니다. 답변이 스트리밍 방식으로 표시되며 TPS, TTFT, 토큰 수를 확인할 수 있습니다. 이전 기능 테스트는 이 인터페이스에서 완료했습니다.
하지만 이 시점에서 TUI는 단순한 텍스트 채팅 도구일 뿐, 도구를 호출할 수 있는 기능은 없습니다. 대형 언어 모델은 생각을 담당하는 '두뇌'와 같지만, 파일을 읽거나 명령을 실행하거나 시스템의 현재 상태를 알 수 있는 '손과 발'이 없습니다.
모델이 시스템 기능을 호출하도록 하려면 Tool Calling을 추가해야 합니다. 간단히 말해, 명령 실행, 파일 읽기, 쓰기와 같은 작업을 도구로 캡슐화합니다. 모델은 먼저 필요한 정보를 판단한 다음 tool use를 시작합니다. Python 스크립트가 이를 실행하고 결과를 모델에 다시 전달하여 추가 처리를 수행합니다.
예를 들어, 처음에 시스템 GPU 정보를 확인하도록 요청했을 때는 실제 사용량을 알지 못하고 확인 방법만 알려줄 수 있었습니다. Tool Calling을 추가한 후에는 시스템 명령을 직접 실행하고 쿼리 결과를 TUI에서 직접 정리할 수 있었습니다.
동일한 원리로 웹 검색, 내부 엔터프라이즈 인터페이스, 데이터베이스 등을 계속 연결할 수 있습니다. 특정 도구는 비즈니스 요구에 따라 확장할 수 있습니다.

05 시각적 인터페이스에 연결
개인적인 사용이라면 Tool Calling이 있는 TUI로도 충분합니다. 더 나아가 모델을 보다 완전한 Agent 작업 공간에 배치하려면 Harness와 같은 에이전트 프레임워크에 연결할 수 있습니다.
이번에는 Liang Sheng의 DeepSeek Harness를 선택했습니다. 이는 단순히 채팅 페이지를 추가하는 것이 아니라 컨텍스트 관리, 작업 공간, Tool Calling, 권한 제어, 작업 계획을 제공하며 내장된 Web UI를 갖추고 있습니다. '모든 것이 플러그인'인 아키텍처를 사용하여 향후 기능 확장이 가능합니다.
참고로 DeepSeek Harness는 아직 개발자 프리뷰 단계에 있으며 업데이트가 빠르므로 호환되지 않는 변경 사항이 발생할 수 있습니다. 다른 많은 오픈소스 Agent 프레임워크가 있으니 필요에 따라 선택할 수 있습니다.
연결 과정은 복잡하지 않습니다. 핵심은 사용자 정의 모델 서비스를 추가하고 주소를 vLLM이 제공하는 로컬 인터페이스로 지정하는 것입니다. Web UI에서 구성하는 것 외에도 다음과 같이 구성 파일을 수정할 수 있습니다.
1llm-pi-ai:2 providers:3 ling:4 displayName: "Ling-3.0-flash (124B)"5 api: openai-completions6 baseURL: http://127.0.0.1:30000/v17 apiKeyEnv: OPENAI_API_KEY8 models:9 - id: ling-int410 name: Ling-3.0-flash (124B MoE)
Web UI를 시작한 후 브라우저에서 기본 주소를 엽니다.
1http://localhost:3080
이제 일상적인 채팅, 기록, 모델 전환을 모두 DeepSeek Harness에서 수행할 수 있습니다. Harness 자체는 파일 작업, 명령 실행, 작업 계획을 제공하며 플러그인을 통해 추가로 확장할 수 있습니다. 구체적인 사용법과 타사 플러그인에 관심이 있는 분들은 검색해 보시기 바랍니다.
참고로 Python TUI에서 작성한 도구는 자동으로 마이그레이션되지 않습니다. Harness에서 사용하려면 해당 플러그인 메커니즘에 따라 다시 통합해야 합니다. 아래는 제가 Ling을 위해 만든 실제 통합 효과이며, 녹화 영상을 보실 수 있습니다.

06 AI 워크플로우 구축
이 시점에서 Ling-3.0-flash의 배포부터 인터페이스, Tool Calling까지의 단일 모델 링크가 완전히 구축되었습니다.
하지만 실제 프로젝트에서는 일반적으로 하나의 모델만 사용하지 않습니다. 각 모델마다 특화된 분야가 있으므로, 하나의 모델이 모든 것을 처리하는 것보다 여러 모델을 결합하는 것이 더 나은 경우가 많습니다.
Ling-3.0-flash의 장점은 텍스트 처리 및 생성 속도이지만, 기본 멀티모달 입력을 지원하지 않습니다. 이미지나 비디오를 이해해야 하는 작업이 있다면 Qwen3.8-27B와 같은 멀티모달 모델을 연결할 수 있습니다. 비디오를 생성해야 한다면 최근 오픈소스화된 MiniMax H3를 연결할 수 있습니다. 각 모델이 가장 잘하는 작업을 처리하고 결과를 다음 모델에 전달합니다.
예를 들어, 비디오 생성 워크플로우를 구축하기 위해 Ling이 먼저 요구 사항을 이해하고 스크립트를 작성하며 스토리보드를 분할한 다음, 멀티모달 모델이 참조 자료와 시각적 일관성을 확인하고, 마지막으로 비디오 모델이 생성합니다. 생성 후에는 또 한 번의 시각적 검사를 통해 프롬프트를 수정하고 결과에 따라 재생성할 수 있습니다.
1요구 사항 및 자료2→ Ling이 스크립트 및 스토리보드 생성3→ 멀티모달 모델이 자료 및 시각적 요구 사항 확인4→ MiniMax H3가 비디오 생성5→ 멀티모달 모델이 시각적 요소 및 연속성 확인6→ Ling이 피드백에 따라 프롬프트 조정7→ 사람이 최종 검토 완료
아래 비디오는 Ling-3.0-flash가 생성한 프롬프트를 MiniMax H3에 전달하여 생성한 실제 효과를 보여줍니다.

이 프로세스가 고정되면 요구 사항과 자료만 변경하여 반복적으로 사용할 수 있습니다. 그러나 여러 대형 언어 모델을 로컬에서 동시에 실행하려면 매우 높은 VRAM과 메모리가 필요합니다. Ling INT4는 약 72GB, Qwen3.8-27B BF16은 약 51.77GB이며, 여기에 KV Cache와 비디오 모델까지 더하면 이 Spark에 모두 상주시키기 어렵습니다.
실제 배포 전에 각 모델에 필요한 VRAM 또는 통합 메모리 양을 반드시 계산해야 합니다. 리소스가 부족할 경우 모델을 단계별로 전환하거나, 양자화된 버전을 선택하거나, 여러 장치에 모델을 분할할 수 있습니다. 여러 모델이 더 이상 독립적으로 실행되지 않고 동일한 작업을 중심으로 협업합니다. 이것이야말로 진정으로 사용 가능한 멀티 모델 AI 워크플로우입니다.
07 마지막 생각
모델 배포, TUI, Tool Calling에서 멀티 모델 워크플로우에 이르기까지 전체 링크가 완성되었습니다. 이 글은 고정된 구성을 공유하기보다는 반복 가능한 방법을 공유하는 것을 목표로 합니다.
오픈소스 모델은 계속 업데이트될 것입니다. 앞으로 모델, 양자화 버전 또는 추론 엔진을 변경하더라도 가중치 다운로드, 서비스 시작, 도구 및 워크플로우 연결 경로는 크게 변하지 않을 것입니다.
여건이 된다면, 모든 분께 로컬 모델을 직접 배포해 보시기를 권장합니다.
- 데이터 통제: 파일, 대화, 비즈니스 데이터가 사용자 머신이나 인트라넷에 남아 있으며, 디렉토리 및 명령 권한은 사용자가 제한할 수 있습니다.
- 고빈도 사용에 적합: 사용할 때마다 토큰 비용을 계산할 필요가 없으며, 네트워크 및 타사 서비스에 대한 의존도를 줄일 수 있습니다.
- 쉬운 사용자 정의: 모델, 양자화 정밀도, 추론 엔진, 도구를 모두 조정할 수 있으며, 내부 인터페이스와 데이터베이스를 연결할 수 있습니다.
오픈소스 모델이 더욱 강력해짐에 따라 로컬 배포는 더 많은 사람들의 선택이 될 것입니다. 작업 요구 사항, 장비 조건, 예산에 따라 도구와 워크플로우를 구축할 수 있습니다. 모든 분께서 미래에는 자신만의 로컬 Agent를 갖게 되어, 매번 토큰 소비량을 확인하지 않고 진정한 '토큰 자유'를 누리실 수 있기를 바랍니다!
관련 자료
📚 이전 글 요약
- Hermes Agent 실전 가이드: X 불안에서 자동 축적까지
- 프로그래머의 탈모 방지 가이드
- Hermes를 iMessage에 연결하기
- Hermes를 X Premium에 연결하기
- Hermes Agent 완벽 가이드
- Hermes Agent 입문 가이드: 보조 모델
- Hermes Agent 입문 가이드
- Hermes Agent 고급 가이드
- Hermes Agent 불완전 가이드
- 나이지리아 Claude Pro 구독 완벽 가이드
- 나이지리아 Apple ID 등록 튜토리얼
- 터키에서 반값 ChatGPT Plus 구독하기
- 미국 Apple ID 등록
- Claude/ChatGPT/Gemini 알리페이 구독
- Mac에서 로컬 LLM 배포 완벽 튜토리얼
- IP 품질 확인
- Doubao가 내 브랜드를 추천하지 않는 이유
- 할머니께 Doubao의 말이 사실이 아니라고 설명하는 방법
도움이 되셨다면, 팔로우 + 북마크 + 공유 부탁드립니다 👏🏻
@Lonely__MH를 팔로우하여 초보자 친화적인 튜토리얼과 AI 도구 인사이트를 지속적으로 업데이트 받아보세요.





