Distribuire modelli Hugging Face con BentoML DeepFloyd IF in azione

Distribuire modelli Hugging Face con BentoML DeepFloyd IF

Hugging Face fornisce una piattaforma Hub che ti permette di caricare, condividere e distribuire i tuoi modelli con facilità. Risparmia agli sviluppatori il tempo e le risorse computazionali richieste per addestrare i modelli da zero. Tuttavia, distribuire modelli in un ambiente di produzione reale o in modo nativo per il cloud può ancora presentare sfide.

Ecco dove entra in gioco BentoML. BentoML è una piattaforma open source per il servizio e il deployment di modelli di machine learning. È un framework unificato per la costruzione, la distribuzione e la scalabilità di applicazioni AI pronte per la produzione, che incorporano modelli tradizionali, pre-addestrati e generativi, nonché Large Language Models. Ecco come si utilizza il framework BentoML da una prospettiva ad alto livello:

  1. Definire un modello: Prima di poter utilizzare BentoML, hai bisogno di un modello di machine learning (o più modelli). Questo modello può essere addestrato utilizzando una libreria di machine learning come TensorFlow e PyTorch.
  2. Salvare il modello: Una volta che hai un modello addestrato, salvalo nel BentoML local Model Store, che viene utilizzato per gestire tutti i tuoi modelli addestrati in locale e per accedervi per il servizio.
  3. Creare un BentoML Service: Crei un file service.py per incapsulare il modello e definire la logica di servizio. Specifica i Runners per eseguire l’inferenza del modello su larga scala ed esponi API per definire come elaborare input e output.
  4. Costruire un Bento: Creando un file di configurazione YAML, raggruppi tutti i modelli e il Service in un Bento, un artefatto distribuibile che contiene tutto il codice e le dipendenze.
  5. Deploy del Bento: Una volta che il Bento è pronto, puoi containerizzarlo per creare un’immagine Docker e farla girare su Kubernetes. In alternativa, puoi distribuire il Bento direttamente su Yatai, una soluzione open source e end-to-end per l’automazione e l’esecuzione di deployment di machine learning su Kubernetes su larga scala.

In questo post del blog, mostreremo come integrare DeepFloyd IF con BentoML seguendo il workflow descritto sopra.

Indice

  • Una breve introduzione a DeepFloyd IF
  • Preparare l’ambiente
  • Scaricare il modello nel BentoML Model Store
  • Creare un BentoML Service
  • Costruire e servire un Bento
  • Testare il server
  • Cosa fare dopo

Una breve introduzione a DeepFloyd IF

DeepFloyd IF è un modello di testo-immagine all’avanguardia e open source. Si differenzia dai modelli di diffusione latente come Stable Diffusion per la sua strategia operativa e la sua architettura distintiva.

DeepFloyd IF offre un alto grado di fotorealismo e una sofisticata comprensione del linguaggio. A differenza di Stable Diffusion, DeepFloyd IF lavora direttamente nello spazio dei pixel, sfruttando una struttura modulare che comprende un codificatore di testo congelato e tre moduli di diffusione dei pixel in cascata. Ogni modulo svolge un ruolo unico nel processo: la Fase 1 è responsabile della creazione di un’immagine di base di 64×64 px, che viene quindi progressivamente ingrandita fino a 1024×1024 px nelle Fasi 2 e 3. Un altro aspetto critico dell’unicità di DeepFloyd IF è l’integrazione di un Large Language Model (T5-XXL-1.1) per codificare le richieste, il che offre una comprensione superiore delle richieste complesse. Per ulteriori informazioni, consulta questo post del blog di Stability AI su DeepFloyd IF.

Per assicurarti che la tua applicazione DeepFloyd IF funzioni con alte prestazioni in produzione, potresti voler allocare e gestire le risorse in modo oculato. A questo proposito, BentoML ti consente di scalare i Runners in modo indipendente per ogni Fase. Ad esempio, puoi utilizzare più Pods per i tuoi Runners della Fase 1 o allocare server GPU più potenti per essi.

Preparare l’ambiente

Questo repository GitHub contiene tutti i file necessari per questo progetto. Per eseguire questo progetto in locale, assicurati di avere quanto segue:

  • Python 3.8+
  • pip installato
  • Almeno 2x16GB di VRAM sulla GPU o 1×40 VRAM GPU. Per questo progetto, abbiamo utilizzato una macchina di tipo n1-standard-16 di Google Cloud con 64 GB di RAM e 2 GPU NVIDIA T4. Nota che anche se è possibile eseguire IF su una singola T4, non è consigliato per un servizio di produzione

Una volta soddisfatti i requisiti, clona il repository del progetto sulla tua macchina locale e naviga nella directory di destinazione.

git clone https://github.com/bentoml/IF-multi-GPUs-demo.git
cd IF-multi-GPUs-demo

Prima di compilare l’applicazione, esploriamo brevemente i file chiave all’interno di questa directory:

  • import_models.py: Definisce i modelli per ogni fase di IFPipeline. Utilizzare questo file per scaricare tutti i modelli sul proprio computer locale in modo da poterli raggruppare in un singolo Bento.
  • requirements.txt: Definisce tutti i pacchetti e le dipendenze richieste per questo progetto.
  • service.py: Definisce un servizio BentoML, che contiene tre Runner creati utilizzando il metodo to_runner ed espone un’API per generare immagini. L’API prende un oggetto JSON in input (ad esempio, prompt e prompt negativi) e restituisce un’immagine in output utilizzando una sequenza di modelli.
  • start-server.py: Avvia un server HTTP BentoML attraverso il servizio definito in service.py e crea un’interfaccia web Gradio per consentire agli utenti di inserire prompt per generare immagini.
  • bentofile.yaml: Definisce i metadati del Bento da costruire, inclusi il servizio, i pacchetti Python e i modelli.

Raccomandiamo di creare un ambiente virtuale per l’isolamento delle dipendenze. Ad esempio, eseguire il seguente comando per attivare myenv:

python -m venv venv
source venv/bin/activate

Installare le dipendenze richieste:

pip install -r requirements.txt

Se non hai precedentemente scaricato modelli da Hugging Face tramite la riga di comando, devi effettuare prima l’accesso:

pip install -U huggingface_hub
huggingface-cli login

Scaricando il modello nel BentoML Model Store

Come accennato in precedenza, è necessario scaricare tutti i modelli utilizzati da ogni fase DeepFloyd IF. Una volta configurato l’ambiente, eseguire il seguente comando per scaricare i modelli nel proprio Model store locale. Il processo potrebbe richiedere del tempo.

python import_models.py

Una volta completati i download, visualizzare i modelli nel Model store.

$ bentoml models list

Tag                                                                 Module                Size       Creation Time
sd-upscaler:bb2ckpa3uoypynry                                        bentoml.diffusers     16.29 GiB  2023-07-06 10:15:53
if-stage2:v1.0                                                      bentoml.diffusers     13.63 GiB  2023-07-06 09:55:49
if-stage1:v1.0                                                      bentoml.diffusers     19.33 GiB  2023-07-06 09:37:59

Avvio di un servizio BentoML

È possibile eseguire direttamente il server HTTP BentoML con un’interfaccia utente web tramite Gradio utilizzando il file start-server.py, che è il punto di ingresso di questa applicazione. Fornisce varie opzioni per personalizzare l’esecuzione e gestire l’allocazione della GPU tra le diverse fasi. È possibile utilizzare comandi diversi a seconda della configurazione della GPU:

  • Per una GPU con più di 40 GB di VRAM, eseguire tutti i modelli sulla stessa GPU.

    python start-server.py
  • Per due Tesla T4 con 15 GB di VRAM ciascuna, assegnare il modello della Fase 1 alla prima GPU e i modelli della Fase 2 e Fase 3 alla seconda GPU.

    python start-server.py --stage1-gpu=0 --stage2-gpu=1 --stage3-gpu=1
  • Per una Tesla T4 con 15 GB di VRAM e due GPU aggiuntive con dimensioni di VRAM più piccole, assegnare il modello della Fase 1 a T4 e i modelli della Fase 2 e Fase 3 alla seconda e terza GPU rispettivamente.

    python start-server.py --stage1-gpu=0 --stage2-gpu=1 --stage3-gpu=2

Per visualizzare tutte le opzioni personalizzabili (come la porta del server), eseguire:

python start-server.py --help

Testare il server

Una volta che il server si avvia, puoi visitare l’interfaccia web all’indirizzo http://localhost:7860. L’endpoint dell’API di BentoML è anche accessibile all’indirizzo http://localhost:3000. Ecco un esempio di un prompt e un prompt negativo.

Prompt:

arancio e nero, primo piano di una donna in piedi sotto dei lampioni, tema scuro, Frank Miller, cinema, ultra realistico, atmosfera, dettagli estremamente dettagliati e complessi, iper realistico, risoluzione 8k, fotorealistico, altamente strutturato, dettagli intricati

Prompt negativo:

piastrellatura, mani disegnate male, piedi disegnati male, volto disegnato male, fuori dal frame, mutazione, mutato, arti extra, gambe extra, braccia extra, deformata, deforme, strabismo, corpo fuori dal frame, sfocato, arte scadente, anatomia scadente, sfocato, testo, watermark, granuloso

Risultato:

Creazione e servizio di un Bento

Ora che hai eseguito correttamente DeepFloyd IF in locale, puoi confezionarlo in un Bento eseguendo il seguente comando nella directory del progetto.

$ bentoml build

Conversione di 'IF-stage1' in minuscolo: 'if-stage1'.
Conversione di 'IF-stage2' in minuscolo: 'if-stage2'.
Conversione di DeepFloyd-IF in minuscolo: deepfloyd-if.
Creazione del servizio BentoML "deepfloyd-if:6ufnybq3vwszgnry" dal contesto di build "/Users/xxx/Documents/github/IF-multi-GPUs-demo".
Confezionamento del modello "sd-upscaler:bb2ckpa3uoypynry"
Confezionamento del modello "if-stage1:v1.0"
Confezionamento del modello "if-stage2:v1.0"
Blocco delle versioni del pacchetto PyPI.

██████╗░███████╗███╗░░██╗████████╗░█████╗░███╗░░░███╗██╗░░░░░
██╔══██╗██╔════╝████╗░██║╚══██╔══╝██╔══██╗████╗░████║██║░░░░░
██████╦╝█████╗░░██╔██╗██║░░░██║░░░██║░░██║██╔████╔██║██║░░░░░
██╔══██╗██╔══╝░░██║╚████║░░░██║░░░██║░░██║██║╚██╔╝██║██║░░░░░
██████╦╝███████╗██║░╚███║░░░██║░░░╚█████╔╝██║░╚═╝░██║███████╗
╚═════╝░╚══════╝╚═╝░░╚══╝░░░╚═╝░░░░╚════╝░╚═╝░░░░░╚═╝╚══════╝

Bento costruito con successo (tag="deepfloyd-if:6ufnybq3vwszgnry").

Visualizza il Bento nel Bento Store locale.

$ bentoml list

Tag                               Dimensione  Data di creazione
deepfloyd-if:6ufnybq3vwszgnry     49.25 GiB   2023-07-06 11:34:52

Il Bento è ora pronto per il servizio in produzione.

bentoml serve deepfloyd-if:6ufnybq3vwszgnry

Per distribuire il Bento in modo più nativo per il cloud, genera un’immagine Docker eseguendo il seguente comando:

bentoml containerize deepfloyd-if:6ufnybq3vwszgnry

Puoi quindi distribuire il modello su Kubernetes.

Quali sono i prossimi passi?

BentoML fornisce un modo potente e semplice per distribuire modelli Hugging Face per la produzione. Con il suo supporto per una vasta gamma di framework di ML e API facili da usare, puoi mettere in produzione il tuo modello in poco tempo. Che tu stia lavorando con il modello DeepFloyd IF o qualsiasi altro modello nell’Hugging Face Model Hub, BentoML può aiutarti a dare vita ai tuoi modelli.

Controlla le risorse seguenti per vedere cosa puoi costruire con BentoML e i suoi strumenti ecosistema, e resta sintonizzato per ulteriori informazioni su BentoML.

  • OpenLLM – Una piattaforma aperta per l’operazione di Large Language Models (LLMs) in produzione.
  • StableDiffusion – Crea il tuo servizio di testo-immagine con qualsiasi modello di diffusione.
  • Transformer NLP Service – API di inferenza online per modelli di Transformer NLP.
  • Unisciti alla comunità BentoML su Slack.
  • Seguici su Twitter e LinkedIn.