- Usa modelos que se carguen rápido y requieran una transformación mínima en estructuras listas para la GPU, y optimiza la forma en que se cargan.
- Usa configuraciones que permitan la ejecución simultánea máxima y eficiente para reducir la cantidad de GPUs necesarias para atender una solicitud objetivo por segundo y, al mismo tiempo, mantener bajos los costos.
Formas recomendadas de cargar modelos de AA grandes en Cloud Run
Google recomienda almacenar los modelos de AA dentro de imágenes de contenedor o optimizar su carga desde Cloud Storage.
Compensaciones entre el almacenamiento y la carga de modelos de AA
A continuación, se incluye una comparación de las opciones:
Ubicación del modelo | Tiempo de implementación | Experiencia de desarrollo | Tiempo de inicio del contenedor | Costo de almacenamiento |
Imagen de contenedor | Lenta Una imagen que contiene un modelo grande tardará más en importarse a Cloud Run. | Los cambios en la imagen del contenedor requerirán una reimplementación, que puede ser lenta para imágenes grandes. | Depende del tamaño del modelo. Para modelos muy grandes, usa Cloud Storage para obtener un rendimiento más predecible, pero más lento. | Es posible que haya varias copias en Artifact Registry. |
Cloud Storage, cargado con la activación de volumen de Cloud Storage FUSE | Rápido. El modelo se descargó durante el inicio del contenedor. | No es difícil de configurar y no requiere cambios en la imagen de Docker. | Es rápida cuando usas optimizaciones de red. No paraleliza la descarga. | Una copia en Cloud Storage |
Cloud Storage, descargado de forma simultánea con el comando gcloud storage cp de Google Cloud CLI o la API de Cloud Storage, como se muestra en el muestra de código de descarga simultánea del administrador de transferencias
|
Rápido. El modelo se descargó durante el inicio del contenedor. | Es un poco más difícil de configurar, ya que deberás instalar Google Cloud CLI en la imagen o actualizar tu código para usar la API de Cloud Storage. | Es rápida cuando usas optimizaciones de red. Google Cloud CLI descarga el archivo del modelo en paralelo, lo que lo hace más rápido que el montaje de FUSE. | Una copia en Cloud Storage |
Internet | Rápido. El modelo se descargó durante el inicio del contenedor. | Por lo general, es más simple (muchos frameworks descargan modelos de repositorios centrales). | Por lo general, es deficiente e impredecible:
|
Depende del proveedor de alojamiento del modelo. |
Almacena modelos en imágenes de contenedor
Al almacenar el modelo de AA en la imagen del contenedor, la carga del modelo se beneficiará de la infraestructura optimizada de transmisión de contenedores de Cloud Run. Sin embargo, compilar imágenes de contenedores que incluyan modelos de AA es un proceso que requiere muchos recursos, en especial cuando se trabaja con modelos grandes. En particular, el proceso de compilación puede verse limitado por la capacidad de procesamiento de la red. Cuando uses Cloud Build, te recomendamos que uses una máquina de compilación más potente con mayor rendimiento de procesamiento y redes. Para ello, compila una imagen con un archivo de configuración de compilación que tenga los siguientes pasos:
steps: - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', 'IMAGE', '.'] - name: 'gcr.io/cloud-builders/docker' args: ['push', 'IMAGE'] images: - IMAGE options: machineType: 'E2_HIGHCPU_32' diskSizeGb: '500'
Puedes crear una copia del modelo por imagen si la capa que contiene el modelo es distinta entre las imágenes (hash diferente). Podría haber un costo adicional de Artifact Registry, ya que podría haber una copia del modelo por imagen si la capa del modelo es única en cada imagen.
Almacena modelos en Cloud Storage
Para optimizar la carga de modelos de AA cuando se cargan modelos de AA desde Cloud Storage, ya sea con activaciones de volúmenes de Cloud Storage o directamente con la API o la línea de comandos de Cloud Storage, debes usar VPC directa con el valor de configuración de salida establecido en all-traffic
, junto con el Acceso privado a Google.
Cómo cargar modelos desde Internet
Para optimizar la carga de modelos de AA desde Internet, enruta todo el tráfico a través de la red de VPC con el valor de configuración de salida establecido en all-traffic
y configura Cloud NAT para llegar a la Internet pública con un ancho de banda alto.
Consideraciones de diseño del sistema, tiempo de ejecución, implementación y compilación
En las siguientes secciones, se describen las consideraciones para el diseño del sistema, la compilación, la implementación y el tiempo de ejecución.
En el momento de la compilación
En la siguiente lista, se muestran las consideraciones que debes tener en cuenta cuando planifiques tu compilación:
- Elige una buena imagen base. Debes comenzar con una imagen de los contenedores de aprendizaje profundo o del registro de contenedores de NVIDIA para el framework de IA que usas. Estas imágenes tienen instalados los paquetes relacionados con el rendimiento más recientes. No recomendamos crear una imagen personalizada.
- Elige modelos cuantificados de 4 bits para maximizar la simultaneidad, a menos que puedas demostrar que afectan la calidad de los resultados. La cuantización produce modelos más pequeños y rápidos, reduce la cantidad de memoria de GPU necesaria para entregar el modelo y puede aumentar el paralelismo en el tiempo de ejecución. Lo ideal es que los modelos se entrenen con la profundidad de bits objetivo en lugar de cuantificarse a la baja hasta alcanzarla.
- Elige un formato de modelo con tiempos de carga rápidos para minimizar el tiempo de inicio del contenedor, como GGUF. Estos formatos reflejan con mayor precisión el tipo de cuantificación objetivo y requieren menos transformaciones cuando se cargan en la GPU. Por motivos de seguridad, no uses puntos de control en formato pickle.
- Crea y calienta las cachés de LLM en el momento de la compilación. Inicia el LLM en la máquina de compilación mientras se compila la imagen de Docker. Habilita el almacenamiento en caché de instrucciones y proporciona instrucciones comunes o de ejemplo para ayudar a calentar la caché para el uso en el mundo real. Guarda los resultados que genera para que se carguen durante el tiempo de ejecución.
- Guarda tu propio modelo de inferencia que generes durante el tiempo de compilación. Esto ahorra una cantidad significativa de tiempo en comparación con la carga de modelos almacenados de manera menos eficiente y la aplicación de transformaciones, como la cuantificación, en el inicio del contenedor.
Durante la implementación
En la siguiente lista, se muestran las consideraciones que debes tener en cuenta cuando planifiques tu implementación:
- Asegúrate de configurar la simultaneidad del servicio con precisión en Cloud Run.
- Ajusta los sondeos de inicio según tu configuración.
Los sondeos de inicio determinan si el contenedor se inició y está listo para aceptar tráfico. Ten en cuenta estos puntos clave cuando configures sondeos de inicio:
- Tiempo de inicio adecuado: Permite que tu contenedor, incluidos los modelos, se inicialice y cargue por completo.
- Verificación de la preparación del modelo: Configura tu sondeo para que se apruebe solo cuando tu aplicación esté lista para atender solicitudes. La mayoría de los motores de entrega logran esto automáticamente cuando el modelo se carga en la memoria de la GPU, lo que evita solicitudes prematuras.
Ten en cuenta que Ollama puede abrir un puerto TCP antes de que se cargue un modelo. Para solucionar este problema, siga estos pasos:
Precarga de modelos: Consulta la documentación de Ollama para obtener orientación sobre cómo precargar tu modelo durante el inicio.
En el tiempo de ejecución.
- Administra de forma activa la longitud del contexto admitida. Cuanto más pequeña sea la ventana de contexto que admitas, más consultas podrás ejecutar en paralelo. Los detalles para hacerlo dependen del framework.
- Usar las cachés del LLM que generaste en el momento de la compilación Proporciona las mismas marcas que usaste durante el tiempo de compilación cuando generaste la caché de prefijo y de instrucciones.
- Carga el modelo guardado que acabas de escribir. Consulta Almacenamiento y carga de modelos: ventajas y desventajas para obtener una comparación sobre cómo cargar el modelo.
- Considera usar una caché de clave-valor cuantificada si tu framework la admite. Esto puede reducir los requisitos de memoria por consulta y permite configurar más paralelismo. Sin embargo, también puede afectar la calidad.
- Ajusta la cantidad de memoria de GPU que se reservará para los pesos, las activaciones y las memorias caché de clave-valor del modelo. Establécelo lo más alto posible sin que se produzca un error de memoria insuficiente.
- Comprueba si tu framework tiene alguna opción para mejorar el rendimiento de inicio del contenedor (por ejemplo, usar la paralelización de la carga del modelo).
- Configura la simultaneidad correctamente dentro del código de tu servicio. Asegúrate de que el código de tu servicio esté configurado para funcionar con la configuración de simultaneidad de tu servicio de Cloud Run.
A nivel del diseño del sistema
- Agrega cachés semánticas cuando corresponda. En algunos casos, almacenar en caché las consultas y respuestas completas puede ser una excelente manera de limitar el costo de las consultas comunes.
- Controla la varianza en tus preámbulos. Las memorias caché de instrucciones solo son útiles cuando contienen las instrucciones en secuencia. Las cachés se almacenan de forma eficaz con prefijos. Las inserciones o ediciones en la secuencia significan que no están almacenadas en caché o que solo están presentes de forma parcial.
Ajuste de escala automático y GPUs
Si usas el ajuste de escala automático predeterminado de Cloud Run, Cloud Run ajusta automáticamente la escala de la cantidad de instancias de cada revisión según factores como la utilización de la CPU y la simultaneidad de solicitudes. Sin embargo, Cloud Run no ajusta automáticamente la escala de la cantidad de instancias según la utilización de la GPU.
En el caso de una revisión con una GPU, si no tiene un uso significativo de la CPU, Cloud Run escala horizontalmente para la simultaneidad de solicitudes. Para lograr un escalamiento óptimo de la simultaneidad de solicitudes, debes establecer una cantidad máxima de solicitudes simultáneas por instancia óptima, como se describe en la siguiente sección.
Cantidad máxima de solicitudes simultáneas por instancia
El parámetro de configuración máximo de solicitudes simultáneas por instancia controla la cantidad máxima de solicitudes que Cloud Run envía a una sola instancia a la vez. Debes ajustar la simultaneidad para que coincida con la simultaneidad máxima que el código dentro de cada instancia puede controlar con un buen rendimiento.
Simultaneidad máxima y cargas de trabajo de IA
Cuando se ejecuta una carga de trabajo de inferencia de IA en una GPU en cada instancia, la simultaneidad máxima que el código puede controlar con un buen rendimiento depende de detalles específicos del framework y la implementación. Los siguientes factores influyen en cómo estableces el parámetro de configuración óptimo de solicitudes simultáneas máximas:
- Cantidad de instancias del modelo cargadas en la GPU
- Cantidad de consultas paralelas por modelo
- Uso del procesamiento por lotes
- Parámetros de configuración específicos del lote
- Cantidad de trabajo que no es de GPU
Si la cantidad máxima de solicitudes simultáneas se establece demasiado alta, es posible que las solicitudes terminen esperando dentro de la instancia para acceder a la GPU, lo que genera una mayor latencia. Si la cantidad máxima de solicitudes simultáneas se establece demasiado baja, es posible que la GPU no se use por completo, lo que provocará que Cloud Run escale horizontalmente más instancias de las necesarias.
Una regla general para configurar la cantidad máxima de solicitudes simultáneas para cargas de trabajo de IA es la siguiente:
(Number of model instances * parallel queries per model) + (number of model instances * ideal batch size)
Por ejemplo, supongamos que una instancia carga 3
instancias del modelo en la GPU y cada instancia del modelo puede controlar 4
consultas paralelas. El tamaño de lote ideal también es 4
, ya que esa es la cantidad de consultas paralelas que puede controlar cada instancia del modelo. Con la regla general, establecerías las solicitudes simultáneas máximas como 24
: (3
* 4
) + (3
* 4
).
Ten en cuenta que esta fórmula es solo una regla general. El parámetro de configuración ideal de solicitudes simultáneas máximas depende de los detalles específicos de tu implementación. Para lograr el rendimiento óptimo real, te recomendamos que pruebes la carga de tu servicio con diferentes parámetros de configuración de solicitudes simultáneas máximas para evaluar qué opción funciona mejor.
Compensaciones entre la capacidad de procesamiento, la latencia y el costo
Consulta Compensaciones entre capacidad de procesamiento, latencia y costos para conocer el impacto de la cantidad máxima de solicitudes simultáneas en la capacidad de procesamiento, la latencia y el costo. Ten en cuenta que todos los servicios de Cloud Run que usan GPUs deben tener configurada la facturación basada en instancias.