複雑になってきたBedrockの「モデル」を整理する

Amazon Bedrockでできることが増えたことにより、[InvokeModel API](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html)や[Converse API](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html)で指定できるモデルが複雑になってきました。

わかりやすくするため、図にしてみました。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/81bc5f8d-8512-3506-60d5-533d80c29e47.png)


## ベースモデル（Base model）

普通の呼び出しです。

### ベースモデルのモデル一覧を取得

ListFoundationModels APIでモデル一覧が取得できますが、ベースモデル以外の情報も含まれています。
ベースモデルのモデル一覧を取得するために`jq`を使ってフィルタリングします。

```shell:CloudShell
aws bedrock list-foundation-models | \
  jq -r '.modelSummaries[] | select(.inferenceTypesSupported[] == "ON_DEMAND") | [
    .modelName,
    .providerName,
    .modelId,
    .modelArn,
    (.inputModalities | join(" ")),
    (.outputModalities | join(" ")),
    .modelLifecycle.status
  ] | @tsv' | column -t -s $'\t'
```

```
Titan Text G1 - Express     Amazon     amazon.titan-text-express-v1               arn:aws:bedrock:ap-northeast-1::foundation-model/amazon.titan-text-express-v1               TEXT        TEXT       ACTIVE
Titan Embeddings G1 - Text  Amazon     amazon.titan-embed-text-v1                 arn:aws:bedrock:ap-northeast-1::foundation-model/amazon.titan-embed-text-v1                 TEXT        EMBEDDING  ACTIVE
Claude Instant              Anthropic  anthropic.claude-instant-v1                arn:aws:bedrock:ap-northeast-1::foundation-model/anthropic.claude-instant-v1                TEXT        TEXT       ACTIVE
Claude                      Anthropic  anthropic.claude-v2:1                      arn:aws:bedrock:ap-northeast-1::foundation-model/anthropic.claude-v2:1                      TEXT        TEXT       ACTIVE
Claude 3 Haiku              Anthropic  anthropic.claude-3-haiku-20240307-v1:0     arn:aws:bedrock:ap-northeast-1::foundation-model/anthropic.claude-3-haiku-20240307-v1:0     TEXT IMAGE  TEXT       ACTIVE
Claude 3.5 Sonnet           Anthropic  anthropic.claude-3-5-sonnet-20240620-v1:0  arn:aws:bedrock:ap-northeast-1::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0  TEXT IMAGE  TEXT       ACTIVE
Embed English               Cohere     cohere.embed-english-v3                    arn:aws:bedrock:ap-northeast-1::foundation-model/cohere.embed-english-v3                    TEXT        EMBEDDING  ACTIVE
Embed Multilingual          Cohere     cohere.embed-multilingual-v3               arn:aws:bedrock:ap-northeast-1::foundation-model/cohere.embed-multilingual-v3               TEXT        EMBEDDING  ACTIVE
```

### 呼び出し例

modelIdは、モデルIDまたはモデルARNを指定します。

* モデルID（例）： anthropic.claude-3-5-sonnet-20240620-v1:0
* モデルARN（例）： arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0

:::note
AWSアカウント固有ではないので、アカウントIDはARNに含まれていません。
:::

```python:Converse API
import boto3

client = boto3.client("bedrock-runtime")

client.converse(
    modelId="anthropic.claude-3-5-sonnet-20240620-v1:0",
#   modelId="arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "text": "Hello, how are you?",
                }
            ],
        }
    ],
)
```

## クロスリージョン推論（Cross-region inference）

2024/8に追加された機能です。

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

ベースモデルを使用する場合、単一のリージョンへリクエストを行います。クロスリージョン推論を使用すると、リクエストしたリージョン（プライマリリージョン）で処理できない場合、２つ目以降のリージョン（セカンダリリージョン）で処理を行います。

### クロスリージョン推論の推論プロファイル一覧を取得

クロスリージョン推論の推論プロファイルはListInferenceProfiles APIを使用して取得します。ListInferenceProfilesでは、アプリケーション推論プロファイル（後述）も含まれるので、「--type-equals SYSTEM_DEFINED」を指定します。

```shell:CloudShell
aws bedrock list-inference-profiles --type-equals SYSTEM_DEFINED | \
  jq -r '.inferenceProfileSummaries[] | [
    .inferenceProfileName,
    .inferenceProfileId,
    .inferenceProfileArn,
    .status
  ] | @tsv' | column -t -s $'\t'
```

```
APAC Anthropic Claude 3 Sonnet    apac.anthropic.claude-3-sonnet-20240229-v1:0    arn:aws:bedrock:ap-northeast-1:123456789012:inference-profile/apac.anthropic.claude-3-sonnet-20240229-v1:0    ACTIVE
APAC Anthropic Claude 3.5 Sonnet  apac.anthropic.claude-3-5-sonnet-20240620-v1:0  arn:aws:bedrock:ap-northeast-1:123456789012:inference-profile/apac.anthropic.claude-3-5-sonnet-20240620-v1:0  ACTIVE
APAC Anthropic Claude 3 Haiku     apac.anthropic.claude-3-haiku-20240307-v1:0     arn:aws:bedrock:ap-northeast-1:123456789012:inference-profile/apac.anthropic.claude-3-haiku-20240307-v1:0     ACTIVE
```

### 呼び出し例

modelIdは、推論プロファイルIDまたは推論プロファイルARNを指定します。

* 推論プロファイルID（例）： us.anthropic.claude-3-5-sonnet-20240620-v1:0	
* 推論プロファイルARN（例）： arn:aws:bedrock:us-east-1:123456789012:inference-profile/us.anthropic.claude-3-5-sonnet-20240620-v1:0


```python:Converse API
import boto3

client = boto3.client("bedrock-runtime")

client.converse(
    modelId="us.anthropic.claude-3-5-sonnet-20240620-v1:0",
#   modelId="arn:aws:bedrock:us-east-1:123456789012:inference-profile/us.anthropic.claude-3-5-sonnet-20240620-v1:0",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "text": "Hello, how are you?",
                }
            ],
        }
    ],
)
```


:::note warn

注意が必要なのは、**「ベースモデルは提供していないが、クロスリージョン推論だけ提供している場合がある」** ということです。

2024/11/24現在、東京リージョンでは **クロスリージョン推論でのみ** Claude 3 Sonnetが使用できます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/8dc8d7a8-336c-b348-87dc-cf5f48bfd392.png)

そのため、東京リージョンでベースモデル「anthropic.claude-3-sonnet-20240229-v1:0」を指定すると、以下のようなエラーとなります。

> ValidationException: An error occurred (ValidationException) when calling the Converse operation: Invocation of model ID anthropic.claude-3-sonnet-20240229-v1:0 with on-demand throughput isn’t supported. Retry your request with the ID or ARN of an inference profile that contains this model.

（セカンダリリージョンでモデルが有効化されている必要があるかもしれませんので、そのあたりもご注意ください。）
:::


## アプリケーション推論プロファイル（Application inference profile）

2024/11/1に追加された機能です。

https://aws.amazon.com/jp/about-aws/whats-new/2024/11/amazon-bedrock-cost-allocation-tags-inference-profiles/

ベースモデルとクロスリージョン推論は、タグ付けができないため、同一リージョンの同一モデルの場合を使用した場合にコストを分割することができませんでした。アプリケーション推論プロファイルを使うことでタグ付けが可能になり、「アプリ１のClaude 3 Sonnet利用料」と「アプリ２のClaude 3 Sonnet利用料」を分けることができるようになりました。（コスト分配タグの機能を組み合わせて使用します）

:::note
コスト以外にもCloudWatchのメトリクスも分けてみることができるようになります。
:::

:::note
カスタムモデルなどは、従来からタグ付けがサポートされています。
:::

アプリケーション推論プロファイルは「create_inference_profile」APIで作成します。「modelSource」にモデルARN（ベースモデルの場合）か推論プロファイルARN（クロスリージョン推論の場合）を指定します。

```python:アプリケーション推論プロファイルの作成
import boto3

client = boto3.client("bedrock")

client.create_inference_profile(
    inferenceProfileName="claude-3-haiku-profile",
    modelSource={
        "copyFrom": "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-haiku-20240307-v1:0"
    },
    tags=[{"key": "bedrock-inference-profile", "value": "app-1"}],
)
```

アプリケーション推論プロファイルを作成すると、一意なARNが発行されます。

```text:アプリケーション推論プロファイルの例
arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/jf2sje1c0jnb
```


### アプリケーション推論プロファイルの推論プロファイル一覧を取得

アプリケーション推論プロファイルは、クロスリージョン推論の推論プロファイルと同様ListInferenceProfiles APIを使用して取得します。取得結果をアプリケーション推論プロファイルのみにフィルターするため、「--type-equals APPLICATION」を指定します。

```shell:CloudShell
aws bedrock list-inference-profiles --type-equals APPLICATION | \
  jq -r '.inferenceProfileSummaries[] | [
    .inferenceProfileName,
    .inferenceProfileId,
    .inferenceProfileArn,
    .status
  ] | @tsv' | column -t -s $'\t'
```

### 呼び出し例

modelIdにアプリケーション推論プロファイルARNを指定します。

```python:Converse API
import boto3

client = boto3.client("bedrock-runtime")

client.converse(
    modelId="arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/jf2sje1c0jnb",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "text": "Hello, how are you?",
                }
            ],
        }
    ],
)
```

## プロンプト（Prompt）

プロンプト管理（Prompt Management）機能は2024/11/7にGAしました。

https://aws.amazon.com/jp/blogs/machine-learning/amazon-bedrock-prompt-management-is-now-available-in-ga/

こちらの投稿で検証していますので参照ください。

https://qiita.com/moritalous/items/0c5f4a2f0a6980e1968e

プロンプト管理にてプロンプトを作成すると、ARNが発行されますので、API呼び出しのmodelIdとして指定します。

### 呼び出し例

```python
import boto3

client = boto3.client("bedrock-runtime")

client.converse(
    modelId=prompt1_arn,
    promptVariables={"language": {"text": "英語"}, "message": {"text": "こんにちは"}},
)
```

## プロビジョンドスループット（Provisioned Throughput）

ベースモデルで提供されるスループット以上のスループットが必要な場合、プロビジョンドスループットを購入することで、安定したパフォーマンスでBedrockを利用できるようになります。

:::note warn
個人で簡単に試せる金額ではないので注意しましょうw

58,400ドル/月 = 8,760,000円/月 (1.00ドル = 150円の場合）

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/f4f354e2-ad9c-4c4f-30b7-641383a29b2c.png)

:::

## カスタムモデル（Custom model）

カスタムモデルは、ベースモデルをもとに、独自のデータセットを使った追加学習を行う機能です。
カスタムモデルを使用する際、プロビジョンドスループットを購入する必要があります。

カスタムモデルの詳細は公式ブログを参考にしてください。

https://aws.amazon.com/jp/blogs/news/customize-models-in-amazon-bedrock-with-your-own-data-using-fine-tuning-and-continued-pre-training/

## インポートしたモデル（Imported model）

インポートしたモデルは、Bedrock「以外」で構築したモデルを取り込んでBedrockで使用する機能です。
インポートしたモデルはカスタムモデルと異なり、プロビジョンドスループットを購入する必要はありません。

すでに検証記事がありますので、詳細はこれらを参考にしてください。

https://qiita.com/ren8k/items/97022fa42dde9c8e8fd8

https://qiita.com/minorun365/items/eadb4e818f71a802f0e7

https://qiita.com/moritalous/items/8f13acd98b3a303100bd


## まとめ

| 種別 | 概要 | 指定方法 |
| --- | --- | --- |
| ベースモデル（Base model） | ベースとなるモデル | モデルID もしくは ARN |
| クロスリージョン推論（Cross region (system-defined) inference profile ）| 複数のAWSリージョンにまたがって推論するモデル | 推論プロファイルID もしくは ARN |
| アプリケーション推論プロファイル（Application inference profile） | コストとモデルの使用状況を追跡するために作成するモデル | ARN |
| プロンプト（Prompt） | Prompt managementで作成したプロンプト | ARN |
| カスタムモデル（Custom model） | Bedrockでカスタマイズしたモデル | プロビジョンドスループットのARN（？） |
| インポートしたモデル（Imported model） | Bedrock外でカスタマイズし、Bedrockにインポートしたモデル | ARN |
| プロビジョンドスループット（Provisioned Throughput） | スループットを固定コストで購入するモデル | ARN |