OpenAI 호환 서버 — 한 대에 걸친 배포
OpenAI 호환 서버 — 한 대에 걸친 배포
LMDeploy로 단일 LLM을 여러 GPU에 걸쳐 배포하고 OpenAI 호환 인터페이스를 제공하는 서버를 만들어 봐요. LMDeploy 문서에서는 이 서비스를 api_server라고 불러요.
출처: https://lmdeploy.readthedocs.io/en/latest/llm/api_server.html
서비스 시작은 CLI 한 줄이면 돼요. internlm2_5-7b-chat 모델을 예로 들면 이렇게 띄워요.
lmdeploy serve api_server internlm/internlm2_5-7b-chat --server-port 23333
api_server의 인자는 lmdeploy serve api_server -h로 볼 수 있어요. 대표적으로 텐서 병렬 수를 정하는 --tp, 컨텍스트 윈도우 최대 길이를 정하는 --session-len, K/V 캐시에 쓸 GPU 메모리 비율을 조정하는 --cache-max-entry-count가 있어요.
Docker 공식 이미지로도 똑같이 띄울 수 있어요.
docker run --runtime nvidia --gpus all -v ~/.cache/huggingface:/root/.cache/huggingface --env "HUGGING_FACE_HUB_TOKEN=" -p 23333:23333 --ipc=host openmmlab/lmdeploy:latest lmdeploy serve api_server internlm/internlm2_5-7b-chat
RESTful API는 OpenAI의 세 인터페이스와 호환돼요. /v1/chat/completions, /v1/models, /v1/completions요. 여기에 더해 대화 기록을 서버 쪽에 캐시하는 /v1/chat/interactive도 지원해요. 이걸 쓰면 멀티턴·긴 컨텍스트 추론에서 대화 기록을 매번 넘길 필요가 없어져 성능이 좋아져요.
Python에서는 lmdeploy.serve.openai.api_client의 APIClient로 바로 호출할 수 있어요.
from lmdeploy.serve.openai.api_client import APIClient
api_client = APIClient('http://{server_ip}:{server_port}')
model_name = api_client.available_models[0]
messages = [{"role": "user", "content": "Say this is a test!"}]
for item in api_client.chat_completions_v1(model=model_name, messages=messages):
print(item)