보조기억장치

sbx를 사용하여 오픈 소스 모델 실행하기 본문

IT

sbx를 사용하여 오픈 소스 모델 실행하기

캐세이 2026. 6. 28. 22:16

지금까지는 클라우드 LLM을 호출하는 에이전트를 관리해 왔습니다. 이 모듈은 마지막 남은 부분을 해결합니다. API 키, 외부 트래픽, 클라우드 종속성 없이 Mac에서 로컬 오픈 소스 모델을 대상으로 sbx 내에서 에이전트를 실행할 수 있습니다.

패턴을 보면 아주 간단합니다.

  • Docker Model Runner는 Mac 호스트에서 실행됩니다.localhost:12434
  • 에이전트는 sbx microVM 내부에서 실행됩니다.
  • VM 경계를 넘어서는 포트는 OpenAI 호환 HTTP 엔드포인트 하나뿐입니다 .

핵심은 바로 이것입니다. 클라우드에 전혀 의존하지 않으면서도 동일한 샌드박스, 네트워크 정책, 감사 로그로 관리되는 에어갭 방식의 에이전트 워크플로우를 구현할 수 있다는 점입니다.


SBX 내부에서 모델을 실행하면 안 될까요?

두 가지 이유:

  1. 모델 용량이 큽니다. 4GB GGUF 파일에 GPU/Metal 가속까지 더하면 호스트에서 처리해야 합니다. sbx는 용량이 작은 마이크로VM이라 Metal에 접근할 수 없습니다.
  2. Docker Model Runner는 이미 호스트에 설치되어 있습니다. Docker Desktop에 내장되어 있으며 OpenAI 호환 API를 제공하고, 시스템의 모든 sbx에서 공유할 수 있습니다.

에이전트는 HTTP를 통해 모델을 호출합니다. VM 경계가 통과해야 하는 것은 이것뿐입니다.


1단계 - 호스트에서 DMR이 실행 중인지 확인합니다.

Mac 에서 :

docker model ls
curl -s http://localhost:12434/engines/llama.cpp/v1/models | head -20

로컬 모델 목록이 표시될 것입니다. docker model ls목록이 비어 있으면 작은 모델(smollm2는 360MB이며 즉시 로드됩니다)을 다운로드하세요.

docker model pull ai/smollm2:360M-Q4_K_M

실제 코딩 데모를 보려면 더 큰 파일을 불러오세요.

docker model pull ai/qwen3:8B-Q4_K_M

2단계 - 새 sbx 생성

호스트에서:

mkdir -p /tmp/dmr-test && cd /tmp/dmr-test
sbx create --name dmr-test shell .

에이전트 shell는 마이크로VM 내부에 일반 bash 프롬프트를 표시합니다. AI 에이전트는 연결되어 있지 않습니다. Codex 또는 Claude를 연결하기 전에 연결성을 테스트하기에 적합합니다.


3단계 - 네트워크 정책을 통해 DMR을 허용합니다.

연결하기 전에 로컬 허용 규칙을 추가하세요. SBX 프록시는 대상에 localhost:12434내부적으로 접근하는 경우에도 대상을 내부적 으로 정규화합니다 host.docker.internal.

sbx policy allow network localhost:12434

확인하다:

sbx policy ls | grep localhost

로컬에서 해당 항목의 진입을 허용하는 항목이 하나 표시될 것입니다 localhost:12434.

 localhost:12434그럴까요 host.docker.internal:12434? SBX 프록시는 호스트 이름을 제거하고 대상 포트를 정책과 비교하여 일치시킵니다 . curl을 사용할 때는 를 localhost:<port>사용 하지만 정책에서는 를 허용하는 것과 같은 이유입니다. 프록시 내부 동작의 특성 때문입니다.host.docker.internallocalhost


4단계 - SBX에 연결

sbx run dmr-test

가상 머신 내부로 이동하게 됩니다.

agent@dmr-test:dmr-test$

새로 설치된 Linux 게스트 운영 체제인지 확인하십시오.

hostname
cat /etc/os-release | head -2

샌드박스 이름과 깨끗한 우분투 25.10 이미지가 표시될 겁니다. 맥은 보이지 않을 거예요.


5단계 - SBX 내부에서 DMR에 접근하기

SBX 내부 네트워킹에 대해 알아야 할 세 가지 사항:

  • localhost가상 머신 내부의 루프백은 사용자 의 Mac이 아닌 가상 머신 자체의 루프백 입니다. 따라서 연결이 거부curl localhost:12434 될 것입니다 .
  • host.docker.internal 해결 됩니다 - SBX 게이트웨이를 통해 Mac 호스트를 가리킵니다.
  • model-runner.docker.internalsbx 내부에서 해결 되지 않습니다 . 사용하지 마십시오.

모델 목록을 확인하세요:

curl -s http://host.docker.internal:12434/engines/llama.cpp/v1/models | head -30

1단계에서 호스트에서 봤던 것과 동일한 목록이 표시됩니다. 이는 SBX 프록시가 요청을 DMR로 전달했다는 증거입니다.


6단계 - 경계를 넘어 추론을 실행합니다.

curl -s http://host.docker.internal:12434/engines/llama.cpp/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "ai/smollm2:360M-Q4_K_M",
    "messages": [{"role":"user","content":"Reply with exactly: sbx to DMR works"}],
    "max_tokens": 20
  }'

모델의 응답이 포함된 JSON 형식의 응답을 받게 됩니다 choices[0].message.content. 이는 추론 왕복 과정이 완료된 것으로, microVM의 에이전트와 호스트의 모델 간에 OpenAI 호환 프로토콜이 사용되었습니다.

팁: smollm2 360M은 연결 테스트에는 적합하지만 실제 코딩에는 너무 작습니다. 프로덕션 수준의 데모를 위해서는 ai/qwen3:8B-Q4_K_M또는 를 사용하세요 ai/gemma4:latest.


7단계 - OpenAI SDK를 사용한 Python 클라이언트

실제 상담원이라면 누구나 사용하는 패턴입니다. test_local.pysbx 파일 내부에 생성하세요.

cat > test_local.py <<'EOF'
from openai import OpenAI

client = OpenAI(
    base_url="http://host.docker.internal:12434/engines/llama.cpp/v1",
    api_key="not-needed"
)

resp = client.chat.completions.create(
    model="ai/qwen3:8B-Q4_K_M",
    messages=[{
        "role": "user",
        "content": "Write a Python function that reads a CSV and counts rows."
    }]
)
print(resp.choices[0].message.content)
EOF

SDK를 설치하고 실행하세요.

pip install --break-system-packages openai
python3 test_local.py

이 모델은 파이썬 코드를 생성합니다. 완전히 오프라인으로 진행되며, API 키가 필요 없고, 데이터가 외부로 전송되지 않습니다.


8단계 - 로컬 모델에 대해 코딩 에이전트를 실행합니다.

shell에이전트를 실제 에이전트로 교체하세요 . Codex와 Claude Code는 모두 환경 변수를 존중 OPENAI_BASE_URL하므로 OPENAI_API_KEYDMR을 가리키도록 설정하는 것은 한 줄짜리 코드로 가능합니다.

먼저 쉘 샌드박스에 들어가 보세요.

sbx stop dmr-test
sbx rm dmr-test

코덱 샌드박스를 생성하고 로컬 모델 환경 변수를 주입합니다.

cd /tmp/dmr-test
sbx create --name dmr-codex codex .

에이전트가 매 실행마다 환경 변수를 사용할 수 있도록 코덱 설정에 환경 변수를 추가합니다. 연결 후 SBX 내부에서 다음 단계를 따르세요.

export OPENAI_BASE_URL=http://host.docker.internal:12434/engines/llama.cpp/v1
export OPENAI_API_KEY=not-needed
codex "write a Python script that prints the first 10 Fibonacci numbers"

에이전트는 마이크로VM 내부에서 실행되고, 모델은 사용자의 Mac에서 실행됩니다. 경계를 넘나드는 유일한 데이터는 HTTP를 통한 OpenAI 호환 JSON 데이터입니다. 클라우드를 사용하지 않으며, 호스트 외부로 비밀 정보가 유출되지 않습니다. 토큰 요금도 발생하지 않습니다.


실행 중에 정책 로그를 확인하세요.

별도의 호스트 터미널에서:

sbx policy log dmr-codex

모든 추론 요청은 허용된 항목으로 표시됩니다 localhost:12434. 이것이 바로 감사 추적 기록이며, 에이전트가 로컬 모델과만 통신하고 다른 어떤 것과도 통신하지 않았다는 증거입니다.

일부러 오류를 일으켜 보세요. SBX를 중지하고, 허용 규칙을 거부 규칙으로 변경한 다음 다시 시작하면 에이전트가 모델에 연결하지 못할 것입니다. 네트워크 정책은 로컬 트래픽과 클라우드 트래픽을 동일한 방식으로 제어합니다.