Autoalojamiento de Embeddings para DiscourseAI

El plugin Discourse AI tiene muchas funciones que requieren embeddings para funcionar, como Temas Relacionados, Búsqueda IA, Sugerencia de Categoría y Etiqueta de Ayudante IA, etc. Si bien puedes usar una API de terceros, como Configurar Claves API para OpenAI, Configurar Claves API para Cloudflare Workers AI o Configurar Claves API para Google Gemini, construimos Discourse AI desde el primer día para no estar atados a ellas.

Ejecución con HuggingFace TEI

HuggingFace proporciona una imagen de contenedor impresionante que puede ponerte en marcha rápidamente.

Por ejemplo:

mkdír -p /opt/tei-cache
docker run --rm --gpus all --shm-size 1g -p 8081:80 \
  -v /opt/tei-cache:/data \
  ghcr.io/huggingface/text-embeddings-inference:latest \
  --model-id BAAI/bge-large-en-v1.5

Esto debería poner en marcha una instancia local de BAAI/bge-large-en-v1.5, un modelo de código abierto con muy buen rendimiento.
Puedes comprobar si está funcionando con

curl http://localhost:8081/ \
    -X POST \
    -H 'Content-Type: application/json' \
    "{ \"inputs\": \"Testing string for embeddings\" }"

Lo que debería devolver una matriz de flotantes en funcionamiento normal.

Hacerlo disponible para tu instancia de Discourse

La mayoría de las veces, ejecutarás esto en un servidor dedicado debido a la aceleración de la GPU. Al hacerlo, recomiendo ejecutar un proxy inverso, realizar la terminación TLS y asegurar el endpoint para que solo pueda ser conectado por tu instancia de Discourse.

Configuración de DiscourseAI

Discourse AI incluye configuraciones del sitio para configurar el servidor de inferencia para modelos de código abierto. Deberías apuntarlo a tu servidor usando la pestaña Embeddings en la configuración de administrador del plugin de IA.

11 Me gusta

¿El modelo bge-m3 debería funcionar para sitios multilingües (o no ingleses)?

Sí, jugué con él la semana que se compartió silenciosamente en GitHub y funciona bien. Todavía estoy esperando ver cómo aterriza en las tablas de clasificación de MTEB, ya que no estaba allí la última vez que miré.

Dicho esto, tenemos grandes instancias de Discourse alojadas que utilizan el plugin multilingüe que se envía, e5, y funciona muy bien.

1 me gusta

Gracias, ¿tenían planes de habilitar puntos de conexión personalizados de código abierto para incrustaciones? Estoy intentando usar estos modelos en Huggingface.

Lo siento, no entiendo lo que intentas decir aquí. Este tema es una guía sobre cómo ejecutar modelos de código abierto para incrustaciones de Discourse AI.

Oh, lo siento. Estoy intentando usar un modelo de código abierto desde un endpoint personalizado de HuggingFace y me pregunto si eso es posible o si está en los planes habilitarlo en un futuro cercano :slight_smile:

Para comprobar si funciona, el siguiente comando me funciona (con el modelo BAAI/bge-m3):

curl -X 'POST' \
  'http://localhost:8081/embed' \
  -H 'Content-Type: application/json' \
  -d '{ "inputs": "Testing string for embeddings"}'

Por cierto, también puedes usar la interfaz web de Swagger en http://localhost:8081/docs/.

2 Me gusta

Este también es un buen servidor de embeddings:

1 me gusta

Para ahorrar espacio, ¿es posible usar incrustaciones cuantificadas? Me gustaría usar incrustaciones cuantificadas binarias para reducir realmente el tamaño de almacenamiento. Después de hacer algunas pruebas, ¡obtengo un rendimiento superior al 90% con un almacenamiento 32 veces menor!

1 me gusta

Estamos almacenando embeddings utilizando precisión media (la mitad de espacio de almacenamiento) y utilizando cuantización binaria para los índices (32 veces más pequeños) por defecto desde hace unas semanas, por lo que simplemente actualizando tu sitio a la última versión deberías obtener una reducción considerable del uso del disco.

3 Me gusta

¿Podrías también añadir:

a los modelos de incrustación compatibles?

Pronto haremos que los embeddings sean configurables de la misma manera que lo hicimos con los LLM, por lo que cualquier modelo será compatible.

4 Me gusta

Si alguien más tiene problemas con los puntos de conexión en la red local, por ejemplo, 192.168.x.x, parece que están bloqueados por Discourse (presumiblemente por razones de seguridad) y es necesario eludir el bloqueo. ¡Perdí algunas horas descifrando eso!

1 me gusta

@Falco eso sería genial. Mientras tanto, si quisiera intentar agregar un nuevo modelo de incrustación, ¿solo necesito agregar:

 lib/embeddings/vector_representations/mxbai-embed-xsmall-v1.rb
 lib/tokenizer/mxbai-embed-xsmall-v1.rb
 tokenizers/mxbai-embed-xsmall-v1.json

y modificar lib/embeddings/vector_representations/base.rb para incluir el nuevo modelo, o hay algo más que también necesite cambiar?

@Falco Intenté agregar el modelo y envié una solicitud de extracción (pull request). Disculpas si hice algo mal, ya que no soy realmente un desarrollador de software. Esperaba que pudieras revisarlo y ver si está bien para su inclusión.

Desafortunadamente, no pude hacerlo funcionar con TEI. Pude hacer que el all-mpnet funcionara con TEI, pero creo que hay algo mal en lo que hice para que mxbai funcione.

Por cierto, ¿hay alguna posibilidad de que se admita https://github.com/michaelfeil/infinity como servidor de incrustación (embedding server)?

EDITAR: Veo que esto va a ser complicado, ya que los índices HNSW en la base de datos parecen estar codificados de forma rígida, por lo que los nuevos modelos deben agregarse al final para evitar alterar el orden y cada nuevo modelo necesita agregar su propio índice.

Recomiendo encarecidamente esperar un par de semanas hasta que enviemos la compatibilidad con embeddings configurables.

Esto debería funcionar bien cuando enviemos los embeddings configurables, pero por curiosidad, ¿qué aportaría sobre GitHub - huggingface/text-embeddings-inference: A blazing fast inference solution for text embeddings models?

No me he puesto al día con TEI, así que no mencionaré las ventajas que no he probado recientemente, pero de las cosas que vi recientemente:

  • Soporte de hardware: infinity tiene mejor soporte de GPU que TEI
  • El servidor infinity puede alojar múltiples modelos de incrustación en un solo servidor (a menos que me haya perdido esto en TEI)

Es muy bueno. Si no lo has probado, ¡deberías echarle un vistazo!

1 me gusta

Un amigo me acaba de enviar este hilo por mensaje directo.

Algunos pros/contras:

  • Infinity admite embeddings multimodales (es decir, enviar imágenes/audio) a
  • Soporte de GPU AMD
  • Múltiples modelos compatibles en el mismo contenedor (controla el modelo a través del parámetro model).
  • Más dtypes, por ejemplo, cuantificación int8 de los pesos (en su mayoría esto es irrelevante, la memoria de activación es mayor)
  • A menudo salen nuevos modelos a través de “código de modelado personalizado” enviado en el repositorio de Hugging Face. Infinity lee este código de PyTorch si es necesario. Esto te ayudará a evitar el “puedes soportar modelos xyz” de forma continua.
  • Más modelos compatibles (por ejemplo, debertav2 para mixedbread)

Contras:

  • El tiempo de arranque en frío de TEI es mejor
3 Me gusta

Hola Michael :wave:

@roman ha estado ocupado reestructurando nuestra configuración de incrustación en:

Deberíamos terminar muy, muy pronto, una vez que eso esté hecho, agregar soporte para infinity será trivial.

Todavía pienso mucho en la incrustación multimodal, te da un atajo cuando intentas hacer RAG en PDFs porque simplemente lo procesas en imágenes e incrustas cada imagen, evitando la necesidad de OCR o costosos servicios de imagen a texto impulsados por LLM.

Una vez que terminemos este PR, estaremos más que felices de agregar soporte para infinity (y soporte multimodal) a la configuración de incrustación.

Gracias por pasarte :hugs:

4 Me gusta

Me pregunto si la creación de soporte para litellm podría ofrecer un atajo, ya que entonces te beneficiarías de todos los modelos compatibles a través de litellm. Otros proyectos parecen integrarlo.