Al ejecutar un programa de capacitación de PyTorch con num_workers=32
para DataLoader
, htop
muestra 33 procesos de python, cada uno con 32 GB de VIRT
y 15 GB de RES
.
¿Significa esto que el entrenamiento de PyTorch usa 33 procesos X 15 GB = 495 GB de memoria? htop
muestra solo alrededor de 50 GB de RAM y 20 GB de intercambio se utilizan en toda la máquina con 128 GB de RAM. Entonces, ¿cómo explicamos la discrepancia?
¿Existe una forma más precisa de calcular la cantidad total de RAM utilizada por el programa PyTorch principal y todos sus procesos de trabajo secundarios de DataLoader?
Gracias
Hay una función de python llamada tracemalloc que se usa para rastrear bloques de memoria asignados a python. https://docs.python.org/3/library/tracemalloc.html
import tracemalloc tracemalloc.start() do_someting_that_consumes_ram_and releases_some() # show how much RAM the above code allocated and the peak usage current, peak = tracemalloc.get_traced_memory() print(f"{current:0.2f}, {peak:0.2f}") tracemalloc.stop()
https://discuss.pytorch.org/t/measuring-peak-memory-usage-tracemalloc-for-pytorch/34067
¿Significa esto que el entrenamiento de PyTorch usa 33 procesos X 15 GB = 495 GB de memoria?
No es necesario. Tiene un proceso de trabajo (con varios subprocesos - trabajadores) y la CPU tiene varios núcleos. Un trabajador suele cargar un lote. El siguiente lote ya puede estar cargado y listo para cuando el proceso principal esté listo para otro lote. Este es el secreto de la aceleración.
Supongo que deberías usar mucho menos num_workers.
También sería interesante conocer el tamaño de su lote, que también puede adaptar para el proceso de capacitación.
¿Existe una forma más precisa de calcular la cantidad total de RAM utilizada por el programa PyTorch principal y todos sus procesos de trabajo secundarios de DataLoader?
Busqué en Google pero no pude encontrar una fórmula concreta. Creo que es una estimación aproximada de cuántos núcleos tiene su CPU, memoria y tamaño de lote.
Elegir num_workers depende del tipo de computadora que esté utilizando, el tipo de conjunto de datos que esté tomando y la cantidad de preprocesamiento sobre la marcha que requieran sus datos.
HTH