LLM · 임베딩 · 리랭커를 각각 다른 포트의 vLLM 프로세스로 띄운 뒤, 인증과 모델 별칭을 한 곳에서 처리하려고 LiteLLM Proxy 를 앞단에 두었다. Cloudera AI(RAG Studio, Agent Studio) 가 OpenAI 호환 이름(gpt-4o, text-embedding-3-large)으로 호출해도 같은 백엔드로 보내는 별칭 구성이 핵심이다. NIM 엔드포인트를 등록할 때의 프로바이더 접두사도 함께 정리한다.
Cloudera AI ──[Bearer master_key]──▶ LiteLLM :8080 ──┬─▶ 127.0.0.1:8000 Qwen3.6-27B
(인증 지점) ├─▶ 127.0.0.1:8001 bge-m3
└─▶ 127.0.0.1:8002 bge-reranker-v2-m3
python3.10 -m venv /opt/litellm/venv # vLLM venv 와 반드시 분리
/opt/litellm/venv/bin/pip install "litellm[proxy]==1.80.4"
KEY="sk-$(openssl rand -hex 24)" # master key 는 sk- 접두사 + 24바이트 난수
install -m 600 /dev/null /etc/sysconfig/litellm
cat > /etc/sysconfig/litellm <<EOF
LITELLM_MASTER_KEY=${KEY}
LITELLM_LOCAL_MODEL_COST_MAP=True # 없으면 기동 시 외부로 cost map 을 받으러 나간다
LITELLM_DONT_SHOW_FEEDBACK_BOX=True
no_proxy=*
NO_PROXY=*
EOF
| 경로 | 내용 | 권한 |
|---|---|---|
/opt/litellm/venv |
LiteLLM 전용 venv | |
/opt/litellm/config.yaml |
모델 라우팅 정의 | 640 |
/etc/sysconfig/litellm |
master key 등 환경 변수 | 600 |
/etc/systemd/system/litellm.service |
서비스 정의 | 644 |
model_list:
- model_name: qwen3.6-27b
litellm_params:
model: hosted_vllm/Qwen3.6-27B # vLLM --served-model-name 과 대소문자까지 일치
api_base: http://127.0.0.1:8000/v1
api_key: "${MASKED}"
- model_name: gpt-4o # Cloudera AI 가 보내는 이름의 별칭 → 같은 백엔드
litellm_params:
model: hosted_vllm/Qwen3.6-27B
api_base: http://127.0.0.1:8000/v1
api_key: "${MASKED}"
- model_name: bge-m3
litellm_params:
model: hosted_vllm/bge-m3
api_base: http://127.0.0.1:8001/v1
api_key: "${MASKED}"
- model_name: text-embedding-3-large
litellm_params:
model: hosted_vllm/bge-m3
api_base: http://127.0.0.1:8001/v1
api_key: "${MASKED}"
- model_name: bge-reranker-v2-m3
litellm_params:
model: hosted_vllm/bge-reranker-v2-m3
api_base: http://127.0.0.1:8002 # rerank 는 /v1 없이
api_key: "${MASKED}"
- model_name: llama32-embedding # Cloudera AI Inference(NIM) 엔드포인트
litellm_params:
model: nvidia_nim/nvidia/llama-3.2-nv-embedqa-1b-v2 # NIM /v1/models 의 id 그대로
api_base: https://<caii-domain>/namespaces/serving-default/endpoints/<endpoint>/v1
api_key: ${MASKED} # CDP JWT 토큰
general_settings:
master_key: os.environ/LITELLM_MASTER_KEY
litellm_settings:
drop_params: true
request_timeout: 600
model: 의 접두사가 프로바이더를 정한다. 자체 vLLM 은 hosted_vllm/, NIM 은 nvidia_nim/(nim/ 이 아니다). 접두사 뒤는 백엔드가 /v1/models 로 돌려주는 id 여야 하고, 바깥 model_name 은 클라이언트가 부르는 별칭이라 자유롭게 여러 개 둘 수 있다. api_base 는 http:// 여야 하며 https:// 로 적으면 Cannot connect ... ssl:<ssl.SSLContext> 로 실패한다.
# /etc/systemd/system/litellm.service
[Unit]
Description=LiteLLM Proxy (vLLM Gateway)
After=network-online.target vllm-llm.service vllm-embed.service vllm-rerank.service
Wants=network-online.target
[Service]
Type=simple
User=vllm
Group=vllm
WorkingDirectory=/opt/litellm
EnvironmentFile=-/etc/sysconfig/litellm
ExecStart=/opt/litellm/venv/bin/litellm --config /opt/litellm/config.yaml --host 0.0.0.0 --port 8080
Restart=on-failure
RestartSec=15
LimitNOFILE=65536
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
ReadWritePaths=/opt/litellm /var/log/litellm
[Install]
WantedBy=multi-user.target
curl -s -o /dev/null -w "no-key: %{http_code}\n" http://127.0.0.1:8080/v1/models # 401 이어야 정상
curl -s http://127.0.0.1:8080/v1/models -H "Authorization: Bearer ${LITELLM_MASTER_KEY}"
curl -s http://127.0.0.1:8080/v1/chat/completions -H "Authorization: Bearer ${LITELLM_MASTER_KEY}" \
-H 'Content-Type: application/json' \
-d '{"model":"qwen3.6-27b","messages":[{"role":"user","content":"ping"}],"max_tokens":8}'
register_model: model=... not in built-in cost map 경고는 무해하다. 반대로 String should have at least 1 character. Received Model Group=... 는 클라이언트가 빈 문자열 필드(빈 system/content)를 보낸 것으로, 게이트웨이가 아니라 요청 쪽 문제다./etc/sysconfig/litellm(600) 에만 두고 명령행·채팅에 남기지 않는다.