Application de génération d’images sans serveur utilisant l’IA générative sur AWS

Utilisation de l'IA générative sur AWS pour une application de génération d'images sans serveur

Que ce soit pour créer du contenu personnalisé ou adapter des images aux préférences des utilisateurs, la capacité de générer des ressources visuelles à partir d’une description est assez puissante. Cependant, la conversion de texte en image implique généralement le déploiement d’une solution d’apprentissage automatique de bout en bout, ce qui est assez intensif en ressources. Et si cette fonctionnalité n’était qu’un appel d’API, rendant ainsi le processus plus simple et accessible aux développeurs ?

Ce tutoriel vous guidera pour utiliser AWS CDK afin de déployer une application de génération d’images sans serveur, implémentée à l’aide d’AWS Lambda et d’Amazon Bedrock, un service entièrement géré qui rend les modèles de base d’Amazon et de fournisseurs de modèles tiers (tels que Anthropic, Cohere, et plus encore) accessibles via une API. Les développeurs peuvent exploiter les modèles de base de premier plan via une seule API tout en conservant la flexibilité d’adopter de nouveaux modèles à l’avenir.

La solution est déployée sous la forme d’un site web statique hébergé sur Amazon S3 et accessible via un domaine Amazon CloudFront. Les utilisateurs peuvent saisir la description de l’image qui sera transmise à une fonction Lambda (via Amazon API Gateway) qui, à son tour, invoquera le modèle Stable Diffusion sur Amazon Bedrock pour générer l’image.

L’ensemble de la solution est créé en utilisant Go – cela inclut la fonction Lambda (en utilisant la bibliothèque aws-lambda-go) ainsi que le déploiement complet de la solution avec AWS CDK.

Le code est disponible sur GitHub.

Prérequis

Avant de commencer ce tutoriel, vous aurez besoin des éléments suivants :

  • Un compte AWS (si vous n’en avez pas encore, vous pouvez en créer un et configurer votre environnement ici)
  • Go (v1.19 ou supérieur)
  • AWS CDK
  • AWS CLI
  • Git
  • Docker

Clonez ce référentiel GitHub et accédez au bon répertoire :

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

Déployer la solution à l’aide de AWS CDK

Pour commencer le déploiement, invoquez simplement cdk deploy.

cd cdkexport DOCKER_DEFAULT_PLATFORM=linux/amd64cdk deploy

Vous verrez une liste de ressources qui seront créées et devrez confirmer votre approbation pour procéder (la sortie est raccourcie pour plus de concision).

Réunion de l'actif BedrockLambdaImgeGenWebsiteStack/bedrock-imagegen-s3/Code/Stage...✨ Temps de synthèse : 7.84s//.... omisCe déploiement entraînera éventuellement des modifications sensibles selon votre niveau d'approbation de sécurité actuel (--require-approval broadening). Veuillez confirmer que vous avez l'intention d'apporter les modifications suivantes://.... omisSouhaitez-vous déployer ces modifications (o/n) ? o

Cela commencera à créer les ressources AWS nécessaires pour l’application.

Si vous voulez voir le modèle AWS CloudFormation qui sera utilisé en coulisses, exécutez cdk synth et consultez le dossier cdk.out.

Vous pouvez suivre l’avancement dans le terminal ou accéder à la console AWS : CloudFormation > Stacks > BedrockLambdaImgeGenWebsiteStack.

Une fois que toutes les ressources sont créées, vous pouvez essayer l’application. Vous devriez avoir :

  • La fonction Lambda de génération d’images et la passerelle API Gateway
  • Un bucket S3 pour héberger la page HTML du site web
  • Une distribution CloudFront
  • Et quelques autres composants (tels que des rôles IAM, des autorisations, une stratégie de bucket S3, etc.)

Le déploiement peut prendre un peu de temps car la création de la distribution CloudFront est un processus long. Une fois terminé, vous devriez recevoir une confirmation ainsi que les valeurs pour le nom du bucket S3, l’URL de l’API Gateway et le nom de domaine CloudFront.

Mettez à jour la page HTML et copiez-la dans le bucket S3

Ouvrez le fichier index.html dans le référentiel GitHub et recherchez le texte suivant : ENTER_API_GATEWAY_URL. Remplacez-le par l’URL de l’API Gateway que vous avez reçue en sortie du déploiement CDK ci-dessus.

Pour copier le fichier dans S3, j’ai utilisé l’AWS CLI :

aws s3 cp index.html s3://<nom du bucket S3 provenant de la sortie CDK>

Vérifiez que le fichier a été téléchargé :

aws s3 ls s3://<nom du bucket S3 provenant de la sortie CDK>

Maintenant, vous êtes prêt à accéder au site web !

Vérifiez la solution

Saisissez le nom de domaine CloudFront dans votre navigateur web pour accéder au site web. Vous devriez voir le site avec une description pré-remplie utilisable comme indication.

Cliquez sur Générer l’image pour lancer le processus. Après quelques secondes, vous devriez voir l’image générée.

Modifiez les paramètres du modèle

Le modèle de diffusion de stabilité nous permet de affiner les paramètres de génération selon nos besoins.

Les modèles de diffusion de Stabilité.ai prennent en charge les contrôles suivants :

  • Force de l’indication (cfg_scale) contrôle la fidélité de l’image à l’indication, avec des valeurs plus basses augmentant l’aléatoire.
  • Étape de génération (steps) détermine la précision du résultat, avec plus d’étapes produisant des images plus précises.
  • Seed (seed) définit le niveau initial de bruit, permettant d’obtenir des résultats reproductibles avec la même seed et les mêmes réglages.

Cliquez sur Afficher la configuration pour les modifier.

Les valeurs maximales pour cfg_steps et steps sont respectivement de 30 et 150.

N’oubliez pas de nettoyer

Une fois terminé, pour supprimer tous les services, utilisez simplement :

cdk destroy# output prompt (choose 'y' to continue)Are you sure you want to delete: BedrockLambdaImgeGenWebsiteStack (y/n)?

Vous avez pu configurer et essayer la solution complète. Avant de conclure, examinons rapidement quelques parties importantes du code pour mieux comprendre ce qui se passe en coulisses.

Guide du code

Étant donné que nous nous concentrerons uniquement sur les parties importantes, une grande partie du code (instructions d’affichage, gestion des erreurs, etc.) a été omise pour des raisons de concision.

CDK

Vous pouvez vous référer au code CDK ici.

Nous commençons par créer l’API Gateway et le bucket 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),    })

Ensuite, nous créons l’identité de l’accès à l’origine CloudFront et accordons les autorisations de lecture du bucket S3 à l’identité de l’accès à l’origine CloudFront :

  • Spécifiez le bucket S3 comme origine.
  • Spécifiez l’identité de l’accès à l’origine CloudFront que nous avons créée précédemment.
    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"), //nom du fichier dans S3    })

Ensuite, nous créons la fonction Lambda de génération d’images ainsi que les autorisations IAM (rôle IAM d’exécution de la fonction) pour lui permettre d’invoquer les opérations 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("*"),    }))

Enfin, nous configurons l’intégration de la fonction Lambda avec API Gateway, ajoutons les routes HTTP et spécifions l’adresse de l’API Gateway, le nom du bucket S3 et le nom de domaine CloudFront en tant que sorties 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 endpoint")})    awscdk.NewCfnOutput(stack, jsii.String("nom de domaine CloudFront"), &awscdk.CfnOutputProps{Value: distribution.DomainName(), Description: jsii.String("nom de domaine CloudFront")})    awscdk.NewCfnOutput(stack, jsii.String("nom du bucket S3"), &awscdk.CfnOutputProps{Value: bucket.BucketName(), Description: jsii.String("nom du bucket S3")})

Fonction Lambda

Vous pouvez consulter le code de la fonction Lambda ici.

Dans le gestionnaire de fonction, nous extrayons la consigne du corps de la requête HTTP et la configuration des paramètres de requête. Ensuite, elle est utilisée pour appeler le modèle en utilisant la fonction bedrockruntime.InvokeModel. Notez que la charge utile JSON envoyée à Amazon Bedrock est représentée par une instance de la structure Request.

Le corps de sortie renvoyé par le modèle Amazon Bedrock Stability Diffusion est une charge utile JSON qui est convertie en une structure Response qui contient l’image générée sous forme de chaîne base64. Cela est renvoyé sous la forme d’un objet events.APIGatewayV2HTTPResponse avec des en-têtes CORS.

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}//modèle de requête/réponsetype 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"`}

Conclusion

Dans ce tutoriel, vous avez utilisé AWS CDK pour déployer une solution de génération d’images sans serveur qui a été implémentée à l’aide d’Amazon Bedrock et d’AWS Lambda et qui a été accessible via un site web statique sur S3 via un domaine CloudFront.

Si vous êtes intéressé par un guide d’introduction à l’utilisation du SDK Go AWS et des modèles de base d’Amazon Bedrock Foundation (FMs), consultez cet article de blog.

Bonne construction!

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

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Science des données

4 Idées Statistiques Importantes que Vous Devriez Comprendre dans un Monde Axé sur les Données

Echantillonnage, incertitude, IA, apprentissage automatique et interprétation des affirmations statistiques ; concept...

Apprentissage automatique

Rencontrez vLLM une bibliothèque open-source d'inférence et de service LLM qui accélère HuggingFace Transformers de 24x.

Les grands modèles de langage, ou LLM en abrégé, ont émergé comme une avancée révolutionnaire dans le domaine de l...

AI

De la misère à la richesse

(Note The translation is a direct translation and may not preserve the exact meaning and tone of the original text. I...

AI

Les chercheurs de l'Université du Texas présentent la prédiction des complications de la reconstruction sur implants en utilisant l'apprentissage automatique.

L’intelligence artificielle (IA) a transformé presque tous les domaines aujourd’hui et a le potentiel d&#...

AI

Découvrez LogAI une bibliothèque open-source conçue pour l'analyse et l'intelligence des journaux.

LogAI est une bibliothèque gratuite pour l’analyse et l’intelligence des journaux qui prend en charge div...