Desarrollado usando Databricks con ❤️
blog que explica la creación de una mezcla escasa de modelos de lenguaje de visión basados en expertos: https://huggingface.co/blog/AviSoori1x/seemoe Puede considerar esto como una versión simplista de Grok 1.5/GPT-4 Vision desde cero, en uno Archivo PyTorch. La implementación consolidada está en seeMoE.py. El cuaderno es seeMoE_from_scratch.ipynb
El blog que explica esto: 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
En esta implementación simple de un modelo de lenguaje de visión (VLM), hay 3 componentes principales.
Codificador de imágenes para extraer características visuales de las imágenes. En este caso utilizo una implementación desde cero del transformador de visión original utilizado en CLIP. En realidad, esta es una opción popular en muchos VLM modernos. La única excepción notable es la serie de modelos Fuyu de Adept, que pasa las imágenes parcheadas directamente a la capa de proyección.
Proyector de lenguaje de visión: las incrustaciones de imágenes no tienen la misma forma que las incrustaciones de texto utilizadas por el decodificador. Por lo tanto, necesitamos "proyectar", es decir, cambiar la dimensionalidad de las características de la imagen extraídas por el codificador de imágenes para que coincidan con lo que se observa en el espacio de incrustación de texto. De modo que las características de la imagen se convierten en "fichas visuales" para el decodificador. Podría ser una sola capa o un MLP. He usado un MLP porque vale la pena mostrarlo.
Un modelo de lenguaje solo decodificador. Este es el componente que finalmente genera texto. En mi implementación me he desviado un poco de lo que ves en LLaVA, etc. al incorporar el módulo de proyección a mi decodificador. Por lo general, esto no se observa y se deja intacta la arquitectura del decodificador (que generalmente es un modelo ya entrenado previamente).
La implementación de autoatención del producto escalado está tomada de makemore de Andrej Kapathy (https://github.com/karpathy/makemore). Además, el decodificador es un modelo de lenguaje autorregresivo a nivel de caracteres, como en makemore. Ahora ves de dónde viene el nombre 'seemore' :)
Todo está escrito desde cero usando pytorch. Eso incluye el mecanismo de atención (tanto para el codificador de visión como para el decodificador de lenguaje), la creación de parches para el transformador de visión y todo lo demás. Espero que esto sea útil para cualquiera que revise el repositorio y/o el blog asociado.
Publicaciones con muchas referencias para esta implementación:
seemore.py es la implementación completa en un solo archivo de pytorch.
seemore_from_Scratch.ipynb analiza la intuición de toda la arquitectura del modelo y cómo se integra todo. Recomiendo empezar aquí.
seemore_Concise.ipynb es la implementación pirateable consolidada que te animo a piratear, comprender, mejorar y crear la tuya propia.
El input.txt con tinyshakespear y las representaciones de cadenas codificadas en base64 + las descripciones correspondientes se encuentran en el archivo inputs.csv en el directorio de imágenes.
El subdirectorio de módulos contiene cada uno de los componentes en su propio archivo .py para mayor comodidad (en caso de que elija piratear las piezas individualmente/reutilizarlas para sus propios proyectos, etc.)
El código se desarrolló íntegramente en Databricks utilizando un único A100 para la computación. Si está ejecutando esto en Databricks, puede escalarlo en un clúster de GPU arbitrariamente grande sin problemas, en el proveedor de nube de su elección.
Elegí usar MLFlow (que viene preinstalado en Databricks. Es completamente de código abierto y puedes instalarlo fácilmente en otro lugar), ya que me resulta útil rastrear y registrar todas las métricas necesarias. Esto es completamente opcional pero se recomienda.
Tenga en cuenta que la implementación enfatiza la legibilidad y la capacidad de pirateo frente al rendimiento, por lo que hay muchas formas en las que podría mejorar esto. ¡Por favor intenta y házmelo saber!
Espero que encuentres esto útil. ¡¡Feliz pirateo!!