Desenvolvido usando Databricks com ❤️
blog que explica a criação de uma mistura esparsa de modelo de linguagem de visão baseado em especialistas: https://huggingface.co/blog/AviSoori1x/seemoe Você pode pensar nisso como uma versão simplista do Grok 1.5/ GPT-4 Vision do zero, em um Arquivo PyTorch. A implementação consolidada está em seeMoE.py. O bloco de notas é seeMoE_from_scratch.ipynb
O Blog que explica isso: 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
Nesta implementação simples de um modelo de linguagem de visão (VLM), existem 3 componentes principais.
Image Encoder para extrair recursos visuais de imagens. Neste caso eu uso uma implementação do zero do transformador de visão original usado no CLIP. Na verdade, esta é uma escolha popular em muitos VLMs modernos. A única exceção notável é a série de modelos Fuyu da Adept, que passa as imagens corrigidas diretamente para a camada de projeção.
Projetor Vision-Language - Os embeddings de imagens não têm o mesmo formato dos embeddings de texto usados pelo decodificador. Portanto, precisamos 'projetar', ou seja, alterar a dimensionalidade dos recursos da imagem extraídos pelo codificador de imagem para corresponder ao que é observado no espaço de incorporação do texto. Assim, os recursos da imagem tornam-se 'tokens visuais' para o decodificador. Pode ser uma camada única ou um MLP. Usei um MLP porque vale a pena mostrar.
Um modelo de linguagem apenas para decodificador. Este é o componente que gera o texto. Na minha implementação, me desviei um pouco do que você vê no LLaVA etc., incorporando o módulo de projeção ao meu decodificador. Normalmente isso não é observado e você deixa a arquitetura do decodificador (que geralmente é um modelo já pré-treinado) intocada.
A implementação de autoatenção de produto escalar em escala é emprestada do makemore de Andrej Kapathy (https://github.com/karpathy/makemore). Além disso, o decodificador é um modelo de linguagem autoregressivo em nível de caractere, assim como no makemore. Agora você vê de onde veio o nome 'seemore' :)
Tudo é escrito do zero usando pytorch. Isso inclui o mecanismo de atenção (tanto para o codificador de visão quanto para o decodificador de linguagem), criação de patch para o transformador de visão e tudo mais. Espero que isso seja útil para qualquer pessoa que acesse o repositório e/ou o blog associado.
Publicações fortemente referenciadas para esta implementação:
seemore.py é a totalidade da implementação em um único arquivo de pytorch.
seemore_from_Scratch.ipynb percorre a intuição de toda a arquitetura do modelo e como tudo se junta. Eu recomendo começar aqui.
seemore_Concise.ipynb é a implementação hackeável consolidada que eu encorajo você a hackear, entender, melhorar e fazer a sua própria
O input.txt com tinyshakespear e as representações de string codificadas em base64 + descrições correspondentes estão no arquivo inputs.csv no diretório de imagens.
O subdiretório de módulos contém cada um dos componentes em seu próprio arquivo .py por conveniência (caso você escolha hackear peças individualmente/reutilizar para seus próprios projetos, etc.)
O código foi inteiramente desenvolvido em Databricks usando um único A100 para computação. Se você estiver executando isso no Databricks, poderá dimensioná-lo em um cluster de GPU arbitrariamente grande sem problemas, no provedor de nuvem de sua escolha.
Optei por usar o MLFlow (que vem pré-instalado no Databricks. É totalmente de código aberto e você pode instalar facilmente em outro lugar), pois acho útil rastrear e registrar todas as métricas necessárias. Isso é totalmente opcional, mas incentivado.
Observe que a implementação enfatiza a legibilidade e a hackabilidade versus o desempenho, portanto, há muitas maneiras de melhorar isso. Por favor, tente e me avise!
Espero que você ache isso útil. Feliz hacking!!