Acerca de la búsqueda de arquitectura neuronal de Vertex AI

Con la búsqueda de arquitectura neuronal de Vertex AI, puedes buscar arquitecturas neuronales óptimas en términos de precisión, latencia, memoria, una combinación de estas o una métrica personalizada.

Determinar si la búsqueda de arquitectura neuronal de Vertex AI es la mejor herramienta para mí

  • La Búsqueda de arquitectura neuronal de Vertex AI es una herramienta de optimización de alto nivel que se usa para encontrar mejores arquitecturas neuronales en términos de precisión con o sin restricciones, como la latencia, la memoria o una métrica personalizada. El espacio de búsqueda de posibles opciones de arquitectura neuronal puede ser de hasta 10^20. Se basa en una técnica, que generó de forma correcta varios modelos de visión artificial de vanguardia en los últimos años, como Nasnet o MNasnet., EfficientNet, NAS-FPN y SpineNet.
  • La Búsqueda de arquitectura neuronal no es una solución en la que puedes incorporar tus datos y esperar un buen resultado sin experimentación. Es una herramienta de experimentación.
  • La Búsqueda de arquitectura neuronal no sirve para ajustar los hiperparámetros, como ajustar la tasa de aprendizaje o la configuración del optimizador. Solo se usa para una búsqueda de arquitectura. No debes combinar el ajuste de hiperparámetros con la Búsqueda de arquitectura neuronal.
  • No se recomienda la Búsqueda de arquitectura neuronal con datos de entrenamiento limitados o conjuntos de datos altamente desequilibrados en los que algunas clases son muy poco frecuentes. Si ya usas magnificaciones importantes para el entrenamiento del modelo de referencia debido a la falta de datos, no se recomienda la Búsqueda de arquitectura neuronal.
  • Primero debes probar otros métodos y técnicas de aprendizaje automático tradicionales y convencionales, como el ajuste de hiperparámetros. Debes usar la Búsqueda de arquitectura neuronal solo si no ves más beneficios con estos métodos tradicionales.
  • Debes tener un equipo interno para el ajuste de modelos, que tenga una idea básica sobre los parámetros de arquitectura a fin de modificarlos y probarlos. Estos parámetros de arquitectura pueden incluir el tamaño del kernel, la cantidad de canales o conexiones, entre muchas otras posibilidades. Si tienes un espacio de búsqueda en mente, la Búsqueda de arquitectura neuronal es muy valiosa y puede reducir al menos seis meses de tiempo de ingeniería para explorar un espacio de búsqueda grande: hasta 10^20 opciones de arquitectura.
  • La Búsqueda de arquitectura neuronal se dirige a clientes empresariales que pueden gastar varios miles de dólares en un experimento.
  • La Búsqueda de arquitectura neuronal no se limita al caso de uso solo de visión. En la actualidad, solo se proporcionan espacios de búsqueda precompilados basados en la visión y entrenadores compilados previamente, pero los clientes también pueden usar sus propios entrenadores y espacios de búsqueda que no sean de visión.
  • Neural Architecture Search no usa un enfoque de supernet (onehot-NAS o NAS basado en uso compartido de la ponderación) en el que solo usas tus propios datos y úsalo como un solución. No es trivial (meses de esfuerzo) personalizar una supernet. A diferencia de una superred, Neural Architecture Search es altamente personalizable para definir espacios de búsqueda y recompensas personalizados. La personalización se puede realizar en aproximadamente uno o dos días.
  • Neural Architecture Search es compatible con 8 regiones en todo el mundo. Verifica la disponibilidad en tu región.

También debes leer la siguiente sección sobre los costos esperados, las ganancias de resultados y los requisitos de cuota de GPU antes de usar la búsqueda de arquitectura neuronal.

Costo esperado, ganancias de resultados y requisitos de cuota de GPU

Búsqueda de NAS.

En la figura anterior, se muestra una curva de búsqueda típica de la Búsqueda de arquitectura neuronal. Y-axis muestra las recompensas de la prueba y X-axis muestra la cantidad de pruebas iniciadas. A medida que aumenta la cantidad de pruebas, el controlador comienza a encontrar mejores modelos. Por lo tanto, la recompensa comienza a aumentar y, luego, la variación de la recompensa y el crecimiento de la recompensa comienzan a disminuir y muestran la convergencia. En el momento de la convergencia, la cantidad de pruebas puede variar según el tamaño del espacio de búsqueda, pero es de alrededor de 2,000 pruebas. Cada prueba está diseñada para ser una versión más pequeña del entrenamiento completo llamada proxy-task que se ejecuta durante aproximadamente una o dos horas en dos GPU Nvidia V100. El cliente puede detener la búsqueda de forma manual en cualquier momento y puede encontrar modelos de recompensa más altos en comparación con su modelo de referencia antes de que se produzca la convergencia. Es posible que sea mejor esperar hasta que se produzca el punto de convergencia para elegir los mejores resultados. Después de la búsqueda, la siguiente etapa es elegir las 10 pruebas (modelos) principales y ejecutar un entrenamiento completo en ellas.

Prueba el espacio de búsqueda y el entrenador compilados previamente de MNasNet (opcional)

En este modo, observa la curva de búsqueda o algunas pruebas, aproximadamente 25, y realiza una prueba con un espacio de búsqueda y un entrenador MNasNet compilados previamente.

Ejecución de juguete de MnasNet

En la figura, la mejor recompensa de etapa 1 comienza a subir de ~0.30 a prueba-1 a ~0.37 a prueba-17. Es posible que tu ejecución exacta se vea un poco diferente debido a la aleatorización de muestreo, pero deberías ver un pequeño aumento en la mejor recompensa. Ten en cuenta que esta es una ejecución de prueba y no representa ninguna prueba de concepto ni una validación de comparativas públicas.

El costo de esta ejecución se detalla de la siguiente manera:

  • Etapa-1:
    • Cantidad de pruebas: 25
    • Cantidad de GPU por prueba: 2
    • Tipo de GPU: TESLA_T4
    • Cantidad de CPUs por prueba: 1
    • Tipo de CPU: n1-highmem-16
    • Tiempo promedio de entrenamiento de una sola prueba: 3 horas
    • Cantidad de pruebas paralelas: 6
    • Cuota de GPU usada: (cant-gpus-por-prueba * cant-prueba-paralelas) = 12 GPUs. Usa la región usus-central1 para la unidad prueba y los datos de entrenamiento del host en la misma región. No se necesita una cuota adicional.
    • Tiempo de ejecución: (total-pruebas * tiempo-entrenamiento-por-prueba)/(cant-pruebas-paralelas) = 12 horas
    • Horas de GPU: (total-pruebas * tiempo-entrenamiento-por-prueba * cant-gpus-por-prueba) = 150 T4 horas de GPU
    • Horas de CPU: (total-pruebas * tiempo-entrenamiento-por-prueba * cant-cpus-por-prueba) = 75 n1-highmem-16 horas
    • Costo: aproximadamente $185. Puedes detener el trabajo antes para reducir el costo. Consulta la página de precios para calcular el precio exacto.

Debido a que esta es una ejecución de juguete, no es necesario ejecutar un entrenamiento completo de etapa 2 para los modelos de la etapa 1. Para obtener más información sobre la ejecución de la etapa 2, consulta el instructivo 3.

El notebook de MnasNet se usa para esta ejecución.

Prueba de concepto (POC) del espacio de búsqueda y el entrenador previamente compilados de MNasNet (opcional)

En caso de que te interese replicar casi un resultado de MNasnet publicado, puedes usar este modo. Según el informe, MnasNet logra una exactitud del 75.2% del nivel más alto en los teléfonos 78 ms en un teléfono Pixel, que es 1.8 veces más rápido que MobileNetV2 con una precisión del 0.5% y 2.3 veces más rápida que NASNet con una exactitud del 1.2%. Sin embargo, en este ejemplo, se usan las GPU en lugar de las TPUs para el entrenamiento y se usa cloud-CPU (n1-highmem-8) para evaluar la latencia. Con este ejemplo, la exactitud esperada de la etapa 1 de etapa 2 en MNasNet es del 75.2% con 50 ms de latencia en CPU de la nube (n1-highmem-8).

El costo de esta ejecución se detalla de la siguiente manera:

  • Búsqueda de etapa 1:

    • Cantidad de pruebas: 2000
    • Cantidad de GPU por prueba: 2
    • Tipo de GPU: TESLA_T4
    • Tiempo promedio de entrenamiento de una sola prueba: 3 horas
    • Cantidad de pruebas paralelas: 10
    • Cuota de GPU usada: (cant-gpus-por-prueba * cant-pruebas-paralelas) = 20 GPUs T4. Debido a que este número supera la cuota predeterminada, crea una solicitud de cuota desde la IU del proyecto. Para obtener más información, consulta setting_up_path.
    • Tiempo de ejecución: (total-pruebas * tiempo-entrenamiento-por-prueba)/(cant-pruebas-paralelas)/24 = 25 días. Nota: El trabajo finaliza después de 14 días. Después de ese período, puedes reanudar el trabajo de búsqueda con facilidad con un comando durante otros 14 días. Si tienes una cuota de GPU más alta, el entorno de ejecución disminuye de forma proporcional.
    • Horas de GPU: (total-pruebas * tiempo-entrenamiento-por-prueba * cant-gpus-por prueba) = 12,000 horas de GPUs T4.
    • Costo: ~$15,000
  • Entrenamiento completo de etapa 2 con los 10 modelos principales:

    • Cantidad de pruebas: 10
    • Cantidad de GPU por prueba: 4
    • Tipo de GPU: TESLA_T4
    • Tiempo promedio de entrenamiento en una sola prueba: 9 días aproximadamente
    • Cantidad de pruebas paralelas: 10
    • Cuota de GPU usada: (cant-gpus-por-prueba * cant-pruebas-paralelas) = 40 GPUs T4. Debido a que este número supera la cuota predeterminada, crea una solicitud de cuota desde la IU del proyecto. Para obtener más información, consulta setting_up_path. También puedes ejecutar esto con 20 GPUs T4 si ejecutas el trabajo dos veces con cinco modelos a la vez en lugar de los 10 en paralelo.
    • Tiempo de ejecución: (total-pruebas * tiempo-entrenamiento-por-prueba)/(cant-pruebas-paralelas)/24 = ~9 días
    • Horas de GPU: (total-pruebas * tiempo-entrenamiento-por-prueba * cant-gpus-por-prueba) = 8960 horas de GPUs T4.
    • Costo: ~$8,000

Costo total: aproximadamente $23,000. Consulta la página de precios para calcular el precio exacto. Nota: Este ejemplo no es un trabajo de entrenamiento normal. El entrenamiento completo se ejecuta durante nueve días, en cuatro GPUs TESLA_T4.

El notebook de MnasNet se usa para esta ejecución.

Usa tu espacio de búsqueda y los entrenadores

Proporcionamos un costo aproximado para un usuario personalizado promedio. Tus necesidades pueden variar según la tarea de entrenamiento, las GPU y las CPU usadas. Necesitas al menos 20 cuotas de GPU para una ejecución de extremo a extremo como se documenta aquí. Nota: El aumento del rendimiento depende completamente de tu tarea. Solo podemos proporcionar ejemplos como MNasnet como ejemplos a los que se hace referencia para aumentar el rendimiento.

El costo de esta ejecución personalizada hipotética se detalla de la siguiente manera:

  • Búsqueda de etapa 1:

    • Cantidad de pruebas: 2,000
    • Cantidad de GPU por prueba: 2
    • Tipo de GPU: TESLA_T4
    • Tiempo promedio de entrenamiento de una sola prueba: 1.5 horas
    • Cantidad de pruebas paralelas: 10
    • Cuota de GPU usada: (cant-gpus-por-prueba * cant-pruebas-paralelas) = 20 GPUs T4. Debido a que este número supera la cuota predeterminada, debes crear una solicitud de cuota desde la IU del proyecto. Para obtener más información, consulta Solicita cuota de dispositivo adicional para el proyecto.
    • Tiempo de ejecución: (total-pruebas * tiempo-entrenamiento-por-prueba)/(cant-pruebas-paralelas)/24 = 12.5 días
    • Horas de GPU: (total-pruebas * tiempo-entrenamiento-por-prueba * cant-gpus-por-prueba) = 6000 horas de GPUs T4.
    • Costo: aproximadamente $7,400
  • Entrenamiento completo de etapa 2 con los 10 modelos principales:

    • Cantidad de pruebas: 10
    • Cantidad de GPU por prueba: 2
    • Tipo de GPU: TESLA_T4
    • Tiempo promedio de entrenamiento de una sola prueba: aproximadamente 4 días
    • Cantidad de pruebas paralelas: 10
    • Cuota de GPU usada: (cant-gpus-por-prueba * cant-pruebas-paralelas) = 20 GPUs T4. **Debido a que este número está por encima de la cuota predeterminada, debes crear una solicitud de cuota desde la IU del proyecto. Para obtener más información, consulta Solicita cuota de dispositivo adicional para el proyecto. Consulta la misma documentación para conocer las necesidades de cuotas personalizadas.
    • Tiempo de ejecución: (total-pruebas * tiempo-entrenamiento-por-prueba)/(cant-pruebas-paralelas)/24 = aproximadamente 4 días
    • Horas de GPU: (total-pruebas * tiempo-entrenamiento-por-prueba * cant-gpus-por prueba) = 1920 horas de GPUs T4.
    • Costo: aproximadamente $2,400
  • Para obtener más información sobre el costo del diseño de tareas de proxy, consulta Diseño de tareas de proxy. El costo es similar al entrenamiento de 12 modelos (la etapa 2 de la figura usa 10 modelos):

    • Cuota de GPU usada: Es igual que la etapa 2 en la figura.
    • Costo: (12/10) * costo-etapa-2-para-10-modelos = ~$2,880

Costo total: aproximadamente $12,680. Consulta la página de precios para calcular el precio exacto.

Estos costos de búsqueda de la etapa 1 son para la búsqueda hasta que se alcance el punto de convergencia y se logre el máximo rendimiento. Sin embargo, no esperes a que la búsqueda converja. Es posible que veas una menor cantidad de aumento de rendimiento con un costo de búsqueda más pequeño si ejecutas el entrenamiento completo de etapa 2 con el mejor modelo hasta ahora si la curva de búsqueda de recompensa comenzó a crecer. Por ejemplo, en el diagrama de búsqueda que se mostró antes, no esperes hasta que se alcancen las 2,000 pruebas de convergencia. Es posible que hayas encontrado mejores modelos con 700 o 1,200 pruebas y puedas ejecutar el entrenamiento completo de etapa 2 para ellos. Puedes detener la búsqueda antes para reducir el costo. También puedes realizar el entrenamiento completo de etapa 2 en paralelo mientras se ejecuta la búsqueda, pero asegúrate de tener una cuota de GPU para admitir un trabajo paralelo adicional.

Resumen del rendimiento y los costos

En la siguiente tabla, se resumen algunos datos con diferentes casos de uso, y su rendimiento y costo asociados.

Resumen.

Casos de uso y funciones

Las funciones de la búsqueda de arquitectura neuronal son flexibles y fáciles de usar. Un usuario novato puede usar espacios de búsqueda precompilados, entrenador precompilado y notebooks sin ninguna configuración adicional para comenzar a explorar la búsqueda de arquitectura neuronal de Vertex AI para su conjunto de datos. Al mismo tiempo, un usuario experto puede usar la búsqueda de arquitectura neuronal con su entrenador personalizado, espacio de búsqueda personalizado y dispositivo de inferencia personalizado, y también extender la búsqueda de arquitectura para casos de uso que no sean de visión.

La Búsqueda de arquitectura neuronal ofrece entrenadores compilados previamente y espacios de búsqueda para ejecutar en GPUs en los siguientes casos de uso:

  • Entrenadores de Tensorflow con resultados basados en conjuntos de datos públicos publicados en un notebook
    • Detección de objetos de imagen con espacios de búsqueda de extremo a extremo (SpineNet)
    • Clasificación con espacios de búsqueda de red troncal precompilada (MnasNet)
    • Detección de objetos en la nube 3D de LiDAR con espacios de búsqueda de extremo a extremo precompilados
    • Búsqueda con restricción de memoria y latencia para dispositivos de destino
  • Los entrenadores de PyTorch se usarán solo como ejemplo de instructivo
    • Ejemplo de espacio de búsqueda de segmentación de imágenes médicas en 3D de PyTorch
    • Clasificación MNasNet basada en PyTorch
    • Búsqueda con restricción de memoria y latencia para dispositivos de destino
  • Espacios de búsqueda precompliados adicionales basados en Tensorflow con código
    • Escalamiento del modelo
    • Magnificación de datos

El conjunto completo de funciones que ofrece Neural Architecture Search se puede usar con facilidad para arquitecturas y casos de uso personalizados:

  • Un lenguaje de la búsqueda de arquitectura neuronal para definir un espacio de búsqueda personalizado sobre posibles arquitecturas neuronales y, además, integrar este espacio de búsqueda con código de entrenador personalizado.
  • Espacios de búsqueda precompliados listos para usar con código.
  • Un entrenador precompilado ya listo para usar, con código, que se ejecuta en GPU.
  • Un servicio administrado para la búsqueda de arquitectura que incluye:
    • Un controlador de la búsqueda de arquitectura neuronal que muestrea el espacio de búsqueda para encontrar la mejor arquitectura.
    • Docker/bibliotecas precompiladas, con código, para calcular la latencia/FLOP/Memory en el hardware personalizado.
  • Instructivos para enseñar el uso de NAS.
  • Un conjunto de herramientas para diseñar tareas de proxy.
  • Orientación y ejemplo para el entrenamiento eficiente de PyTorch con Vertex AI.
  • Compatibilidad de la biblioteca con informes y análisis de métricas personalizadas.
  • IU de la consola de Google Cloud para supervisar y administrar trabajos.
  • Notebooks fáciles de usar para iniciar la búsqueda.
  • Compatibilidad con bibliotecas para la administración del uso de recursos de GPU/CPU en un nivel de detalle por proyecto o por trabajo.
  • Cliente Nas basado en Python para compilar Docker, iniciar trabajos de NAS y reanudar un trabajo de búsqueda anterior.
  • Asistencia al cliente basada en IU de la consola de Google Cloud.

Segundo plano

La Búsqueda de arquitectura neuronal es una técnica para automatizar el diseño de redes neuronales. En los últimos años, ha generado con éxito varios modelos de visión artificial de vanguardia, incluidos los siguientes:

Estos modelos resultantes lideran el camino en las 3 clases clave de problemas de visión artificial: clasificación de imágenes, detección de objetos y segmentación.

Con la Búsqueda de arquitectura neuronal, los ingenieros pueden optimizar los modelos para la exactitud, la latencia y la memoria en la misma prueba, lo que reduce el tiempo necesario para implementar modelos. La búsqueda de arquitectura neuronal explora muchos tipos diferentes de modelos: el controlador propone modelos de AA, luego entrena y evalúa modelos, e itera más de 1,000 veces para encontrar las mejores soluciones con restricciones de latencia o memoria en dispositivos de destino. En la siguiente figura, se muestran los componentes clave del framework de búsqueda de arquitectura:

Componentes de un framework de la búsqueda de arquitectura neuronal

  • Modelo: Una arquitectura neuronal con operaciones y conexiones.
  • Espacio de búsqueda: El espacio de modelos posibles (operaciones y conexiones) que se pueden diseñar y optimizar.
  • Docker del entrenador: Código del entrenador personalizable del usuario para entrenar y evaluar un modelo, y calcular su exactitud.
  • Dispositivo de inferencia: Un dispositivo de hardware, como CPU/GPU, en el que se calculan la latencia y el uso de memoria del modelo.
  • Recompensa: Una combinación de métricas del modelo, como la exactitud, la latencia y la memoria, para clasificar los modelos como mejores o peores.
  • Controlador de la búsqueda de arquitectura neuronal: El algoritmo de organización que (a) muestrea los modelos del espacio de búsqueda, (b) recibe las recompensas del modelo y (c) proporciona el siguiente conjunto de sugerencias de modelo para evaluar a fin de encontrar los modelos más óptimos.

Tareas de configuración del usuario

La búsqueda de arquitectura neuronal ofrece un entrenador precompilado integrado con espacios de búsqueda precompilados que se pueden usar con facilidad con los notebooks proporcionados sin ninguna configuración adicional.

Sin embargo, la mayoría de los usuarios deben usar su entrenador personalizado, espacios de búsqueda personalizados, métricas personalizadas (memoria, latencia y tiempo de entrenamiento, por ejemplo) y recompensas personalizadas (combinación de elementos como la precisión y la latencia). Para esto, debes hacer lo siguiente:

  • Define un espacio de búsqueda personalizado con el lenguaje de búsqueda de la búsqueda de arquitectura neuronal.
  • Integra la definición del espacio de búsqueda en el código del entrenador.
  • Agrega informes de métricas personalizadas al código del entrenador.
  • Agrega una recompensa personalizada al código del entrenador.
  • Compila un contenedor de entrenamiento y úsalo para iniciar trabajos de la Búsqueda de arquitectura neuronal.

En el siguiente diagrama, se ilustra esto:

Configuración de la búsqueda de arquitectura neuronal en el entorno de usuario

Servicio de la Búsqueda de arquitectura neuronal en funcionamiento

Una vez que configures el contenedor de entrenamiento que se usará, el servicio de la búsqueda de arquitectura neuronal iniciará varios contenedores de entrenamiento en paralelo en varios dispositivos de GPU. Puedes controlar cuántas pruebas usar en paralelo para el entrenamiento y cuántas pruebas totales iniciar. Cada contenedor de entrenamiento recibe una arquitectura sugerida del espacio de búsqueda. El contenedor de entrenamiento compila el modelo sugerido, realiza el entrenamiento y la evaluación y, luego, informa las recompensas al servicio de la Búsqueda de arquitectura neuronal. A medida que este proceso avanza, el servicio de la Búsqueda de arquitectura neuronal usa los comentarios de las recompensas para encontrar arquitecturas de modelo cada vez mejores. Después de la búsqueda, tienes acceso a las métricas informadas para un análisis más detallado.

Servicio de la búsqueda de arquitectura neuronal en funcionamiento

Descripción general del recorrido del usuario para una búsqueda de arquitectura neuronal

Los pasos de alto nivel para realizar un experimento de Neural Architecture Search son los siguientes:

  • Configuración y definiciones:

    • Identifica el conjunto de datos etiquetados y especifica el tipo de tarea (por ejemplo, detección o segmentación).
    • Personaliza el código del entrenador:
      • Usa un espacio de búsqueda compilado previamente o define un espacio de búsqueda personalizado con el lenguaje de la búsqueda de arquitectura neuronal.
      • Integra la definición del espacio de búsqueda en el código del entrenador.
      • Agrega informes de métricas personalizadas al código del entrenador.
      • Agrega una recompensa personalizada al código del entrenador.
    • Compila un contenedor de entrenador.
    • Configura los parámetros de prueba de búsqueda para el entrenamiento parcial (tarea de proxy). Lo ideal es que el entrenamiento de búsqueda finalice con rapidez (por ejemplo, en un plazo de 30 a 60 minutos) para entrenar los modelos de forma parcial:
      • Los ciclos de entrenamiento mínimos necesarios para que los modelos de muestra se reúnan (los ciclos de entrenamiento mínimos no necesitan garantizar la convergencia del modelo).
      • Hiperparámetros (por ejemplo, tasa de aprendizaje)
  • Ejecuta la búsqueda de manera local para asegurarte de que el contenedor integrado del espacio de búsqueda se pueda ejecutar de forma correcta.

  • Inicia el trabajo de búsqueda de Google Cloud (etapa de pruebas) con cinco pruebas de evaluación y verifica que las pruebas de búsqueda cumplan con los objetivos de entorno de ejecución y precisión.

  • Inicia el trabajo de búsqueda de Google Cloud (etapa 1) con más de 1,000 pruebas.

    • Como parte de la búsqueda, también configura un intervalo regular para entrenar modelos N principales (etapa 2):

      • Hiperparámetros y algoritmo para la búsqueda de hiperparámetros. La etapa 2 suele usar la configuración similar a la etapa 1, pero con una configuración más alta para ciertos parámetros, como los pasos o los ciclos de entrenamiento y la cantidad de canales.
      • Criterios de detención (la cantidad de ciclos de entrenamiento).
  • Analiza las métricas informadas o visualiza las arquitecturas para obtener estadísticas

Un experimento de búsqueda de arquitectura puede estar seguido por un experimento de búsqueda de escalamiento, seguido de un experimento de búsqueda de magnificación.

Orden de lectura de la documentación

  1. Configura el entorno (obligatorio)
  2. Instructivos (obligatorio)
  3. Capacitación eficiente de PyTorch con datos en la nube (obligatorio solo para clientes de PyTorch)
  4. Prácticas recomendadas y flujo de trabajo sugerido (obligatorio)
  5. Diseño de tareas de proxy (obligatorio)
  6. Cómo usar los espacios de búsqueda compilados previamente y un entrenador compilado previamente (obligatorio solo cuando se usan entrenadores compilados previamente)

Referencias