¿Por qué un entorno de ejecución de IA local reserva memoria después de una solicitud?

Eva Wong es la Redactora técnica y manitas residente en ZimaSpace. Una geek de toda la vida con pasión por los homelabs y el software de código abierto, se especializa en traducir conceptos técnicos complejos en guías accesibles y prácticas. Eva cree que el autoalojamiento debe ser divertido, no intimidante. A través de sus tutoriales, empodera a la comunidad para desmitificar las configuraciones de hardware, desde construir su primer NAS hasta dominar los contenedores Docker.

Un entorno de ejecución de IA local reserva memoria después de una solicitud para que los tensores futuros puedan reutilizar bloques del dispositivo sin asumir repetidamente los costes de asignación y sincronización.

El resultado visible puede parecer una fuga: el uso de la GPU cae a cero, la respuesta está completa, pero el proceso sigue ocupando la mayor parte de la memoria del acelerador. Parte de esa huella puede corresponder a pesos del modelo activos o al estado KV, mientras que otra parte pertenece a un asignador de memoria en caché, al contexto de ejecución, a la captura de gráficos, al espacio de trabajo de una biblioteca o a una política de mantenimiento activo del modelo. Las secciones siguientes distinguen entre asignaciones activas y reservas reutilizables, y muestran cuándo la memoria persistente es normal, innecesaria o indicio de una fuga real.

La asignación en el dispositivo es lo bastante costosa como para almacenarla en caché

Los tensores de una solicitud se crean y liberan repetidamente. Devolver cada bloque al controlador puede introducir sincronización y obligar a la siguiente solicitud a reconstruir la misma distribución de memoria.

El asignador CUDA de PyTorch separa los bloques del asignador en caché de los tensores que siguen asignados activamente.

Mantener los bloques libres dentro del proceso mejora la latencia de las solicitudes repetidas, pero otro servicio de IA no puede utilizar esos bytes hasta que el asignador los libere al controlador.

La memoria asignada, reservada y libre en el dispositivo son métricas distintas

La memoria asignada pertenece a tensores activos. La memoria reservada está gestionada por el asignador del entorno de ejecución y puede incluir tanto asignaciones activas como bloques reutilizables actualmente sin uso.

Por tanto, un entorno de ejecución puede mostrar una diferencia de memoria reservada incluso después de destruir los tensores temporales.

Las herramientas del dispositivo, como nvidia-smi, muestran la huella del proceso visible para el controlador, no qué bloques están lógicamente libres dentro del framework.

El modelo y el entorno de ejecución pueden permanecer activos intencionadamente

El proceso puede conservar los pesos del modelo, el estado del tokenizador, los kernels, los gráficos de ejecución y los contextos del acelerador listos, porque descargarlos convertiría la siguiente solicitud en un arranque en frío.

La explicación de ZimaSpace sobre la permanencia del modelo muestra por qué un servicio activo consume memoria incluso cuando ningún usuario está generando tokens en ese momento.

Se trata de un compromiso deliberado entre capacidad y latencia. La memoria está inactiva desde el punto de vista del cómputo, pero sigue siendo valiosa como estado listo para usar.

-15% OFF

La fragmentación puede dejar bloques reservados difíciles de reutilizar

Un grupo puede contener suficientes bytes sin usar en total, pero los tamaños de sus bloques pueden no coincidir con los de la siguiente solicitud. Los prompts variables, las dimensiones de las imágenes, los lotes y los cambios de modelo pueden crear un patrón de reserva fragmentado.

GMLake estudia la fragmentación del asignador causada por tamaños de asignación irregulares.

En ese caso, la memoria retenida no es útil de forma activa ni está disponible para otros procesos, y reiniciar el proceso puede restaurar temporalmente una distribución más limpia.

Mide si la huella se estabiliza o crece

Ejecuta repetidamente la misma solicitud fija y registra la memoria asignada, reservada, de la caché KV, de los pesos del modelo y libre en el dispositivo después de cada finalización.

Un punto máximo estable sugiere un comportamiento normal de almacenamiento en caché o mantenimiento activo. Una huella que crece con cada solicitud idéntica y nunca reutiliza los bloques antiguos sugiere una fuga, una caché sin límite, una sesión retenida o una variación de la carga de trabajo.

Prueba los controles de liberación de la caché solo después de confirmar qué estado eliminan. Vaciar los bloques sin uso del asignador no descarga los pesos activos del modelo, y descargar el modelo puede perjudicar el tiempo de respuesta.

En un servidor doméstico con varios servicios, define un presupuesto de memoria y una política de inactividad para cada entorno de ejecución, de modo que la reserva de un servicio no impida silenciosamente que otro se inicie.

Centro de Tecnología e IA

Más para leer

Get More Builds Like This

Stay in the Loop

Get updates from Zima - new products, exclusive deals, and real builds from the community.

Stay in the Loop preferences

We respect your inbox. Unsubscribe anytime.