Amazon Bedrock で Amazon Bedrock の画像を生成
2023年12月20日 水曜日
CONTENTS
【IIJ 2023 TECHアドベントカレンダー 12/20の記事です】
こんにちは。 IIJ で AWS のソリューションを担当している yuhei-otsuka です。
さて、この IIJ Engineers Blog では記事執筆の際、読者の目を引く目的でアイキャッチ画像を設定することになっています。そこで 9月に一般提供となった Amazon Bedrock を使って、テキストからアイキャッチ画像を生成してみようと思います。(自然な導入)
Amazon Bedrock とは
Amazon Bedrock とはいわゆる生成系AIのサービスで、AI21 Labs、Anthropic、Cohere、Meta、Stability AI、Amazon などの大手 AI 企業が提供する高性能な基盤モデル (FM) を選択できるフルマネージド型サービスです。
今回はテキストから画像を生成するタスクを行うため Stability AI の Stable Diffusion XL モデルを選択します。
Stable Diffusion XL モデルのアクセス追加
AWS アカウントで Amazon Bedrock を使用を開始するには、対象のモデルへのアクセスを追加する必要があります。
AWS マネジメントコンソールでオレゴン(us-west-2)リージョンの Amazon Bedrock の画面に移動し、Model access メニューから Stable Diffusion XL を追加します。
このとき、AWS Marketplace の画面を見ていただくと Stable Diffusion XL がサブスクリプション(購読)されていることを確認することができます。

管理者によって Amazon Bedrock の Stable Diffusion XL モデルへのアクセスが追加されたことにより、この AWS アカウントの他のユーザも Stable Diffusion XL モデルが使用可能になりました。
モデル操作の概念図
今回の構成はいたってシンプルで、InvokeModel API で推論を実行します。

Go 言語で画像生成
build-on-aws / amazon-bedrock-go-sdk-examples を参考に Go 言語で推論コードを書きます。
package main
import (
"context"
"encoding/base64"
"encoding/json"
"log"
"os"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/bedrockruntime"
)
func main() {
// Amazon Bedrock の写真風画像を生成したい。
prompt := "A photograph of the Amazon bedorock."
payload := Request{
TextPrompts: []TextPrompt{{Text: prompt}},
CfgScale: 10,
Seed: 7,
Steps: 50,
}
payloadBytes, err := json.Marshal(payload)
if err != nil {
log.Fatal(err)
}
cfg, err := config.LoadDefaultConfig(context.Background(),
config.WithRegion("us-west-2"),
)
if err != nil {
log.Fatal(err)
}
// https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/bedrockruntime
client := bedrockruntime.NewFromConfig(cfg)
// https://docs.aws.amazon.com/ja_jp/bedrock/latest/APIReference/API_runtime_InvokeModel.html
output, err := client.InvokeModel(context.Background(), &bedrockruntime.InvokeModelInput{
Body: payloadBytes,
ModelId: aws.String("stability.stable-diffusion-xl-v0"),
Accept: aws.String("application/json"),
ContentType: aws.String("application/json"),
})
var resp Response
err = json.Unmarshal(output.Body, &resp)
if err != nil {
log.Fatal("failed to unmarshal", err)
}
decoded, err := resp.Artifacts[0].DecodeImage()
file, _ := os.Create("image.png")
defer file.Close()
file.Write(decoded)
}
type Request struct {
TextPrompts []TextPrompt `json:"text_prompts"`
CfgScale float64 `json:"cfg_scale"`
Steps int `json:"steps"`
Seed int `json:"seed"`
}
type TextPrompt struct {
Text string `json:"text"`
}
type Response struct {
Result string `json:"result"`
Artifacts []Artifact `json:"artifacts"`
}
type Artifact struct {
Base64 string `json:"base64"`
FinishReason string `json:"finishReason"`
}
func (a *Artifact) DecodeImage() ([]byte, error) {
decoded, err := base64.StdEncoding.DecodeString(a.Base64)
if err != nil {
return nil, err
}
return decoded, nil
}
このコードを実行して「 Amazon Bedrock で生成した Amazon Bedrock の画像 (哲学)」を、この記事冒頭のアイキャッチ画像として使用しています。
Bedrock (岩盤) 要素は薄いですね。
まとめ
Amazon Bedrock の Stable Diffusion XL モデルを用いて、テキストから画像を生成しました。
IIJ Engineer Blog 用のアイキャッチ画像が簡単に用意できるようになりましたので、今後も AWS 関連で小ネタを投稿させていただければと思います。
それではみなさま、良いクリスマスをお迎えください。

Xのフォロー&条件付きツイートで、「IoT米」と「バリーくんシール」のセットを抽選でプレゼント!
応募期間は2023/12/01~2023/12/31まで。詳細はこちらをご覧ください。
今すぐポストするならこちら→
フォローもお忘れなく!
