Cross region inference

跨区域推理(cross region inference)功能允许自动进行跨区域路由,对于使用按需推理模式的开发人员来说,这提供了一种无缝的解决方案,可以获得更高的吞吐量和性能。通过选择使用这一功能,开发人员不再需要花费时间和精力预测需求波动。

此外,该功能在可能的情况下优先考虑连接的Amazon Bedrock API源区域,从而有助于最小化延迟并提高响应能力。

Amazon Bedrock在任何时候都会为通过跨区域推理发出的每个请求做出实时决策。当请求到达Amazon Bedrock时, 会在请求源自的同一区域进行容量检查, 如果有足够的容量, 则请求将得到满足, 否则会进行第二次检查, 以确定哪个区域有容量来处理该请求, 然后将其重新路由到该决定的区域, 并为客户请求检索结果。这种执行容量检查的能力以前是不可用的, 用户必须在收到错误后手动检查每个选择区域, 然后进行重新路由:

img

一个在eu-west-1(爱尔兰)有工作负载的客户可以利用eu-west-3(巴黎)和eu-central-1(法兰克福)的容量, 或者一个在us-east-1(弗吉尼亚北部)有工作负载的客户可以利用us-west-2(俄勒冈州)的容量, 反之亦然。这将使所有推理流量保持在EU或US内。

img

img

需要注意的几点:

  1. 使用此功能时, bedrock quota可以达到默认区域内配额的两倍, 但这只适用于通过推理配置文件执行的调用,如果选择区域内模型调用请求, 则常规配额仍然适用。

  2. 跨区域推理的日志在哪里? 日志和调用仍将位于请求源自的区域和帐户中。Amazon Bedrock将在日志中输出指示符,显示哪个区域实际提供了服务。

  3. 为了表示发生了重新路由, AWS CloudTrail 中的相关条目还将包含以下附加数据。该事件将包含一个additionalEventData元素, 其中包含一个inferenceRegion键, 指定处理请求的区域。如果请求在未经重新路由的情况下得到处理, 则additionalEventData将从该事件中省略。

{
    "eventVersion": "1.09",
    ...
    "eventSource": "bedrock.amazonaws.com",
    "eventName": "Converse",
    "awsRegion": "us-east-1",
    ...
    "additionalEventData": {
        "inferenceRegion": "us-west-2"
    },
    ...
}

同样的信息也可在Amazon Bedrock模型调用日志 中获得:

{
    "schemaType": "ModelInvocationLog",
    "schemaVersion": "1.0",
    ...
    "region": "us-east-1",
    "operation": "Converse",
    ...
    "inferenceRegion": "us-west-2"
}

使用跨区域推理

要使用跨区域推理, 需要在Amazon Bedrock中使用inference profile。模型的inference profile配置来自各个AWS区域的不同模型ARN, 并将它们抽象为统一的模型标识符(ID和ARN)。只需简单地使用这个新的inference profile标识符与InvokeModelConverse API, 就可以使用跨区域推理功能。

列出所在区域可用的inference profile:

image-20241223145015124

也可以通过AWS CLI在所在区域列出可用的inference-profile:

aws bedrock list-inference-profiles

image-20241223145117230

inference profile的使用类似于使用 InvokeModel 或 Converse API 调用基础模型,modelId 之间的唯一区别是添加了前缀,例如 us.eu.

import json
import boto3

client = boto3.client(service_name='bedrock-runtime', region_name="us-east-1")

native_request = {
    "anthropic_version": "bedrock-2023-05-31",
    "messages": [  # Define one or more messages using the "user" and "assistant" roles.
        {"role": "user", "content": [{"text": "给爷讲个笑话","type": "text",}]},
    ],
    "system": [
        {"text": "You should respond to all messages in Chinese","type": "text",}
    ],
    "max_tokens": 3000,
}

response = client.invoke_model(modelId='us.anthropic.claude-3-5-sonnet-20240620-v1:0', body=json.dumps(native_request)) # 注意modelId加了前缀us.

model_response = json.loads(response["body"].read())

print(model_response.get('content')[0]['text'])

image-20241223150342512