背景
随着大语言模型的兴起,越来越多的应用已经开始接入 OpenAI 进行使用。但是想要从 OpenAI 切换到 Amazon Bedrock 或 Amazon SageMaker,还需要做一些调整。
主要的是,OpenAI 和 Bedrock 及 SageMaker 的 API 及数据格式并不兼容。如果应用侧的代码没有对接口进行抽象封装,那么原来所有调用 OpenAI API 的地方都需要修改,以适配 Bedrock 和 SageMaker 的格式。这无疑会增加不少工作量。
为减少这样的重复劳动,最好的方式是在应用侧提供一个服务接口层。在这个层中,开发者可以定义自己的请求格式和对象模型。业务逻辑代码都调用这组服务接口,而不直接访问 OpenAI 或 Bedrock。这样一来,API 的变更就只需要在接口层适配一次,不会影响到业务代码。
方案介绍
借助 LiteLLM-proxy,应用可以仅通过简单修改请求 URL,即可以类似访问 OpenAI 那样的方式调用 Bedrock API。
- 应用将原本要请求 OpenAI API 的 URL 改为指向 LiteLLM-proxy 的 URL,请求报文格式保持不变。
- LiteLLM-proxy 会将收到的请求转化成对应 Bedrock 或者 SageMaker 的格式,向 Bedrock 或 SageMaker 发起请求。
- 获取 Bedrock 或 SageMaker 的响应后,LiteLLM-proxy 再将其转换成与 OpenAI API 相符的格式返回给应用。
这样通过在 LiteLLM-proxy 做适当的请求和响应转换,应用可以享受到调用 Bedrock 和 SageMaker 的便利,而无需做繁琐的适配工作。
本文直接使用开源项目 GitHub – BerriAI/liteLLM-proxy 进行 LiteLLM-proxy 的搭建。
先决条件
LiteLLM-Proxy 部署
下载 liteLLM-proxy 开源项目
根据需要,接下来可以选择进行本地部署,本地部署(Docker)或 AWS 部署。
本地部署
下载相关依赖。
pip install --no-cache-dir -r requirements.txt
pip install boto3
设置访问用于验证的 key。
export LITELLM_PROXY_MASTER_KEY=<your-master-key>
export AWS_REGION_NAME=<your-region>
将 master-key 替换为自定义 key 值以进行后续访问,将 region 替换为需要调用的 bedrock 服务所在区域。
运行以下命令启动 LiteLLM-proxy。
使用 OpenAI 的报文格式进行测试。
curl http://127.0.0.1:8080/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <your-master-key>" \
-d '{
"model": "bedrock/anthropic.claude-v2",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "Hello!"
}
],
"stream": false
}'
替换 <your-master-key> 为前面设置的用于验证的 key。
本地部署(Docker)
替换 Dockerfile 文件为以下内容。
# Use an official Python runtime as a parent image
FROM python:3.8
# Set the working directory in the container
WORKDIR /app
# Copy the current directory contents into the container at /app
COPY . /app
# Install any needed packages specified in requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
RUN pip install boto3
ENV AWS_ACCESS_KEY_ID <your-access-key-id>
ENV AWS_SECRET_ACCESS_KEY <your-secret-access-key>
ENV AWS_REGION_NAME <your-region>
ENV LITELLM_PROXY_MASTER_KEY <your-master-key>
# Expose the port that your FastAPI application will run on
EXPOSE 8080
# Define the command to run your application
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]
替换对应的 access-key,secret-key,region,master-key,注意使用最小权限的 access-key,secret-key。
运行以下命令打包镜像。
docker build \
--tag litellm-proxy:latest .
运行以下命令启动 LiteLLM-proxy。
docker run -d -p 8080:8080 litellm-proxy
使用 OpenAI 的报文格式进行测试。
curl http://127.0.0.1:8080/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <your-master-key>" \
-d '{
"model": "bedrock/anthropic.claude-v2",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "Hello!"
}
],
"stream": false
}'
替换 <your-master-key> 为前面设置的用于验证的 key。
AWS 部署
在该步骤中,你将部署以下架构到 AWS 中:
设置当前的账号 ID 及部署区域。
export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
export AWS_REGION=<your-region>
替换 region 为对应的需要部署的区域。
替换 Dockerfile 文件为以下内容:
# Use an official Python runtime as a parent image
FROM python:3.8
# Set the working directory in the container
WORKDIR /app
# Copy the current directory contents into the container at /app
COPY . /app
# Install any needed packages specified in requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
RUN pip install boto3
# Expose the port that your FastAPI application will run on
EXPOSE 8080
# Define the command to run your application
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]
运行以下命令创建 Amazon Elastic Container Registry 仓库并登录。
aws ecr create-repository \
--repository-name litellm-proxy \
--region ${AWS_REGION}
aws ecr get-login-password --region ${AWS_REGION} \
| docker login --username AWS \
--password-stdin ${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com
运行以下命令打包多架构镜像并上传到 ECR 仓库。
docker buildx build \
--tag ${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/litellm-proxy:latest \
--platform linux/amd64,linux/arm64 \
--push .
运行以下命令下载部署文件并替换其中镜像的地址。
在 Linux 中,使用 sed -i 代替 sed -i ”。
运行以下命令将 LiteLLM-proxy 部署到 Amazone Elastic Container Service 集群中,并通过负载均衡器进行监听。
aws cloudformation create-stack \
--stack-name litellm-stack \
--template-body file://template.yaml \
--capabilities CAPABILITY_IAM \
--parameters ParameterKey=LitellmProxyMasterKey,ParameterValue=<your-master-key> \
--region ${AWS_REGION}
aws cloudformation wait stack-create-complete \
--stack-name litellm-stack \
--region ${AWS_REGION}
替换 master-key 为自定义的 key 值用于后续使用,Fn::GetAZs 获取可用区与默认子网相关,确保默认子网超过 3 个或不存在默认子网。
运行以下命令可获取访问的负载均衡器的 DNS 地址。
aws cloudformation describe-stacks \
--region ${AWS_REGION} \
--query "Stacks[?StackName=='litellm-stack'][].Outputs[?OutputKey=='LoadBalancerDNS'].OutputValue" \
--output text
使用 OpenAI 的报文格式进行测试。
curl http://<your-alb-url>:8080/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <your-master-key>" \
-d '{
"model": "bedrock/anthropic.claude-v2",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "Hello!"
}
],
"stream": false
}'
替换 <your-master-key> 为前面设置的用于验证的 key,修改 <your-alb-url> 为上一步获取的负载均衡器 DNS 地址。
清理环境
为避免产生不必要的费用,运行以下命令进行清理。
aws cloudformation delete-stack \
--stack-name litellm-stack \
--region ${AWS_REGION}
aws ecr delete-repository \
--repository-name litellm-proxy \
--region ${AWS_REGION} \
--force
总结
在这篇文章中,您探索了如何在不同场景下部署 Litellm-proxy,这是一个非常有用的代理。通过搭建该代理,您可以轻松地修改原有应用中的 OpenAI 请求地址,将其切换到 Bedrock 或 SageMaker。这样,您就可以快速地利用 Bedrock 及 SageMaker 提供的各种大型语言模型,如 Titan、Claude 等,从而为您的应用提供强大的 AI 功能。并且,您可以无缝地集成 Bedrock 和 SageMaker,而无需修改原有系统代码。总的来说,Litellm-proxy 为您提供了一个方便快捷地使用 Bedrock 及 SageMaker 提供的先进 AI 模型的途径。希望这篇文章能给您在 AI 应用开发方面带来启发和帮助。
*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。
参考资料
https://github.com/BerriAI/litellm
https://aws.amazon.com/blogs/machine-learning/llama-2-foundation-models-from-meta-are-now-available-in-amazon-sagemaker-jumpstart/
本篇作者