Bedrockのクロスリージョン推論で、ひとつのリージョンのモデルアクセスしか有効化していない場合どうなるのか

Bedrockに新しく、クロスリージョン推論の機能が追加されました。

https://aws.amazon.com/jp/about-aws/whats-new/2024/08/amazon-bedrock-cross-region-inference/

[ブログ](https://aws.amazon.com/jp/blogs/machine-learning/getting-started-with-cross-region-inference-in-amazon-bedrock/)によると、まずプライマリーリージョンで処理を行い、トラフィックが集中などした場合はセカンダリーリージョンで推論が行われるとのことです。

## やってみる

Claude 3.5 Sonnetを使います。

私のAWSアカウントでは、バージニア北部（us-east-1）リージョンでのみモデルの有効化を行っており、オレゴン（us-west-2）リージョンではモデルの有効化を行っておりません。

この状態で、色々条件を変えて呼び出します。

## バージニア北部を指定して呼び出し

以下のコードで試しました。
model_idの指定が変わっています。クロスリージョン推論用のモデルID（Inference profile IDが正式名称らしいです）が用意されています。[ドキュメント](https://docs.aws.amazon.com/bedrock/latest/userguide/cross-region-inference-support.html)

その部分の指定以外はこれまでと変わりありません。

モデルが有効化されているバージニア北部リージョンを明示的に指定して呼び出します。

```python
import boto3

model_id = "us.anthropic.claude-3-5-sonnet-20240620-v1:0"
region = "us-east-1"
client = boto3.client("bedrock-runtime", region_name=region)

response = client.converse(
    modelId=model_id,
    system=[{"text": "You are an AI assistant."}],
    messages=[{"role": "user", "content": [{"text": "Tell me about Amazon Bedrock."}]}],
)

print(response["output"]["message"]["content"][0]["text"])
```

<details><summary>回答</summary>

> Amazon Bedrock is a fully managed service offered by Amazon Web Services (AWS) that provides access to foundation models (FMs) from leading AI companies through a single API. Here are some key points about Amazon Bedrock:
> 
> 1. Model Access: It offers access to a variety of foundation models from AI companies like AI21 Labs, Anthropic, Stability AI, and Amazon's own models.
> 
> 2. Customization: Users can customize these models for their specific use cases without needing to build and train their own models from scratch.
> 
> 3. Integration: It can be easily integrated with other AWS services and tools.
> 
> 4. Security and Privacy: Amazon Bedrock provides enterprise-grade security, privacy, and responsible AI capabilities.
> 
> 5. API-based: Developers can access the models through a simple API, making it easier to incorporate AI capabilities into their applications.
> 
> 6. Cost-effective: Users only pay for what they use, without upfront commitments or minimum fees.
> 
> 7. Use Cases: It can be used for various applications such as content generation, summarization, classification, question-answering, and more.
> 
> 8. No Infrastructure Management: As a fully managed service, users don't need to worry about infrastructure management.
> 
> 9. Model Fine-tuning: It allows for fine-tuning of models on proprietary data to improve performance for specific tasks.
> 
> 10. Responsible AI: Amazon Bedrock includes features to help ensure responsible use of AI, including bias detection and mitigation tools.
> 
> Amazon Bedrock aims to make it easier for businesses to leverage powerful AI models without the need for extensive machine learning expertise or infrastructure management.

</details>

うまくいきました。


## オレゴンリージョンを指定した場合

`region = "us-west-2"`に変更して再実行すると、エラーになりました。

> An error occurred (AccessDeniedException) when calling the Converse operation: You don't have access to the model with the specified model ID.

100回試しましたが、すべて同じエラーでした。

ブログを再度確認したところ、「まず、プライマリーリージョンで処理を試みて、トラフィック集中などがあった場合に他のリージョンにルーティングする」とありました。

そのため、プライマリーリージョンのモデルが有効化されていない場合、処理が行えず、セカンダリリージョンにルーティングすることなくエラーとなるようです。

## バージニア北部リージョンを指定して連続アクセス

バージニア北部リージョンからの呼び出しの場合で、プライマリーリージョンでエラー発生時はどのような動作となるのでしょうか？

以下のコードで試しました。

```python
import boto3

model_id = "us.anthropic.claude-3-5-sonnet-20240620-v1:0"
region = "us-east-1"
client = boto3.client("bedrock-runtime", region_name=region)

for n in range(10):
    try:
        response = client.converse(
            modelId=model_id,
            system=[{"text": "You are an AI assistant."}],
            messages=[{"role": "user", "content": [{"text": "Tell me about Amazon Bedrock."}]}],
        )

        print(response["output"]["message"]["content"][0]["text"])
    except Exception as e:
        print(e)
```

発生するエラーはすべて、以下のものでした。

> An error occurred (ThrottlingException) when calling the Converse operation (reached max retries: 4): Too many requests, please wait before trying again. You have sent too many requests.  Wait before trying again.

プライマリーリージョンでスロットリングが発生しても、他のリージョンで利用できるものがないので、最終的にスロットリングエラーとなりました。（オレゴン指定の場合のAccessDeniedExceptionになることはありませんでした。）



## 東京リージョン指定で呼べるの？

クロスリージョンなので、どこからでも呼べそうな雰囲気を感じます。
boto3.clientの明示的に「ap-northeast-1」を指定してみました。

```python
import boto3

model_id = "us.anthropic.claude-3-5-sonnet-20240620-v1:0"
region = "ap-northeast-1"
client = boto3.client("bedrock-runtime", region_name=region)

response = client.converse(
    modelId=model_id,
    system=[{"text": "You are an AI assistant."}],
    messages=[{"role": "user", "content": [{"text": "Tell me about Amazon Bedrock."}]}],
)

print(response["output"]["message"]["content"][0]["text"])
```

> botocore.errorfactory.ValidationException: An error occurred (ValidationException) when calling the Converse operation: Your account is not authorized to invoke this API operation.

エラーになりました。エラーメッセージは「あなたのアカウントはだめよ」的ですが、クロスリージョンに含まれるリージョンから呼び出す必要がありそうです。

## バージニア北部のOpusを使う

Opusが提供されているリージョンはオレゴンのみでしたが、モデル一覧を見ると、クロスリージョン推論用途でのみ、バージニア北部リージョンが使える雰囲気です。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/a012cb71-5a57-328d-4bb5-a611d9430ae0.png)

最後に以下のコードで、バージニア北部のOpusが呼び出されることがあるか検証します。

```python
import boto3

model_id = "us.anthropic.claude-3-opus-20240229-v1:0"
region = "us-west-2"
client = boto3.client("bedrock-runtime", region_name=region)

for n in range(3):
    try:
        response = client.converse(
            modelId=model_id,
            system=[{"text": "You are an AI assistant."}],
            messages=[{"role": "user", "content": [{"text": "Tell me about Amazon Bedrock."}]}],
        )

        print(response["output"]["message"]["content"][0]["text"])
    except Exception as e:
        print(e)
```

残念ながらスロットリングエラーになりました。

> An error occurred (ThrottlingException) when calling the Converse operation (reached max retries: 4): Too many requests, please wait before trying again. You have sent too many requests.  Wait before trying again.
An error occurred (ThrottlingException) when calling the Converse operation (reached max retries: 4): Too many requests, please wait before trying again. You have sent too many requests.  Wait before trying again.
An error occurred (ThrottlingException) when calling the Converse operation (reached max retries: 4): Too many requests, please wait before trying again. You have sent too many requests.  Wait before trying again.


:::note
もしかしたら、サポートに連絡して、バージニア北部のOpusを有効化する必要があるのかもしれません
:::