Développé à l'aide de Databricks avec ❤️
blog qui explique la création d'un mélange clairsemé de modèles de langage de vision basés sur des experts : https://huggingface.co/blog/AviSoori1x/seemoe Vous pouvez considérer cela comme une version simpliste de Grok 1.5/GPT-4 Vision à partir de zéro, en un Fichier PyTorch. L'implémentation consolidée se trouve dans seeMoE.py. Le cahier est seeMoE_from_scratch.ipynb
Le blog qui explique cela : https://avisoori1x.github.io/2024/04/22/seemore-_Implement_a_Vision_Language_Model_from_Scratch.html
https://huggingface.co/blog/AviSoori1x/seemore-vision-langage-model
Dans cette implémentation simple d'un modèle de langage de vision (VLM), il y a 3 composants principaux.
Image Encoder pour extraire les caractéristiques visuelles des images. Dans ce cas, j'utilise une implémentation à partir de zéro du transformateur de vision original utilisé dans CLIP. Il s’agit en fait d’un choix populaire dans de nombreux VLM modernes. La seule exception notable est la série de modèles Fuyu d'Adept, qui transmet les images patchifiées directement à la couche de projection.
Projecteur Vision-Language - Les intégrations d'images n'ont pas la même forme que les intégrations de texte utilisées par le décodeur. Nous devons donc « projeter », c'est-à-dire modifier la dimensionnalité des caractéristiques de l'image extraites par l'encodeur d'image pour qu'elles correspondent à ce qui est observé dans l'espace d'incorporation de texte. Ainsi, les caractéristiques de l'image deviennent des « jetons visuels » pour le décodeur. Il peut s'agir d'une seule couche ou d'un MLP. J'ai utilisé un MLP parce que cela vaut la peine d'être montré.
Un modèle de langage de décodeur uniquement. C'est le composant qui génère finalement le texte. Dans mon implémentation, je me suis un peu écarté de ce que vous voyez dans LLaVA etc. en incorporant le module de projection à mon décodeur. Généralement, cela n'est pas observé et vous laissez l'architecture du décodeur (qui est généralement un modèle déjà pré-entraîné) intacte.
L'implémentation de l'auto-attention du produit scalaire à l'échelle est empruntée au makemore d'Andrej Kapathy (https://github.com/karpathy/makemore). Le décodeur est également un modèle de langage autorégressif au niveau des caractères, tout comme dans makemore. Vous voyez maintenant d'où vient le nom « seemore » :)
Tout est écrit de A à Z à l'aide de pytorch. Cela inclut le mécanisme d'attention (à la fois pour l'encodeur de vision et le décodeur de langage), la création de correctifs pour le transformateur de vision et tout le reste. J'espère que cela sera utile à tous ceux qui consultent le dépôt et/ou le blog associé.
Publications fortement référencées pour cette implémentation :
seemore.py est l'intégralité de l'implémentation dans un seul fichier de pytorch.
seemore_from_Scratch.ipynb parcourt l'intuition de l'ensemble de l'architecture du modèle et comment tout s'assemble. Je recommande de commencer ici.
seemore_Concise.ipynb est l'implémentation piratable consolidée que je vous encourage à pirater, comprendre, améliorer et vous approprier
Le fichier input.txt avec tinyshakespear et les représentations de chaînes codées en base64 + les descriptions correspondantes se trouvent dans le fichier inputs.csv dans le répertoire images.
Le sous-répertoire modules contient chacun des composants dans leur propre fichier .py pour plus de commodité (si vous choisissez de pirater des pièces individuellement/de les réutiliser pour vos propres projets, etc.)
Le code a été entièrement développé sur Databricks en utilisant un seul A100 pour le calcul. Si vous l'exécutez sur Databricks, vous pouvez l'étendre sur un cluster GPU arbitrairement grand sans problème, sur le fournisseur de cloud de votre choix.
J'ai choisi d'utiliser MLFlow (qui est préinstallé dans Databricks. Il est entièrement open source et vous pouvez l'installer facilement ailleurs) car je trouve utile de suivre et d'enregistrer toutes les métriques nécessaires. Ceci est entièrement facultatif mais encouragé.
Veuillez noter que l'implémentation met l'accent sur la lisibilité et la piratage par rapport aux performances. Il existe donc de nombreuses façons d'améliorer cela. S'il vous plaît, essayez et faites-le-moi savoir !
J'espère que vous trouverez cela utile. Bon piratage !!