Xlera8

在 Amazon Bedrock 上构建内部 SaaS 服务,并跟踪基础模型的成本和使用情况 |亚马逊网络服务

企业正在寻求通过向不同业务线 (LOB) 提供对基础模型 (FM) 的访问来快速释放生成式 AI 的潜力。 IT 团队负责帮助 LOB 快速、敏捷地进行创新,同时提供集中治理和可观察性。例如,他们可能需要跟踪跨团队的 FM 使用情况、退款成本并提供 LOB 中相关成本中心的可见性。此外,他们可能需要规范每个团队对不同模型的访问。例如,如果只有特定的 FM 可以被批准使用。

亚马逊基岩 是一项完全托管的服务,通过单一 API 提供来自 AI21 Labs、Anthropic、Cohere、Meta、Stability AI 和 Amazon 等领先 AI 公司的高性能基础模型选择,以及用于构建生成 AI 的广泛功能具有安全性、隐私性和负责任的人工智能的应用程序。由于 Amazon Bedrock 是无服务器的,因此您无需管理任何基础设施,并且可以使用您已经熟悉的 AWS 服务将生成式 AI 功能安全地集成和部署到您的应用程序中。

基础模型的软件即服务 (SaaS) 层可以为最终用户提供简单且一致的界面,同时保持访问和消费的集中治理。 API 网关可以提供模型使用者和模型端点服务之间​​的松耦合,以及适应不断变化的模型、架构和调用方法的灵活性。

在这篇文章中,我们将向您展示如何在多租户(团队)架构中构建内部 SaaS 层以使用 Amazon Bedrock 访问基础模型。我们特别关注每个租户的使用情况和成本跟踪,以及每个租户的使用限制等控制措施。我们描述了解决方案和 Amazon Bedrock 消费计划如何映射到通用 SaaS 旅程框架。解决方案的代码和 AWS云开发套件 (AWS CDK) 模板可在 GitHub存储库.

挑战

AI 平台管理员需要为多个开发团队提供对 FM 的标准化且轻松的访问。

以下是提供对基础模型的受管控访问的一些挑战:

  • 成本和使用情况跟踪 – 跟踪和审核单个租户的成本和基础模型的使用情况,并向特定成本中心提供退款成本
  • 预算和使用控制 – 管理 API 配额、预算和使用限制,以允许每个租户在定义的频率上使用基础模型
  • 访问控制和模型治理 – 为每个租户的特定允许列出的模型定义访问控制
  • 多租户标准化API – 提供对基础模型的一致访问 OpenAPI的 标准
  • API集中管理 – 提供单层来管理用于访问模型的 API 密钥
  • 型号版本和更新 – 处理新的和更新的模型版本的推出

解决方案概述

在这个解决方案中,我们引用了一个 多租户 方法。 A 承租人 这里的范围可以是单个用户、特定项目、团队甚至整个部门。当我们讨论该方法时,我们使用术语 团队,因为它是最常见的。我们使用 API 密钥来限制和监控团队的 API 访问。每个团队都分配有一个 API 密钥,用于访问 FM。组织中可以部署不同的用户身份验证和授权机制。为简单起见,我们不将这些包含在此解决方案中。您还可以将现有的身份提供商与此解决方案集成。

下图总结了解决方案架构和关键组件。分配到不同成本中心的团队(租户)通过 API 服务使用 Amazon Bedrock FM。为了跟踪每个团队的消耗和成本,该解决方案记录每个单独调用的数据,包括调用的模型、文本生成模型的令牌数量以及多模式模型的图像尺寸。此外,它还汇总了每个团队的每个模型的调用和成本。

您可以使用 AWS CDK 在您自己的账户中部署解决方案。 AWS CDK 是一个开源软件开发框架,可使用熟悉的编程语言对云应用程序资源进行建模和配置。 AWS CDK 代码可在 GitHub存储库.

在以下部分中,我们将更详细地讨论该解决方案的关键组件。

捕获每个团队的基础模型使用情况

捕获每个团队 FM 使用情况的工作流程包含以下步骤(如上图中编号):

  1. 团队的应用程序发送 POST 请求至 Amazon API网关 与要调用的模型 model_id 请求体中的查询参数和用户提示。
  2. API网关将请求路由到 AWS Lambda 功能(bedrock_invoke_model)负责记录团队使用信息 亚马逊CloudWatch 并调用 Amazon Bedrock 模型。
  3. Amazon Bedrock 提供由以下技术支持的 VPC 终端节点 AWS私有链接。在此解决方案中,Lambda 函数使用 PrivateLink 将请求发送到 Amazon Bedrock,以在您账户中的 VPC 与 Amazon Bedrock 服务账户之间建立私有连接。要了解有关 PrivateLink 的更多信息,请参阅 使用 AWS PrivateLink 设置对 Amazon Bedrock 的私有访问.
  4. 在亚马逊基岩调用之后, 亚马逊云跟踪 产生一个 CloudTrail 事件。
  5. 如果 Amazon Bedrock 调用成功,Lambda 函数将根据调用模型的类型记录以下信息,并将生成的响应返回给应用程序:
    • 团队 ID – 发出请求的团队的唯一标识符。
    • 请求ID – 请求的唯一标识符。
    • 型号标识 – 要调用的模型的ID。
    • 输入令牌 – 作为提示的一部分发送到模型的令牌数量(对于文本生成和嵌入模型)。
    • 输出令牌 – 模型生成的最大标记数(对于文本生成模型)。
    • 高度 – 请求图像的高度(对于多模态模型和多模态嵌入模型)。
    • 宽度 – 请求图像的宽度(仅适用于多模式模型)。
    • 步骤 – 请求的步骤(针对稳定性 AI 模型)。

跟踪每个团队的成本

不同的流程聚合使用信息,然后计算并保存每个团队每天的按需成本。通过拥有单独的流程,我们确保成本跟踪不会影响模型调用流程的延迟和吞吐量。工作流程步骤如下:

  1. An 亚马逊EventBridge 规则触发 Lambda 函数 (bedrock_cost_tracking) 日常的。
  2. Lambda 函数从 CloudWatch 获取前一天的使用信息,计算相关成本,并存储汇总的数据 team_idmodel_id in 亚马逊简单存储服务 (Amazon S3) CSV 格式。

要查询和可视化存储在 Amazon S3 中的数据,您有不同的选择,包括 S3 选择亚马逊 Athena 和亚马逊 QuickSight。

控制每个团队的使用情况

使用计划指定谁可以访问一个或多个已部署的 API,并可以选择设置目标请求率以开始限制请求。该计划使用 API 密钥来识别可以访问每个密钥关联的 API 的 API 客户端。您可以使用API​​网关 使用计划 限制超过预定义阈值的请求。您还可以使用 API密钥 和配额限制,使您能够设置每个团队在指定时间间隔内允许发出的每个 API 密钥的最大请求数。这是除了 Amazon Bedrock 服务配额 仅在帐户级别分配。

先决条件

在部署解决方案之前,请确保您具备以下条件:

部署 AWS CDK 堆栈

请按照 读我 GitHub 存储库的文件来配置和部署 AWS CDK 堆栈。

该堆栈部署以下资源:

  • 私有网络环境(VPC、私有子网、安全组)
  • 用于控制模型访问的 IAM 角色
  • 必要的 Python 模块的 Lambda 层
  • 拉姆达函数 invoke_model
  • 拉姆达函数 list_foundation_models
  • 拉姆达函数 cost_tracking
  • Rest API(API网关)
  • API网关使用计划
  • 与使用计划关联的 API 密钥

加入新团队

为了向新团队提供访问权限,您可以在不同团队之间共享相同的 API 密钥,并通过提供不同的 API 密钥来跟踪模型消耗 team_id 用于 API 调用,或按照以下中提供的说明创建用于访问 Amazon Bedrock 资源的专用 API 密钥 读我.

该堆栈部署以下资源:

  • 与之前创建的 REST API 关联的 API Gateway 使用计划
  • 与新团队的使用计划关联的 API 密钥,并为 API 保留限制和突发配置

有关API网关限流和突发配置的更多信息,请参阅 限制 API 请求以获得更好的吞吐量.

部署堆栈后,您可以看到新的 API 密钥 team-2 也被创建。

配置模型访问控制

平台管理员可以通过编辑与 Lambda 函数关联的 IAM 策略来允许访问特定基础模型 invoke_model。 该

IAM 权限在文件中定义 设置/stack_constructs/iam.py。 请参见以下代码:

self.bedrock_policy = iam.Policy( scope=self, id=f"{self.id}_policy_bedrock", policy_name="BedrockPolicy", statements=[ iam.PolicyStatement( effect=iam.Effect.ALLOW, actions=[ "sts:AssumeRole", ], resources=["*"], ), iam.PolicyStatement( effect=iam.Effect.ALLOW, actions=[ "bedrock:InvokeModel", “bedrock:ListFoundationModels", ], resources=[ "arn:aws:bedrock:*::foundation-model/anthropic.claude-v2.1", "arn:aws:bedrock:*::foundation-model/amazon.titan-text-express-v1", "arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v1"
], ) ], ) … self.bedrock_policy.attach_to_role(self.lambda_role)

调用服务

部署解决方案后,您可以直接从代码调用服务。下列

是 Python 中使用的一个示例 invoke_model 通过 POST 请求生成文本的 API:

api_key=”abcd1234” model_id = "amazon.titan-text-express-v1" #the model id for the Amazon Titan Express model model_kwargs = { # inference configuration "maxTokenCount": 4096, "temperature": 0.2
} prompt = "What is Amazon Bedrock?" response = requests.post( f"{api_url}/invoke_model?model_id={model_id}", json={"inputs": prompt, "parameters": model_kwargs}, headers={ "x-api-key": api_key, #key for querying the API "team_id": team_id #unique tenant identifier }
) text = response.json()[0]["generated_text"] print(text)

输出:Amazon Bedrock 是亚马逊开发的一个内部技术平台,用于运行和运营其许多服务和产品。关于基岩的一些关键事项……

下面是Python中使用的另一个例子 invoke_model 通过 POST 请求生成嵌入的 API:

model_id = "amazon.titan-embed-text-v1" #the model id for the Amazon Titan Embeddings Text model prompt = "What is Amazon Bedrock?" response = requests.post( f"{api_url}/invoke_model?model_id={model_id}", json={"inputs": prompt, "parameters": model_kwargs}, headers={ "x-api-key": api_key, #key for querying the API "team_id": team_id #unique tenant identifier, "embeddings": "true" #boolean value for the embeddings model }
) text = response.json()[0]["embedding"]

输出:0.91796875、0.45117188、0.52734375、-0.18652344、0.06982422、0.65234375、-0.13085938、0.056884766、0.092285156、0.06982422、 1.03125、0.8515625、0.16308594、0.079589844、-0.033935547、0.796875、-0.15429688、-0.29882812、-0.25585938、0.45703125、0.044921875 0.34570312、 XNUMX …

拒绝访问基础模型

以下是 Python 中使用的示例 invoke_model 通过具有访问拒绝响应的 POST 请求生成文本的 API:

model_id = " anthropic.claude-v1" #the model id for Anthropic Claude V1 model model_kwargs = { # inference configuration "maxTokenCount": 4096, "temperature": 0.2
} prompt = "What is Amazon Bedrock?" response = requests.post( f"{api_url}/invoke_model?model_id={model_id}", json={"inputs": prompt, "parameters": model_kwargs}, headers={ "x-api-key": api_key, #key for querying the API "team_id": team_id #unique tenant identifier }
) print(response)
print(response.text)

“回溯(最近一次调用最后一次):n 文件”/var/task/index.py”,第 213 行,在 lambda_handlern 响应 = _invoke_text(bedrock_client, model_id, body, model_kwargs)n 文件”/var/task/index.py ”,第 146 行,在 _invoke_textn 中 raise en 文件“/var/task/index.py”,第 131 行,在 _invoke_textn 响应 = bedrock_client.invoke_model(n 文件“/opt/python/botocore/client.py”,第 535 行,在 _api_calln 返回 self._make_api_call(operation_name, kwargs)n 文件“/opt/python/botocore/client.py”,第 980 行,在 _make_api_calln 中引发 error_class(parsed_response, operation_name)nbotocore.errorfactory.AccessDeniedException: 调用 InvokeModel 操作时发生错误 (AccessDeniedException):您的帐户无权调用此 API 操作。n”

成本估算示例

当调用具有按需定价的 Amazon Bedrock 模型时,总成本计算为输入成本和输出成本之和。输入成本基于发送到模型的输入令牌数量,输出成本基于生成的令牌。价格为每 1,000 个输入代币和每 1,000 个输出代币。更多详情及具体型号价格请参考 亚马逊基岩定价.

让我们看一个示例,其中两个团队(team1 和 team2)通过本文中的解决方案访问 Amazon Bedrock。 Amazon S3 单日保存的使用量和费用数据如下表所示。

input_tokensoutput_tokens 分别存储给定日期每个模型和每个团队的模型调用的总输入和输出令牌。

input_costoutput_cost 存储每个模型和每个团队的相应成本。这些是使用以下公式计算的:

input_cost = input_token_count * model_pricing["input_cost"] / 1000
output_cost = output_token_count * model_pricing["output_cost"] / 1000

团队 ID 型号标识 输入令牌 输出令牌 调用 输入成本 产出成本
Team1 亚马逊.titan-tg1-large 24000 2473 1000 0.0072 0.00099
Team1 人类.claude-v2 2448 4800 24 0.02698 0.15686
Team2 亚马逊.titan-tg1-large 35000 52500 350 0.0105 0.021
Team2 ai21.j2-大指令 4590 9000 45 0.05738 0.1125
Team2 人类.claude-v2 1080 4400 20 0.0119 0.14379

功能性多租户无服务器 SaaS 环境的端到端视图

让我们了解一下端到端功能性多租户无服务器 SaaS 环境是什么样子的。下面是参考架构图。

此架构图是本文前面解释的上一个架构图的缩小版本,其中上一个架构图解释了提到的微服务之一(基础模型服务)的详细信息。此图说明,除了基础模型服务之外,您的多租户 SaaS 平台中还需要其他组件才能实现功能性且可扩展的平台。

让我们详细了解一下该架构。

租户申请

租户应用程序是与环境交互的前端应用程序。在这里,我们展示了从不同本地或 AWS 环境进行访问的多个租户。前端应用程序可以扩展为包括供新租户自行注册的注册页面和供 SaaS 服务层管理员使用的管理控制台。如果租户应用程序需要实现需要与 SaaS 环境交互的自定义​​逻辑,则可以实现应用程序适配器微服务的规范。示例场景可以是添加自定义授权逻辑,同时遵守 SaaS 环境的授权规范。

共享服务

以下是共享服务:

  • 租户和用户管理服务 –这些服务负责注册和管理租户。它们提供独立于应用程序服务并在所有租户之间共享的横切功能。
  • 基础模型服务 –本文开头解释的解决方案架构图代表了该微服务,其中从 API Gateway 到 Lambda 函数的交互发生在该微服务的范围内。所有租户都使用此微服务来调用来自 Anthropic、AI21、Cohere、Stability、Meta 和 Amazon 的基础模型以及微调模型。它还捕获 CloudWatch 日志中的使用情况跟踪所需的信息。
  • 成本跟踪服务 – 该服务跟踪每个租户的成本和使用情况。该微服务按计划运行以查询 CloudWatch 日志并将聚合的使用情况跟踪和推断的成本输出到数据存储。成本跟踪服务可以扩展以构建进一步的报告和可视化。

应用适配器服务

该服务提供了租户可以实施的一组规范和 API,以便将其自定义逻辑集成到 SaaS 环境。根据需要多少自定义集成,该组件对于租户来说是可选的。

多租户数据存储

共享服务将其数据存储在数据存储中,该数据存储可以是单个共享的 Amazon DynamoDB 具有将 DynamoDB 项目与各个租户关联的租户分区键的表。成本跟踪共享服务将聚合的使用情况和成本跟踪数据输出到 Amazon S3。根据用例,还可以有特定于应用程序的数据存储。

多租户 SaaS 环境可以拥有更多组件。欲了解更多信息,请参阅 使用 AWS 无服务器服务构建多租户 SaaS 解决方案.

支持多种部署模型

SaaS 框架通常概述两种部署模型:池和筒仓。对于池模型,所有租户都从具有公共存储和计算基础设施的共享环境访问 FM。在筒仓模型中,每个租户都有自己的一组专用资源。您可以阅读有关隔离模型的信息 SaaS 租户隔离策略白皮书.

所提出的解决方案可用于两种 SaaS 部署模型。在池方法中,集中式 AWS 环境托管 API、存储和计算资源。在筒仓模式下,每个团队都可以访问专用 AWS 环境中的 API、存储和计算资源。

该解决方案还符合 Amazon Bedrock 提供的可用消费计划。 AWS 提供两种消费计划供选择用于推理:

  • 点播 – 此模式允许您在即用即付的基础上使用基础模型,而无需做出任何基于时间的期限承诺
  • 预置吞吐量 – 此模式允许您提供足够的吞吐量来满足应用程序的性能要求,以换取基于时间的期限承诺

有关这些选项的更多信息,请参阅 亚马逊基岩定价.

本文中描述的无服务器 SaaS 参考解决方案可以应用 Amazon Bedrock 消费计划,为最终用户提供基本和高级分层选项。基本可能包括 Amazon Bedrock 的按需或预置吞吐量消耗,并且可能包括特定的使用情况和预算限制。可以通过根据请求、令牌大小或预算分配限制请求来启用租户限制。高级层租户可以拥有自己的专用资源,并预配置 Amazon Bedrock 的吞吐量消耗。这些租户通常与需要高吞吐量和低延迟访问 Amazon Bedrock FM 的生产工作负载相关联。

结论

在这篇文章中,我们讨论了如何构建一个内部 SaaS 平台,以便在多租户设置中使用 Amazon Bedrock 访问基础模型,重点是跟踪成本和使用情况以及每个租户的限制。需要探索的其他主题包括集成组织中现有的身份验证和授权解决方案、增强 API 层以包括用于双向客户端服务器交互的 Web 套接字、添加内容过滤和其他治理护栏、设计多个部署层、集成 SaaS 中的其他微服务建筑,等等。

该解决方案的完整代码可在 GitHub存储库.

有关基于 SaaS 的框架的更多信息,请参阅 SaaS 之旅框架:在 AWS 上构建新的 SaaS 解决方案.


作者简介

哈桑·波纳瓦拉(Hasan Poonawala) 是 AWS 的高级 AI/ML 专家解决方案架构师,与医疗保健和生命科学客户合作。 Hasan 帮助在 AWS 上设计、部署和扩展生成式 AI 和机器学习应用程序。他在机器学习、软件开发和云数据科学领域拥有超过 15 年的综合工作经验。在业余时间,哈桑喜欢探索大自然并与朋友和家人共度时光。

阿纳斯塔西娅 策韦莱卡 是 AWS 的高级 AI/ML 专家解决方案架构师。作为工作的一部分,她帮助欧洲、中东和非洲地区的客户使用 AWS 服务构建基础模型并创建可扩展的生成式 AI 和机器学习解决方案。

无活塞 是一位位于米兰的 AWS 生成式 AI 和 ML 专家解决方案架构师。他与大客户合作,帮助他们深入了解自己的技术需求,并设计充分利用 AWS 云和 Amazon 机器学习堆栈的 AI 和机器学习解决方案。他的专业知识包括:端到端机器学习、机器学习工业化和生成人工智能。他喜欢与朋友共度时光,探索新的地方,以及去新的目的地旅行。

维克什·潘迪 是一位生成式 AI/ML 解决方案架构师,专门从事金融服务,帮助金融客户构建和扩展生成式 AI/ML 平台和解决方案,以扩展到数百甚至数千个用户。在业余时间,Vikesh 喜欢在各种博客论坛上写作,并与他的孩子一起搭建乐高积木。

在线答疑

你好呀! 我怎么帮你?