Esplorazione dei possibili casi d'uso di Phi-3-Vision, un MLLM piccolo ma potente che può essere eseguito localmente (con esempi di codice)
Microsoft ha recentemente rilasciato Phi-3, un potente modello linguistico, con una nuova variante Vision-Language chiamata Phi-3-vision-128k-instruct. Questo modello con parametri 4B ha ottenuto risultati impressionanti sui benchmark pubblici, superando addirittura GPT-4V in alcuni casi e surclassando Gemini 1.0 Pro V in tutto tranne MMMU.
Questo post del blog esplorerà come utilizzare Phi-3-vision-128k-instruct come un robusto modello di visione e testo nel tuo kit di strumenti per la scienza dei dati. Dimostreremo le sue capacità attraverso vari casi d'uso, tra cui:
- Riconoscimento ottico dei caratteri (OCR)
- Didascalie delle immagini
- Analisi della tabella
- Figura Comprensione
- Comprensione della lettura di documenti digitalizzati
- Richiesta set di contrassegni
Inizieremo fornendo un semplice frammento di codice per eseguire questo modello localmente utilizzando trasformatori e bit e byte. Quindi, mostreremo un esempio per ciascuno dei casi d'uso elencati sopra.
Esecuzione del modello localmente:
Crea un ambiente Conda Python e installa Torch e altre dipendenze Python:
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
pip install git+https://github.com/huggingface/transformers.git@60bb571e993b7d73257fb64044726b569fef9403 pillow==10.3.0 chardet==5.2.0 flash_attn==2.5.8 accelerate==0.30.1 bitsandbytes==0.43.1
Quindi, possiamo eseguire questo script:
# Example inspired from https://huggingface.co/microsoft/Phi-3-vision-128k-instruct# Import necessary libraries
from PIL import Image
import requests
from transformers import AutoModelForCausalLM
from transformers import AutoProcessor
from transformers import BitsAndBytesConfig
import torch
# Define model ID
model_id = "microsoft/Phi-3-vision-128k-instruct"
# Load processor
processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True)
# Define BitsAndBytes configuration for 4-bit quantization
nf4_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_use_double_quant=True,
bnb_4bit_compute_dtype=torch.bfloat16,
)
# Load model with 4-bit quantization and map to CUDA
model = AutoModelForCausalLM.from_pretrained(
model_id,
device_map="cuda",
trust_remote_code=True,
torch_dtype="auto",
quantization_config=nf4_config,
)
# Define initial chat message with image placeholder
messages = ({"role": "user", "content": "<|image_1|>\nWhat is shown in this image?"})
# Download image from URL
url = "https://images.unsplash.com/photo-1528834342297-fdefb9a5a92b?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&dl=roonz-nl-vjDbHCjHlEY-unsplash.jpg&w=640"
image = Image.open(requests.get(url, stream=True).raw)
# Prepare prompt with image token
prompt = processor.tokenizer.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True
)
# Process prompt and image for model input
inputs = processor(prompt, (image), return_tensors="pt").to("cuda:0")
# Generate text response using model
generate_ids = model.generate(
**inputs,
eos_token_id=processor.tokenizer.eos_token_id,
max_new_tokens=500,
do_sample=False,
)
# Remove input tokens from generated response
generate_ids = generate_ids(:, inputs("input_ids").shape(1) :)
# Decode generated IDs to text
response = processor.batch_decode(
generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False
)(0)
# Print the generated response
print(response)
Questo codice caricherà il modello Phi-3 come faremmo con qualsiasi altro transfomers
modello. Noi aggiungiamo bitsandbytes
in modo che si adatti a una memoria GPU di livello consumer.
Usiamo un semplice prompt `<|image_1|>\nCosa è mostrato in questa immagine?` dove facciamo riferimento all'immagine e chiediamo una descrizione di cosa contiene. Questo prompt viene elaborato con l'immagine (la stessa immagine della miniatura di questo blog) e inserito nel modello. Ciò si traduce nel seguente output:
L'immagine mostra un singolo fiore giallo con uno stelo verde su sfondo blu.
Una volta caricato il modello, l'elaborazione e la previsione hanno richiesto 2 secondi su un RTX3080.
Ora che tutto è pronto, esploriamo alcuni casi d'uso:
Riconoscimento ottico dei caratteri (OCR)
Vogliamo trascrivere il testo da un'immagine. Per fare ciò, modifica le righe del messaggio e dell'URL dell'immagine nello snippet di codice sopra con:
messages = ({"role": "user", "content": "<|image_1|>\nOCR the text of the image as is. OCR:"})
url = "https://i.postimg.cc/fRFvFVyv/Screenshot-from-2024-05-22-20-55-43.png"
Ingresso:
Produzione:
3 ESPERIMENTI
Mostriamo che l'interpolazione della posizione può estendere efficacemente la finestra di contesto fino a 32 volte la dimensione originale e tale estensione può essere eseguita solo con diverse centinaia di passaggi di addestramento. Mostriamo che i modelli risultanti sono LLM forti con finestre di contesto lunghe pienamente efficaci. Dimostriamo le sue prestazioni in una serie di attività tra cui la modellazione del linguaggio, il recupero della passkey e lunghi documenti.
riassunto. Presentiamo anche i risultati dei benchmark dei modelli estesi sui benchmark di valutazione LLaMA originali.
Il risultato è quello previsto! La trascrizione del testo completo ha richiesto 6 secondi, un po' lenta rispetto al normale OCR.
Didascalie delle immagini
L'obiettivo qui è quello di didascalia un'immagine naturale:
messages = ({"role": "user", "content": "<|image_1|>\nWhat is this image of?"})
url = "https://i.postimg.cc/q7Wjtj3n/Screenshot-from-2024-05-22-20-56-56.png"
Ingresso:
Produzione:
Questa immagine mostra un peluche che ricorda un personaggio di una popolare serie televisiva animata. Il giocattolo ha un corpo rotondo con cappuccio e indossa un paio di occhiali. Il volto del personaggio non è visibile nell'immagine.
Per lo più giusto (niente occhiali 😞). Tuttavia, è impressionante che abbia riconosciuto Kenny da una serie animata.
Analisi della tabella
Vogliamo vedere se il modello è in grado di analizzare la tabella in un formato leggibile dalla macchina:
messages = ({"role": "user", "content": "<|image_1|>\nExtract the table content of the table in JSON format: "})
url = "https://i.postimg.cc/W1YwqXk8/Screenshot-from-2024-05-22-21-41-03.png"
Ingresso:
Produzione:
```json
(
{
"Benchmark": "Phi-3 Vision-128K-In1",
"MMMU": 40.2,
"MMBench": 80.5,
"ScienceQA": 90.8
},
{
"Benchmark": "LlaVA-1.6 Vicuna-7B",
"MMMU": 34.2,
"MMBench": 76.3,
"ScienceQA": 70.6
},
{
"Benchmark": "QWEN-VI Chat",
"MMMU": 39.0,
"MMBench": 75.8,
"ScienceQA": 67.2
}
)
```
È infatti in grado di estrarre il contenuto della tabella, in formato strutturato, direttamente dallo screenshot.
Figura Comprensione
Chiediamo al modello di descrivere una figura:
messages = ({"role": "user", "content": "<|image_1|>\nWhat is this figure about? "})
url = "https://i.postimg.cc/Y0sRQR4Q/Screenshot-from-2024-05-22-21-47-39.png"
Ingresso:
Produzione:
La figura è un grafico a barre che mette a confronto le prestazioni di vari modelli di machine learning, dove ciascun modello è rappresentato da una coppia di barre impilate che indicano le prestazioni del modello di base e del modello ottimizzato.
Breve ma corretto!
Comprensione della lettura di documenti digitalizzati
L'obiettivo è porre domande sul testo scansionato o fotografato. Questo differisce dal riconoscimento ottico dei caratteri (OCR) in quanto non siamo interessati semplicemente a trascrivere il testo. Vogliamo invece valutare se il modello è in grado di comprendere il contenuto scritto e rispondere direttamente alle domande al riguardo.
messages = ({"role": "user", "content": "<|image_1|>\nWhat is this book about? "})
url = "https://i.postimg.cc/rmHxPbQY/Screenshot-from-2024-05-22-20-56-21.png"
Ingresso:
Produzione:
L'immagine mostra la copertina di un libro intitolato “SAM TALLENT RUNNING THE LIGHT” con una sinossi che descrive la storia di un comico di nome Billy Ray Schafer che deve affrontare sfide personali e professionali. Il libro sembra essere un'opera di finzione, forse un romanzo, poiché include una citazione di DOUG STANHOPE, ICONOCLAST, che elogia il libro come brillante e come la migliore rappresentazione immaginaria della commedia.
Il titolo del libro è sbagliato ma il MLLM è riuscito a capire di cosa parla il testo nell'immagine e riassumerlo in un colpo solo.
Richiesta set di contrassegni
La richiesta Set-of-Mark (SoM) utilizza modelli di segmentazione interattivi per dividere un'immagine in regioni e contrassegnarle con simboli, consentendo a grandi modelli multimodali di comprendere e rispondere meglio a domande basate sulla vista.
Per semplificare le cose in questo esempio, ho contrassegnato gli oggetti manualmente invece di utilizzare un modello e quindi ho fatto riferimento al contrassegno (4) nel mio prompt:
messages = ({"role": "user", "content": "<|image_1|>\nWhat is object number 4? "})
url = "https://i.postimg.cc/fy0Lz798/scott-webb-p-0l-WFknspg-unsplash-2.jpg"
Ingresso:
L'oggetto numero 4 è un cactus con fiori d'arancio in un vaso.
Il MLLM è stato in grado di comprendere il mio riferimento e rispondere di conseguenza alla mia domanda.
Così il gioco è fatto! Phi-3-Vision è un potente modello per lavorare con immagini e testo, in grado di comprendere il contenuto delle immagini, estrarre testo dalle immagini e persino rispondere a domande su ciò che vede. Sebbene le sue dimensioni ridotte, con solo 4 miliardi di parametri, possano limitarne l'idoneità per compiti che richiedono competenze linguistiche elevate, la maggior parte dei modelli della sua classe sono almeno il doppio delle sue dimensioni con parametri 8B o più, rendendolo eccezionale per la sua efficienza. Brilla in applicazioni come l'analisi dei documenti, la comprensione della struttura delle tabelle e l'OCR in natura. La sua natura compatta lo rende ideale per l'implementazione su dispositivi edge o GPU locali di livello consumer, soprattutto dopo la quantizzazione. Sarà il mio modello di riferimento in tutte le pipeline di analisi e comprensione dei documenti, poiché le sue capacità zero-shot lo rendono uno strumento capace, soprattutto per le sue dimensioni modeste. Successivamente, lavorerò anche su alcuni script di messa a punto LoRA per questo modello per vedere fino a che punto posso spingerlo su attività più specializzate.
Riferimenti:
Fonte: towardsdatascience.com