stable_diffusion.openvino – imagens geradas por IA num LXC container sem a necessidade de GPU

Olá a todos.

A menos que tenham vivido em marte nos últimos tempos, já devem conhecer o impacto positivo (e as vezes negativo) da IA.
Um dos campos onde este impacto tem sido notado, é precisamente no campo da arte. Soluções como o Dall-E, Midjourney e como o Stable Difusion tem sido particularmente discutidos e debatidos.
Todos eles, desde os pagos aos gratuitos, tem por base a necessidade de computação maciça, largura de banda de memória e capacidade de uma placa gráfica de ultima geração, cara, e pouco disponível em alguns casos.

Assim sendo, os autores do stable_diffusion.openvino fizeram um fork que embora perca algo em termos de velocidade para as versões com GPU (lembram-se da largura de banda e multitude de cuda cores?) em termos práticos, conseguem a mesma produzir coisas interessantes em termos gráficos. Este é um post sobre como instalar o produto num container lxc.

O que é o stable_diffusion?

Training Stable Diffusion Models

O stable_diffusion refere-se a uma técnica específica de machine learning, mais precisamente em modelos gerativos. No contexto do machine learning, a difusão estável (stable diffusion) é uma abordagem para gerar amostras de dados complexos e de alta qualidade.

O stable_diffusion é frequentemente utilizado em modelos generativos probabilísticos, nos quais o objetivo é aprender a distribuição de probabilidade subjacente aos dados. Ele difere de outras técnicas de geração de dados, como GANs (Redes Generativas Adversariais) e VAEs (Variational Autoencoders), e tem sido explorada para melhorar a qualidade das amostras geradas.

O conceito básico da difusão estável envolve um processo iterativo em que uma amostra inicial é modificada gradualmente até se assemelhar à distribuição desejada. Esse processo é “estável” no sentido de que as mudanças são controladas para evitar que o modelo saia de uma região plausível do espaço de dados.

Quanto ao projeto específico mencionado , é uma implementação ou extensão que integra o stable_diffusion com o OpenVINO. O OpenVINO é uma ferramenta da Intel projetada para otimizar e acelerar a implementação de modelos de inteligência artificial em hardware específico da Intel, como CPUs, GPUs e FPGAs (embora seja compatível com processadores AMD e equivalentes)

Para obter mais informações mais precisas sobre o stable_diffusion e o projeto stable_diffusion.openvino, recomendo lerem a documentação oficial do projeto no GitHub, mas num ponto de vista bird’s eye isto é o projeto suporta e efetua muito bem:

  • Txt2img/img2img
  • Negative prompts
  • Prompt queueing
  • Upscaling
  • Waifu Diffusion support

E se estás interessado em explorar o poder do Stable Diffusion com o OpenVINO, estás no lugar certo! Este guia abrangente irá nos ajudar através do processo de instalação e utilização do stable_diffusion.openvino. Certifiquem-se de seguir cada passo com muita atenção para obter os resultados desejados.

Pré-requisitos:

Para este caso especifico instalei um opensuse tumbleweed – build de 122023 – como plataforma num lxc container, com os seguintes requisitos de hardware e software:

Python 3.9.+ (incluído e deployed pelo  Miniconda).
CPU compatível com o OpenVINO (a maior parte suporta).
8gb RAM (quase não chega e irá causar swapping e lentidão. 24gb ou mais de ram recomendado).

Preparação do container após instalado:

zypper install gcc git libX11-6 libvulkan1 Mesa-libGL1 libgthread-2_0-0 unzip

Criem um utilizador que irá correr a vossa instancia de stable_diffusione e executem lá os seguintes passos:

useradd ai

Instalação do Python Virtual Environment / Conga:

Como é obvio, iremos ainda ter de instalar alguns componentes extras relacionados com python. Para isto escolhi criar um ambiente com o conga:

mkdir -p ~/miniconda3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm -rf ~/miniconda3/miniconda.sh

Em seguida, activar o conga:

~/miniconda3/bin/conda init bash
~/miniconda3/bin/conda init zsh

Sair e voltar a entrar na sessão de consola para o utilizador criado anteriormente:

su - ai

Em seguida, descarregar o feature branch desde o git:

git clone https://github.com/bes-dev/stable_diffusion.openvino.git

E procede-se a instalação dos pré-requisitos:

cd stable_diffusion.openvino
conda create --name vin python=3.9 pip
conda activate vin
conda install pip
pip install -r requirements.txt
pip install Pillow pyyaml sv-ttk

Aguardar durante algum tempo para que todas as instalações das dependencias estejam completadas.

Utilizando o Stable Diffusion OpenVINO:

Agora que está tudo instalado e configurado, estamos prontos para utilizar o stable_diffusion.openvino. Certifiquem-se de fornecer os parâmetros necessários conforme descrito na documentação do projeto. Por exemplo:

 python demo.py --prompt "Street-art painting of Torre de Belem, photorealism"

O resultado foi:

 

Modificando um pouco o nosso prompt:

 python demo.py --prompt "Street-art painting of Torre de Belem, with the sun behind in Monet style. Personalize at will"

Se notarem, a personalização que ele fez foi assinar a foto.
Pedi então, por sugestão, que removesse a personalização por ele efetuada:

python demo.py --prompt "Street-art painting of Torre de Belem, with the sun behind in Monet style. Do not sign your painting"

Lembrem-se que esta geração irá demorar um pouco. Os valores temporais para gerar a imagem são os seguintes:

(Intel(R) Core(TM) i5-8279U) 7.4 s/it 3.59 min
(AMD Ryzen Threadripper 1900X) 5.34 s/it 2.58 min
(Intel(R) Xeon(R) Gold 6154 CPU) 1 s/it 33 s

Lembrem-se, este é apenas um guia básico para começar.
Para obter informações mais detalhadas sobre os parâmetros, funcionalidades e possíveis configurações, consulte a documentação oficial do  disponível no GitHub.

Parabéns! Se chegaram até este ponto com uma imagem gerada, concluíram com sucesso a instalação e utilização do stable_diffusion.openvino. Este é um passo significativo para explorar as capacidades da difusão estável com a eficiência do OpenVINO. Sintam-se à vontade para experimentar e ajustar os parâmetros de acordo com vossas necessidades específicas.
O próximo passo será treinarem novos modelos de machine learning para ir obtendo imagens cada vez mais realistas.
Divirtam-se explorando esse fascinante mundo da inteligência artificial e como sempre, se tiverem duvidas ou reparos, sabem onde me encontrar.

Um abraço
Nuno

Agradecimentos especiais ao Pedro Silva pela ajuda em me fazer compreender alguns conceitos e métodos do software.