こんにちは!引き続きIE課にて修行中の荒井です。
今回は最近話題の Amazon Bedrock(Stable Diffusion) の workshop を触ってきたので、そちらについて書こうと思います。
手順通りにやるとエラーが出たり上手くいかない点があったので、そちらの備忘録でもあります。
はじめに
今回の workshop は Amazon が公式に公開しているものを利用しています。
workshop は日々更新されているため、将来的には違った内容になっている可能性があります。
前提
この記事で取り扱うこと
- Bedrock(Stable Diffusion) の Text to Image のワークショップ
この記事で取り扱わないこと
- Bedrock(Stable Diffusion) の Image to Image のワークショップ
- Bedrock(Stable Diffusion) 以外のワークショップ
- awscli の初期設定
以下の記事にて awscli の設定方法について紹介しておりますので、必要に応じてご参照ください。
環境
OS: windows11 + Ubuntu 22.04
Python: 3.11.6
事前準備
まずはローカルの環境で公式のリポジトリのクローンを行います。
git clone https://github.com/aws-samples/amazon-bedrock-workshop
次に AWS コンソールを開き、リージョンをバージニア北部に変更します。
Amazon Bedrockのページを開き、左メニューから Model access を選択し、[Manage model access] をクリックします。
今回利用したいモデルは Stable Diffusion XL なので、チェックを入れて [Request model access] をクリックします。

早ければ直ぐにでも状態が Access granted に変更になり、利用可能な状態となります。
最後に以下のポリシーを作成し、今回利用するユーザに割り当てます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BedrockFullAccess",
"Effect": "Allow",
"Action": [
"bedrock:*"
],
"Resource": "*"
}
]
}
その後、ユーザの認証情報を awscli に設定すれば準備は完了です。
パッケージのインストール
以下のコマンドを実行し、必要なパッケージをインストールします。
%pip install --no-build-isolation --force-reinstall \
"boto3>=1.28.57" \
"awscli>=1.29.57" \
"botocore>=1.31.57"
今回は画像生成の手順を行うため、追加で pillow もインストールします。
%pip install --quiet "pillow>=9.5,<10"
画像生成
サンプルコードを繋げて保存し、実行してみます。
# Python Built-Ins:
import base64
import io
import json
import os
import sys
import random
# External Dependencies:
import boto3
from PIL import Image
module_path = ".."
sys.path.append(os.path.abspath(module_path))
from utils import bedrock, print_ww
# ---- ⚠️ Un-comment and edit the below lines as needed for your AWS setup ⚠️ ----
os.environ["AWS_DEFAULT_REGION"] = "us-east-1"
os.environ["AWS_PROFILE"] = "default" # ここは設定したプロファイル名を指定
boto3_bedrock = bedrock.get_bedrock_client(
assumed_role=os.environ.get("BEDROCK_ASSUME_ROLE", None),
region=os.environ.get("AWS_DEFAULT_REGION", None),
runtime=False
)
prompt = "a beautiful mountain landscape"
negative_prompts = [
"poorly rendered",
"poor background details",
"poorly drawn mountains",
"disfigured mountain features",
]
style_preset = "photographic" # (e.g. photographic, digital-art, cinematic, ...)
clip_guidance_preset = "FAST_GREEN" # (e.g. FAST_BLUE FAST_GREEN NONE SIMPLE SLOW SLOWER SLOWEST)
sampler = "K_DPMPP_2S_ANCESTRAL" # (e.g. DDIM, DDPM, K_DPMPP_SDE, K_DPMPP_2M, K_DPMPP_2S_ANCESTRAL, K_DPM_2, K_DPM_2_ANCESTRAL, K_EULER, K_EULER_ANCESTRAL, K_HEUN, K_LMS)
width = 768
request = json.dumps({
"text_prompts": (
[{"text": prompt, "weight": 1.0}]
+ [{"text": negprompt, "weight": -1.0} for negprompt in negative_prompts]
),
"cfg_scale": 5,
"seed": 452345,
"steps": 60,
"style_preset": style_preset,
"clip_guidance_preset": clip_guidance_preset,
"sampler": sampler,
"width": width,
})
modelId = "stability.stable-diffusion-xl"
response = boto3_bedrock.invoke_model(body=request, modelId=modelId)
response_body = json.loads(response.get("body").read())
print(response_body["result"])
base_64_img_str = response_body["artifacts"][0].get("base64")
print(f"{base_64_img_str[0:80]}...")
os.makedirs("data", exist_ok=True)
image_1 = Image.open(io.BytesIO(base64.decodebytes(bytes(base_64_img_str, "utf-8"))))
image_1.save("./data/image_1.png") # ここだけちょっとだけ変更
image_1
しかし以下の通りエラーが出てしまいました。
どうやら invoke_model という属性が存在しないというエラーのようです。
Create new client
Using region: us-east-1
Using profile: default
boto3 Bedrock client successfully created!
bedrock(https://bedrock.us-east-1.amazonaws.com)
Traceback (most recent call last):
File "/home/arai/venv/python3.11/test2.py", line 55, in <module>
response = boto3_bedrock.invoke_model(body=request, modelId=modelId)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/arai/venv/python3.11/bedrock/lib/python3.11/site-packages/botocore/client.py", line 888, in __getattr__
raise AttributeError(
AttributeError: 'Bedrock' object has no attribute 'invoke_model'
公式の boto3 ドキュメントを見ると、クライアント生成は以下で出来そうなので、 クライアント生成を行っている箇所を修正してみます。
client = boto3.client('bedrock-runtime')
修正箇所
# boto3_bedrock = bedrock.get_bedrock_client(
# assumed_role=os.environ.get("BEDROCK_ASSUME_ROLE", None),
# region=os.environ.get("AWS_DEFAULT_REGION", None),
# runtime=False
# )
boto3_bedrock = boto3.client("bedrock-runtime", region_name="us-east-1")
上記の修正を行い、コードを再度実行すると・・・無事に成功しました!
生成された画像は以下となります。
今回は固定シードで行っているため、モデルの更新等が無ければ同じ画像が生成されるかと思われます。

おわりに
後半はだいぶ駆け足になってしまいましたが、無事に画像を生成することが出来ました。
次回は画像から画像を生成すること(Image to Image)を試してみようと思います。
本記事を最後までお読みくださりありがとうございました。
どなかたのお役に立てれば幸いです。