Leia nosso artigo sobre

class="lazyload

.

Este artigo oferece um guia para a implantação do modelo Stable Diffusion, um popular modelo de geração de imagens, no Google Cloud o Vertex AI. O guia aborda a configuração e o download dos pesos, o TorchServe para implantação, o servidor TorchServe implantado em um endpoint do Vertex e o salvamento automático do histórico de imagens no GCS

Introdução

O Stable Diffusion é um modelo de geração de imagens. Foi disponibilizado como código aberto em 2022 e ganhou popularidade devido à sua capacidade de gerar imagens de alta qualidade a partir de descrições textuais. Assim como outros modelos de geração de imagens, tais como o Dall-E, o Stable Diffusion utiliza técnicas de aprendizado de máquina para gerar imagens com base em uma entrada fornecida.

A Moët Hennessy, divisão de vinhos e bebidas destiladas do conglomerado de luxo LVMH, administra um portfólio de mais de 26 marcas icônicas, como Moët & Chandon, Hennessy e Veuve Clicquot. A Moët Hennessy já colaborou com Artefact para investigar os usos potenciais de tecnologia de ponta na geração de conteúdo de marketing. Com foco na privacidade e segurança, a equipe decidiu explorar a implantação do Stable Diffusion na Google Cloud (GCP) para permitir que a Moët Hennessy ajustasse e executasse o modelo dentro de sua própria infraestrutura, proporcionando uma experiência integrada desde o ajuste do modelo até a exposição da API.

Antes de começar, é importante observar que este artigo pressupõe que você tenha conhecimento prévio do Google Cloud (GCP) e, especificamente, do Vertex AI. Isso inclui conceitos como o registro de modelos e os endpoints do Vertex. Além disso, é necessário ter experiência prévia com o Docker para seguir algumas das etapas. Se você não estiver familiarizado com esses conceitos, recomenda-se que se familiarize com eles antes de prosseguir.
Além disso, para baixar os pesos do Stable Diffusion, você precisa ter uma conta no Hugging Face; caso ainda não tenha uma, pode criá-la facilmente nosite do Hugging Face.
Dito isso, vamos começar!

Download de configurações e pesos

Recomendo clonar orepositório do GitHubque preparei para seguir as etapas do artigo.

É sempre importante criar um ambiente virtual para instalar os pacotes. Pessoalmente, vou usar o Anaconda e instalar o arquivo requirements.txt com todas as dependências:

conda create -n stable_diffusion — no-default-packages python=3.8 -y
conda activate stable_diffusion
pip install -r src/requirements.txt

Agora você está pronto para baixar os pesos do Stable Diffusion; neste artigo, usaremoso Stable Diffusion 1.5. É necessário aceitar a licença na página do modelo; caso contrário, ocorrerão erros ao baixar os pesos do modelo.
Acesse sua conta → configurações → token de acesso → novo token (acesso de leitura)

Vá para sua conta → configurações → token de acesso → novo token (acesso de leitura)

Você pode adicionar o token como uma variável de ambiente. Pessoalmente, recomendo usar um arquivo .env e carregar a variável de ambiente com abiblioteca python-dotenv.
Você precisa acessar a pasta `src/stable_diffusion` e executar:

python download_model.py

Isso fará o download dos pesos

`src/stable_diffusion/external_files/model_weights`.

Estrutura Torchserve

O Torchserveé uma estrutura para a implementação de modelos PyTorch. Ele permite que você implemente modelos PyTorch em um ambiente de produção e oferece recursos como controle de versões de modelos e implementação de múltiplos modelos. Foi projetado para ser fácil de usar e permite que você se concentre na criação e na implementação de seus modelos, em vez de se preocupar com a infraestrutura.

1. Criação de um manipulador que respeite o formato TorchServe

Um manipulador personalizado é uma classe Python que define como pré-processar data de entrada, como executar o modelo e como pós-processar a saída. Para criar um manipulador personalizado para o seu modelo, você precisará criar uma classe Python que siga o formato do TorchServe.
Um manipulador personalizado para o Stable Diffusion já está disponível no repositório do TorchServe. No entanto, o endpoint do Vertex espera um formato específico para as solicitações, portanto, precisamos adaptar o método preprocess() do manipulador para atender ao formato do Vertex. Você pode usar a versão modificada do manipulador chamada `stable_diffusion_handler.py`, disponível no repositório do GitHub deste artigo.

2. Criação do arquivo .mar

Depois de criar seu manipulador personalizado, você precisará empacotá-lo, juntamente com todas as dependências e o próprio modelo, em um arquivo .mar usando a ferramenta model-archiver. A ferramenta model-archiver é uma ferramenta de linha de comando que permite empacotar seu modelo, manipulador e dependências em um único arquivo.

Isso criará um arquivo .mar chamado output.mar que contém seu modelo, manipulador e dependências.

Talvez seja necessário editar o caminho de acordo com a localização dos arquivos no seu computador:

torch-model-archiver
–model-name stable-diffusion
–version 1.0
–handler stable_diffusion/stable_diffusion_handler.py
–export-path stable_diffusion/model-store
–extra-files stable_diffusion/external_files

3. Executando o servidor TorchServe

Depois de criar seu arquivo .mar, você pode iniciar o servidor TorchServe usando o comando torchserve. Para isso, execute o seguinte comando:

torchserve
— start
— ts-config=config.properties
— models=stable-diffusion.mar
— model-store=stable_diffusion/model-store

O arquivo config.properties permite especificar as configurações do seu servidor TorchServe, como a porta para inferência, verificações de integridade, número de workers, etc.
AVISO: Todos os scripts devem ser executados no mesmo diretório em que o arquivo está localizado para evitar erros de caminho.

Execute o servidor TorchServe localmente

É importante testar o código localmente antes de começar a implementar o Docker na nossa implantação; já preparei um script em Bash que criará o arquivo .mar e iniciará o servidor TorchServe.

Você pode executá-lo com:


bash serve_locally.sh

É preciso aguardar alguns minutos até que o servidor seja inicializado e o worker carregue o modelo; você poderá iniciar a inferência assim que vir o seguinte registro:

2023–01–05T15:34:52,842 [DEBUG] W-9000-stable-diffusion_1.0
org.pytorch.serve.wlm.WorkerThread— W-9000-stable-diffusion_1.0
Mudança de estado WORKER_STARTED -> WORKER_MODEL_LOADED

Você pode então usar o código a seguir para fazer solicitações de inferência ao seu modelo:

import requests
prompt = “uma foto de um astronauta montando a cavalo em Marte”
URL = “http://localhost:7080/predictions/stable-diffusion”
response = requests.post(URL, data)

Você pode verificar se o servidor recebeu sua solicitação consultando os logs do servidor:

2023–01–05T15:35:43,765 [INFO ] W-9000-stable-diffusion_1.0-stdout
MODEL_LOG — O backend recebeu a inferência no momento: 1672929343

O Stable Diffusion requer uma GPU para funcionar corretamente, por isso você não terá nenhum resultado por enquanto. Você pode parar o servidor torchserve com o comando `torchserve –stop`.

Converter o torchserve para o Docker

Seu servidor TorchServe está funcionando localmente; para implantar o Stable Diffusion no Vertex AI, você precisará criá-lo como um contêiner Docker. Isso significa criar uma imagem Docker que contenha o modelo, o manipulador personalizado e todas as dependências necessárias. Trata-se simplesmente de todas as etapas que realizamos acima dentro de um Dockerfile.
Felizmente, ele já está preparado e pronto para uso aqui:Dockerfile.

É importante executar o contêiner localmente para verificar se ele está funcionando corretamente. Vou compilá-lo localmente, mas você pode compilá-lo usando cloud e baixá-lo para o seu computador.

Compile a imagem localmente (é necessário que o daemon do Docker esteja em execução):

build -t serve_sd .

A compilação da imagem levará de 20 a 30 minutos; a fase de compilação é demorada porque os pesos do modelo precisam ser copiados para dentro da imagem antes de serem empacotados pelo model-archiver.

Você pode executar um contêiner Docker e ouvir na porta 7080 com:

docker run -p 7080:7080 serve_sd

Para verificar se tudo está funcionando corretamente, você pode esperar até que o worker tenha carregado o modelo e executar o mesmo código de inferência de antes, já que estamos usando a mesma porta 7080.

Implantação no Vertex AI

Agora que o Dockerfile está pronto e funcionando, precisamos:

  • Crie a imagem usando Cloud no Google Container Registry (GCR)
  • Carregue a imagem do nosso modelo personalizado no registro AI do Vertex AI

  • Criar um AI do Vertex AI
  • Anexe o modelo ao ponto final

É exatamente isso que o script bash `deploy.sh` vai fazer; você pode executá-lo com:

bash deploy.sh

A implantação leva cerca de 1 hora com uma boa velocidade de internet:

  • O envio dos 8 GB de pesos do modelo para Cloud pode levar de alguns minutos a várias horas, dependendo da velocidade da sua conexão à Internet
  • A montagem da imagem leva cerca de 20 minutos

  • O upload do modelo leva cerca de 5 minutos

  • A criação do endpoint leva cerca de 5 minutos

  • A fixação do modelo no ponto final leva de 30 a 40 minutos

Depois que o modelo for vinculado com sucesso ao endpoint, você poderá consultar o endpoint com o seguinte código:

from google.cloud aiplatform as aip

PROJECT_NAME = ""
REGION = ""
ID_DO_PONTO_DE_ACESSO = ""
aip.init(project=PROJECT_NAME, location=REGION)
endpoint = aip.Endpoint(endpoint_name=ID_DO_PONTO_DE_ACESSO)
text_input = """Uma garrafa de conhaque envelhecido e exclusivo
está sobre uma superfície reflexiva, em frente a um bar vibrante,
hiperdetalhado, 4K, bokeh"""

def query_endpoint(endpoint, text_input):
payload =
response = endpoint.predict(instances=[payload])
return response

image = query_endpoint(endpoint, text_input)
class="lazyload

Uma garrafa de conhaque envelhecido e exclusivo repousa sobre uma superfície reflexiva, em frente a um bar animado, com detalhes impressionantes, em 4K e efeito bokeh — Stable Diffusion 1.5

A inferência deve levar entre 10 e 15 segundos em uma GPU T4. Você pode aumentar a velocidade escolhendo uma GPU mais potente; para isso, altere a variável ACCELERATOR_TYPE no arquivo deploy.sh.

Opcional: Se o tamanho da imagem for muito grande para o endpoint ou se você quiser armazenar o histórico de imagens.

Talvez você queira manter um registro do histórico das imagens, ou esteja enfrentando erros devido ao limite de tamanho de 1,5 MB para a resposta do endpoint. Nesse caso, recomendo usar o método de pós-processamento do manipulador para salvar a imagem no GCS e retornar apenas o caminho da imagem no GCS.

Felizmente, já preparei um handler que faz exatamente isso para você; basta mudar do stable_diffusion_handler.py parao stable_diffusion_handler_gcs.pye o problema estará resolvido.

AVISO: Antes de executar a implantação com o novo manipulador, é necessário:

  • Crie um bucket do GCS para armazenar as imagens

  • Edite o nome do novo bucket do GCS e da pasta dentro do arquivo src/stable_diffusion/external_files/config.py

  • Altere a conta de serviço utilizada pelo endpoint no arquivo deploy.sh. Você precisa de uma conta de serviço com permissões de PROPRIETÁRIO no GCS.

Conclusão

Neste artigo, é apresentado um guia completo para a implantação do modelo Stable Diffusion na Google Cloud usando o Vertex AI.

O guia abordou etapas essenciais, tais como:

  • Utilizando o TorchServe para implantação
  • Criando e modificando um manipulador personalizado para o Stable Diffusion
  • Implantação do modelo usando o registro de modelos do Vertex e os Endpoints do Vertex

É importante lembrar que, embora o endpoint do Vertex possa ser uma solução eficaz, ele não permite reduzir a escala para 0 instâncias, o que pode resultar em aumento de custos, uma vez que a GPU continua em uso.

Além disso, com a implantação do modelo Stable Diffusion concluída, estamos atualmente explorando novas possibilidades, como o ajuste fino do modelo para produtos específicos da Moët Hennessy, a fim de aprimorar ainda mais as capacidades do modelo.

class="lazyload

Blog do Medium pela Artefact.

Este artigo foi publicado originalmente no Medium.com.
Siga-nos no nosso blog no Medium!