自分の好きなLLMをAmazon Bedrockにインポートして動かしてみよう!


本記事は 夏休みクラウド自由研究2026 8/21付の記事です

こんにちは、ひるたんぬです。
私はあくびをしている人を視認した場合、9割くらいの確率であくびがうつります。
では、なぜあくびがうつるのでしょうか?

現時点で得られる研究をまとめると、あくびの役割は「天敵から身を守るため」、そしてあくびが伝染する理由は、「周囲へ危険性を知らせるため」という本能が残っているからかもしれません。
すなわち、太古の昔から哺乳類に脈々と受け継がれてきた、必然的な反射なのです。
引用:Yahoo! ニュース「人があくびをする理由 なぜ伝染するのか? 呼吸器内科医が解説」

他にも調べてみましたが、明確な理由・メカニズムというものは分かっていないようです。
また、あくびの行為を目撃する以外にも「あくび」という文字や音を見聞きしただけであくびが出てしまうこともあるようで…
この部分を書いていた私も何回かあくびをしていた気がします。皆様はいかがでしょうか?

さて、今回は「夏休みクラウド自由研究」ということで、気になっていたけど中々触れられていなかったことをやってみようと思います。

やってみたいこと

Amazon Bedrockでは、Anthoropic ClaudeやAmazon Noveなど多数のモデルが用意されており、それらの中から適切なモデルを選定し利用されることが多いかなと思います。

一方、特定のドメインに適応させたい場合などは、基盤モデルをチューニングすることがあります。
本記事ではこのようなケースを想定し、Amazon Bedrock Custom Model Import 機能を用いてカスタムされたモデルをインポートし、実際にBedrock上で動作するところまで検証したいと思います。

モデルのインポート要件

Bedrockにインポートするには、そのモデルが要件に沿っている必要があります。
要件の詳細の紹介は割愛いたします。AWSのドキュメントをご参照ください。

利用料金

インポートしたモデルについては「カスタムモデルユニット」という単位で課金金額が決定されます。
これはモデルアーキテクチャ、モデルパラメータ数、コンテキストの長さなど、さまざまな要因によって設定されます。
実際のカスタムモデルユニット数は、モデルインポート時に分かるため、それを元に料金の算出が可能です。

以下はバージニア北部リージョン及びオレゴンリージョンにてLlamaベースのモデルをインポートした場合の料金です。

カスタムモデルユニットのバージョン v1.0
カスタムモデルユニットあたりの料金/分* 0.05718 USD
カスタムモデルユニットあたりのストレージコスト/月 1.95 USD
最新の料金や他モデル・リージョンでの料金は、以下をご参照ください。

この料金体系より、カスタムモデルインポートはトークンベースの課金体系ではないことが分かります。カスタムモデルユニット数(≒ モデル規模)に応じたサーバ・ストレージが用意され、サーバについては従量課金というイメージですかね。

モデル選定

今回は日本語応答に特化したモデルを選定しようと思います。
国立情報学研究所 大規模言語モデル研究開発センター (LLM研究開発センター)が主宰するLLMに関するコミュニティである、「LLM-jp」が公開する日本語に関するLLMのリーダーボードを参考にモデルを選定してみます。

▼ 国立情報学研究所 大規模言語モデル研究開発センター (LLM研究開発センター)

▼ LLM-jp

リーダーボード

今回は「Open Japanese LLM Leaderboard V2」を参考にしました。このリーダーボードでは、14のカテゴリに渡る71種類以上のタスクでLLMの性能を評価しています。

本リーダーボードのカテゴリ及びタスクは、こちらにまとめられています。
例えば「QA(Question Answering – 質問応答)」というカテゴリでは、クイズを題材としたデータセット(JAQKET (AIO))や日本の文化や風習に関するデータセット(JamC-QA)などを用いて質問応答の性能を測定しています。

今回はこの中から、「CR – コモンセンス推論」というカテゴリの中のJCommonSenseQAで、最もスコアの高い「Llama-3.3-Swallow-70B-Instruct-v0.4」というモデルを使用します。
本モデルは東京科学大学と国立研究開発法人産業技術総合研究所によって開発されたLlama 3.3ベースのモデルです。
モデルの構築方法などにつきましては下記サイトをご参照ください。

なお、JCommonSenseQAはYahoo! JAPAN研究所が提供する「日本語言語理解ベンチマークJGLUE(Japanese General Language Understanding Evaluation)」の一部を指します。

SQuADとはまた別のタイプの質問応答のデータセットとしてCommonsenseQA[文献9]があります。CommonsenseQAは常識推論能力を評価するための5択の選択式問題です。JCommonsenseQAはCommonsenseQAの日本語版で、コアとなる選択肢を知識ベースであるConceptNetの日本語部分から抽出し、質問と誤り選択肢をクラウドソーシングで作成しました。
引用:Yahoo! JAPAN Tech Blog「日本語言語理解ベンチマークJGLUEの構築 〜 自然言語処理モデルの評価用データセットを公開しました」

このベンチマークの詳細は以下サイトをご参照ください。

対応確認

大前提として、利用するモデルのライセンスが問題ないかを確認します。
今回のモデルは「Llama 3.3」ライセンスを採用しており、今回の検証の範囲では問題ないことが分かりました。

次にBedrockへインポートできるかの確認です。こちらは手動で上記の「インポート要件」に沿って確認してもよいのですが、今回はKiroにお願いしてみました。その結果が下表です。

チェック項目 要件 モデルの状態 判定
アーキテクチャ サポート対象 LlamaForCausalLM (model_type: “llama”) – Llama 3.3 ✅ 問題なし
重みサイズ テキストモデルは200GB未満 約141GB (30ファイル) ✅ 問題なし
重み形式 Safetensors形式 .safetensors 30ファイル ✅ 問題なし
コンテキスト長 128K未満 max_position_embeddings: 131,072 (= 128K) ⚠️ 影響軽微
vocab_size 標準的な範囲 128,256 (Llama 3.3標準) ✅ 問題なし
config.json 必須 あり ✅ 問題なし
tokenizer_config.json 必須 あり ✅ 問題なし
tokenizer.json 必須 あり ✅ 問題なし
tokenizer.model 必須 なし(Llama3系はtokenizer.jsonで動作) ⚠️ 要確認
トークナイザークラス サポート対象 PreTrainedTokenizerFast ✅ 問題なし
auto_map なし推奨 なし ✅ 問題なし
rope_scaling 互換性 null(独自拡張なし) ✅ 問題なし
transformersバージョン 4.51.3サポート 4.47.1 ⚠️ 影響軽微

モデルインポート

まずは上記で「⚠️ 要確認」となっている事項を見ていきます。

tokenizer.model

そもそも「トークナイザー」とは何か、というところから分からなかったので、調べてみます。
誤解を恐れずに一言で言い表すと「文章をトークンに分解するためのもの」ということのようです。
そして、この「トークナイザー」には「tokenizer.model」と「tokenizer.json」の2つの形式が主に存在するようでした。前者は、Googleによって開発された形式でコンパイルされたファイルであるためファイルサイズが比較的小さいことが特徴です。一方、後者はHugging Faceによって開発されたもので、JSON形式であるため編集可能であることが特徴です。
最近のモデルでは、編集可能である(≒ 高い透明性)から、tokenizer.jsonを使用することが多いようです。

役割などやそれぞれの形式の正確な違いについては、調査いただくことを推奨いたします。

これを見た私は、「同じようなものなのであれば、tokenizer.jsonがあるし、tokenizer.modelいらないんじゃない…?」などと勝手に想像しました。また、他の方の検証記事などを拝見する限り、そのままでもモデルインポートできそうであることを確認できた、というのも判断材料としてあります。

▼ 他の方がインポートされていたモデルの一例(tokenizer.model がない)

なので、まずはそのままモデルインポートを試してみようと思います。

モデルインポート実施

まずはHugging Faceからモデルを入手します。今回はローカル端末にモデルダウンロード→S3にコピーという手順を踏みます。

CloudShellでMountpoint for Amazon S3を使えば直接S3にファイルを転送できるのでは…?などと思いましたが、その願いは叶わず…
Mountpoint for Amazon S3の仕様に因るもののようで、当該Githubのissueにも同様の記載がありました。

モデルダウンロード(通常の手順)

当該モデルのページから、「…」→「Clone repository」を選択します。

するとコマンドが出てきますので、それを参考にモデルを取得します。
なお、今回は以下のコマンドでした。

git clone https://huggingface.co/tokyotech-llm/Llama-3.3-Swallow-70B-Instruct-v0.4
必要に応じて、git-xetのインストールも行ってください。
# Make sure git-xet is installed (https://hf.co/docs/hub/git-xet)
brew install git-xet
git xet install

モデルダウンロード(今回の手順)

通常は上記コマンドでファイルが取得できますが、今回はgit cloneを実行して8時間経っても進展が見られなかったため、Hugging Faceから直接取得するようにアプローチを変えました。

まずは、関連するモジュールをインストールします。仮想環境などを使われている方は適宜読み替えてください。

pip install huggingface_hub hf_transfer

完了しましたら、Hugging Faceにログインし、トークンの認証を行います。

hf auth login

ブラウザを開き、認証コードを入れて認証すれば完了です。

上記ログイン手順は任意ですが、これを実行することでより高速にダウンロードできるようです。
なお、未認証でダウンロードをした場合は、以下のような警告が表示されます。
Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.
最後に各種ファイルをダウンロードします。ファイル指定ができるため、モデルインポートに関連するファイルのみダウンロードします。
hf download tokyotech-llm/Llama-3.3-Swallow-70B-Instruct-v0.4 \
--local-dir /Users/user/llm/Llama-3.3-Swallow-70B-Instruct-v0.4 \ # 各自で適切なディレクトリを設定
--include "config.json" "generation_config.json" "tokenizer_config.json" "tokenizer.json" "model.safetensors.index.json" "model-*.safetensors"

モデルのS3への転送

ローカル端末でのダウンロードが完了したら、続いて格納先のS3バケットを作成します。
今回はバージニア北部リージョンでカスタムモデルインポートを実行するため、同リージョン内でバケットを作成するようにします。

aws s3api create-bucket --bucket bedrock-custom-model-bucket-us-east-1 --region us-east-1 # 各自で適切なバケット名を設定

これが完了したら、バケット内にオブジェクトを移行します。S3 Syncを使う場合は以下のコマンドで同期します。

aws s3 sync /Users/user/llm/Llama-3.3-Swallow-70B-Instruct-v0.4/ \ # 各自で適切なディレクトリを設定
s3://bedrock-custom-model-bucket-us-east-1/Llama-3.3-Swallow-70B-Instruct-v0.4/ \ # 各自で適切なバケット名や宛先を設定
--exclude "*cache*" \
--include "config.json" \
--include "generation_config.json" \
--include "tokenizer_config.json" \
--include "tokenizer.json" \
--include "model.safetensors.index.json" \
--include "model-*.safetensors" \
--region us-east-1
モデルダウンロード時に「.cache」フォルダが作成されているので、それを除くようにしています。

一方、世の中には「s5cmd」というマシンの資源をフル活用することでS3への転送を高速化するツールもあるようです。

途中からこちらを使用してアップロードをしてみました。
上記のS3 Syncコマンドとは異なり、引数としてリージョンの指定ができないのでご注意ください。

AWS_REGION=us-east-1 s5cmd sync \
--include "model-*.safetensors" \
--include "config.json" \
--include "generation_config.json" \
--include "tokenizer_config.json" \
--include "tokenizer.json" \
--include "model.safetensors.index.json" \
--exclude "*cache*" \
/Users/user/llm/Llama-3.3-Swallow-70B-Instruct-v0.4/ \ # 各自で適切なディレクトリを設定
s3://bedrock-custom-model-bucket-us-east-1/Llama-3.3-Swallow-70B-Instruct-v0.4/ # 各自で適切なバケット名や宛先を設定
私の環境ではS3 Sync実行時とそんなに差は見られませんでした。回線がボトルネックになっているような気がします…

同期が完了したら、念のため中身を確認します。

aws s3 ls s3://bedrock-custom-model-bucket-us-east-1/Llama-3.3-Swallow-70B-Instruct-v0.4/ # 各自で適切なバケット名や宛先を設定
2026-08-11 18:34:57 763 config.json
2026-08-11 18:34:57 172 generation_config.json
2026-08-11 18:34:57 4584408808 model-00001-of-00030.safetensors
2026-08-11 18:34:57 4664167376 model-00002-of-00030.safetensors
2026-08-11 18:34:57 4999711704 model-00003-of-00030.safetensors
2026-08-11 18:34:57 4966157032 model-00004-of-00030.safetensors
2026-08-11 18:34:57 4664134408 model-00005-of-00030.safetensors
2026-08-11 18:59:13 4664167408 model-00006-of-00030.safetensors
2026-08-11 18:59:43 4664167408 model-00007-of-00030.safetensors
2026-08-12 19:11:27 4999711728 model-00008-of-00030.safetensors
2026-08-12 19:13:39 4966157056 model-00009-of-00030.safetensors
2026-08-12 19:13:39 4664134408 model-00010-of-00030.safetensors
2026-08-12 19:13:38 4664167408 model-00011-of-00030.safetensors
2026-08-12 19:13:39 4664167408 model-00012-of-00030.safetensors
2026-08-12 19:13:39 4999711728 model-00013-of-00030.safetensors
2026-08-12 19:26:07 4966157056 model-00014-of-00030.safetensors
2026-08-12 19:37:43 4664134408 model-00015-of-00030.safetensors
2026-08-12 20:02:54 4664167408 model-00016-of-00030.safetensors
2026-08-12 20:03:01 4664167408 model-00017-of-00030.safetensors
2026-08-12 20:05:21 4999711728 model-00018-of-00030.safetensors
2026-08-12 20:05:47 4966157056 model-00019-of-00030.safetensors
2026-08-12 20:14:15 4664134408 model-00020-of-00030.safetensors
2026-08-12 20:39:28 4664167408 model-00021-of-00030.safetensors
2026-08-12 20:39:43 4664167408 model-00022-of-00030.safetensors
2026-08-12 20:44:40 4999711728 model-00023-of-00030.safetensors
2026-08-12 20:44:52 4966157056 model-00024-of-00030.safetensors
2026-08-12 20:51:03 4664134408 model-00025-of-00030.safetensors
2026-08-12 21:16:48 4664167408 model-00026-of-00030.safetensors
2026-08-12 21:17:04 4664167408 model-00027-of-00030.safetensors
2026-08-12 21:24:42 4999711728 model-00028-of-00030.safetensors
2026-08-12 21:24:47 4966173536 model-00029-of-00030.safetensors
2026-08-12 19:05:00 2101346432 model-00030-of-00030.safetensors
2026-08-12 19:02:07 59615 model.safetensors.index.json
2026-08-12 19:28:20 17209958 tokenizer.json
2026-08-12 19:02:07 51048 tokenizer_config.json

指定したファイルがすべてS3に転送されていることを確認できました。

モデルインポートの実行

問題がなければモデルインポートを実行します。
Bedrockの「インポートしたモデル」より「インポートモデル」を押下します。

インポートモデル設定では、主にモデル名とインポート元のS3バケットを設定します。
設定が完了したら「インポートモデル」を押下します。

しばらくするとIAMロールが作成され、その後にインポートジョブが開始されます。

今回は22分でインポートが完了しました。

モデルの詳細を確認することで、課金単位であるカスタムモデルユニット数を知ることができます。
今回は8だったので、先述した料金表を8倍することで、利用単価を算出することができます。

動作確認

モデルのプレイグラウンドできちんと応答するか検証してみます。
今回はモデル選定に用いた「JCommonsenseQA」からいくつか問題を出して聞いてみることにします。

初回モデル呼び出し時には以下のようなエラーが出ました。

ModelNotReadyException
Model is not ready for inference. Wait and try your request again. Refer to https://docs.aws.amazon.com/bedrock/latest/userguide/invoke-imported-model.html#handle-model-not-ready-exception.

まだモデルの準備ができていない旨のエラーのため、少し時間をおいてみます。

Q1: 埼玉県三郷市の三郷ジャンクション から、千葉県、茨城県、福島県を経由し宮城県亘理町の亘理インターチェンジ に至る高速道路は?
→ 正解(常磐道)

Q2: 1989年(平成元年)9月27日に開通した神奈川県横浜市にある長さ860m(中央支間長460m)の斜張橋は?
→ 正解(ベイブリッジ)

Q3: 石ノ森章太郎の同名漫画を原作とし、テレビドラマ化され、「姉さん、事件です」が決まり文句の作品はなにか?
→ 不正解(正解はホテル)

数問やってみましたが、一問間違えていますね。。選択肢のホテルが漫画の正式表記では「HOTEL」なので、これで改めて確認してみます。

今度は正答できました。

誤答の解説にある「石ノ森章太郎は『仮面ライダー』の原作者であること」は合っていますね。

 

まとめ

今回はAmazon Bedrockに自分で選定したモデルをインポートし、実際に動作するところまでやってみました。
モデルインポートの要件さえ確認できればインポートの手順自体はシンプルで、インフラの管理をせずにBedrockの基盤で好きなモデルを動かせる点は魅力的に感じられました。

余談ですが、このデータセットに人間(私)が分からない問題がありました。

Q: ショウタ君という名前のビヒィズス菌がいました。あるところに行ったら、名前がショウ君に変わりました。さてそこはどこ?
→ データセット上の正解は「体内」

AIの解説も釈然としませんでした。
この問の意味が分かる方はこっそり教えていただけるととても嬉しいです。

検証が終了したらモデルの削除・S3内のオブジェクトの削除などのクリーンアップを忘れずに行いましょう。
カスタムモデルのストレージコスト・S3の保管コストがかかってしまいます。
×
タイトルとURLをコピーしました