← 블로그 목록
LMStudioAI로컬AILMLinkDocker1인개발맥미니

LM Studio로 로컬 AI 서버 구축하기 — Docker 연동과 LM Link까지

2026년 4월 16일

LM Studio는 내 PC에서 오픈소스 LLM을 실행하고, OpenAI 호환 API 서버로 노출해주는 도구입니다. 맥미니나 고사양 PC가 있다면 API 비용 없이 AI 기능을 넣을 수 있습니다.

투자킹은 맥미니를 AI 서버로 써서 뉴스 분류, 타임라인 클러스터링, 코인 분석을 하루 종일 처리하고 있습니다. 이 글에서는 그 구조를 공개합니다.


LM Studio 기본 설정

LM Studio 공식 사이트(lmstudio.ai)에서 다운로드하고 설치합니다.

모델 다운로드

LM Studio 내 모델 검색에서 원하는 모델을 받습니다.

MoE(Mixture of Experts) 모델은 선택이 아니라 필수입니다.

Dense 모델은 추론 시 파라미터 전체를 활성화하지만, MoE 모델은 일부 전문가(Expert)만 활성화합니다. 덕분에 총 파라미터가 크더라도 실제 연산량은 훨씬 적어서 속도가 dense 모델과 비교가 안 될 만큼 빠릅니다. 동급 품질의 dense 모델보다 2~4배 이상 빠르게 응답이 나오는 경우가 많습니다.

추천 모델:

모델종류특징활성 파라미터
Qwen3.5 35B A3BMoE한국어 강점, 빠른 응답35B 중 3B만 활성화
Gemma 4 26B A4BMoE균형 잡힌 성능26B 중 4B만 활성화

A3B, A4B에서 A는 Active(활성)를 뜻합니다. 총 파라미터가 35B여도 실제로는 3B 수준의 연산만 한다는 의미입니다.

맥미니 M4(16GB RAM) 기준으로 두 모델 모두 쾌적하게 돌아갑니다.

API 서버 활성화

  1. LM Studio 상단 메뉴 → Developer 탭 (또는 Local Server)
  2. 원하는 모델 로드
  3. Start Server 클릭
  4. 기본 포트: 1234

이제 http://localhost:1234/v1/chat/completions로 OpenAI 호환 API를 쓸 수 있습니다.

# 테스트
curl http://localhost:1234/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "local",
    "messages": [{"role": "user", "content": "안녕하세요"}]
  }'

Docker 컨테이너에서 로컬 LM Studio 접근

FastAPI를 Docker로 띄웠을 때 Docker 컨테이너 안에서 localhost:1234로 LM Studio에 접근하면 안 됩니다.

컨테이너 안에서 localhost는 컨테이너 자신을 가리키기 때문입니다.

해결책: host.docker.internal

Docker Desktop(Mac/Windows)에서는 이 특수 도메인이 호스트 PC의 IP를 자동으로 가리킵니다.

# .env
LM_STUDIO_BASE_URL=http://host.docker.internal:1234
# Python (OpenAI 호환 클라이언트)
import httpx

async def call_lm_studio(messages: list[dict]) -> str:
    async with httpx.AsyncClient(timeout=120.0) as client:
        response = await client.post(
            f"{LM_STUDIO_BASE_URL}/v1/chat/completions",
            json={
                "model": "local",
                "messages": messages,
                "temperature": 0.1,
                "max_tokens": 2048,
            }
        )
        return response.json()["choices"][0]["message"]["content"]

Linux 서버(AWS EC2 등)에서는 host.docker.internal이 작동하지 않습니다. Docker Desktop 전용 기능이기 때문입니다. Linux에서 같은 효과를 원하면 --add-host=host.docker.internal:host-gateway 옵션을 추가해야 합니다.


LM Link — AWS 서버에서 로컬 모델 사용하기

서비스를 AWS 같은 원격 서버에 배포하면 host.docker.internal이 통하지 않습니다. 서버와 내 로컬 PC는 다른 네트워크에 있기 때문입니다.

이때 LM Link를 쓰면 됩니다.

LM Link는 LM Studio의 공식 CLI 도구(lms)를 통해 인증하면, 원격 서버의 localhost:1234가 로컬 PC의 LM Studio로 연결되는 기능입니다.

별도 공개 URL을 만드는 방식이 아니라, 원격 서버에서 그냥 localhost:1234를 호출하면 된다는 점이 특징입니다.

LM Link 설정 방법

1. 로컬 PC: LM Studio에서 모델 로드 후 서버 시작

LM Studio → Developer 탭 → 모델 선택 → Start Server

2. 원격 서버: lms CLI 설치

# AWS 서버에서 실행
curl -fsSL https://installer.lmstudio.ai/linux/lms | sh

3. 원격 서버: LM Studio 계정으로 로그인

lms login
# 브라우저 인증 또는 토큰 입력

4. 인증 완료 후 localhost:1234로 로컬 모델 호출 가능

# 원격 서버에서 실행 — 로컬 PC의 LM Studio로 연결됨
curl http://localhost:1234/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model": "local", "messages": [{"role": "user", "content": "테스트"}]}'

코드에서는 기존과 동일하게 localhost:1234를 쓰면 됩니다.

# AWS 서버 .env
LM_STUDIO_BASE_URL=http://localhost:1234
원격 서버 (AWS)
  → localhost:1234 (LM Link가 가로챔)
  → LM Studio 인프라
  → 내 맥미니 localhost:1234
  → 로컬 LLM 모델

주의사항:

  • 로컬 PC의 LM Studio가 실행 중이어야 합니다. 맥미니가 꺼지면 연결이 끊깁니다.
  • lms login 인증은 한 번만 하면 세션이 유지됩니다.
  • 가정용 인터넷의 업로드 속도에 따라 응답 속도가 달라집니다.

reasoning_effort — 속도와 품질 조절

LM Studio는 reasoning_effort 파라미터로 같은 모델에서 사고 깊이를 조절할 수 있습니다. 작업 난이도에 따라 별도 thinking 모델 없이 속도와 품질을 선택할 수 있습니다.

설명적합한 작업
none추론 없음, 빠른 응답분류, 태깅, 간단한 변환
medium중간 수준 추론요약, 분석, 복잡한 판단
high깊은 추론논리 추론, 복잡한 코드 생성
# 빠른 분류 작업 — reasoning_effort: none
response = await client.post(
    f"{LM_STUDIO_BASE_URL}/v1/chat/completions",
    json={
        "model": "local",
        "messages": messages,
        "reasoning_effort": "none",
    }
)

# 복잡한 분석 작업 — reasoning_effort: medium
response = await client.post(
    f"{LM_STUDIO_BASE_URL}/v1/chat/completions",
    json={
        "model": "local",
        "messages": messages,
        "reasoning_effort": "medium",
    }
)

투자킹에서는 뉴스 분류·태그 추출은 none, 타임라인 종합 분석은 medium으로 분리해서 사용합니다. 동일 모델로 fast/slow 두 가지 경로를 만들 수 있어 별도 모델을 추가로 운영할 필요가 없습니다.


동시 요청 제한

LM Studio는 단일 모델로 처리하기 때문에 동시 요청이 많으면 큐가 쌓입니다.

asyncio.Semaphore로 동시에 처리하는 요청 수를 제한했습니다.

import asyncio

_semaphore = asyncio.Semaphore(4)  # 최대 4개 동시 처리

async def ai_complete_with_limit(messages: list[dict]) -> str:
    async with _semaphore:
        return await ai_complete(messages)

4개 이상 요청이 들어오면 Semaphore에서 대기합니다. 큐가 무한히 쌓이는 것을 방지하고 LM Studio가 OOM으로 죽는 것도 막습니다.


임베딩은 Infinity로 분리

LLM 요청이 들어오는 동안 임베딩 요청도 같은 LM Studio에 보내면 서로 블로킹됩니다.

임베딩은 Infinity라는 별도 서버를 씁니다. Infinity는 임베딩 전용 서버로, 추론 서버(LM Studio)와 분리해서 독립적으로 처리합니다.

# docker-compose.yml
infinity:
  build:
    dockerfile: Dockerfile.infinity
  container_name: twojaking-infinity
  ports:
    - "7997:7997"
# .env
INFINITY_BASE_URL=http://infinity:7997

LLM 추론: LM Studio (또는 LM Link → 맥미니) 임베딩/리랭킹: Infinity (Docker 컨테이너, 별도 모델)


비용 비교

투자킹 기준 한 달 AI 처리량:

항목처리량상업 API 기준 비용비용 (LM Studio)
뉴스 분류약 10,000건/일$30~50/월전기세만
타임라인 클러스터링24회/일$10~20/월전기세만
코인 분석72회/일$5~10/월전기세만

맥미니 M4의 전기세가 대략 월 3,000~5,000원입니다. 상업 API를 그대로 쓰면 위 비용이 매달 나오지만, 로컬 모델로 처리하면 전기세만 듭니다.

0

댓글 0

Ctrl+Enter