로컬 llama-server를 위해 직접 작성한 미니멀 프록시: 약 1,100줄의 코드로 구현한 사용자별 키, 토큰 계정 관리 및 속도 제한
요약
로컬 llama-server 운영 시 사용자별 API 키 관리와 속도 제한을 구현하기 위해 작성된 미니멀한 Python 프록시를 소개합니다. SQLite를 활용하여 약 1,100줄의 코드로 가볍게 구현되었으며, 추론 성능에 영향을 주지 않는 매우 낮은 지연 시간을 자랑합니다.
핵심 포인트
- 사용자별 API 키 및 토큰 사용량 추적 기능 제공
- RPM/TPM 기반의 속도 제한(Rate Limiting) 지원
- SQLite 기반의 경량 설계로 추가 서비스 설치 불필요
- FastAPI와 uvloop를 사용하여 매우 낮은 오버헤드 구현
- pip를 통해 smol-llm-proxy로 간편하게 설치 가능
안녕하세요 여러분, 저는 집에서 몇 개의 llama-server 인스턴스를 운영하며 소수의 사람들과 공유하고 있습니다. 각 사용자에게 키를 부여하고 누가 얼마나 사용하는지 확인하고 싶었습니다. 이를 위해 단순히 Postgres와 Redis를 실행하고 싶지는 않았기에, 결국 저만의 프록시(proxy)를 직접 작성하게 되었습니다. 비슷한 상황에 처한 분들에게 도움이 될까 하여 공유합니다.
이 프록시는 llama-server 인스턴스 앞에 위치하며 기본적으로 한 가지 기능, 즉 토큰 계정 관리(token accounting)와 속도 제한(rate limits)을 갖춘 사용자별 API 키 기능을 수행합니다. 클라우드 제공업체, 예산, 관리 UI, 모델 로딩은 필요 없습니다. 약 1,100줄의 Python 코드로 구성되어 있으며(CI에 이 길이를 유지하기 위한 테스트가 포함되어 있습니다), SQLite만 사용하며 다른 서비스는 필요하지 않습니다. 프록시 로직은 uvloop를 사용하여 요청당 약 0.13ms가 소요되며, 실제 llama-server와 연동한 엔드 투 엔드(end-to-end) 시 대략 1ms가 추가되는데, 이는 추론(inference) 시간에 비하면 무시할 수 있는 수준입니다. 워커(worker)당 RSS는 약 53MB이며, 대부분은 FastAPI의 기본 점유량입니다.
주요 기능:
- 사용자별 API 키
- 모델 이름에 따른 라우팅 (routing)
- 키별 모델 별칭(model aliases) 적용
- RPM/TPM 제한 (429 + Retry-After)
- 키별 및 모델별 토큰 사용량 추적 — 대화 내용은 저장되지 않음
- 스트리밍 및 비스트리밍 지원: 채팅(chat), 완성(completions), 임베딩(embeddings)
LiteLLM이나 llama-swap이 되려는 것이 아닙! 대부분의 코드는 llama.cpp 상에서 로컬 Qwen3.6-27B 및 Qwen3.6-35B-A3B를 사용하여 오픈 코드로 작성되었습니다.
pip를 통해 설치할 수 있습니다: pip install smol-llm-proxy
또는 여기서 확인하세요: https://github.com/robolamp/smol-llm-proxy
영어가 제 모국어가 아니어서, 이 게시물을 정리하는 데 LLM의 도움을 받았습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 r/LocalLLaMA의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기