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.
- Cette recherche en IA en provenance de Chine présente Woodpecker un cadre d’intelligence artificielle innovant conçu pour corriger les hallucinations dans les grands modèles de langage multimodaux (MLLMs).
- LLM Faire confiance, mais vérifier
- Les innovations en IA génératrice dynamisent les développeurs
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!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- Bundesliga Match Facts Vitesse de tir – Qui tire les tirs les plus puissants en Bundesliga?
- Maîtriser les recherches sur Arxiv un guide de bricolage pour construire un chatbot de questions-réponses avec Haystack
- Plongez dans le futur avec le rapport AI de Kaggle 2023 – Découvrez les tendances chaudes
- Comprendre SCD – Dimensions qui changent lentement
- UC San Diego chercheurs DYffusion Un modèle de diffusion informé par la dynamique pour la prévision spatiotemporelle
- À quel point les grands modèles de langage sont-ils transparents ?
- Du GPT au Mistral-7B Le passionnant bond en avant dans les conversations de l’IA