- Transformers.rb es una librería que permite usar Transformers de Hugging Face en Ruby, enfocada en ejecutar modelos transformer modernos con código Ruby
- La instalación se realiza instalando primero Torch.rb y luego agregando
gem "transformers-rb"al Gemfile - Los ejemplos compatibles incluyen embeddings, sparse embedding y modelos de reranking, y muestran cómo usar modelos de las familias
sentence-transformers,mixedbread-ai,BAAI,SnowflakeyOpenSearch - Los pipelines se dividen en texto y visión, y permiten invocar NER, análisis de sentimiento, preguntas y respuestas, clasificación de imágenes, extracción de características de imágenes y más con la forma
Transformers.pipeline - La API sigue la API de Transformers para Python y actualmente soporta las arquitecturas BERT, DeBERTa-v2, DistilBERT, MPNet, ViT y XLM-RoBERTa
Uso de Transformers en Ruby
- Transformers.rb es una librería moderna de transformers para Ruby
- Se indica revisar Informers si se necesita inferencia rápida
Método de instalación
- Primero se necesita instalar Torch.rb
- Después, agrega la siguiente línea al Gemfile de la aplicación
gem "transformers-rb"
Ejemplos de modelos compatibles
- El README ofrece ejemplos de uso de modelos divididos en Embedding, sparse embedding y reranking
-
Embedding
- sentence-transformers/all-MiniLM-L6-v2: genera embeddings a partir de un arreglo de oraciones
- sentence-transformers/multi-qa-MiniLM-L6-cos-v1: incluye un ejemplo que crea embeddings de consultas y documentos y ordena los documentos con puntajes de producto punto
- sentence-transformers/all-mpnet-base-v2: convierte un arreglo de oraciones en embeddings
- sentence-transformers/paraphrase-MiniLM-L6-v2: ofrece un ejemplo de embedding que recibe un arreglo de oraciones como entrada
- mixedbread-ai/mxbai-embed-large-v1: incluye un ejemplo que usa el prefijo
"Represent this sentence for searching relevant passages: "para representaciones de oraciones orientadas a búsqueda - thenlper/gte-small: genera embeddings a partir de dos oraciones de entrada
- intfloat/e5-base-v2: muestra un ejemplo que agrega el prefijo
"passage: "a los documentos y"query: "a las consultas - BAAI/bge-base-en-v1.5: incluye un ejemplo que usa un prefijo para representaciones de pasajes relacionados con búsqueda
- Snowflake/snowflake-arctic-embed-m-v1.5: incluye un ejemplo que genera embeddings con la opción
pooling: "cls"
-
Sparse embedding
- opensearch-project/opensearch-neural-sparse-encoding-v1: calcula sparse embeddings cargando directamente
AutoModelForMaskedLMyAutoTokenizer - La salida del tokenizer usa
padding,truncation,return_tensors: "pt"yreturn_token_type_ids: false - Aplica una attention mask a los valores de salida y genera el arreglo de embeddings pasando por
Torch.max,Torch.logyTorch.relu - Los valores en la posición de los special tokens se establecen en 0
- opensearch-project/opensearch-neural-sparse-encoding-v1: calcula sparse embeddings cargando directamente
-
Reranking
- mixedbread-ai/mxbai-rerank-base-v1: genera resultados de reranking a partir de una consulta y una lista de documentos
- BAAI/bge-reranker-base: también incluye un ejemplo de reranking que usa como entrada una consulta y un arreglo de documentos
Pipelines
- El pipeline de Text soporta las siguientes tareas
embedding: generación de embeddings de textoreranking: reordenamiento de ranking de una consulta y un arreglo de documentosner: reconocimiento de entidades nombradassentiment-analysis: análisis de sentimientoquestion-answering: genera respuestas a partir de una pregunta y un contextofeature-extraction: extracción de características de texto
- El pipeline de Vision soporta las siguientes tareas
image-classification: clasificación de imágenesimage-feature-extraction: extracción de características de imágenes
API y arquitecturas compatibles
- Esta librería sigue la API de Transformers para Python
- Las arquitecturas de modelo compatibles actualmente son las siguientes
- BERT
- DeBERTa-v2
- DistilBERT
- MPNet
- ViT
- XLM-RoBERTa
Desarrollo y contribución
- El historial de cambios puede revisarse en el changelog
- Las formas de contribuir incluyen reportar errores, corregir errores y enviar pull requests, redactar, aclarar o corregir documentación, y proponer o agregar nuevas funciones
- Las instrucciones para comenzar el desarrollo indican clonar el repositorio y luego ejecutar
bundle install,bundle exec rake download:filesybundle exec rake testen ese orden
1 comentarios
Comentarios en Hacker News
El runtime de ONNX para Ruby de Ankane es tan fácil de usar que hasta hace preguntarse por qué el repositorio oficial de JavaScript es tan difícil de entender
Apenas he visto por encima lo que logró esta persona y ya me parece un héroe
En serio, ¿esta persona es humana? Si fuera un individuo con tanto talento, hasta querría invertirle mil millones de dólares
Aunque seguro no lo hace por esto, si alguien quiere mostrar su agradecimiento, ya nominé a Ankane para el Rails 2024 Luminary award
https://rubyonrails.org/2024/8/2/nominations-open-for-2024-l...
Este tipo de contribuciones de verdad le hacen falta a la comunidad Ruby, y este proyecto también se ve interesante
En este caso, de repente Ruby recibió una librería excelente, y eso por sí solo es un logro realmente valioso. Pero la “comunidad” solo terminó “creando” esto meses o incluso años después de que librerías equivalentes ya salieran para Python, JavaScript, TypeScript, Rust, Go y otros
Esto no pasa solo con machine learning/IA, también ocurre con los gems de Ruby para tecnologías nuevas. Antes, las empresas SaaS o las startups ofrecían un Rubygem oficial desde el principio, y muchas veces incluso antes que para otras plataformas o lenguajes. Hoy, si quieres integrarte con cosas como Notion, Slack o Cloudflare, muchas veces no hay opción para Ruby o al menos no hay una oficial
Eso da tristeza. Ruby es un lenguaje mucho más amplio que Rails, y se puede entender la resistencia o el rechazo hacia Rails. Aun así, Ruby es un lenguaje mucho más agradable para trabajar que Python, y definitivamente mucho más que JavaScript. Estoy convencido de que Ruby pudo haber ocupado el lugar que hoy tiene Python, y que si hubiera sido así, decenas de miles de desarrolladores serían un poco más felices de lo que son ahora
Ankane, incluso por su cuenta, está devolviéndole a la industria una contribución enorme de muchísimas maneras. Impresionante
Me pregunto cómo una sola persona puede ser tan productiva. Debe tener una vida bastante ocupada entre trabajo, familia y demás
Es difícil expresar lo agradecido que estoy por los gems de Ankane. Lo que ha hecho ha sido esencial en varias de mis apps, y siento que llena vacíos dentro del ecosistema
Las herramientas que ha creado esta persona son realmente increíbles. Ojalá hubiera más así
Según entiendo, Andrew Kane también es el autor de pgvector, pgvector-ruby y neighbor, y todos son bastante buenos
Además ha hecho muchísimas otras cosas
Tal vez resolvió la inteligencia artificial/machine learning por su cuenta hace mucho tiempo y la está usando para ser así de productivo
[0] https://github.com/pgvector/pgvector
[1] https://github.com/pgvector/pgvector-ruby
[2] https://github.com/ankane/neighbor
[3] https://github.com/ankane/
https://github.com/ankane/pretender hace muy fácil hacerse pasar por otro usuario en apps Rails
https://github.com/ankane/ahoy es una herramienta de analítica propia para Rails
https://github.com/ankane/blazer es una herramienta de business intelligence integrada en Rails
https://github.com/ankane/field_test es para pruebas A/B
Este tipo de cosas aumentan la productividad en Rails para apps web comunes. Seguramente hay productos de proveedores mejores o soluciones más especializadas para cada una, pero si puedes instalar un gem, configurarlo un poco y obtener una solución del 80%, puedes lanzar algo realmente rápido
Chartkick es una librería de gráficos para Ruby, Ahoy es una librería de analítica para Rails y Searchkick es una librería de búsqueda para Rails
En su perfil de GitHub tiene más de 370 repositorios
Por ejemplo,
/discoes una implementación muy simple de filtrado colaborativo que puedes usar cuando quieres agregar recomendaciones rápidamente en cualquier parteSi estás buscando algo relacionado con machine learning en Ruby, normalmente ankane ya le echó un vistazo antes
Dentro de la comunidad Ruby, personalmente creo que Andrew Kane y Chris Oliver son de lo mejor de lo mejor. Aunque no uses todas sus contribuciones, ese tipo de aportes siempre son bienvenidos