Amazon Bedrock で Amazon Bedrock の画像を生成

2023年12月20日 水曜日


【この記事を書いた人】
yuhei-otsuka

他社クラウド(AWS)のソリューションアーキテクトをやっています。2023 Japan AWS All Certifications Engineer。趣味は登山。

「Amazon Bedrock で Amazon Bedrock の画像を生成」のイメージ

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 を追加します。

Manage model access

Amazon Bedrock で SDXL のアクセスを追加する様子。本稿執筆時点(2023/11/01)では SDXL は Preview であることがわかる。

 

このとき、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 関連で小ネタを投稿させていただければと思います。

それではみなさま、良いクリスマスをお迎えください。

IIJ Engineers blog読者プレゼントキャンペーン

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

yuhei-otsuka

2023年12月20日 水曜日

他社クラウド(AWS)のソリューションアーキテクトをやっています。2023 Japan AWS All Certifications Engineer。趣味は登山。

Related
関連記事