Erkundung möglicher Anwendungsfälle von Phi-3-Imaginative and prescient, einem kleinen, aber leistungsstarken MLLM, das lokal ausgeführt werden kann (mit Codebeispielen)

Foto von RoonZ nl An Unsplash

Microsoft hat kürzlich Phi-3 veröffentlicht, ein leistungsstarkes Sprachmodell, mit einer neuen Imaginative and prescient-Language-Variante namens Phi-3-vision-128k-instruct. Dieses 4B-Parametermodell erzielte beeindruckende Ergebnisse bei öffentlichen Benchmarks, übertraf in einigen Fällen sogar GPT-4V und übertraf Gemini 1.0 Professional V in allen Punkten außer MMMU.

In diesem Blogbeitrag erfahren Sie, wie Sie Phi-3-vision-128k-instruct als robustes Imaginative and prescient- und Textmodell in Ihrem Knowledge Science-Toolkit nutzen können. Wir demonstrieren seine Fähigkeiten anhand verschiedener Anwendungsfälle, darunter:

  • Optische Zeichenerkennung (OCR)
  • Bildbeschriftung
  • Tabellenanalyse
  • Figurenverständnis
  • Leseverständnis gescannter Dokumente
  • Markierungssatz-Aufforderung

Wir beginnen mit einem einfachen Codeausschnitt, um dieses Modell lokal mithilfe von Transformatoren und Bitsandbytes auszuführen. Anschließend zeigen wir für jeden der oben aufgeführten Anwendungsfälle ein Beispiel.

Lokales Ausführen des Modells:

Erstellen Sie eine Conda Python-Umgebung und installieren Sie Torch und andere Python-Abhängigkeiten:

conda set up pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
pip set up git+https://github.com/huggingface/transformers.git@60bb571e993b7d73257fb64044726b569fef9403 pillow==10.3.0 chardet==5.2.0 flash_attn==2.5.8 speed up==0.30.1 bitsandbytes==0.43.1

Dann können wir dieses Skript ausführen:

# Instance impressed from https://huggingface.co/microsoft/Phi-3-vision-128k-instruct

# Import obligatory libraries
from PIL import Picture
import requests
from transformers import AutoModelForCausalLM
from transformers import AutoProcessor
from transformers import BitsAndBytesConfig
import torch

# Outline mannequin ID
model_id = "microsoft/Phi-3-vision-128k-instruct"

# Load processor
processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True)

# Outline 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 mannequin with 4-bit quantization and map to CUDA
mannequin = AutoModelForCausalLM.from_pretrained(
model_id,
device_map="cuda",
trust_remote_code=True,
torch_dtype="auto",
quantization_config=nf4_config,
)

# Outline preliminary chat message with picture placeholder
messages = (image_1)

# Obtain picture from URL
url = "https://photographs.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"
picture = Picture.open(requests.get(url, stream=True).uncooked)

# Put together immediate with picture token
immediate = processor.tokenizer.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True
)

# Course of immediate and picture for mannequin enter
inputs = processor(immediate, (picture), return_tensors="pt").to("cuda:0")

# Generate textual content response utilizing mannequin
generate_ids = mannequin.generate(
**inputs,
eos_token_id=processor.tokenizer.eos_token_id,
max_new_tokens=500,
do_sample=False,
)

# Take away enter tokens from generated response
generate_ids = generate_ids(:, inputs("input_ids").form(1) :)

# Decode generated IDs to textual content
response = processor.batch_decode(
generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False
)(0)

# Print the generated response
print(response)

Dieser Code lädt das Phi-3-Modell wie jedes andere transfomersModell. Wir fügen hinzu bitsandbytes damit es in einen GPU-Speicher der Verbraucherklasse passt.
Wir verwenden eine einfache Eingabeaufforderung `<|image_1|>nWas ist auf diesem Bild zu sehen?`, in der wir auf das Bild verweisen und nach einer Beschreibung des Inhalts fragen. Diese Eingabeaufforderung wird mit dem Bild verarbeitet (dasselbe Bild wie das Miniaturbild dieses Blogs) und durch das Modell geleitet. Dies führt zu folgender Ausgabe:

Das Bild zeigt eine einzelne gelbe Blume mit einem grünen Stiel vor einem blauen Hintergrund.

Sobald das Modell geladen ist, dauerte die Verarbeitung und Vorhersage auf einem RTX3080 2 Sekunden.

Nachdem wir nun alles eingerichtet haben, können wir einige Anwendungsfälle untersuchen:

Optische Zeichenerkennung (OCR)

Wir möchten den Textual content aus einem Bild transkribieren. Ändern Sie dazu die Nachrichtenzeile und die Bild-URL-Zeilen im obigen Codeausschnitt mit:

messages = (>nOCR the textual content of the picture as is. OCR:")
url = "https://i.postimg.cc/fRFvFVyv/Screenshot-from-2024-05-22-20-55-43.png"

Eingang:

Bild von https://arxiv.org/pdf/2306.15595

Ausgabe:

3 EXPERIMENTE
Wir zeigen, dass Place Interpolation das Kontextfenster effektiv auf das 32-fache der ursprünglichen Größe erweitern kann und dass eine solche Erweiterung mit nur einigen hundert Trainingsschritten möglich ist. Wir zeigen, dass die resultierenden Modelle starke LLMs mit voll wirksamen langen Kontextfenstern sind. Wir demonstrieren ihre Leistung in einer Reihe von Aufgaben, darunter Sprachmodellierung, Passkey-Abruf und lange Dokument-
Zusammenfassung des Projekts. Wir präsentieren auch Benchmark-Ergebnisse der erweiterten Modelle anhand der ursprünglichen LLaMA-Evaluierungsbenchmarks.

Das Ergebnis ist wie erwartet! Die Volltexttranskription dauerte 6 Sekunden, was im Vergleich zur normalen OCR etwas langsam ist.

Bildbeschriftung

Das Ziel besteht hier darin, ein natürliches Bild zu beschriften:

messages = (>nWhat is that this picture of?")
url = "https://i.postimg.cc/q7Wjtj3n/Screenshot-from-2024-05-22-20-56-56.png"

Eingang:

Bild vom Autor

Ausgabe:

Dieses Bild zeigt ein Plüschtier, das einer Figur aus einer beliebten Zeichentrickserie ähnelt. Das Spielzeug hat einen runden Körper mit einer Kapuze und trägt eine Brille. Das Gesicht der Figur ist auf dem Bild nicht sichtbar.

Größtenteils richtig (keine Brille 😞). Trotzdem ist es beeindruckend, dass es Kenny aus einer Zeichentrickserie erkannt hat.

Tabellenanalyse

Wir möchten sehen, ob das Modell die Tabelle in ein maschinenlesbares Format analysieren kann:

messages = (image_1)
url = "https://i.postimg.cc/W1YwqXk8/Screenshot-from-2024-05-22-21-41-03.png"

Eingang:

Bild von https://ai.azure.com/discover/fashions/Phi-3-vision-128k-instruct/model/1/registry/azureml

Ausgabe:

```json
(
{
"Benchmark": "Phi-3 Imaginative and prescient-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
}
)
```

Es ist tatsächlich möglich, den Inhalt der Tabelle in strukturiertem Format direkt aus dem Screenshot zu extrahieren.

Figurenverständnis

Wir fordern das Modell auf, eine Figur zu beschreiben:

messages = (image_1)
url = "https://i.postimg.cc/Y0sRQR4Q/Screenshot-from-2024-05-22-21-47-39.png"

Eingang:

Abbildung aus https://arxiv.org/pdf/2405.00732

Ausgabe:

Die Abbildung ist ein Balkendiagramm, das die Leistung verschiedener Modelle des maschinellen Lernens vergleicht. Jedes Modell wird durch ein Paar gestapelter Balken dargestellt, die die Leistung des Basismodells und des fein abgestimmten Modells angeben.

Kurz aber richtig!

Leseverständnis bei gescannten Dokumenten

Ziel ist es, Fragen zu gescanntem oder fotografiertem Textual content zu stellen. Der Unterschied zur optischen Zeichenerkennung (OCR) besteht darin, dass wir nicht daran interessiert sind, den Textual content einfach zu transkribieren. Stattdessen möchten wir beurteilen, ob das Modell den geschriebenen Inhalt verstehen und Fragen dazu direkt beantworten kann.

messages = (image_1)
url = "https://i.postimg.cc/rmHxPbQY/Screenshot-from-2024-05-22-20-56-21.png"

Eingang:

Bild vom Autor (das Buch heißt Operating the Mild von Sam Expertise)

Ausgabe:

Das Bild zeigt das Cowl eines Buches mit dem Titel „SAM TALLENT RUNNING THE LIGHT“ mit einer Inhaltsangabe, die die Geschichte eines Komikers namens Billy Ray Schafer beschreibt, der mit persönlichen und beruflichen Herausforderungen konfrontiert ist. Das Buch scheint ein fiktives Werk zu sein, möglicherweise ein Roman, da es ein Zitat von DOUG STANHOPE, ICONOCLAST, enthält, der das Buch als brillant und als beste fiktionale Darstellung von Comedy lobt.

Der Buchtitel ist falsch, aber das MLLM konnte den Inhalt des Bildtextes verstehen und in einer Aufnahme zusammenfassen.

Markierungssatz-Aufforderung

Bei der Set-of-Mark (SoM)-Eingabeaufforderung werden interaktive Segmentierungsmodelle verwendet, um ein Bild in Regionen zu unterteilen und diese mit Symbolen zu markieren. Dadurch können große multimodale Modelle visuell fundierte Fragen besser verstehen und beantworten.

Um die Dinge in diesem Beispiel zu vereinfachen, habe ich die Objekte manuell markiert, anstatt ein Modell zu verwenden, und dann die Markierung referenziert (4) in meiner Eingabeaufforderung:

messages = (>nWhat is object quantity 4? ")
url = "https://i.postimg.cc/fy0Lz798/scott-webb-p-0l-WFknspg-unsplash-2.jpg"

Eingang:

Modifiziert nach Foto von Scott Webb An Unsplash

Objekt Nummer 4 ist ein Kaktus mit orangen Blüten in einem Topf.

Das MLLM konnte meinen Hinweis verstehen und meine Frage entsprechend beantworten.

Additionally, da haben Sie es! Phi-3-Imaginative and prescient ist ein leistungsstarkes Modell für die Arbeit mit Bildern und Textual content, das Bildinhalte verstehen, Textual content aus Bildern extrahieren und sogar Fragen zu dem, was es sieht, beantworten kann. Während seine geringe Größe mit nur 4 Milliarden Parametern seine Eignung für Aufgaben, die starke Sprachkenntnisse erfordern, einschränken kann, sind die meisten Modelle seiner Klasse mit 8 Milliarden Parametern oder mehr mindestens doppelt so groß, was es zu einem herausragenden Modell seiner Effizienz macht. Es glänzt in Anwendungen wie Dokumentanalyse, Tabellenstrukturverständnis und OCR in der Praxis. Seine Kompaktheit macht es ideally suited für den Einsatz auf Edge-Geräten oder lokalen GPUs für Verbraucher, insbesondere nach der Quantisierung. Es wird mein bevorzugtes Modell für alle Dokumentanalyse- und -verständnis-Pipelines sein, da seine Zero-Shot-Fähigkeiten es zu einem leistungsfähigen Werkzeug machen, insbesondere für seine bescheidene Größe. Als Nächstes werde ich auch an einigen LoRA-Feinabstimmungsskripten für dieses Modell arbeiten, um zu sehen, wie weit ich es bei spezialisierteren Aufgaben bringen kann.

Verweise:

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert