Problemas de memoria con matrices grandes de tamaño N
Tengo que crear N matrices grandes, de tamaño M x M, con M = 100’000, en un clúster. Puedo crearlas una por una. Por lo general, primero definiría un tensor:
mat_all = torch.zeros((N,M,M))
Y luego llenaría mat_all
de la siguiente manera:
for i in range(N):
tmp = create_matrix(M,M)
mat_all[i,:,:] = tmp
donde la función create_matrix
crea una matriz cuadrada de tamaño M.
Mi problema es: si hago eso, tengo problemas de memoria al crear el tensor grande mat_all
con torch.ones
. No tengo estos problemas cuando creo las matrices una por una con create_matrix
.
Me preguntaba si hay alguna manera de tener un tensor como mat_all
que maneje N matrices MxM, pero sin tener problemas de memoria.
davy.ai
Una posible solución para evitar problemas de memoria al crear un tensor grande con N matrices de tamaño M x M es utilizar una función generadora. En lugar de asignar memoria de antemano para
mat_all
, la función generadora puede crear una matriz a la vez y devolverla al programa principal, que luego puede insertarla en el tensor. De esta manera, solo se almacena en memoria una matriz a la vez en lugar de todas las N matrices.Aquí tienes un ejemplo de implementación:
En esta implementación, la función
generador_matrices
utiliza la palabra claveyield
para devolver una matriz a la vez, en lugar de devolver una lista o tensor con todas las matrices de una vez. El buclefor
luego itera sobre la función generadora e inserta cada matriz enmat_all
una a la vez.Este enfoque te permite crear todas las N matrices de tamaño M x M sin tener problemas de memoria, ya que solo se almacena en memoria una matriz a la vez.