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