Esegui più modelli di intelligenza artificiale generativa su GPU utilizzando endpoint multimodello Amazon SageMaker con TorchServe e risparmia fino al 75% sui costi di inferenza | Servizi Web di Amazon

Nodo di origine: 2866306

Gli endpoint multimodello (MME) sono una potente funzionalità di Amazon Sage Maker progettato per semplificare l'implementazione e il funzionamento dei modelli di machine learning (ML). Con gli MME, puoi ospitare più modelli su un unico contenitore di servizio e ospitare tutti i modelli dietro un singolo endpoint. La piattaforma SageMaker gestisce automaticamente il carico e lo scarico dei modelli e dimensiona le risorse in base ai modelli di traffico, riducendo l'onere operativo derivante dalla gestione di una grande quantità di modelli. Questa funzionalità è particolarmente utile per il deep learning e i modelli di intelligenza artificiale generativa che richiedono elaborazione accelerata. Il risparmio sui costi ottenuto attraverso la condivisione delle risorse e la gestione semplificata dei modelli rende gli MME SageMaker una scelta eccellente per ospitare modelli su larga scala su AWS.

Recentemente, le applicazioni di intelligenza artificiale generativa hanno catturato l’attenzione e l’immaginazione diffuse. I clienti desiderano implementare modelli di intelligenza artificiale generativa sulle GPU ma allo stesso tempo sono consapevoli dei costi. Gli MME SageMaker supportano le istanze GPU e rappresentano un'ottima opzione per questi tipi di applicazioni. Oggi siamo lieti di annunciare il supporto TorchServe per gli MME SageMaker. Questo nuovo modello di supporto server ti offre il vantaggio di tutti i vantaggi degli MME pur utilizzando lo stack di servizio con cui i clienti TorchServe hanno più familiarità. In questo post, dimostriamo come ospitare modelli di intelligenza artificiale generativa, come Stable Diffusion e Segment Anything Model, su MME SageMaker utilizzando TorchServe e creare una soluzione di editing guidata dal linguaggio che può aiutare artisti e creatori di contenuti a sviluppare e iterare le loro opere d'arte più velocemente.

Panoramica della soluzione

La modifica guidata dal linguaggio è un caso d'uso comune dell'intelligenza artificiale generativa in tutti i settori. Può aiutare gli artisti e i creatori di contenuti a lavorare in modo più efficiente per soddisfare la domanda di contenuti automatizzando le attività ripetitive, ottimizzando le campagne e fornendo un'esperienza iper-personalizzata per il cliente finale. Le aziende possono trarre vantaggio da una maggiore produzione di contenuti, risparmi sui costi, migliore personalizzazione e migliore esperienza del cliente. In questo post, dimostriamo come creare funzionalità di modifica assistita dal linguaggio utilizzando MME TorchServe che ti consentono di cancellare qualsiasi oggetto indesiderato da un'immagine e modificare o sostituire qualsiasi oggetto in un'immagine fornendo un'istruzione di testo.

Il flusso dell'esperienza utente per ciascun caso d'uso è il seguente:

  • Per rimuovere un oggetto indesiderato, seleziona l'oggetto dall'immagine per evidenziarlo. Questa azione invia le coordinate dei pixel e l'immagine originale a un modello di intelligenza artificiale generativa, che genera una maschera di segmentazione per l'oggetto. Dopo aver confermato la corretta selezione dell'oggetto, è possibile inviare le immagini originali e mascherate a un secondo modello per la rimozione. L'illustrazione dettagliata di questo flusso utente è illustrata di seguito.
ML-14465-cane-clic

Passo 1: Seleziona un oggetto ("cane") dall'immagine

Passo 2: Confermare che sia evidenziato l'oggetto corretto

Passo 3: Cancella l'oggetto dall'immagine

  • Per modificare o sostituire un oggetto, selezionare ed evidenziare l'oggetto desiderato, seguendo lo stesso procedimento descritto sopra. Una volta confermata la corretta selezione dell'oggetto, è possibile modificare l'oggetto fornendo l'immagine originale, la maschera e un messaggio di testo. Il modello modificherà quindi l'oggetto evidenziato in base alle istruzioni fornite. Un'illustrazione dettagliata di questo secondo flusso utente è la seguente.

Passo 1: Seleziona un oggetto ("vaso") dall'immagine

Passo 2: Confermare che sia evidenziato l'oggetto corretto

Passo 3: Fornire un messaggio di testo ("vaso futuristico") per modificare l'oggetto

Per alimentare questa soluzione, utilizziamo tre modelli di intelligenza artificiale generativa: Segment Anything Model (SAM), Large Mask Inpainting Model (LaMa) e Stable Diffusion Inpaint (SD). Ecco come questi modelli sono stati utilizzati nel flusso di lavoro dell'esperienza utente:

Per rimuovere un oggetto indesiderato Per modificare o sostituire un oggetto
  1. Segment Anything Model (SAM) viene utilizzato per generare una maschera di segmenti dell'oggetto di interesse. Sviluppato da Meta Research, SAM è un modello open source in grado di segmentare qualsiasi oggetto in un'immagine. Questo modello è stato addestrato su un enorme set di dati noto come SA-1B, che comprende oltre 11 milioni di immagini e 1.1 miliardi di maschere di segmentazione. Per ulteriori informazioni su SAM, fare riferimento al loro sito web ed documento di ricerca.
  2. LaMa viene utilizzato per rimuovere eventuali oggetti indesiderati da un'immagine. LaMa è un modello GAN (Generative Adversarial Network) specializzato nel riempire parti mancanti di immagini utilizzando maschere irregolari. L'architettura del modello incorpora un contesto globale a livello di immagine e un'architettura a passaggio singolo che utilizza le convoluzioni di Fourier, consentendo di ottenere risultati all'avanguardia a una velocità maggiore. Per maggiori dettagli su LaMa, visita il loro sito web ed documento di ricerca.
  3. Il modello inpaint SD 2 di Stability AI viene utilizzato per modificare o sostituire oggetti in un'immagine. Questo modello ci consente di modificare l'oggetto nell'area della maschera fornendo un messaggio di testo. Il modello inpaint si basa sul modello SD da testo a immagine, che può creare immagini di alta qualità con un semplice messaggio di testo. Fornisce argomenti aggiuntivi come immagini originali e maschere, consentendo una rapida modifica e ripristino del contenuto esistente. Per ulteriori informazioni sui modelli di diffusione stabile su AWS, fare riferimento a Crea immagini di alta qualità con modelli di diffusione stabile e distribuiscile in modo conveniente con Amazon SageMaker.

Tutti e tre i modelli sono ospitati su MME SageMaker, il che riduce il carico operativo derivante dalla gestione di più endpoint. In aggiunta a ciò, l’utilizzo di MME elimina le preoccupazioni relative al sottoutilizzo di alcuni modelli perché le risorse sono condivise. Puoi osservare il vantaggio derivante da una migliore saturazione delle istanze, che in definitiva porta a un risparmio sui costi. Il seguente diagramma dell'architettura illustra come vengono serviti tutti e tre i modelli utilizzando gli MME SageMaker con TorchServe.

Abbiamo pubblicato il codice per implementare questa architettura di soluzione nel ns Repository GitHub. Per seguire il resto del post, utilizzare il file notebook. Si consiglia di eseguire questo esempio su un'istanza notebook SageMaker utilizzando il file conda_python3 (Python 3.10.10).

Estendi il contenitore TorchServe

Il primo passaggio consiste nel preparare il contenitore di hosting del modello. SageMaker fornisce un PyTorch Deep Learning Container (DLC) gestito che puoi recuperare utilizzando il seguente snippet di codice:

# Use SageMaker PyTorch DLC as base image
baseimage = sagemaker.image_uris.retrieve( framework="pytorch", region=region, py_version="py310", image_scope="inference", version="2.0.0", instance_type="ml.g5.2xlarge",
)
print(baseimage)

Poiché i modelli richiedono risorse e pacchetti aggiuntivi che non sono presenti nel DLC PyTorch di base, è necessario creare un'immagine Docker. Questa immagine viene quindi caricata su Registro dei contenitori Amazon Elastic (Amazon ECR) in modo da poter accedere direttamente da SageMaker. Le librerie installate personalizzate sono elencate nel file Docker:

ARG BASE_IMAGE FROM $BASE_IMAGE #Install any additional libraries
RUN pip install segment-anything-py==1.0
RUN pip install opencv-python-headless==4.7.0.68
RUN pip install matplotlib==3.6.3
RUN pip install diffusers
RUN pip install tqdm
RUN pip install easydict
RUN pip install scikit-image
RUN pip install xformers
RUN pip install tensorflow
RUN pip install joblib
RUN pip install matplotlib
RUN pip install albumentations==0.5.2
RUN pip install hydra-core==1.1.0
RUN pip install pytorch-lightning
RUN pip install tabulate
RUN pip install kornia==0.5.0
RUN pip install webdataset
RUN pip install omegaconf==2.1.2
RUN pip install transformers==4.28.1
RUN pip install accelerate
RUN pip install ftfy

Esegui il file di comandi della shell per creare l'immagine personalizzata localmente ed inviarla ad Amazon ECR:

%%capture build_output reponame = "torchserve-mme-demo"
versiontag = "genai-0.1" # Build our own docker image
!cd workspace/docker && ./build_and_push.sh {reponame} {versiontag} {baseimage} {region} {account}

Preparare gli artefatti del modello

La differenza principale per i nuovi MME con supporto TorchServe è il modo in cui prepari gli artefatti del modello. Il repository del codice fornisce una cartella scheletro per ciascun modello (cartella models) per ospitare i file richiesti per TorchServe. Seguiamo lo stesso processo in quattro fasi per preparare ciascun modello .tar file. Il codice seguente è un esempio della cartella scheletro per il modello SD:

workspace
|--sd |-- custom_handler.py |-- model-config.yaml

Il primo passaggio consiste nel scaricare i checkpoint del modello preaddestrato nella cartella dei modelli:

import diffusers
import torch
import transformers pipeline = diffusers.StableDiffusionInpaintPipeline.from_pretrained( "stabilityai/stable-diffusion-2-inpainting", torch_dtype=torch.float16
) sd_dir = "workspace/sd/model"
pipeline.save_pretrained(sd_dir)

Il passo successivo è definire a custom_handler.py file. Ciò è necessario per definire il comportamento del modello quando riceve una richiesta, ad esempio il caricamento del modello, la preelaborazione dell'input e la postelaborazione dell'output. IL handle Il metodo è il punto di ingresso principale per le richieste e accetta un oggetto richiesta e restituisce un oggetto risposta. Carica i checkpoint del modello preaddestrato e applica il file preprocess ed postprocess metodi per i dati di input e di output. Il seguente frammento di codice illustra una struttura semplice del file custom_handler.py file. Per maggiori dettagli, fare riferimento a API del gestore TorchServe.

def initialize(self, ctx: Context): def preprocess(self, data): def inference(self, data): def handle(self, data, context): requests = self.preprocess(data) responses = self.inference(requests) return responses

L'ultimo file richiesto per TorchServe è model-config.yaml. Il file definisce la configurazione del server modello, come il numero di lavoratori e la dimensione del batch. La configurazione è a livello di modello e un file di configurazione di esempio è mostrato nel codice seguente. Per un elenco completo dei parametri, fare riferimento a Repository GitHub.

minWorkers: 1
maxWorkers: 1
batchSize: 1
maxBatchDelay: 200
responseTimeout: 300

Il passaggio finale consiste nel comprimere tutti gli artefatti del modello in un singolo file .tar.gz utilizzando il file .tar.gz torch-model-archiver modulo:

!torch-model-archiver --model-name sd --version 1.0 --handler workspace/sd/custom_handler.py --extra-files workspace/sd/model --config-file workspace/sam/model-config.yaml --archive-format no-archive!cd sd && tar cvzf sd.tar.gz .

Creare l'endpoint multimodello

I passaggi per creare un MME SageMaker sono gli stessi di prima. In questo esempio particolare, avvii un endpoint utilizzando SageMaker SDK. Inizia definendo un Servizio di archiviazione semplice Amazon (Amazon S3) e il contenitore di hosting. Questa posizione S3 è dove SageMaker caricherà dinamicamente i modelli in base ai modelli di invocazione. Il contenitore di hosting è il contenitore personalizzato che hai creato e inviato ad Amazon ECR nella fase precedente. Vedere il seguente codice:

# This is where our MME will read models from on S3.
multi_model_s3uri = output_path

Quindi vuoi definire a MulitDataModel che cattura tutti gli attributi come la posizione del modello, il contenitore di hosting e l'accesso alle autorizzazioni:

print(multi_model_s3uri)
model = Model( model_data=f"{multi_model_s3uri}/sam.tar.gz", image_uri=container, role=role, sagemaker_session=smsess, env={"TF_ENABLE_ONEDNN_OPTS": "0"},
) mme = MultiDataModel( name="torchserve-mme-genai-" + datetime.now().strftime("%Y-%m-%d-%H-%M-%S"), model_data_prefix=multi_model_s3uri, model=model, sagemaker_session=smsess,
)
print(mme)

Il deploy() la funzione crea una configurazione di endpoint e ospita l'endpoint:

mme.deploy( initial_instance_count=1, instance_type="ml.g5.2xlarge", serializer=sagemaker.serializers.JSONSerializer(), deserializer=sagemaker.deserializers.JSONDeserializer(),
)

Nell'esempio fornito mostriamo anche come elencare i modelli e aggiungere dinamicamente nuovi modelli utilizzando l'SDK. IL add_model() la funzione copia il modello locale .tar file nella posizione MME S3:

# Only sam.tar.gz visible!
list(mme.list_models()) models = ["sd/sd.tar.gz", "lama/lama.tar.gz"]
for model in models: mme.add_model(model_data_source=model)

Invocare i modelli

Ora che abbiamo tutti e tre i modelli ospitati su un MME, possiamo richiamare ciascun modello in sequenza per creare le nostre funzionalità di modifica assistita dal linguaggio. Per richiamare ciascun modello, fornire a target_model parametro nel predictor.predict() funzione. Il nome del modello è solo il nome del modello .tar file che abbiamo caricato. Quello che segue è un frammento di codice di esempio per il modello SAM che accetta una coordinata di pixel, un'etichetta di punto e una dimensione del kernel dilatata e genera una maschera di segmentazione dell'oggetto nella posizione del pixel:

img_file = "workspace/test_data/sample1.png"
img_bytes = None with Image.open(img_file) as f: img_bytes = encode_image(f) gen_args = json.dumps(dict(point_coords=[750, 500], point_labels=1, dilate_kernel_size=15)) payload = json.dumps({"image": img_bytes, "gen_args": gen_args}).encode("utf-8") response = predictor.predict(data=payload, target_model="/sam.tar.gz")
encoded_masks_string = json.loads(response.decode("utf-8"))["generated_image"]
base64_bytes_masks = base64.b64decode(encoded_masks_string) with Image.open(io.BytesIO(base64_bytes_masks)) as f: generated_image_rgb = f.convert("RGB") generated_image_rgb.show()

Per rimuovere un oggetto indesiderato da un'immagine, prendi la maschera di segmentazione generata da SAM e inseriscila nel modello LaMa con l'immagine originale. Le immagini seguenti mostrano un esempio.

Sample image

Maschera di segmentazione da SAM

Cancella il cane usando LaMa

Per modificare o sostituire qualsiasi oggetto in un'immagine con un messaggio di testo, prendi la maschera di segmentazione da SAM e inseriscila nel modello SD con l'immagine originale e il messaggio di testo, come mostrato nell'esempio seguente.

Sample image

Maschera di segmentazione da SAM

Sostituisci utilizzando il modello SD con un messaggio di testo

“un criceto su una panchina”

Risparmio sui costi

I vantaggi degli MME SageMaker aumentano in base alla portata del consolidamento del modello. La tabella seguente mostra l'utilizzo della memoria della GPU dei tre modelli in questo post. Sono schierati su uno g5.2xlarge esempio utilizzando un SageMaker MME.

Modello Memoria GPU (MiB)
Segmenta qualsiasi modello 3,362
Diffusione stabile nella vernice 3,910
Lama 852

Puoi notare un risparmio sui costi quando si ospitano i tre modelli con un unico endpoint e, per i casi d'uso con centinaia o migliaia di modelli, il risparmio è molto maggiore.

Ad esempio, considera 100 modelli di diffusione stabile. Ciascuno dei modelli da solo potrebbe essere servito da un ml.g5.2xlarge endpoint (4 GiB di memoria), con un costo di $ 1.52 per istanza all'ora nella regione degli Stati Uniti orientali (Virginia settentrionale). Fornire tutti i 100 modelli utilizzando il proprio endpoint costerebbe 218,880 dollari al mese. Con un MME SageMaker, un singolo endpoint utilizzando ml.g5.2xlarge le istanze possono ospitare quattro modelli contemporaneamente. Ciò riduce i costi di inferenza della produzione del 75% a soli $ 54,720 al mese. La tabella seguente riepiloga le differenze tra endpoint a modello singolo e multimodello per questo esempio. Data una configurazione dell'endpoint con memoria sufficiente per i modelli di destinazione, la latenza di chiamata allo stato stazionario dopo che tutti i modelli sono stati caricati sarà simile a quella di un endpoint a modello singolo.

. Endpoint a modello singolo Endpoint multimodello
Prezzo totale dell'endpoint al mese $218,880 $54,720
Tipo di istanza dell'endpoint ml.g5.2xgrande ml.g5.2xgrande
Capacità di memoria della CPU (GiB) 32 32
Capacità di memoria della GPU (GiB) 24 24
Prezzo dell'endpoint all'ora $1.52 $1.52
Numero di istanze per endpoint 2 2
Endpoint necessari per 100 modelli 100 25

ripulire

Al termine, seguire le istruzioni nella sezione di pulizia del notebook per eliminare le risorse fornite in questo post per evitare addebiti non necessari. Fare riferimento a Prezzi di Amazon SageMaker per i dettagli sul costo delle istanze di inferenza.

Conclusione

Questo post dimostra le funzionalità di modifica assistita dal linguaggio rese possibili attraverso l'uso di modelli di intelligenza artificiale generativa ospitati su MME SageMaker con TorchServe. L'esempio che abbiamo condiviso illustra come possiamo utilizzare la condivisione delle risorse e la gestione semplificata dei modelli con gli MME SageMaker continuando a utilizzare TorchServe come stack di presentazione dei modelli. Abbiamo utilizzato tre modelli di base del deep learning: SAM, SD 2 Inpainting e LaMa. Questi modelli ci consentono di sviluppare potenti funzionalità, come cancellare qualsiasi oggetto indesiderato da un'immagine e modificare o sostituire qualsiasi oggetto in un'immagine fornendo un'istruzione testuale. Queste funzionalità possono aiutare gli artisti e i creatori di contenuti a lavorare in modo più efficiente e a soddisfare le loro richieste di contenuti automatizzando attività ripetitive, ottimizzando le campagne e fornendo un'esperienza iper-personalizzata. Ti invitiamo a esplorare l'esempio fornito in questo post e a creare la tua esperienza di interfaccia utente utilizzando TorchServe su un MME SageMaker.

Per iniziare, vedi Algoritmi, framework e istanze supportati per endpoint multimodello che utilizzano istanze supportate da GPU.


Circa gli autori

Giacomo Wu è un Senior AI/ML Specialist Solution Architect presso AWS. aiutare i clienti a progettare e realizzare soluzioni AI/ML. Il lavoro di James copre un'ampia gamma di casi d'uso di ML, con un interesse primario per la visione artificiale, il deep learning e la scalabilità del ML in tutta l'azienda. Prima di entrare in AWS, James è stato architetto, sviluppatore e leader tecnologico per oltre 10 anni, di cui 6 in ingegneria e 4 anni nei settori del marketing e della pubblicità.

Li NingLi Ning è un ingegnere informatico senior presso AWS con una specializzazione nella creazione di soluzioni AI su larga scala. In qualità di responsabile tecnologico per TorchServe, un progetto sviluppato congiuntamente da AWS e Meta, la sua passione risiede nello sfruttare PyTorch e AWS SageMaker per aiutare i clienti ad abbracciare l'intelligenza artificiale per il bene comune. Al di fuori dei suoi impegni professionali, a Li piace nuotare, viaggiare, seguire gli ultimi progressi tecnologici e trascorrere del tempo di qualità con la sua famiglia.

Ankith GunapalAnkith Gunapal è un ingegnere partner AI presso Meta (PyTorch). È appassionato di ottimizzazione dei modelli e di model service, con un'esperienza che spazia dalla verifica RTL, al software incorporato, alla visione artificiale, a PyTorch. Ha conseguito un Master in Data Science e un Master in Telecomunicazioni. Al di fuori del lavoro, Ankith è anche un produttore di musica dance elettronica.

Saurabh Trikande è un Senior Product Manager per Amazon SageMaker Inference. È appassionato di lavorare con i clienti ed è motivato dall'obiettivo di democratizzare l'apprendimento automatico. Si concentra sulle sfide principali relative all'implementazione di applicazioni ML complesse, modelli ML multi-tenant, ottimizzazioni dei costi e rendere più accessibile l'implementazione di modelli di deep learning. Nel tempo libero, Saurabh ama fare escursioni, conoscere tecnologie innovative, seguire TechCrunch e trascorrere del tempo con la sua famiglia.

Subhash TalluriSubhash Talluri è un architetto capo delle soluzioni AI/ML della business unit Telecom Industry di Amazon Web Services. È stato alla guida dello sviluppo di soluzioni AI/ML innovative per clienti e partner di telecomunicazioni in tutto il mondo. Porta competenze interdisciplinari in ingegneria e informatica per contribuire a creare soluzioni AI/ML scalabili, sicure e conformi tramite architetture ottimizzate per il cloud su AWS.

Timestamp:

Di più da Apprendimento automatico di AWS