GAしたBedrockのカスタムモデルインポートを検証！とっても簡単に日本語特化LLMモデルをBedrock化できる！！！

BedrockのカスタムモデルインポートがGAしました🎉🎉🎉

https://aws.amazon.com/jp/blogs/machine-learning/amazon-bedrock-custom-model-import-now-generally-available/

プレビュー期間中に試せなかったので、遅ればせながら試してみました。

## モデルを選定

カスタムモデルインポートに対応しているのは以下のアーキテクチャのモデルです。

* Mistral
* Mixtral
* Flan
* Llama 2, Llama3, Llama3.1, and Llama3.2

Llama 3.2は出たばかりなのに対応ってのはすごいですね。

今回は、以下のモデルを試しました。

https://huggingface.co/tokyotech-llm/Llama-3.1-Swallow-8B-Instruct-v0.1

## 手順

### モデルをS3に配置する

正直、ここが一番めんどくさい。

EC2やSageMaker StudioなどでAWS CLIが使えて、ストレージが十分ある環境を用意して実行してください。

:::note warn
CloudShellはストレージ不足で動作しませんでした
:::

```shell:Shell
BUCKET_NAME=xxxxxxxxxx

python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade huggingface_hub

huggingface-cli download tokyotech-llm/Llama-3.1-Swallow-8B-Instruct-v0.1 --local-dir ./model

aws s3 cp --recursive \
  --exclude ./.cache \
 ./model s3://${BUCKET_NAME}/model
```

ここまでできたら、もう、終わったも同然です。

### インポートジョブを作成する

1. Bedrock管理画面にアクセス
    「基盤モデル」の「インポートしたモデル」を選択します
    
    ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/fc0bc896-5a2a-55de-1b81-84fe23414a88.png)

1. 「ジョブ」タブを選択し、「インポートモデル」ボタンをクリックします
    ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/1151b655-2246-dd47-0d63-62a9a62fe04f.png)

1. モデルの詳細セクションの「モデル名」、モデルインポート設定セクションの「S3の場所」を入力します
        
    ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/3339a149-7ec3-c148-feb7-c86c75cb9885.png)

:::note warn
何故かIAMロールの作成に失敗したとしてエラーになります。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/e90abc59-8c00-9477-d117-7d94149e1de6.png)

実際にはIAMロールはうまく作成されていますので、一度エラーを発生させ、作成したIAMロールを選択すると良いと思います。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/644fe195-5fe6-efa8-d3a6-927063f6f259.png)

そのうち修正されると思います

:::


しばらく時間がかかりますが、ジョブが完了するまで待ちます。待つのみです。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/6efff346-ff09-bf23-ca45-213a097ac850.png)


## プレイグラウンドで試す

インポートしたモデルを選べるようになります。

![us-east-1.console.aws.amazon.com_bedrock_home_region=us-east-1 (34).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/b5ad75b9-fb18-b1b5-0524-c3261d0861eb.png)

インポート直後だからかエラーになりますが、時間を置くと成功します。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/aab0c782-18bf-d23e-0475-5f92c5687b94.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/57b4c46d-860f-d0c5-f506-a8f9cb44c8e9.png)


## Boto3で試す

### InvokeModel

```python
import json

import boto3

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

model_id = "arn:aws:bedrock:us-east-1:999999999999:imported-model/d8k3k4pt5dt0"

prompt = "こんにちは！日本の四季について教えて下さい！"

response = client.invoke_model(
    modelId=model_id,
    body=json.dumps(
        {
            "prompt": prompt,
        }
    ),
)

response_body = json.loads(response["body"].read().decode("utf-8"))
print(response_body)
```

```
{'generation': '日本の四季は、春、夏、秋、冬の4つの季節があります。春は3月から5月までで、桜の花が咲きます。夏は6月から8月までで、暑い日が続きます。秋は9月から11月までで、紅葉が美しいです。冬は12月から2月までで、雪が降ります。日本の四季はそれぞれに美しい景色があります。春は桜の花が咲き、夏は海や山で遊ぶことができます。秋は紅葉が美しく、冬は雪が降ります。日本の四季は、自然の美しさを感じることができます。日本の四季は、文化や伝統にも深く関係しています。例えば、春は新しい始まりの季節として、夏は祭りや花火の季節として、秋は収穫の季節として、冬は静寂の季節として、それぞれに文化や伝統があります。日本の四季は、自然の美しさと文化や伝統の深さを感じることができます。日本の四季は、世界中の人々に愛されています。日本の四季は、自然の美しさと文化や伝統の深さを感じることができるため、世界中の人々に愛されています。日本の四季は、自然の美しさと文化や伝統の深さを感じることができるため、世界中の人々に愛されています。日本の四季は、自然の美しさと文化や伝統の深さを感じることができるため、世界中の人々に愛されています。日本の四季は、自然の美しさと文化や伝統の深さを感じることができるため、世界中の人々に愛されています。日本の四季は、自然の美しさと文化や伝統の深さを感じることができるため、世界中の人々に愛されています。日本の四季は、自然の美しさと文化や伝統の深さを感じることができるため、世界中の人々に愛されています。日本の四季は、自然の美しさと文化や伝統の深さを感じることができるため、世界中', 'generation_token_count': 512, 'stop_reason': 'length', 'prompt_token_count': 13}
```

### Converse

```python
import boto3

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

model_id = "arn:aws:bedrock:us-east-1:999999999999:imported-model/d8k3k4pt5dt0"

prompt = "こんにちは！日本の四季について教えて下さい！"

response = client.converse(
    modelId=model_id,
    messages=[
        {
            "role": "user",
            "content": [{"text": prompt}],
        }
    ],
)

print(response)

```

```
{'ResponseMetadata': {'RequestId': '89520a7a-d741-47f9-8284-366e36d7f48d', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Wed, 23 Oct 2024 14:50:14 GMT', 'content-type': 'application/json', 'content-length': '787', 'connection': 'keep-alive', 'x-amzn-requestid': '89520a7a-d741-47f9-8284-366e36d7f48d'}, 'RetryAttempts': 0}, 'output': {'message': {'role': 'assistant', 'content': [{'text': '\n日本の四季は、春、夏、秋、冬の4つの季節があります。\n\n春は、3月から5月までで、桜の花が咲きます。気温が暖かくなり、自然が目覚めます。\n\n夏は、6月から8月までで、暑い季節です。海や山で遊ぶのに最適です。\n\n秋は、9月から11月までで、紅葉が美しい季節です。気温が涼しくなり、食欲が増します。\n\n冬は、12月から2月までで、寒い季節です。雪が降り、温泉に入るのに最適です。\n\nこれが日本の四季です。どれが一番好きですか？'}]}}, 'stopReason': 'end_turn', 'usage': {'inputTokens': 27, 'outputTokens': 169, 'totalTokens': 196}, 'metrics': {'latencyMs': 2725}}
```

## 料金

モデルごとに違うようですが、Llamaの場合は以下の通りです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/00b16b94-841d-a27a-d43d-10c309f59e53.png)

最新情報は公式サイトを確認ください。

https://aws.amazon.com/bedrock/pricing/?nc1=h_ls

## まとめ

めっちゃ簡単でした。
日本語特化LLM、もっとプリーズ！