EdgeBERT: Construí mi motor de inferencia en Rust y lo hice pensando en aplicaciones a medida y en entornos donde el tamaño y la dependencia de Python son un problema.
Necesitaba búsqueda semántica en una aplicación Rust para que un usuario que buscara doctor encontrara documentos que mencionaran physician o medical practitioner. La idea es convertir texto en vectores que capturen significado: palabras similares generan vectores similares y palabras distintas vectores distintos, de modo que doctor y physician estén muy cerca en el espacio vectorial mientras que banana quede lejos.
El dolor de las soluciones existentes era real: para generar embeddings con Python la solución estándar inflaba un entorno virtual hasta 6.8 GB por PyTorch, tokenizers y pesos del modelo. Intenté usar ONNX Runtime desde Rust pero acabó trayendo 80+ crates, un binario de release de 350 MB y dependencias al sistema como libstdc++, libpthread y OpenSSL con incompatibilidades que rompían distribuciones como RHEL. Esto convirtió un proyecto de RAG ligero y offline en una pesadilla de compatibilidad.
Lo que realmente quería era una API simple tipo model = SentenceTransformer all-MiniLM-L6-v2 y embeddings = model.encode texts sin todo el ruido. La solución fue implementar mi propio motor de inferencia en Rust: EdgeBERT. Un ejemplo de uso sencillo permite cargar el modelo MiniLML6V2 y obtener embeddings en una llamada, con un binario de 5MB y uso de RAM alrededor de 200MB, sin el infierno de dependencias y con una correlación de 0.9997 respecto a los embeddings generados por sentence-transformers en Python.
Rendimiento: tras optimizar multiplicaciones de matrices EdgeBERT ofrece ventajas claras en escenarios de un solo hilo. En CPU EdgeBERT puede ser hasta 3 veces más rápido en single-threaded en modelos MiniLM cuya dimensión de matrices es relativamente pequeña. En multi hilo y en lotes muy grandes la implementación de sentence-transformers en Python puede recuperar ventaja, pero para dispositivos edge, navegadores y aplicaciones donde la latencia por petición importa, EdgeBERT muestra su mejor cara.
Uso en WebAssembly: al ser Rust puro con dependencias mínimas se compila a WASM y puede ejecutarse en navegadores. El binario WASM pesa ~429KB y los pesos del modelo unos 30MB. Para lograr esto tuve que implementar un tokenizador WordPiece en Rust porque la crate tokenizers trae dependencias en C que no compilan a WASM.
Cómo funciona a grandes rasgos: tokenización WordPiece a ids, embeddings de 384 dimensiones que suman word, posición y segmento, múltiples capas de self attention y feed forward con GELU, y finalmente pooling por promedio para obtener el embedding de la frase. MiniLM usa 6 capas y la implementación principal ocupa unas 500 líneas en Rust, sin magia, solo el algoritmo transformer reescrito con foco en eficiencia y portabilidad.
Precisión: las diferencias numéricas entre implementaciones flotantes son mínimas. Un vector de ejemplo de EdgeBERT y su equivalente en Python tienen una similitud coseno de 0.9997, lo que significa que el resultado es esencialmente el mismo para tareas de búsqueda semántica, recomendaciones, detección de duplicados y moderación de contenido.
Ventajas prácticas: esta solución permite búsqueda semántica que entiende intención y sinónimos, recomendaciones basadas en significado, detección de duplicados con distinto wording, y alimentar sistemas RAG para proporcionar a los LLM el contexto correcto sin depender de coincidencias por palabras clave. Todo ello apto para despliegues en el edge, navegadores, o servidores con limitaciones de memoria.
Cuándo usar EdgeBERT: cuando necesitas embeddings sin Python, el tamaño del despliegue es crítico, la aplicación corre en edge o navegador, la memoria es limitada o la latencia single-threaded importa. Usa sentence-transformers cuando necesites aceleración por GPU, múltiples arquitecturas de modelo o estés ya inmerso en el ecosistema Python y Hugging Face.
Instalación y despliegue: EdgeBERT se publica como crate y soporta una feature opcional para BLAS como openblas para un mejor rendimiento en CPU. Para compilar a WASM no se requiere ninguna dependencia C externa. Si quieres integrar esta tecnología en una solución empresarial a medida contacta con nuestro equipo en Q2BSTUDIO, especialistas en desarrollo de software a medida, inteligencia artificial y servicios cloud.
En Q2BSTUDIO ofrecemos desarrollo de aplicaciones a medida y servicios de inteligencia artificial para empresas, incluyendo agentes IA y soluciones de inteligencia de negocio y power bi. Si tu proyecto necesita integración de embeddings para búsqueda semántica o funciones RAG podemos ayudarte a diseñar una solución escalable y segura. Conoce nuestros servicios de inteligencia artificial en Q2BSTUDIO Inteligencia Artificial y descubre cómo desarrollamos aplicaciones a medida en Desarrollo de aplicaciones y software a medida.
También ofrecemos ciberseguridad y pentesting, servicios cloud aws y azure, y soluciones de business intelligence con Power BI para convertir datos en decisiones. Si quieres reducir el tamaño del despliegue, mejorar la latencia o llevar modelos de NLP al edge, nuestro equipo puede implementar EdgeBERT o adaptar soluciones similares en proyectos de software a medida, servicios cloud y automatización.
Roadmap y futuro: planes para soporte GPU con wgpu, más arquitecturas eficientes, y cuantización para reducir aún más tamaño y mejorar rendimiento en microcontroladores. El código está disponible en GitHub y aceptamos contribuciones; la implementación es compacta y pensada para integrarse en pipelines de producción donde la eficiencia y la seguridad son prioritarias.
Contacta con Q2BSTUDIO para una evaluación personalizada de tu caso de uso en IA para empresas, agentes IA, seguridad y despliegues cloud AWS y Azure. Podemos asesorar en integración, despliegue y mantenimiento de soluciones basadas en embeddings, RAG y modelos transformadores, adaptadas a las necesidades de tu negocio.