En este documento se proporciona una arquitectura de referencia que muestra cómo implementar un flujo de trabajo de generación de candidatos de extremo a extremo de dos torres con Vertex AI. El marco de modelado de dos torres es una técnica de recuperación eficaz para casos prácticos de personalización, ya que aprende la similitud semántica entre dos entidades diferentes, como las consultas web y los elementos candidatos.
Este documento está dirigido a profesionales técnicos, como científicos de datos e ingenieros de aprendizaje automático, que desarrollan aplicaciones de recomendación a gran escala con requisitos de servicio de baja latencia. Para obtener más información sobre las técnicas de modelado, la formulación de problemas y la preparación de datos para crear un modelo de dos torres, consulta el artículo Escalar la recuperación profunda con TensorFlow Recommenders y Vector Search.
Arquitectura
En el siguiente diagrama se muestra una arquitectura para entrenar un modelo de dos torres y desplegar cada torre por separado para diferentes tareas de despliegue y servicio:
La arquitectura del diagrama incluye los siguientes componentes:
- Datos de entrenamiento: los archivos de entrenamiento se almacenan en Cloud Storage.
- Entrenamiento de dos torres: el modelo combinado de dos torres se entrena sin conexión con el servicio Vertex AI Training. Cada torre se guarda por separado y se usa para diferentes tareas.
- Torres de consulta y candidatas registradas: una vez entrenadas las torres, cada una se sube por separado al registro de modelos de Vertex AI.
- Torre de consultas implementada: la torre de consultas registrada se implementa en un endpoint online de Vertex AI.
- Predecir inserciones por lotes: la torre candidata registrada se usa en una tarea de predicción por lotes para precalcular las representaciones de inserción de todos los elementos candidatos disponibles.
- JSON de las incrustaciones: las incrustaciones predichas se guardan en un archivo JSON en Cloud Storage.
- Índice ANN: se usa Vertex AI Vector Search para crear un índice de servicio configurado para la búsqueda del vecino más cercano aproximado (ANN).
- Índice desplegado: el índice ANN se despliega en un endpoint de índice de Vertex AI Vector Search.
Productos usados
Esta arquitectura de referencia usa los siguientes Google Cloud productos:
- Vertex AI Training: un servicio de entrenamiento totalmente gestionado que te permite poner en marcha el entrenamiento de modelos a gran escala.
- Búsqueda vectorial: un servicio de coincidencia de similitud vectorial que te permite almacenar, indexar y buscar datos semánticamente similares o relacionados.
- Registro de modelos de Vertex AI: un repositorio central en el que puedes gestionar el ciclo de vida de tus modelos de aprendizaje automático.
- Cloud Storage: un almacén de objetos ilimitado y a un coste bajo para diversos tipos de datos. Se puede acceder a los datos desde dentro y fuera de Google Cloud, y se replican en varias ubicaciones para ofrecer redundancia.
Caso práctico
Para cumplir los requisitos de publicación de baja latencia, los sistemas de recomendación a gran escala suelen desplegarse en producción como sistemas de dos fases o, en ocasiones, como sistemas de varias fases. El objetivo de la primera fase, la generación de candidatos, es examinar una gran colección de elementos candidatos y recuperar un subconjunto relevante de cientos de elementos para las tareas de filtrado y clasificación posteriores. Para optimizar esta tarea de recuperación, ten en cuenta estos dos objetivos principales:
- Durante el entrenamiento del modelo, aprende la mejor representación del problema o la tarea que se va a resolver y compila esta representación en
<query, candidate>
incrustaciones. - Durante el servicio de modelos, recupera los elementos relevantes con la rapidez suficiente para cumplir los requisitos de latencia.
En el siguiente diagrama se muestran los componentes conceptuales de un recomendador de dos fases:
En el diagrama, los filtros de generación de candidatos filtran millones de elementos candidatos. A continuación, la clasificación filtra los cientos de elementos candidatos resultantes para devolver docenas de elementos recomendados.
La arquitectura de referencia de este documento entrena un modelo de recuperación basado en dos torres. En la arquitectura, cada torre es una red neuronal que procesa las características de la consulta o del elemento candidato y, a continuación, genera una representación de inserción de esas características. Cada torre se implementa por separado, ya que se usará para diferentes tareas en producción:
- Torre de candidatos: se usa para precalcular las inserciones de todos los elementos candidatos. Las inserciones precalculadas se implementan en un endpoint de índice de Vertex AI Vector Search optimizado para la recuperación de baja latencia.
- Torre desplegada: durante el servicio online, la torre de consultas desplegada convierte las consultas de los usuarios sin procesar en representaciones de inserciones. Las representaciones de inserción se usan para buscar inserciones de elementos similares en el índice implementado.
Las arquitecturas de dos torres son ideales para muchas tareas de recuperación, ya que capturan la relación semántica de las entidades de consulta y candidatas, y las asignan a un espacio de incrustación compartido. Cuando las entidades se asignan a un espacio de inserción compartido, las entidades semánticamente similares se agrupan más. Por lo tanto, si calculas las inserciones de vector de una consulta determinada, puedes buscar en el espacio de inserciones los elementos candidatos más cercanos (más similares). La principal ventaja de esta arquitectura es la capacidad de desacoplar la inferencia de las representaciones de consultas y candidatos. Las ventajas de esta separación son principalmente dos:
- Puedes servir elementos nuevos sin volver a entrenar un nuevo vocabulario de elementos. Si proporcionas cualquier conjunto de características de elementos al torre de elementos candidatos, puedes calcular las inserciones de elementos de cualquier conjunto de candidatos, incluso de aquellos que no se hayan visto durante el entrenamiento. Realizar este cálculo ayuda a solucionar el problema del arranque en frío.
- La torre de candidatos puede admitir un conjunto arbitrario de elementos candidatos, incluidos los que aún no han interactuado con el sistema de recomendaciones. Esto es posible porque las arquitecturas de dos torres procesan contenido enriquecido y metadatos sobre cada par
<query, candidate>
. Este tipo de procesamiento permite que el sistema describa un elemento desconocido en función de los elementos que conoce.
- La torre de candidatos puede admitir un conjunto arbitrario de elementos candidatos, incluidos los que aún no han interactuado con el sistema de recomendaciones. Esto es posible porque las arquitecturas de dos torres procesan contenido enriquecido y metadatos sobre cada par
- Puedes optimizar la inferencia de recuperación precalculando todas las inserciones de elementos candidatos. Estas inserciones precalculadas se pueden indexar y desplegar en una infraestructura de servicio optimizada para la recuperación de baja latencia.
- El aprendizaje conjunto de las torres te permite describir elementos en términos de consultas y viceversa. Si tienes una mitad de un par, como una consulta, y necesitas buscar el otro elemento correspondiente, puedes precalcular la mitad de la ecuación con antelación. La precomputación te permite tomar el resto de la decisión lo más rápido posible.
Factores del diseño
En esta sección se ofrecen directrices para ayudarte a desarrollar una arquitectura de generación de candidatos en Google Cloud que satisfaga tus necesidades de seguridad y rendimiento. Las directrices de esta sección no son exhaustivas. En función de tus requisitos específicos, puedes tener en cuenta otros factores de diseño y compensaciones.
Seguridad
Vertex AI Vector Search admite implementaciones de endpoints públicos y de nube privada virtual (VPC). Si quieres usar una red de VPC, empieza siguiendo los pasos para configurar una conexión de emparejamiento entre redes de VPC. Si el índice de búsqueda vectorial se implementa en un perímetro de VPC, los usuarios deben acceder a los recursos asociados desde la misma red de VPC. Por ejemplo, si desarrollas desde Vertex AI Workbench, debes crear la instancia de Workbench en la misma red de VPC que el endpoint del índice desplegado. Del mismo modo, cualquier canalización que deba crear un endpoint o desplegar un índice en un endpoint debe ejecutarse en la misma red de VPC.
Optimización del rendimiento
En esta sección se describen los factores que debes tener en cuenta al usar esta arquitectura de referencia para diseñar una topología en Google Cloud que cumpla los requisitos de rendimiento de tus cargas de trabajo.
Perfil de las tareas de entrenamiento
Para optimizar las canalizaciones de entrada de datos y el gráfico de entrenamiento en general, te recomendamos que analices el rendimiento del entrenamiento con Cloud Profiler. Profiler es una implementación gestionada de TensorBoard Profiler, una herramienta de código abierto.
Si incluyes el argumento –profiler
en la tarea de entrenamiento, habilitas la retrollamada de TensorFlow para que cree un perfil de un número determinado de minilotes en cada época. El perfil captura trazas de la CPU del host y del hardware de la GPU o la TPU del dispositivo. Los rastreos proporcionan información sobre el consumo de recursos de la tarea de entrenamiento. Para evitar errores de falta de memoria, te recomendamos que empieces con una duración del perfil de entre 2 y 10 pasos de entrenamiento, y que la aumentes según sea necesario.
Para saber cómo usar Profiler con Vertex AI Training y Vertex AI TensorBoard, consulta Perfil del rendimiento del entrenamiento de modelos. Para consultar las prácticas recomendadas de depuración, consulta Optimizar el rendimiento de la GPU. Para obtener información sobre cómo optimizar el rendimiento, consulta el artículo Optimizar el rendimiento de TensorFlow con Profiler.
Aprovechar al máximo los aceleradores
Cuando conectas aceleradores de entrenamiento, como GPUs NVIDIA o TPUs de Cloud, es importante que los utilices al máximo. Utilizar los aceleradores de entrenamiento al máximo es una práctica recomendada para gestionar los costes, ya que son el componente más caro de la arquitectura. También es una práctica recomendada para la eficiencia de los trabajos utilizar los aceleradores de entrenamiento al máximo, ya que, al no haber tiempo de inactividad, se reduce el consumo general de recursos.
Para que un acelerador se utilice al máximo, normalmente se realizan varias iteraciones para identificar el cuello de botella, optimizarlo y, a continuación, repetir estos pasos hasta que la utilización del dispositivo acelerador sea aceptable. Como muchos de los conjuntos de datos de este caso práctico son demasiado grandes para caber en la memoria, los cuellos de botella suelen encontrarse entre el almacenamiento, las VMs host y el acelerador.
En el siguiente diagrama se muestran las fases conceptuales de un flujo de procesamiento de entrada de entrenamiento de aprendizaje automático:
En el diagrama, los datos se leen del almacenamiento y se preprocesan. Una vez que se han preprocesado los datos, se envían al dispositivo. Para optimizar el rendimiento, empieza por determinar si el rendimiento general está limitado por la CPU del host o por el dispositivo acelerador (GPU o TPU). El dispositivo se encarga de acelerar el bucle de entrenamiento, mientras que el host se encarga de proporcionar datos de entrenamiento al dispositivo y de recibir los resultados del dispositivo. En las siguientes secciones se describe cómo resolver los cuellos de botella mejorando el rendimiento de la canalización de entrada y el rendimiento del dispositivo.
Mejorar el rendimiento del flujo de procesamiento de entrada
- Lectura de datos del almacenamiento: para mejorar la lectura de datos, prueba a usar el almacenamiento en caché, la prefetching, los patrones de acceso secuencial y la E/S paralela.
- Preprocesamiento de datos: para mejorar el preprocesamiento de datos, configura el procesamiento en paralelo
para la extracción y la transformación de datos, y ajusta la
interleave
transformación en el flujo de entrada de datos. - Enviar datos al dispositivo: para reducir el tiempo total de los trabajos, transfiere datos del host a varios dispositivos en paralelo.
Mejorar el rendimiento del dispositivo
- Aumentar el tamaño del minilote. Los minilotes son el número de muestras de entrenamiento que usa cada dispositivo en una iteración de un bucle de entrenamiento. Si aumentas el tamaño del minilote, aumentará el paralelismo entre las operaciones y mejorarás la reutilización de los datos. Sin embargo, el minilote debe poder caber en la memoria con el resto del programa de entrenamiento. Si aumentas demasiado el tamaño del minibatch, pueden producirse errores de falta de memoria y divergencia del modelo.
- Vectoriza las funciones definidas por el usuario. Normalmente, las transformaciones de datos se pueden expresar como una función definida por el usuario que describe cómo transformar cada elemento de un conjunto de datos de entrada. Para vectorizar esta función, aplica la operación de transformación a un lote de entradas a la vez en lugar de transformar un elemento cada vez. Cualquier función definida por el usuario tiene una sobrecarga relacionada con la programación y la ejecución. Cuando transformas un lote de entradas, se produce una sobrecarga por lote, en lugar de una por elemento del conjunto de datos.
Aumentar la capacidad antes de ampliarla
Cuando configures los recursos de computación para tus trabajos de entrenamiento, te recomendamos que aumentes la escala verticalmente antes de hacerlo horizontalmente. Esto significa que debes elegir un dispositivo más grande y potente antes de usar varios dispositivos menos potentes. Te recomendamos que aumentes la escala de la siguiente manera:
- Un solo trabajador y un solo dispositivo
- Un solo trabajador y un dispositivo más potente
- Un solo trabajador y varios dispositivos
- Preparación distribuida
Evaluar la recuperación en función de la latencia de la búsqueda de vectores ANN
Para evaluar las ventajas de la búsqueda de ANN, puedes medir la latencia y la recuperación de una consulta determinada. Para ayudarte a optimizar los índices, Vertex AI Vector Search te permite crear un índice de fuerza bruta. Los índices de fuerza bruta realizarán una búsqueda exhaustiva, a costa de una latencia mayor, para encontrar los vecinos más cercanos reales de un vector de consulta determinado. El uso de índices de fuerza bruta no está pensado para entornos de producción, pero proporciona una buena base cuando se calcula la recuperación durante el ajuste de índices.
Para evaluar la recuperación en comparación con la latencia, despliega las inserciones candidatas precalculadas en un índice configurado para la búsqueda de ANN y en otro índice configurado para la búsqueda por fuerza bruta. El índice de fuerza bruta devolverá los vecinos más cercanos absolutos, pero normalmente tardará más que una búsqueda de ANN. Puede que estés dispuesto a sacrificar parte de la capacidad de recuperación para mejorar la latencia de recuperación, pero debes evaluar esta compensación. Otras características que influyen en la latencia y la capacidad de recordar información son las siguientes:
- Parámetros de modelización: muchas decisiones de modelización influyen en el espacio de inserción, que en última instancia se convierte en el índice de servicio. Compara los candidatos que se obtienen de los índices creados a partir de modelos de recuperación superficial y profunda.
- Dimensiones: las dimensiones son otro aspecto que, en última instancia, determina el modelo. Las dimensiones del índice ANN deben coincidir con las dimensiones de los vectores de consulta y de candidato.
- Etiquetas de aglomeración y filtrado: las etiquetas pueden ofrecer funciones eficaces para adaptar los resultados a diferentes casos prácticos de producción. Es una práctica recomendada para saber cómo influyen las etiquetas en los candidatos obtenidos y cómo afectan al rendimiento.
- Número de ANN: si aumentas este valor, se incrementará el recuerdo y puede que la latencia aumente de forma proporcional.
- Porcentaje de nodos hoja que se van a buscar: este porcentaje es la opción más importante para evaluar el equilibrio entre la latencia y la recuperación. Si aumentas este valor, se incrementará el recuerdo y, proporcionalmente, la latencia.
Siguientes pasos
Para ver más arquitecturas de referencia, diagramas y prácticas recomendadas, consulta el centro de arquitectura de Cloud.
Colaboradores
Autores:
- Jordan Totten | Ingeniero de clientes
- Jeremy Wortz | Ingeniero de clientes
- Lakshmanan Sethu | Administrador técnico de cuentas
Otro colaborador: Kaz Sato | Staff Developer Advocate