Разработано с использованием Databricks с ❤️
блог, в котором рассказывается о создании редкой смеси языковой модели видения, основанной на экспертах: https://huggingface.co/blog/AviSoori1x/seemoe. Вы можете думать об этом как об упрощенной версии Grok 1.5/GPT-4 Vision с нуля, в одном PyTorch-файл. Консолидированная реализация находится в файлеseeMoE.py. Блокнот — этоseeMoE_from_scratch.ipynb.
Блог, в котором рассказывается об этом: 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
В этой простой реализации модели языка видения (VLM) есть три основных компонента.
Image Encoder для извлечения визуальных особенностей из изображений. В данном случае я использую созданную с нуля реализацию оригинального преобразователя зрения, используемого в CLIP. На самом деле это популярный выбор во многих современных VLM. Заметным исключением является серия моделей Fuyu от Adept, которые передают исправленные изображения непосредственно на проекционный слой.
Проектор Vision-Language — встраивание изображений не имеет той же формы, что и встраивание текста, используемое декодером. Поэтому нам нужно «проецировать», то есть изменить размерность функций изображения, извлеченных кодером изображения, чтобы они соответствовали тому, что наблюдается в пространстве для встраивания текста. Таким образом, функции изображения становятся «визуальными маркерами» для декодера. Это может быть один слой или MLP. Я использовал MLP, потому что его стоит показать.
Языковая модель только для декодера. Это компонент, который в конечном итоге генерирует текст. В своей реализации я немного отклонился от того, что вы видите в LLaVA и т. д., включив в свой декодер модуль проекции. Обычно этого не наблюдается, и вы оставляете архитектуру декодера (которая обычно представляет собой уже предварительно обученную модель) нетронутой.
Реализация масштабированного скалярного произведения самообслуживания заимствована из работы Андрея Капати (https://github.com/karpathy/makemore). Кроме того, декодер представляет собой авторегрессионную языковую модель на уровне символов, как и в makemore. Теперь вы понимаете, откуда взялось название Seemore :)
Все написано с нуля с использованием Pytorch. Сюда входит механизм внимания (как для кодера зрения, так и для декодера языка), создание патчей для преобразователя зрения и все остальное. Надеюсь, это будет полезно для всех, кто просматривает репозиторий и/или связанный с ним блог.
Публикации, на которые часто ссылаются для этой реализации:
Seemore.py — это вся реализация в одном файле pytorch.
Seemore_from_Scratch.ipynb рассматривает всю архитектуру модели и то, как все складывается воедино. Я рекомендую начать здесь.
Seemore_Concision.ipynb — это консолидированная реализация, которую можно взломать, которую я советую вам взломать, понять, улучшить и создать свою собственную.
Входной файл input.txt с tinyshakespear и строковые представления в кодировке Base64 + соответствующие описания находятся в файле inputs.csv в каталоге изображений.
Подкаталог модулей содержит каждый из компонентов в отдельном файле .py для удобства (если вы решите взламывать части по отдельности/повторно использовать для своих собственных проектов и т. д.).
Код был полностью разработан на Databricks с использованием одного A100 для вычислений. Если вы используете это на Databricks, вы можете без проблем масштабировать это на кластере графических процессоров произвольного размера у выбранного вами облачного провайдера.
Я решил использовать MLFlow (который предварительно установлен в Databricks. Его исходный код полностью открыт, и вы можете легко установить его в другом месте), так как считаю полезным отслеживать и регистрировать все необходимые метрики. Это совершенно необязательно, но приветствуется.
Обратите внимание, что в реализации упор делается на читабельность и возможность взлома, а не на производительность, поэтому существует множество способов улучшить это. Пожалуйста, попробуйте и дайте мне знать!
Надеюсь, вы найдете это полезным. Удачного взлома!!