跨区域推理(cross region inference)
功能允许自动进行跨区域路由,对于使用按需推理模式的开发人员来说,这提供了一种无缝的解决方案,可以获得更高的吞吐量和性能。通过选择使用这一功能,开发人员不再需要花费时间和精力预测需求波动。
此外,该功能在可能的情况下优先考虑连接的Amazon Bedrock API源区域,从而有助于最小化延迟并提高响应能力。
Amazon Bedrock在任何时候都会为通过跨区域推理发出的每个请求做出实时决策。当请求到达Amazon Bedrock时, 会在请求源自的同一区域进行容量检查, 如果有足够的容量, 则请求将得到满足, 否则会进行第二次检查, 以确定哪个区域有容量来处理该请求, 然后将其重新路由到该决定的区域, 并为客户请求检索结果。这种执行容量检查的能力以前是不可用的, 用户必须在收到错误后手动检查每个选择区域, 然后进行重新路由:
一个在eu-west-1
(爱尔兰)有工作负载的客户可以利用eu-west-3
(巴黎)和eu-central-1
(法兰克福)的容量, 或者一个在us-east-1
(弗吉尼亚北部)有工作负载的客户可以利用us-west-2
(俄勒冈州)的容量, 反之亦然。这将使所有推理流量保持在EU或US内。
需要注意的几点:
使用此功能时, bedrock quota可以达到默认区域内配额的两倍, 但这只适用于通过推理配置文件执行的调用,如果选择区域内模型调用请求, 则常规配额仍然适用。
跨区域推理的日志在哪里? 日志和调用仍将位于请求源自的区域和帐户中。Amazon Bedrock将在日志中输出指示符,显示哪个区域实际提供了服务。
为了表示发生了重新路由, 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
标识符与InvokeModel
或Converse
API, 就可以使用跨区域推理功能。
列出所在区域可用的inference profile
:
也可以通过AWS CLI在所在区域列出可用的inference-profile
:
aws bedrock list-inference-profiles
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'])