Entwickelt mit Databricks mit ❤️
Blog, der durch die Erstellung eines spärlichen, auf Experten basierenden Vision-Sprachmodells geht: https://huggingface.co/blog/AviSoori1x/seemoe Sie können sich dies als eine vereinfachte Version von Grok 1.5/GPT-4 Vision von Grund auf vorstellen, in einem PyTorch-Datei. Die konsolidierte Implementierung befindet sich in seeMoE.py. Das Notizbuch heißt seeMoE_from_scratch.ipynb
Der Blog, der dies durchgeht: https://avisoori1x.github.io/2024/04/22/seemore-_Implement_a_Vision_Language_Model_from_Scratch.html
https://huggingface.co/blog/AviSoori1x/seemore-vision-Language-Model
In dieser einfachen Implementierung eines Vision Language Model (VLM) gibt es drei Hauptkomponenten.
Image Encoder zum Extrahieren visueller Merkmale aus Bildern. In diesem Fall verwende ich eine völlig neue Implementierung des ursprünglichen Vision-Transformers, der in CLIP verwendet wird. Dies ist tatsächlich eine beliebte Wahl in vielen modernen VLMs. Die einzige bemerkenswerte Ausnahme ist die Fuyu-Modellreihe von Adept, die die gepatchten Bilder direkt an die Projektionsebene weiterleitet.
Vision-Language-Projektor – Bildeinbettungen haben nicht die gleiche Form wie Texteinbettungen, die vom Decoder verwendet werden. Wir müssen also „projizieren“, dh die Dimensionalität der vom Bildencoder extrahierten Bildmerkmale ändern, damit sie mit dem übereinstimmen, was im Texteinbettungsraum beobachtet wird. So werden Bildmerkmale zu „visuellen Token“ für den Decoder. Dies kann eine einzelne Schicht oder ein MLP sein. Ich habe ein MLP verwendet, weil es sich lohnt, es vorzuführen.
Ein Nur-Decoder-Sprachmodell. Dies ist die Komponente, die letztendlich Text generiert. Bei meiner Implementierung bin ich ein wenig von dem abgewichen, was Sie in LLaVA usw. sehen, indem ich das Projektionsmodul in meinen Decoder integriert habe. Normalerweise wird dies nicht beobachtet und Sie lassen die Architektur des Decoders (bei der es sich normalerweise um ein bereits vorab trainiertes Modell handelt) unberührt.
Die Implementierung der skalierten Punktprodukt-Selbstaufmerksamkeit ist von Andrej Kapathys Makemore (https://github.com/karpathy/makemore) entlehnt. Auch der Decoder ist ein autoregressives Sprachmodell auf Zeichenebene, genau wie in makemore. Jetzt sehen Sie, woher der Name „seemore“ kommt :)
Alles wird von Grund auf mit Pytorch geschrieben. Dazu gehören der Aufmerksamkeitsmechanismus (sowohl für den Vision-Encoder als auch für den Sprachdecoder), die Patch-Erstellung für den Vision-Transformer und alles andere. Ich hoffe, dies ist für jeden nützlich, der sich das Repo und/oder den zugehörigen Blog ansieht.
Veröffentlichungen, auf die für diese Implementierung häufig verwiesen wird:
seemore.py ist die gesamte Implementierung in einer einzigen Datei von Pytorch.
seemore_from_Scratch.ipynb geht durch die Intuition für die gesamte Modellarchitektur und wie alles zusammenkommt. Ich empfehle, hier zu beginnen.
seemore_Concise.ipynb ist die konsolidierte hackbare Implementierung, die ich Ihnen empfehle, zu hacken, zu verstehen, zu verbessern und Ihre eigene zu erstellen
Die Datei „input.txt“ mit tinyshakespear und die Base64-codierten Zeichenfolgendarstellungen + entsprechende Beschreibungen befinden sich in der Datei „inputs.csv“ im Verzeichnis „images“.
Das Unterverzeichnis „modules“ enthält der Einfachheit halber jede der Komponenten in einer eigenen .py-Datei (sollten Sie Teile einzeln hacken/für Ihre eigenen Projekte wiederverwenden usw.).
Der Code wurde vollständig auf Databricks entwickelt, wobei ein einziger A100 für die Berechnung verwendet wurde. Wenn Sie dies auf Databricks ausführen, können Sie es problemlos auf einem beliebig großen GPU-Cluster beim Cloud-Anbieter Ihrer Wahl skalieren.
Ich habe mich für die Verwendung von MLFlow entschieden (das in Databricks vorinstalliert ist. Es ist vollständig Open Source und kann problemlos an anderer Stelle installiert werden), da ich es hilfreich finde, alle erforderlichen Metriken zu verfolgen und zu protokollieren. Dies ist völlig optional, wird aber empfohlen.
Bitte beachten Sie, dass bei der Implementierung der Schwerpunkt auf Lesbarkeit und Hackbarkeit statt auf Leistung liegt. Es gibt also viele Möglichkeiten, wie Sie dies verbessern können. Bitte versuchen Sie es und lassen Sie es mich wissen!
Ich hoffe, Sie finden das nützlich. Viel Spaß beim Hacken!!