O blog da AWS

Crie aplicações de IA generativa no Amazon ECS para o SageMaker JumpStart

Por Sushanth Mangalore e Jooyoung Kim

Introdução

O aumento da popularidade da IA generativa (GenAI) reflete uma mudança ampla em direção à automação inteligente no cenário de negócios, o que permite que as empresas inovem em uma escala sem precedentes, ao mesmo tempo em que aderem às demandas dinâmicas do mercado. Embora a promessa da GenAI seja empolgante, os passos iniciais para sua adoção podem ser intimidadores. Esta postagem tem como objetivo desmistificar as complexidades e oferecer orientação para iniciar.

O Amazon SageMaker Jumpstart oferece uma opção conveniente para iniciar sua jornada de GenAI na AWS. Ele oferece FMs (Foundation Models, ou em tradução livre, Modelos de Fundação), como Stable Diffusion, FLAN-T5 e LLama-2, que são pré-treinados em grandes quantidades de dados. Os FMs podem ser adaptados a uma ampla variedade de workloads (cargas de trabalho ou aplicações em uma tradução contextualizada) em diferentes domínios, como criação de conteúdo, resumo de texto, etc. O Amazon SageMaker Studio fornece notebooks Jupyter gerenciados, uma interface interativa web-based para executar código ao vivo e análise de dados. Além disso, você pode ajustar e fazer deploy FMs nos endpoints do Amazon SageMaker para inferência a partir do SageMaker Studio.

No entanto, os usuários de negócio responsáveis por verificar a eficácia dos FMs podem não estar familiarizados com o Jupyter ou com a escrita de código. É mais fácil para os usuários de negócio acessarem os FMs no contexto de uma aplicação. E é aqui que o Streamlit [1] [MOU2] [MOU3] se destaca. O Streamlit é uma biblioteca Python de código aberto que permite que cientistas e engenheiros de dados criem e façam deploy facilmente de aplicações Web para projetos de [4] aprendizado de máquina (machine learning) e ciência de dados com o mínimo de codificação. A interface de usuário web-based o torna ideal para usuários de negócio interagirem. Com as aplicações Streamlit, os usuários de negócio podem explorar ou validar facilmente os FMs e colaborar de forma eficaz com as equipes de ciência de dados.

O Amazon Elastic Container Service (Amazon ECS) é um orquestrador de contêineres totalmente gerenciado, que facilita a execução de aplicações em contêineres de forma escalável e segura. O AWS Fargate é um mecanismo de computação sem servidor para contêineres. Ele pode simplificar o gerenciamento e a escalabilidade de aplicações em nuvem transferindo tarefas operacionais [5] tradicionais para a AWS. Com o Amazon ECS e o AWS Fargate, você pode aliviar os encargos operacionais, permitindo que você se concentre na inovação e desenvolva rapidamente aplicações GenAI com o Streamlit. Além disso, ao configurar um mecanismo de integração contínua/entrega contínua (CI/CD) por meio do AWS CodePipeline, você pode iterar com eficiência sobre o feedback. Neste post, discutiremos como você pode criar uma aplicação GenAI com Amazon ECS, AWS Fargate, Amazon SageMaker JumpStart e AWS CodePipeline.

Visão geral da solução

Figura 1. Diagrama de arquitetura mostrando a task do Amazon ECS com a aplicação Streamlit acessando o endpoint do Amazon SageMaker para obter um FM.

A Figura 1 mostra a arquitetura de um cluster do Amazon ECS com algumas tasks rodando uma aplicação GenAI com Streamlit. A aplicação pode ser acessada através de um Application Load Balancer, que está associado a um service do Amazon ECS. Os services do Amazon ECS garantem que um número necessário de tasks estejam sempre em execução. Adicionalmente, você pode configurar o Amazon ECS service para escalar automaticamente suas tasks à medida que a carga aumenta. Você pode compartilhar o endereço do DNS do Load Balancer com seus usuários de negócio conforme necessário para que utilizem o FM. Como alternativa, você pode usar um DNS customizado para a aplicação usando o Amazon Route 53 ou seu serviço DNS preferido.

Normalmente, seus endpoints do Amazon SageMaker e seu cluster do Amazon ECS com a aplicação Streamlit residem na mesma conta da AWS. Isso permite que você tenha uma configuração independente para acesso, ajuste fino e teste de inferência ao modelo GenAI. No entanto, se seu endpoint do Amazon SageMaker precisar estar em uma conta diferente da AWS, você poderá utilizar o Amazon API Gateway para permitir acesso externo ao endpoint de inferência do Amazon SageMaker a partir de um cliente fora da sua conta da AWS. Você pode consultar esta postagem para obter mais informações. Este exemplo pressupõe que seus endpoints do Amazon SageMaker estarão na mesma conta da AWS que seu cluster do Amazon ECS.

Sua task do Amazon ECS deve ter acesso necessário para invocar os endpoints do Amazon SageMaker para inferência. Você pode restringir ainda mais as políticas de acesso do AWS Identity and Access Management (AWS IAM) no IAM role das tasks do Amazon ECS a ARNs (Amazon resource names, ou nomes de recursos da amazon em tradução livre) específicos para seus endpoints do Amazon SageMaker. Ao vincular a política do AWS IAM a um ARN específico, você pode garantir que a política só permita acesso quando a solicitação for feita a esse endpoint específico. Isso ajuda você a seguir o princípio do menor privilégio de segurança. Sua task do AWS Fargate também precisa acessar os endpoints do Amazon SageMaker no AWS Systems Manager Parameter Store. O uso do Parameter Store permite que seus endereços de endpoint do Amazon SageMaker sejam desacoplados do seu aplicativo.

A solução também inclui uma configuração de implantação contínua (CD – Continuous Deployment). O AWS CodePipeline pode detectar qualquer alteração em sua aplicação, acionando o AWS CodeBuild para criar uma nova imagem de contêiner, que é enviada para o Amazon Elastic Container Registry (Amazon ECR). O pipeline modifica a definição da task do Amazon ECS com a nova versão da imagem do contêiner e atualiza o service do Amazon ECS para substituir as tasks pela nova versão da sua aplicação.

Passo a passo

Você pode seguir estas etapas para configurar uma aplicação de GenAI com o Amazon SageMaker Jumpstart e o AWS Fargate:

1.        Configurar os pré-requisitos

2.        Clone e configure o aplicativo AWS Cloud Deployment Kit (CDK)

3.        Faça deploy do ambiente Amazon SageMaker

4.        Faça deploy do ambiente de CI/CD

5.        Explore o modelo de IA de geração de imagens

6.        Explore o modelo de IA de geração de texto

Pré-requisitos
•          Interface de linha de comando da AWS (AWS CLI) versão 2

•          AWS CDK Toolkit (versão 2.93.0+)

•          Trabalhando com o AWS CDK em Python

•          Python ≥ 3,6+

•          Git

•          Docker Command Line

Clone e configure o repositório GitHub para o aplicativo GenAI

Configure as credenciais da AWS no host que você está usando para sua configuração. Para começar, faça um fork do repositório do Amazon ECS Blueprints no GitHub e faça um clone para seu repositório git local.

git clone https://github.com/<repository_owner>/ecs-blueprints.git
cd ecs-blueprints/cdk/examples/generative_ai_service/

Configure as variáveis de ambiente da conta da AWS e da região da AWS para corresponder ao seu ambiente. Este post usa a região de Oregon (us-west-2) como exemplo. Você gerará um arquivo “.env” para ser usado pelo template do AWS CDK. Você buscará variáveis no arquivo de ambiente durante o deploy do serviço de back-end.

export AWS_ACCOUNT=$(aws sts get-caller-identity --query 'Account' --output text)
export AWS_REGION=${AWS_REGION:=us-west-2}

sed -e "s/<ACCOUNT_NUMBER>/$AWS_ACCOUNT/g" \
  -e "s/<REGION>/$AWS_REGION/g" sample.env > .env

Você pode criar um ambiente virtual do Python para isolar as instalações do Python e os respectivos pacotes pip do seu ambiente local. Depois disso, você instalará os pacotes necessários:

# manually create a virtualenv:
python3 -m venv .venv

# activate your virtualenv:
source .venv/bin/activate

# install the required dependencies:
python -m pip install -r requirements.txt

Se você nunca usou anteriormente o CDK em seu ambiente da AWS, que é uma combinação de uma conta da AWS e uma região da AWS, você deve executar o seguinte comando bootstrap:

cdk bootstrap aws://${AWS_ACCOUNT}/${AWS_REGION}

Liste as pilhas no aplicativo. Neste Amazon ECS Blueprint, você verá quatro pilhas.

cdk ls

Deploy do ambiente Amazon SageMaker

Depois de finalizar a configuração acima, agora você está pronto para criar os componentes da solução. Primeiro, você criará o ambiente do Amazon SageMaker e o endpoint de inferência do SageMaker com a pilha GenaitXT2ImgSageMakerStack do AWS CDK.

cdk deploy GenAITxt2ImgSageMakerStack --require-approval never

Quando o deploy da pilha estiver concluído, faça o deploy do ambiente Amazon SageMaker para o modelo de geração texto-para-texto (text to text) com a pilha GenaitXT2TxtSageMakerStack do AWS CDK.

cdk deploy GenAITxt2TxtSageMakerStack --require-approval never

O exemplo de texto-para-imagem faz uso do FM Stable Diffusion v2.1 da Stability AI. O exemplo de texto-para-texto usa o FM FLAN-T5-XL da Hugging Face. Ambos os FMs usam instâncias ml.g4dn.2xlarge no Amazon SageMaker para gerar endpoints de inferência. Isso é a configuração padrão no .env. Você pode modificar os valores no .env para usar FMs alternativos e também outros tipos de instância para inferência.

Deploy do ambiente de CI/CD

Em seguida, você estabelecerá o ambiente de CI/CD para facilitar as atualizações da aplicação em execução. A pilha de CI/CD usa o AWS CodePipeline como pipeline de lançamento. Ele extrai o código-fonte atualizado do seu repositório do GitHub e usa o AWS CodeBuild para criar a nova versão da imagem do contêiner para sua aplicação. A nova versão da imagem do contêiner é usada para atualizar a aplicação em execução no Amazon ECS.

Altere o diretório de trabalho para cicd_service para criar um pipeline de CI/CD.

cd ../cicd_service

Crie um token do GitHub para acessar o repositório que você fez o fork. Você deve criar isso na mesma região em que os serviços da AI Generativa são implantados.

aws secretsmanager create-secret --name ecs-github-token --secret-string &lt;your-github-access-token&gt;

Conforme realizado anteriormente, configure as variáveis de ambiente da conta da AWS e da região da AWS para corresponder ao seu ambiente.

export AWS_ACCOUNT=$(aws sts get-caller-identity --query 'Account' --output text)
export AWS_REGION=${AWS_REGION:=us-west-2}

sed -e "s/<ACCOUNT_NUMBER>/$AWS_ACCOUNT/g" \
-e "s/<REGION>/$AWS_REGION/g" sample.env > .env

No arquivo .env, você atualizará algumas variáveis de ambiente.

  • Propriedades essenciais (Essencial props)
    • repository_owner: Proprietário do repositório Github (use seu username do GitHub aqui)
  • Propriedades de CICD (CICD Service props)
    • ecr_repository_name: generative-ai-service
    • container_name: web-container
    • task_cpu: 2048
    • task_memory: 4096
    • service_name: gen-ai-web-service-new
  • Propriedades do repositório (Repository props)
    • caminho_de_pasta: ./cdk/examples/generative_ai_service/web-app/.

O arquivo .env resultante deve se parecer com o seguinte:

deploy_core_stack="True"

# Essential Props
account_number="${AWS_ACCOUNT}"
aws_region="${AWS_REGION}"
repository_owner="<REPO_OWNER>"

# Core Stack Props
vpc_cidr="10.0.0.0/16"
ecs_cluster_name="ecs-blueprint-infra"
namespaces="default"
enable_nat_gw="True"
az_count="3"

# CICD Service Props
buildspec_path="./application-code/ecsdemo-cicd/buildspec.yml"
ecr_repository_name="generative-ai-service"
container_image="nginx"
container_name="web-container"
container_port="80"
task_cpu="2048"
task_memory="4096"
desired_count="3"
service_name="gen-ai-web-service-new"

## Repository props
folder_path="./cdk/examples/generative_ai_service/web-app/."
repository_name="ecs-blueprints"
repository_branch="main"
github_token_secret_name="ecs-github-token"

# ECS cluster Props
ecs_task_execution_role_arn="<TASK-EXECUTION-ROLE-ARN>"
vpc_name="ecs-blueprint-infra-vpc"

# Service discovery Props
namespace_name="default.ecs-blueprint-infra.local"
namespace_arn="<NAMESPACE-ARN>"
namespace_id="<NAMESPACE-ID>"

Como nossa aplicação web exige permissões “ssm:GetParameter” e “sagemaker:InvokeEndpoint” para inferir os FMs usando o endpoint do Amazon SageMaker, também precisamos adicionar o seguinte código ao lib/cicd_service_stack.py.

Adicione as importações desses módulos Python:

from aws_cdk.aws_iam import (
Role,
PolicyStatement,
Effect
)

Além disso, adicione o bloco de código abaixo após a linha que define o serviço Amazon ECS em cicd_service_stack.py. Esse código adiciona as permissões necessárias ao role AWS IAM da Amazon ECS Task.

# Adiciona o role IAM a task do ECS
self.fargate_service.task_definition.add_to_task_role_policy(PolicyStatement(
effect=Effect.ALLOW,
actions = ["ssm:GetParameter"],
resources = ["*"],
)
)

self.fargate_service.task_definition.add_to_task_role_policy(PolicyStatement(
effect=Effect.ALLOW,
actions=["sagemaker:InvokeEndpoint"],
resources=["*"]
)
)

Na última etapa, você fará o deploy da infraestrutura principal, que inclui a Amazon Virtual Private Cloud (Amazon VPC), as políticas e roles necessários do AWS IAM, o cluster Amazon ECS e o serviço ECS de GenAI, que hospedará sua aplicação Streamlit.

cdk deploy CoreInfraStack, CICDService --require-approval never

Explore o FM de geração de imagens

Você pode usar a URL do Application Load Balancer obtido da saída de output do AWS CDK para acessar o serviço. Selecione o modelo de geração de imagem (image generation model) na barra lateral à esquerda. Quando você insere uma descrição de imagem, ela gera uma imagem com base no texto escrito.

Explore o FM de geração de texto

Em seguida, selecione o modelo de geração de texto (text generation model) na barra lateral. Você pode inserir o contexto, fornecer uma solicitação relevante e pressionar o botão Generate Response. Isso gera uma resposta de texto para sua solicitação na seção input query.

Limpando o Ambiente

Você pode excluir a pilha de soluções do console no AWS CloudFormation ou usar o comando destroy do AWS CDK nos diretórios em que você implantou suas pilhas de CDK. Essa etapa é importante para parar de incorrer em custos depois de explorar os FMs. Em produção, você pode deixar seus endpoints de inferência ativos para inferência contínua. Você também pode programar periodicamente a exclusão e a recriação dos endpoints de inferência, com base em suas necessidades de inferência.

cdk destroy --all --force

Conclusão

Neste post, mostramos como você pode usar o Amazon ECS com o AWS Fargate para implantar aplicações GenAI. Com o AWS Fargate, você pode implantar suas aplicações sem a sobrecarga de gerenciar sua computação. Você aprendeu como as aplicações Streamlit podem ser configurados para acessar FMs de IA generativa no Amazon SageMaker Jumpstart. Os FMs fornecem um ponto de partida para ajudar a criar suas próprias soluções generativas de IA. Com contêineres sem servidor, sua equipe de ciência de dados pode se concentrar mais em soluções eficazes para seus casos de uso e menos na infraestrutura correspondente. Seus usuários de negócio podem colaborar com as equipes de ciência de dados usando a interface web amigável das aplicações Streamlit e fornecer feedback. Isso pode ajudar sua organização a ser mais ágil na adoção da IA generativa para seus casos de uso. Os recursos mencionados abaixo fornecem mais informações sobre os tópicos que discutimos neste post.

Este blog é uma tradução do conteúdo original em inglês (link aqui).

Leitura adicional

FMs do SageMaker Jumpstart

Amazon ECS Blueprints

Melhores práticas do Amazon ECS

Workshop de IA generativa sem servidor

Autores

Sushanth Mangalore
Sushanth Mangalore é arquiteto de soluções sênior na Amazon Web Services, alocado em Chicago, IL. Ele é um especialista em tecnologia e ajuda empresas a criar soluções na AWS para atingir seus objetivos estratégicos. Ele é especialista em serviços de contêineres como Amazon ECS e Amazon EKS. Antes da AWS, Sushanth criou soluções de TI para vários setores, usando uma ampla variedade de tecnologias.

Jooyoung Kim
Jooyoung é arquiteta de soluções especialista em contêineres na AWS e trabalha na estratégia go-to-market do AWS Container Services para ajudar os clientes na jornada da AWS. Durante seu tempo livre, ela gosta de cozinhar e nadar em algum lugar próximo a São Francisco. Você pode se conectar com ela no LinkedIn em linkedin.com/in/joozero/

Revisores

Rafael Weffort é engenheiro da computação pós-graduado, quase-biólogo, pai do Martin e montanhista. Atualmente é arquiteto de soluções da AWS para o segmento de Fornecedores de Software Independente (ISV – Independent Software Vendor). Começou a carreira nos primórdios da internet brasileira, desenvolvendo e vendendo websites aos 12 anos. Por uma década foi desenvolvedor full-stack no mercado financeiro e desde 2019 vem apoiando clientes do mundo de SaaS e e-commerce em modernização e otimização na nuvem, se especializando em arquitetura, design de APIs, integrações de sistemas, micros-serviços e contêineres.

https://www.linkedin.com/in/rafaelweffort/

Karine Ferrari é arquiteta de soluções na AWS com experiência em clientes SMB e Financial Services. Com 15 anos de experiência na área de tecnologia da informação atuando em instituições de grande porte e nos últimos 4 anos atua com arquitetura para projetos em cloud e modernização de aplicações. Possui experiência em implementar e fornecer documentações, guias e experimentações com intuito de evangelizar e apoiar as equipes de negócios para utilização de microserviços, APIs, mensageria, eventos e banco de dados em projetos em nuvem.

https://www.linkedin.com/in/karine-p-ferrari/