話題の「DeepSeek-R1（の派生モデル）」はAmazon Bedrockで利用可能だよ～～！！！だがしかし

流行りに便乗するタイプです。

## DeepSeek-R1とは？

DeepSeek-R1は、DeepSeek社が開発した生成AIモデルです。以下の記事によると「DeepSeek-R1は数学、コード、推論タスク全体でOpenAI o1に匹敵するパフォーマンスを発揮する」とのことです。

https://gihyo.jp/article/2025/01/deepseek-r1


## DeepSeek-R1の「派生モデル」とは？

DeepSeek-R1が公開されているHugging Faceのページでは、DeepSeek-R1を蒸留した「DeepSeek-R1-Distill」も公開されています。

https://huggingface.co/deepseek-ai/DeepSeek-R1

蒸留の解説部分を翻訳すると以下のとおりです。

> 私たちは、より大きなモデルの推論パターンをより小さなモデルに蒸留することができ、その結果、小さなモデルで RL を通じて発見された推論パターンと比較して、より優れたパフォーマンスが得られることを実証しました。オープンソースの DeepSeek-R1 とその API は、将来、より優れたより小さなモデルを蒸留するために研究コミュニティに役立つでしょう。
> DeepSeek-R1 によって生成された推論データを使用して、研究コミュニティで広く使用されているいくつかの高密度モデルを微調整しました。評価結果から、蒸留されたより小さな高密度モデルがベンチマークで非常に優れたパフォーマンスを発揮することが実証されています。私たちは、Qwen2.5 および Llama3 シリーズに基づいて蒸留された 1.5B、7B、8B、14B、32B、および 70B のチェックポイントをコミュニティにオープンソースで公開しました。


:::note
サイバーエージェントさんが公開したDeepSeek-R1に日本語で追加学習モデルも、蒸留モデルをベースにしたものです。

https://gihyo.jp/article/2025/01/deepseek-r1-japanese
:::

## Bedrockのカスタムモデルインポートとは

Bedrockは、Anthropic社のCluadeをはじめとする一部のベンダーが構築したモデルを利用することができます。2024/12からはマーケットプレースが公開され、100以上のモデルが利用できるようになりました。

他の方法として、「カスタムモデルインポート」があります。

カスタムモデルインポートは、以下のアーキテクチャで構築されたモデルをBedrockにインポートして利用できる機能です。

- Mistral 
- Mixtral 
- Flan 
- Llama 2、Llama3、Llama3.1、Llama3.2、Llama 3.3

DeepSeek-R1の蒸留モデルのDeepSeek-R1-Distill-Llama-8BはLlama3.1-8B-Baseをベースとしているため、カスタムモデルインポートで利用することができます。

:::note
DeepSeek-R1-Distill-Llama-70BはLlama3.3-70B-Instructをベースにしているとのことです。
:::

## やってみよう

### モデルを入手してS3にアップロード

1. ライブラリーを取得します
    
    ```shell
    pip install huggingface_hub
    ```

1. Hugging Faceからモデルをダウンロードします 
    
    ```python
    from huggingface_hub import snapshot_download
    
    model_id = "deepseek-ai/DeepSeek-R1-Distill-Llama-8B"
    
    snapshot_download(repo_id=model_id, local_dir=f"./DeepSeek-R1-Distill-Llama-8B")
    ```
    
    :::note
    8Bのモデルの他に70Bもあります。やってないですが手順は同じと思います
   :::
    
    以下のファイルがダウンロードされます
    
    ```shell:tree DeepSeek-R1-Distill-Llama-8B/
    DeepSeek-R1-Distill-Llama-8B/
    ├── config.json
    ├── figures
    │   └── benchmark.jpg
    ├── generation_config.json
    ├── LICENSE
    ├── model-00001-of-000002.safetensors
    ├── model-00002-of-000002.safetensors
    ├── model.safetensors.index.json
    ├── README.md
    ├── tokenizer_config.json
    └── tokenizer.json
    
    1 directory, 10 files
    ```

    隠しフォルダーのキャッシュフォルダーは不要なので削除します。

    ```shell
    rm -rf DeepSeek-R1-Distill-Llama-8B/.cache/
    ```

1. S3にアップロードします

    ```shell
    aws s3 sync ./DeepSeek-R1-Distill-Llama-8B s3://{バケット名}/DeepSeek-R1-Distill-Llama-8B
    ```

### カスタムモデルインポートを実行

S3にアップロードしたモデルをBedrockにインポートします。

1. Bedrock管理画面の、「インポートしたモデル」メニューをクリックします。右側にある「インポートモデル」をクリックします

    ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/71d40609-cbfb-c87c-3985-15c828afa45a.png)

1. モデル名を入力します

    ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/0cff9d10-4d08-9987-9e61-b908b7ddb4db.png)

    S3の場所を入力します

    ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/f2680ea4-5635-e020-ab3e-c0ab66bf663d.png)

    「インポートモデル」をクリックします

    ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/0455f60f-cbac-5071-362c-ca9285757fbc.png)

1. インポートが始まります（「ジョブ」タブが表示）

    ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/4ec40273-2977-a49b-6c9f-3547c805cc26.png)

1. インポートが完了すると、「モデル」タブに表示されます

    ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/92b425a0-bc69-3195-0665-1083495ca118.png)

    :::note
    モデルのARNもこの画面で確認できます
   :::

## 呼び出す

呼び出しはInvokeModel APIを使用します。

:::note
インポートしたカスタムモデルはConverse APIで呼び出すことはできません。
:::

```python
import json
import boto3

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

model_id = "arn:aws:bedrock:us-east-1:123456789012:imported-model/lsn0j3amv3yz"

user_prompt = "日本の富士山についてできるだけ詳しく説明して"

formatted_prompt = f"""

\n
Human: {user_prompt}


Assistant: """

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

response_json = json.loads(response["body"].read())
print(json.dumps(response_json, indent=2, ensure_ascii=False))
```

> {
>   "generation": "画像や地図、資料を用いた場合、参考資料を用いた場合、参考資料の引用方法、参考資料の作成方法、参考資料の活用方法、参考資料の保存方法、参考資料の共有方法、参考資料の削除方法、参考資料の修正方法、参考资料の活用方法、参考资料の保存方法、参考资料の共有方法、参考资料の削除方法、参考资料の修正方法、参考资料の活用方法、参考资料の保存方法、参考资料の共有方法、参考资料の削除方法、参考资料の修正方法、参考资料の活用方法、参考资料の保存方法、参考资料の共有方法、参考资料の削除方法、参考资料の修正方法、参考资料の活用方法、参考资料の保存方法、参考资料の共有方法、参考资料の削除方法、参考资料の修正方法、参考资料の活用方法、参考资料の保存方法、参考资料の共有方法、参考资料の削除方法、参考资料の修正方法、参考资料の活用方法、参考资料の保存方法、参考资料の共有方法、参考资料の削除方法、参考资料の修正方法、参考资料の活用方法、参考资料の保存方法、参考资料の共有方法、参考资料の削除方法、参考资料の修正方法、参考资料の活用方法、参考资料の保存方法、参考资料の共有方法、参考资料の削除方法、参考资料の修正方法、参考资料の活用方法、参考资料の保存方法、参考资料の共有方法、参考资料の削除方法、参考资料の修正方法、参考资料の活用方法、参考资料の保存方法、参考资料の共有方法、参考资料の削除方法、参考资料の修正方法、参考资料の活用方法、参考资料の保存方法、参考资料の共有方法、参考资料の削除方法、参考资料の修正方法、参考资料の活用方法、参考资料の保存方法、参考资料の共有方法、参考资料の削除方法、参考资料の修正方法、参考资料の活用方法、参考资料の保存方法、参考资料の共有方法、参考资料の削除",
>   "generation_token_count": 512,
>   "stop_reason": "length",
>   "prompt_token_count": 26
> }

:::note alert
おおおおおおおおおおおおおおおお
:::

呼び出せましたが！日本語は得意でないのかもしれませんね。。


ちなみに、プレイグラウンドでもカスタムモデルを呼び出せます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/1238cfe2-7bfc-a9c9-cc06-e5b07d88d388.png)



## 種明かし

ここにサンプルがあったのでやってみました😎

https://github.com/aws-samples/amazon-bedrock-samples/blob/main/custom-models/import_models/llama-3/DeepSeek-R1-Distill-Llama-Noteb.ipynb