教程:使用 LiteLLM Proxy 为大语言模型增加基础 api key 认证
为什么需要权限管理
在部署大语言模型服务时,权限管理是一个至关重要的环节。主要原因包括:
- 安全性:防止未经授权的访问,保护模型资源不被滥用
- 成本控制:可以为不同的用户设置不同的访问限制,更好地控制资源成本
LiteLLM Proxy 简介
LiteLLM Proxy 是一个轻量级的代理服务器,它可以为任何 LLM(大语言模型)API 添加基础的权限管理功能:
- 简单的身份验证机制
- 轻量级部署
- 与 OpenAI API 格式兼容
在 OpenBayes 上使用 Master Key 进行基本认证
前提条件
在开始配置 LiteLLM Proxy 之前,你需要安装并运行了大语言模型推理框架,该框架需要提供 OpenAI 兼容的 API。在本教程中,我们使用 vLLM 作为示例:
pip install vllm
vLLM 是一个高性能的大语言模型推理框架,它原生支持 OpenAI 兼容的 API 格式,非常适合作为 LiteLLM Proxy 的后端服务。当然,你也可以使用其他提供 OpenAI 兼容 API 的推理框架。
完整部署架构
在 OpenBayes 平台上,完整的部署架构如下:
- vLLM 服务运行在内部端口 3000 上
- LiteLLM Proxy 运行在对外端口上(模型训练: 8080, 模型部署: 80)
- 所有外部请求都通过 LiteLLM Proxy 进行,需要提供有效的 API Key
- LiteLLM Proxy 将请求转发给内部的 vLLM 服务
部署步骤
- 安装必要的依赖:
pip install litellm[proxy]
- 创建配置文件
litellm.config.yaml
:
model_list:
- model_name: DeepSeek-R1-Distill-Qwen-1.5B
litellm_params:
model: openai/custom # 使用 openai 兼容格式
api_base: http://localhost:3000/v1
api_key: "none" # vLLM 不需要 API key
general_settings:
master_key: "your-master-key-here" # 替换为你的主密钥
- 创建 vLLM 服务启动脚本
vllm.sh
:
#!/bin/bash
# 获取 GPU 数量
GPU_COUNT=$(nvidia-smi --query-gpu=name --format=csv,noheader | wc -l)
# 设置端口
VLLM_PORT=3000
# 启动 vLLM 服务
export PYTORCH_CUDA_ALLOC_CONF="expandable_segments:True"
echo "Starting vLLM service..."
vllm serve /output/DeepSeek-R1-Distill-Qwen-1.5B \
--served-model-name DeepSeek-R1-Distill-Qwen-1.5B \
--disable-log-requests --enforce-eager \
--trust-remote-code \
--host 0.0.0.0 --port $VLLM_PORT \
--gpu-memory-utilization 0.98 \
--max-model-len 16384 --enable-prefix-caching \
--tensor-parallel-size $GPU_COUNT &
# 等待 vLLM 服务启动
echo "Waiting for vLLM service to start..."
while ! curl -s "http://localhost:$VLLM_PORT/v1/models" > /dev/null; do
sleep 1
done
echo "vLLM service started successfully!"
- 创建主启动脚本
start.sh
:
#!/bin/bash
# 创建探针目录
mkdir -p /etc/probe
# 初始状态:服务未就绪且不健康
touch /etc/probe/not-ready
# 设置端口
PROXY_PORT=8080
if [ ! -z "$OPENBAYES_SERVING_PRODUCTION" ]; then
PROXY_PORT=80
fi
# 启动 vLLM 服务
echo "Starting vLLM service..."
bash vllm.sh
# 等待 vLLM 服务启动
echo "Waiting for vLLM service to start..."
while ! curl -s "http://localhost:3000/v1/models" > /dev/null; do
sleep 1
done
# 启动 LiteLLM Proxy
echo "Starting LiteLLM Proxy..."
litellm --config litellm.config.yaml --port $PROXY_PORT &
# 等待 LiteLLM Proxy 启动
echo "Waiting for LiteLLM Proxy to start..."
while ! curl -s "http://localhost:$PROXY_PORT/health/liveness" > /dev/null; do
sleep 1
done
# 所有服务启动成功,移除未就绪标记
rm -f /etc/probe/not-ready
rm -f /etc/probe/not-healthy
echo "All services started successfully!"
# 设置健康检查函数
check_health() {
# 检查 vLLM 服务
if ! curl -s "http://localhost:3000/v1/models" > /dev/null; then
touch /etc/probe/not-healthy
return
fi
# 检查 LiteLLM Proxy
if ! curl -s "http://localhost:$PROXY_PORT/health/liveness" > /dev/null; then
touch /etc/probe/not-healthy
return
fi
# 如果所有检查都通过,移除不健康标记
rm -f /etc/probe/not-healthy
}
# 设置 trap 以在进程终止时恢复探针文件
trap 'touch /etc/probe/not-ready /etc/probe/not-healthy; exit 0' SIGTERM SIGINT
# 启动后台健康检查
while true; do
check_health
sleep 10
done &
# 保持脚本运行
wait
- 给脚本添加执行权限:
chmod +x vllm.sh start.sh
- 运行服务:
./start.sh
测试服务
在模型训练中的服务进行测试:
curl http://your-gear-url/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-master-key-here" \
-d '{
"model": "DeepSeek-R1-Distill-Qwen-1.5B",
"messages": [{"role": "user", "content": "Hello!"}]
}'
在模型部署中的服务部署:
curl http://your-serving-url/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-master-key-here" \
-d '{
"model": "DeepSeek-R1-Distill-Qwen-1.5B",
"messages": [{"role": "user", "content": "Hello!"}]
}'
关键配置修改项目
在部署时需要修改以下关键配置:
-
在
litellm.config.yaml
中:model_name
: 替换为你的模型名称master_key
: 替换为你的密钥
-
在
vllm.sh
中:- 模型路径:替换
/output/DeepSeek-R1-Distill-Qwen-1.5B
为你的模型路径 - 模型名称:确保与
litellm.config.yaml
中的model_name
保持一致 - 上下文长度:根据需求调整
--max-model-len
参数
- 模型路径:替换
注意事项
- 请妥善保管 Master Key,不要在代码仓库或公开场合泄露
- 建议在生产环境中使用 HTTPS
- 在 OpenBayes 平台上的端口使用:
- vLLM 服务使用内部端口 3000
- LiteLLM Proxy 使用对外端口(模型训练: 8080, 模型部署: 80)
- 端口配置通过命令行参数设置,而不是在配置文件中设 置
如需了解更多信息,请参考: