Cuando PyTorch construye un grafo de computación para un modelo de aprendizaje automático, debe decidir qué operaciones almacenar en memoria y cuáles recomputar para mantenerse dentro de un presupuesto de RAM específico. Esto se plantea como un problema de la mochila 0/1: cada operación es un 'elemento' con un costo de memoria y un 'valor' de tiempo de ejecución. El objetivo es seleccionar un conjunto de operaciones a guardar que maximice el ahorro total de tiempo sin exceder la capacidad de memoria disponible. Aunque PyTorch utiliza tradicionalmente un enfoque de programación dinámica (DP) llamado `dp_knapsack` para resolver esto, la implementación estándar requiere asignar una tabla 2D completa de forma (número de elementos, peso máximo), lo que puede provocar el agotamiento de la memoria en modelos grandes.

Esta imagen ilustra el problema de la mochila mencionado en el primer párrafo, donde las operaciones se tratan como elementos con costos de memoria y valores de tiempo de ejecución.
Para abordar esto, Jędrzej Maczan introdujo `dp_knapsack_sliding_hirschberg`, un solucionador que reduce significativamente la huella de memoria de la propia fase de planificación. La implementación utiliza dos optimizaciones principales. Primero, emplea un truco de 'ventana deslizante', que reduce la complejidad espacial de la tabla DP al mantener solo las filas actual y anterior en memoria. Segundo, incorpora el algoritmo de Hirschberg, un enfoque de divide y vencer que elimina la necesidad de un costoso paso de retroceso. En lugar de construir una tabla masiva y rastrear hacia atrás para encontrar los elementos óptimos, el método de Hirschberg divide recursivamente el problema en subproblemas más pequeños, identificando los puntos de división óptimos hasta que se determina el conjunto final de operaciones guardadas.

Esta figura explica la primera optimización mencionada en el segundo párrafo: el uso de una ventana deslizante para minimizar la huella de memoria de la tabla DP.

Este apoyo visual corresponde a la segunda optimización descrita en el segundo párrafo, mostrando cómo el método de Hirschberg divide el problema recursivamente.
En pruebas prácticas, este cambio permite al solucionador manejar problemas con 2,000 elementos en una máquina con 64 GB de RAM, una tarea en la que el solucionador `dp_knapsack` original fallaría con solo 100 elementos. Si bien el nuevo solucionador proporciona una solución exacta y una aceleración de aproximadamente el 37% sobre la línea base, no es el método más rápido disponible. Para los usuarios que pueden incluir dependencias externas, el solucionador de Programación Lineal Entera (ILP) a través de SciPy es significativamente más rápido. Sin embargo, para aquellos restringidos a las distribuciones estándar de PyTorch, `dp_knapsack_sliding_hirschberg` ofrece una forma robusta de gestionar modelos intensivos en memoria sin la sobrecarga de la tabla DP tradicional.

Esta imagen ilustra los resultados de las pruebas prácticas y la comparación entre el nuevo solucionador, la línea base y los solucionadores ILP externos discutidos en el último párrafo.