AWSを使用したジェネレーティブAIを使用したサーバーレスイメージ生成アプリケーション

『ジェネレーティブAIとAWSを活用したサーバーレスイメージ生成アプリケーション』

パーソナライズされたコンテンツの作成やユーザーの好みに合わせた画像の作成など、説明に基づいて視覚的なアセットを生成する能力は非常に強力です。ただし、テキストから画像への変換は通常、リソースを消費する機械学習ソリューションの展開を含みます。この能力が API 呼び出しで利用できるなら、開発者にとってプロセスがより簡単でアクセスしやすくなるでしょう。

このチュートリアルでは、AWS CDK を使用して、AWS Lambda と Amazon Bedrock を使ったサーバーレス画像生成アプリケーションのデプロイ方法を解説します。Amazon Bedrock は、API を介して Amazon やサードパーティのモデルプロバイダ(Anthropic、Cohere など)からのベースモデルを提供する完全マネージドサービスです。開発者は単一の API を使用して主要な基盤モデルを活用し、将来的に新しいモデルを採用する柔軟性を保つことができます。

このソリューションは、Amazon S3 にホストされた静的ウェブサイトとして展開され、Amazon CloudFront ドメイン経由でアクセスできます。ユーザーは画像の説明を入力し、それが Lambda 関数(Amazon API Gateway 経由)に渡され、Amazon Bedrock 上の安定した拡散モデルが画像を生成します。

このソリューション全体は Go を使用して構築されています。これには Lambda 関数(aws-lambda-go ライブラリを使用)および AWS CDK を使用した完全なソリューションのデプロイが含まれます。

コードは GitHub で利用できます。

前提条件

このチュートリアルを開始する前に、次のものが必要です:

  • AWS アカウント(まだお持ちでない場合は、ここで作成して環境を設定できます)
  • Go(バージョンv1.19以上)
  • AWS CDK
  • AWS CLI
  • Git
  • Docker

この GitHub リポジトリをクローンし、適切なディレクトリに変更します:

git clone https://github.com/build-on-aws/amazon-bedrock-lambda-image-generation-golangcd amazon-bedrock-lambda-image-generation-golang

AWS CDK を使用してソリューションをデプロイする

デプロイを開始するには、単純に cdk deploy を呼び出します。

cd cdkexport DOCKER_DEFAULT_PLATFORM=linux/amd64cdk deploy

作成されるリソースのリストが表示され、進行するために確認が求められます(出力は簡潔にするために短縮されています)。

Bundling asset BedrockLambdaImgeGenWebsiteStack/bedrock-imagegen-s3/Code/Stage...✨  Synthesis time: 7.84s//.... 省略このデプロイメントは、現在のセキュリティ承認レベルに基づいて潜在的に敏感な変更を行います(--require-approval broadening)。次の変更を行う意図があることを確認してください://.... 省略これらの変更をデプロイしますか (y/n)? y

これにより、アプリケーションに必要な AWS リソースの作成が開始されます。

裏側で使用される AWS CloudFormation テンプレートを確認したい場合は、cdk synth を実行し、cdk.out フォルダを確認してください。

進捗状況をターミナルで確認するか、AWS コンソールに移動してください:CloudFormation > Stacks > BedrockLambdaImgeGenWebsiteStack

すべてのリソースが作成されたら、アプリケーションを試すことができます。次のようなものがあるはずです:

  • 画像生成 Lambda 関数および API Gateway
  • ウェブサイトの HTML ページをホストする S3 バケット
  • CloudFront ディストリビューション
  • IAM ロール、権限、S3 バケットポリシーなどのその他のコンポーネント

CloudFrontディストリビューションの作成は時間のかかるプロセスであるため、デプロイに少し時間がかかる場合があります。完了したら、S3バケット名、API Gateway URL、およびCloudFrontドメイン名の値が確認できるはずです。

HTMLページを更新し、S3バケットにコピーする

GitHubリポジトリのindex.htmlファイルを開き、次のテキストを見つけます:ENTER_API_GATEWAY_URL。これを、上記のCDKデプロイの出力として受け取ったAPI Gateway URLで置き換えてください。

ファイルをS3にコピーするには、以下のAWS CLIを使用しました:

aws s3 cp index.html s3://<CDK出力からのS3バケットの名前>

ファイルがアップロードされたかどうかを確認します:

aws s3 ls s3://<CDK出力からのS3バケットの名前>

これでウェブサイトにアクセスする準備が整いました!

ソリューションの確認

ウェブブラウザにCloudFrontのドメイン名を入力してウェブサイトに移動します。プロンプトとして使用できる事前入力済みの説明が表示されるはずです。

処理を開始するには、画像を生成をクリックします。数秒後に生成された画像が表示されるはずです。

モデルパラメータの変更

Stability Diffusionモデルでは、必要に応じて生成パラメータを調整することができます。

Stability.ai Diffusionモデルは、以下のコントロールをサポートしています:

  • Prompt strength (cfg_scale)は、画像のプロンプトへの忠実度を制御し、低い値ほどランダム性が増します。
  • Generation step (steps)は、結果の正確さを決定し、ステップ数が多いほどより精密な画像が生成されます。
  • Seed (seed)は、初期ノイズレベルを設定し、同じシードと設定を使用して再現可能な結果を得ることができます。

これらを編集するには、構成を表示をクリックします。

cfg_stepsstepsの最大値はそれぞれ30と150です。

クリーンアップを忘れずに

終了後、すべてのサービスを削除するには、次のようにしてください:

cdk destroy#output prompt (choose 'y' to continue)Are you sure you want to delete: ベッドロックLambdaイメージジェンウェブサイトスタック (y/n)?

完全なソリューションのセットアップとお試しを行うことができました。まとめる前に、コードの重要な部分をいくつか見て、裏側で何が行われているかをより良く理解してみましょう。

コードの解説

重要な部分にのみ焦点を当てるため、コードの一部(プリントステートメント、エラーハンドリングなど)は省略されています。

CDK

CDKコードはこちらを参照できます。

最初にAPI GatewayとS3バケットを作成します。

    apigw := awscdkapigatewayv2alpha.NewHttpApi(stack, jsii.String("image-gen-http-api"), nil)    bucket := awss3.NewBucket(stack, jsii.String("website-s3-bucket"), &awss3.BucketProps{        BlockPublicAccess: awss3.BlockPublicAccess_BLOCK_ALL(),        RemovalPolicy:     awscdk.RemovalPolicy_DESTROY,        AutoDeleteObjects: jsii.Bool(true),    })

次に、CloudFront Origin Access Identityを作成し、S3バケットにCloudFront Origin Access Identity主体への読み取りアクセス許可を付与します。その後、CloudFrontディストリビューションを作成します:

  • S3バケットをオリジンとして指定します。
  • 前に作成したOrigin Access Identityを指定します。
    oai := awscloudfront.NewOriginAccessIdentity(stack, jsii.String("OAI"), nil)    bucket.GrantRead(oai.GrantPrincipal(), "*")    distribution := awscloudfront.NewDistribution(stack, jsii.String("MyDistribution"), &awscloudfront.DistributionProps{        DefaultBehavior: &awscloudfront.BehaviorOptions{            Origin: awscloudfrontorigins.NewS3Origin(bucket, &awscloudfrontorigins.S3OriginProps{                OriginAccessIdentity: oai,            }),        },        DefaultRootObject: jsii.String("index.html"), //S3のファイル名    })

それでは、イメージ生成のためのLambda関数と、関数の実行IAMロールへのIAM権限(Bedrock操作の呼び出しを許可する)を作成します。

function := awscdklambdagoalpha.NewGoFunction(stack, jsii.String("bedrock-imagegen-s3"),        &awscdklambdagoalpha.GoFunctionProps{            Runtime: awslambda.Runtime_GO_1_X(),            Entry:   jsii.String(functionDir),            Timeout: awscdk.Duration_Seconds(jsii.Number(30)),        })    function.AddToRolePolicy(awsiam.NewPolicyStatement(&awsiam.PolicyStatementProps{        Actions:   jsii.Strings("bedrock:*"),        Effect:    awsiam.Effect_ALLOW,        Resources: jsii.Strings("*"),    }))

最後に、Lambda関数をAPI Gatewayと統合し、HTTPルートを追加し、API Gatewayのエンドポイント、S3バケット名、CloudFrontドメイン名をCloudFormationの出力として指定します。

functionIntg := awscdkapigatewayv2integrationsalpha.NewHttpLambdaIntegration(jsii.String("function-integration"), function, nil)    apigw.AddRoutes(&awscdkapigatewayv2alpha.AddRoutesOptions{        Path:        jsii.String("/"),        Methods:     &[]awscdkapigatewayv2alpha.HttpMethod{awscdkapigatewayv2alpha.HttpMethod_POST},        Integration: functionIntg})    awscdk.NewCfnOutput(stack, jsii.String("apigw URL"), &awscdk.CfnOutputProps{Value: apigw.Url(), Description: jsii.String("API Gatewayのエンドポイント")})    awscdk.NewCfnOutput(stack, jsii.String("cloud front domain name"), &awscdk.CfnOutputProps{Value: distribution.DomainName(), Description: jsii.String("CloudFrontのドメイン名")})    awscdk.NewCfnOutput(stack, jsii.String("s3 bucket name"), &awscdk.CfnOutputProps{Value: bucket.BucketName(), Description: jsii.String("S3バケット名")})

Lambda関数

こちらでLambda関数のコードを参照できます。

関数のハンドラでは、HTTPリクエストボディからプロンプトを抽出し、クエリパラメータから構成を取得します。そして、bedrockruntime.InvokeModel関数を使用してモデルを呼び出します。Amazon Bedrockへ送信されるJSONペイロードは、Request構造体のインスタンスで表されている点に注意してください。

Amazon Bedrock Stability Diffusionモデルから返される出力ボディは、base64文字列として生成されたイメージを含むResponse構造体に変換されます。これは、CORSヘッダーと共に、events.APIGatewayV2HTTPResponseオブジェクトとして返されます。

func handler(ctx context.Context, req events.APIGatewayV2HTTPRequest) (events.APIGatewayV2HTTPResponse, error) {    prompt := req.Body    cfgScaleF, _ := strconv.ParseFloat(req.QueryStringParameters["cfg_scale"], 64)    seed, _ := strconv.Atoi(req.QueryStringParameters["seed"])    steps, _ := strconv.Atoi(req.QueryStringParameters["steps"])    payload := Request{        TextPrompts: []TextPrompt{{Text: prompt}},        CfgScale:    cfgScaleF,        Steps: steps,    }    if seed > 0 {        payload.Seed = seed    }    payloadBytes, err := json.Marshal(payload)    output, err := brc.InvokeModel(context.Background(), &bedrockruntime.InvokeModelInput{        Body:        payloadBytes,        ModelId:     aws.String(stableDiffusionXLModelID),        ContentType: aws.String("application/json"),    })    var resp Response    err = json.Unmarshal(output.Body, &resp)    image := resp.Artifacts[0].Base64    return events.APIGatewayV2HTTPResponse{        StatusCode:      http.StatusOK,        Body:            image,        IsBase64Encoded: false,        Headers: map[string]string{            "Access-Control-Allow-Origin":  "*",            "Access-Control-Allow-Methods": "POST,OPTIONS",        },    }, nil}//request/response modeltype 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"`}

結論

このチュートリアルでは、AWS CDK を使用して、Amazon Bedrock と AWS Lambda を使用したサーバーレスイメージ生成ソリューションをデプロイし、CloudFront ドメイン経由の S3 上の静的ウェブサイトからアクセスされました。

AWS Go SDK と Amazon Bedrock Foundation Models (FMs) の使用に関する入門ガイドに興味がある場合は、このブログ投稿をご覧ください。

楽しい構築を!

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

人工知能

タイム100 AI:最も影響力のあるもの?

『タイム誌が、Time 100 AIリストを発表しましたこのリストは、リーダーやイノベーターなどのカテゴリーで、AIの100人の重要...

AIニュース

「知っておくべきトップBERTの応用事例」

言語モデルの事前学習は、自然言語処理(NLP)と自然言語理解(NLU)の分野を大いに進歩させました。それは、感情分析、質問...

AI研究

シンガポール国立大学の研究者たちは、ピクセルベースと潜在ベースのVDMを結びつけたハイブリッド人工知能モデルであるShow-1を提案しますこれはテキストからビデオを生成するものです

シンガポール国立大学の研究者たちは、Show-1というハイブリッドモデルを導入しました。テキストからビデオを生成するための...

AIニュース

世界初のAI搭載アーム:知っておくべきすべて

人工知能がバイオニックアームを制御する世界を想像したことがありますか? スーパーヒーローの映画から出てきたコンセプトの...

AI研究

「UCバークレーの研究者たちは、スターリング-7Bを発表しました:AIフィードバックからの強化学習でトレーニングされたオープンな大規模言語モデル(LLM)です(RLAIF)」

大規模言語モデル(LLM)は、自然言語処理タスクのための人工知能モデルです。これらのモデルは膨大なデータセットでトレーニ...

AIニュース

「Amazon SageMaker JumpStartでのテキスト生成のために、Llama 2を微調整する」

「本日は、Amazon SageMaker JumpStartを使用して、MetaによってLlama 2モデルを微調整する機能を発表できることを喜んでお知...