亚马逊AWS官方博客

借助 LiteLLM-proxy 平滑迁移应用到 Bedrock 和 SageMaker

背景

随着大语言模型的兴起,越来越多的应用已经开始接入 OpenAI 进行使用。但是想要从 OpenAI 切换到 Amazon Bedrock 或 Amazon SageMaker,还需要做一些调整。

主要的是,OpenAI 和 Bedrock 及 SageMaker 的 API 及数据格式并不兼容。如果应用侧的代码没有对接口进行抽象封装,那么原来所有调用 OpenAI API 的地方都需要修改,以适配 Bedrock 和 SageMaker 的格式。这无疑会增加不少工作量。

为减少这样的重复劳动,最好的方式是在应用侧提供一个服务接口层。在这个层中,开发者可以定义自己的请求格式和对象模型。业务逻辑代码都调用这组服务接口,而不直接访问 OpenAI 或 Bedrock。这样一来,API 的变更就只需要在接口层适配一次,不会影响到业务代码。

方案介绍

借助 LiteLLM-proxy,应用可以仅通过简单修改请求 URL,即可以类似访问 OpenAI 那样的方式调用 Bedrock API。

  1. 应用将原本要请求 OpenAI API 的 URL 改为指向 LiteLLM-proxy 的 URL,请求报文格式保持不变。
  2. LiteLLM-proxy 会将收到的请求转化成对应 Bedrock 或者 SageMaker 的格式,向 Bedrock 或  SageMaker 发起请求。
  3. 获取 Bedrock 或 SageMaker 的响应后,LiteLLM-proxy 再将其转换成与 OpenAI API 相符的格式返回给应用。

这样通过在 LiteLLM-proxy 做适当的请求和响应转换,应用可以享受到调用 Bedrock 和 SageMaker 的便利,而无需做繁琐的适配工作。

本文直接使用开源项目 GitHub – BerriAI/liteLLM-proxy 进行 LiteLLM-proxy 的搭建。

先决条件

LiteLLM-Proxy 部署

下载 liteLLM-proxy 开源项目

git clone https://github.com/BerriAI/liteLLM-proxy.git
cd liteLLM-proxy
git reset --hard 7023dfa5de810abcc9b802390f50df6306e9227b

根据需要,接下来可以选择进行本地部署,本地部署(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。

python main.py

使用 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 .

运行以下命令下载部署文件并替换其中镜像的地址。

curl -o template.yaml https://raw.githubusercontent.com/aws-samples/aws-global-accelerator-custom-routing-workshop/main/stack/ecs-alb-litellm-proxy.yaml

sed -i '' "s/<your-account-id>/${ACCOUNT_ID}/g" template.yaml
sed -i '' "s/<your-region>/${AWS_REGION}/g" template.yaml

在 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/

本篇作者

黄际东

AWS 解决方案架构师,有过银行、旅游、直播、教育等行业的十多年项目经验。曾独立主导实现从零到千万用户级别的教育类应用,也参与研发过月活跃用户过千万的全球知名直播平台。在互联网领域拥有多年的研发及运维经验,是一个喜欢编程的解决方案架构师。