6 Praktische Anwendungen Von Microsofts Neuestem Phi 3 Vision Language Modell 6 Praktische Anwendungen Von Microsofts Neuestem Phi 3 Vision Language Modell

6 praktische Anwendungen von Microsofts neuestem Phi-3 Vision-Language-Modell

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

In diesem Blog-Beitrag werden wir untersuchen, wie Sie Phi-3-vision-128k-instruct als robustes Vision- und Textmodell in Ihrem Data-Science-Werkzeugkasten nutzen können. Wir werden seine Fähigkeiten durch verschiedene Anwendungsfälle demonstrieren, einschließlich:

  • Optische Zeichenerkennung (OCR)
  • Bildbeschriftung
  • Tabellenparsing
  • Verständnis von Abbildungen
  • Leseverständnis auf gescannten Dokumenten
  • Set-of-Mark-Prompting

Wir beginnen damit, einen einfachen Code-Schnipsel bereitzustellen, um dieses Modell lokal mit transformers und bitsandbytes auszuführen. Anschließend zeigen wir ein Beispiel für jeden der oben genannten Anwendungsfälle.

Lokale Ausführung des Modells

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

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

Dann können wir dieses Skript ausführen:

# Beispiel inspiriert von https://huggingface.co/microsoft/Phi-3-vision-128k-instruct
# Importieren Sie die erforderlichen Bibliotheken
from PIL import Image
import requests
from transformers import AutoModelForCausalLM
from transformers import AutoProcessor
from transformers import BitsAndBytesConfig
import torch
# Definieren Sie die Modell-ID
model_id = "microsoft/Phi-3-vision-128k-instruct"
# Laden Sie den Prozessor
processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True)
# Definieren Sie die BitsAndBytes-Konfiguration für die 4-Bit-Quantisierung
nf4_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_use_double_quant=True,
    bnb_4bit_compute_dtype=torch.bfloat16,
)
# Laden Sie das Modell mit 4-Bit-Quantisierung und Abbildung auf CUDA
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    device_map="cuda",
    trust_remote_code=True,
    torch_dtype="auto",
    quantization_config=nf4_config,
)
# Definieren Sie die anfängliche Chat-Nachricht mit Bild-Placeholder
messages = [{"role": "user", "content": "<|image_1|>\nWas ist auf diesem Bild zu sehen?"}]
# Laden Sie das Bild von der URL herunter
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)
# Bereiten Sie den Prompt mit dem Bild-Token vor
prompt = processor.tokenizer.apply_chat_template(
    messages, tokenize=False, add_generation_prompt=True
)
# Verarbeiten Sie den Prompt und das Bild für die Modelleingabe
inputs = processor(prompt, [image], return_tensors="pt").to("cuda:0")
# Generieren Sie die Textantwort mithilfe des Modells
generate_ids = model.generate(
    **inputs,
    eos_token_id=processor.tokenizer.eos_token_id,
    max_new_tokens=500,
    do_sample=False,
)
# Entfernen Sie die Eingabetoken aus der generierten Antwort
generate_ids = generate_ids[:, inputs["input_ids"].shape[1] :]
# Dekodieren Sie die generierten IDs zu Text
response = processor.batch_decode(
    generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False
)[0]
# Geben Sie die generierte Antwort aus
print(response)

Dieser Code lädt das Phi-3-Modell wie jedes andere transfomers-Modell. Wir fügen bitsandbytes hinzu, damit es in den Speicher einer Consumer-GPU passt. Wir verwenden einen einfachen Prompt <|image_1|>\nWas ist auf diesem Bild zu sehen?, in dem wir auf das Bild verweisen und eine Beschreibung dessen anfordern, was darauf zu sehen ist. Dieser Prompt wird mit dem Bild (dem gleichen Bild wie das Thumbnail dieses Blogs) verarbeitet und durch das Modell geführt. 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, dauert die Verarbeitung und Vorhersage 2 Sekunden auf einer RTX3080.

Nun da wir alles eingerichtet haben, lassen Sie uns einige Anwendungsfälle erkunden:

Optische Zeichenerkennung (OCR)

Wir möchten den Text aus einem Bild transkribieren. Dazu ändern Sie die Nachrichten- und die Bild-URL-Zeilen im obigen Code-Schnipsel wie folgt:

messages = [{"role": "user", "content": "<|image_1|>\nErkenne den Text des Bildes wie vorhanden. OCR:"}]
url = "https://i.postimg.cc/fRFvFVyv/Screenshot-from-2024-05-22-20-55-43.png"

Eingabe:

Auto Draft

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

Ausgabe:

3 EXPERIMENTS Wir zeigen, dass Position Interpolation effektiv das Kontextfenster auf bis zu 32-fache der ursprünglichen Größe erweitern kann, und dass diese Erweiterung mit nur wenigen hundert Trainingsschritten durchgeführt werden kann. Wir zeigen, dass die daraus resultierenden Modelle starke LLMs mit vollständig wirksamen langen Kontextfenstern sind. Wir demonstrieren ihre Leistung in einer Reihe von Aufgaben, darunter Sprachmodellierung, Passwortwiederherstellung und Zusammenfassung langer Dokumente. Wir präsentieren auch Benchmark-Ergebnisse der erweiterten Modelle auf den ursprünglichen LLaMA-Evaluierungs-Benchmarks.

Das Ergebnis ist wie erwartet! Die vollständige Texttranskription dauerte 6 Sekunden, was im Vergleich zu regulärer OCR etwas langsam ist.

Bildbeschriftung

Hier ist das Ziel, eine natürliche Abbildung zu beschreiben:

messages = [{"role": "user", "content": "<|image_1|>\nWas ist auf diesem Bild zu sehen?"}]
url = "https://i.postimg.cc/q7Wjtj3n/Screenshot-from-2024-05-22-20-56-56.png"

Eingabe:

Auto Draft

Bild vom Autor

Ausgabe:

Dieses Bild zeigt ein Stofftier, das einem Charakter aus einer beliebten animierten Fernsehserie ähnelt. Das Tier hat einen runden Körper mit einer Kapuze und trägt eine Brille. Das Gesicht des Charakters ist auf dem Bild nicht zu sehen.

Meistens richtig (keine Brille 😞). Trotzdem ist es beeindruckend, dass es Kenny aus einer animierten Serie erkannt hat.

Tabellenparsing

Wir möchten sehen, ob das Modell in der Lage ist, die Tabelle in ein maschinenlesbares Format zu parsen:

messages = [{"role": "user", "content": "<|image_1|>\nExtrahieren Sie den Tabelleninhalt der Tabelle im JSON-Format: "}]
url = "https://i.postimg.cc/W1YwqXk8/Screenshot-from-2024-05-22-21-41-03.png"

Eingabe:

Auto Draft

Bild von https://ai.azure.com/explore/models/Phi-3-vision-128k-instruct/version/1/registry/azureml

Ausgabe:

[
  {
    "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
  }
]

Tatsächlich ist es in der Lage, den Inhalt der Tabelle direkt aus dem Screenshot in strukturiertem Format zu extrahieren.

Verständnis von Abbildungen

Wir fordern das Modell auf, eine Abbildung zu beschreiben:

messages = [{"role": "user", "content": "<|image_1|>\nWas ist diese Abbildung darüber? "}]
url = "https://i.postimg.cc/Y0sRQR4Q/Screenshot-from-2024-05-22-21-47-39.png"

Eingabe:

Auto Draft

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

Ausgabe:

Die Abbildung ist ein Balkendiagramm, das die Leistung verschiedener Machine-Learning-Modelle vergleicht, wobei jedes Modell durch ein Paar gestapelter Balken dargestellt wird, die die Leistung des Basismodells und des feinabgestimmten Modells anzeigen.

Kurz, aber korrekt!

Leseverständnis auf gescannten Dokumenten

Das Ziel ist es, Fragen zu gescannten oder fotografierten Texten zu stellen. Dies unterscheidet sich von der optischen Zeichenerkennung (OCR) dadurch, dass wir nicht einfach nur den Text transkribieren möchten. Stattdessen möchten wir bewerten, ob das Modell den geschriebenen Inhalt verstehen und direkt Fragen dazu beantworten kann.

messages = [{"role": "user", "content": "<|image_1|>\n Worum geht es in diesem Buch? "}]
url = "https://i.postimg.cc/rmHxPbQY/Screenshot-from-2024-05-22-20-56-21.png"

Eingabe:

Auto Draft

Bild vom Autor (Buch ist Running the light von Sam Tallent)

Ausgabe:

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

Der Buchtitel ist falsch, aber das MLLM war in der Lage, zu verstehen, worum es in dem Text auf dem Bild geht, und ihn in einem Schritt zusammenzufassen.

Set-of-Mark-Prompting

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

Um die Dinge in diesem Beispiel zu vereinfachen, habe ich die Objekte manuell markiert, anstatt ein Modell zu verwenden, und dann auf die Markierung (4) in meinem Prompt verwiesen:

messages = [{"role": "user", "content": "<|image_1|>\n Was ist Objekt Nummer 4? "}]
url = "https://i.postimg.cc/fy0Lz798/scott-webb-p-0l-WFknspg-unsplash-2.jpg"

Eingabe:

Auto Draft

Modifiziert von Foto von Scott Webb auf Unsplash

Ausgabe:

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

Das MLLM war in der Lage, meinen Verweis zu verstehen und meine Frage entsprechend zu beantworten.

Schlussfolgerung

Nun, da haben Sie es! Phi-3-Vision ist ein leistungsstarkes Modell für die Arbeit mit Bildern und Text, das in der Lage ist, den Inhalt von Bildern zu verstehen, Text aus Bildern zu extrahieren und sogar Fragen zu dem zu beantworten, was es sieht. Obwohl seine geringe Größe mit nur 4 Milliarden Parametern seine Eignung für Aufgaben, die starke Sprachkenntnisse erfordern, einschränken kann, ist die Mehrheit der Modelle seiner Klasse mindestens doppelt so groß mit 8B Parametern oder mehr, was ihn zu einer herausragenden Wahl für seine Effizienz macht. Es glänzt in Anwendungen wie der Dokumentenanalyse, dem Verständnis von Tabellenstrukturen und der OCR in freier Wildbahn. Seine kompakte Natur macht es ideal für die Bereitstellung auf Edge-Geräten oder lokalen Consumer-GPUs, insbesondere nach der Quantisierung. Es wird mein bevorzugtes Modell in allen Dokumentenanalyse- und Verständnis-Pipelines sein, da seine Zero-Shot-Fähigkeiten es zu einem fähigen Werkzeug machen, insbesondere für seine bescheidene Größe. Als Nächstes werde ich auch an einigen LoRA-Feinabstimmungs-Skripten für dieses Modell arbeiten, um zu sehen, wie weit ich es auf spezialisiertere Aufgaben bringen kann.

Referenzen:

Schreibe einen Kommentar

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