Leia nosso artigo sobre

.

Este artigo fornece um guia para a implantação do modelo Stable Diffusion, um modelo popular de geração de imagens, no Google Cloud usando o Vertex AI. O guia aborda a configuração e o download de pesos, o TorchServe para implantação, o servidor TorchServe implantado em um endpoint 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. Seu código-fonte foi aberto em 2022 e ganhou popularidade devido à sua capacidade de gerar imagens de alta qualidade a partir de descrições de texto. Como outros modelos de geração de imagens, como o Dall-E, o Stable Diffusion usa técnicas de aprendizado de máquina para gerar imagens com base em uma determinada entrada.

A Moët Hennessy, a divisão de vinhos e destilados 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 colaborou com Artefact para investigar os possíveis usos da tecnologia de ponta na geração de conteúdo de marketing. Com foco na privacidade e na segurança, a equipe decidiu explorar a implantação do Stable Diffusion no Google Cloud Platform (GCP) para permitir que a Moët Hennessy ajustasse e executasse o modelo em sua própria infraestrutura, proporcionando uma experiência perfeita desde o ajuste fino do modelo até a exposição da API.

Antes de começar, é importante observar que este artigo pressupõe que o senhor tenha conhecimento prévio do Google Cloud Platform (GCP) e, especificamente, do Vertex AI. Isso inclui conceitos como registro de modelos e pontos de extremidade do Vertex. Além disso, o senhor precisa ter experiência prévia com o Docker para seguir algumas das etapas. Se não estiver familiarizado com esses conceitos, é recomendável que o senhor se familiarize com eles antes de prosseguir.
Além disso, para fazer o download dos pesos do Stable Diffusion, o senhor precisa ter uma conta na huggingface; se ainda não tiver uma, pode criá-la facilmente em Site da huggingface.
Dito isso, vamos começar!

Configuração e download de pesos

Recomendo clonar o grepositório do itub Eu me preparei para seguir as etapas do artigo.

É sempre importante criar um ambiente virtual para instalar os pacotes. Pessoalmente, uso o anaconda e instalo o 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 o senhor está pronto para fazer o download dos pesos do Stable Diffusion; neste artigo, usaremos Difusão estável 1.5. O senhor precisa aceitar a licença na página do modelo, caso contrário, ocorrerão erros ao fazer o download dos pesos do modelo.
Acesse sua conta → configurações → token de acesso → novo token (acesso de leitura)

Go to your account → settings → access token → new token (read access)

O senhor pode adicionar o token como uma variável de ambiente. Pessoalmente, recomendo usar um arquivo .env e carregar a variável de ambiente usando o comando biblioteca python-dotenv.
O senhor deve navegar até `src/stable_diffusion` e executar:

python download_model.py

Isso fará o download dos pesos internos

`src/stable_diffusion/external_files/model_weights`.

Estrutura do Torchserve

Torchserve é uma estrutura para servir modelos PyTorch. Ele permite que o usuário implante modelos PyTorch em um ambiente de produção e fornece recursos como versão de modelo e serviço de vários modelos. Ele foi projetado para ser fácil de usar e permite que o usuário se concentre na criação e na implantação de seus modelos, em vez de se preocupar com a infraestrutura.

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

Um manipulador personalizado é uma classe Python que define como pré-processar a entrada data, como executar o modelo e como pós-processar a saída. Para criar um manipulador personalizado para o seu modelo, o senhor precisará criar uma classe Python que siga o formato do TorchServe.
Um manipulador personalizado para o Stable Diffusion já é fornecido dentro do repositório TorchServe. Mas o ponto de extremidade Vertex espera um formato específico para as solicitações, portanto, precisamos adaptar o método preprocess() do manipulador para levar em conta o formato Vertex. O senhor pode usar a versão modificada do manipulador chamada `stable_diffusion_handler.py` fornecido no repositório do github deste artigo.

2. Criação do arquivo .mar

Depois de criar o manipulador personalizado, o senhor precisará empacotá-lo junto 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 o modelo, o manipulador e as dependências em um único arquivo.

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

Talvez seja necessário editar o caminho com base na localização dos arquivos em seu computador:

torch-model-archiver
-model-name stable-diffusion
-versão 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 o arquivo .mar, o senhor pode iniciar o servidor TorchServe usando o comando torchserve. Para fazer isso, o senhor precisará executar o seguinte comando:

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

O config.properties permite que o senhor especifique as configurações do seu servidor TorchServe, como a porta para inferência, verificações de integridade, número de trabalhadores, etc.
AVISO: Todos os scripts precisam ser executados onde o arquivo está localizado para evitar erros de caminho.

Executar o servidor TorchServe localmente

É importante testar o código localmente antes de começar a dockerizar nossa implantação. Já preparei um script bash que criará o arquivo .mar e iniciará o servidor TorchServe.

O senhor pode executá-lo com :


bash serve_locally.sh

É necessário aguardar alguns minutos para que o servidor seja inicializado e o worker carregue o modelo; o senhor pode começar a executar a inferência se vir o seguinte log:

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

Em seguida, o senhor pode usar o código a seguir para fazer solicitações de inferência ao seu modelo:

solicitações de importação
prompt = “a photo of an astronaut riding a horse on mars” (uma foto de um astronauta andando a cavalo em Marte)”
URL = “http://localhost:7080/predictions/stable-diffusion”
response = requests.post(URL, data=prompt)

O senhor 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 em: 1672929343

O Stable Diffusion requer uma GPU para ser executado sem problemas, portanto, o senhor não terá nenhuma saída no momento. O senhor pode parar o servidor torchserve com `torhcserve -stop`.

Dockerize torchserve

Seu servidor TorchServe está funcionando localmente. Para implantar o Stable Diffusion no Vertex AI, o senhor precisará colocá-lo no Docker. Isso significa criar uma imagem do Docker que contenha o modelo, o manipulador personalizado e todas as dependências necessárias. Isso é simplesmente todas as etapas que fizemos acima em um Dockerfile.
Felizmente, ele já está preparado e pronto para ser usado aqui: Dockerfile.

É importante executar o contêiner localmente para verificar se ele está funcionando corretamente. Vou construí-lo localmente, mas o senhor pode construí-lo com o cloud build e puxá-lo para a sua máquina.

Crie a imagem localmente (o senhor precisa ter o daemon do Docker em execução):

build -t serve_sd .

A construção da imagem levará de 20 a 30 minutos; a fase de construção é longa porque os pesos do modelo precisam ser copiados dentro da imagem antes de serem empacotados pelo arquivador de modelos.

O senhor pode executar um contêiner do docker e escutar na porta 7080 com:

docker run -p 7080:7080 serve_sd

Para verificar se tudo está funcionando corretamente, o senhor 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.

Implementação no Vertex AI

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

  • Crie a imagem usando o Cloud Build dentro do registro de contêineres do Google (gcr)
  • Faça o upload da imagem do nosso modelo personalizado dentro do registro de modelos do Vertex AI

  • Criar um ponto de extremidade Vertex AI
  • Anexar o modelo ao endpoint

Isso é exatamente o que o deploy.sh o script bash vai fazer, o senhor 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 o Cloud Build pode levar de alguns minutos a horas, dependendo da velocidade de sua internet
  • A criação 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 conexão do modelo ao endpoint leva de 30 a 40 minutos

Depois que o modelo for anexado com êxito ao endpoint, o senhor poderá consultar o endpoint com o seguinte código:

from google.cloud import aiplatform as aip

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

def query_endpoint(endpoint, text_input):
carga útil =
response = endpoint.predict(instances=[payload])
resposta de retorno

image = query_endpoint(endpoint, text_input)

Uma garrafa de conhaque envelhecido e exclusivo em uma superfície reflexiva, em frente a um bar vibrante, hiperdetalhado, 4K, bokeh - Stable Diffusion 1.5

A inferência deve levar entre 10 e 15 segundos na GPU T4. O senhor pode aumentar a velocidade escolhendo uma GPU melhor e pode alterar a variável ACCELERATOR_TYPE dentro do deploy.sh.

Opcional: se o tamanho da imagem for muito grande para o endpoint ou se o senhor quiser armazenar o histórico da imagem.

Talvez o senhor queira acompanhar o histórico das imagens ou esteja tendo erros devido ao limite de tamanho de 1,5 MB para a resposta do endpoint. Nesse caso, recomendo que o senhor use o método de pós-processamento do manipulador para salvar a imagem dentro do GCS e retornar apenas o caminho do GCS da imagem.

Felizmente, já preparei um manipulador que faz exatamente isso para o senhor, mudando de stable_diffusion_handler.py para stable_diffusion_handler_gcs.py deve resolver o problema.

AVISO: Antes de executar a implantação com o novo manipulador, o senhor precisa:

  • Criar um bucket GCS que armazenará as imagens

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

  • Altere a conta de serviço usada pelo endpoint dentro do arquivo deploy.sh. O senhor precisa de uma conta de serviço com permissões de GCS OWNER.

Conclusão

Neste artigo, foi fornecido um guia abrangente para a implantação do modelo Stable Diffusion no Google Cloud Platform usando o Vertex AI.

O guia abrangeu etapas essenciais, como

  • Usando o TorchServe para implantação
  • Criação e modificação de um manipulador personalizado para Stable Diffusion
  • Implementação do modelo usando o Vertex Model Registry e o Vertex Endpoints

É importante lembrar que, embora o Vertex endpoint possa ser uma solução eficaz, ele não oferece suporte ao dimensionamento para 0 instâncias, o que pode levar a um aumento nos custos, pois a GPU continua em uso.

Além disso, com a implantação do modelo Stable Diffusion concluída, estamos explorando outras possibilidades, como o ajuste fino do modelo em produtos específicos da Moet Hennessy para aprimorar ainda mais os recursos do modelo.

Média Blog por Artefact.

Este artigo foi publicado inicialmente no Medium.com.
Siga-nos em nosso Medium Blog !