From e670559fe49d716f2b275dd1590124aa5990f4d2 Mon Sep 17 00:00:00 2001 From: lucasdelimanogueira Date: Wed, 5 Jun 2024 15:43:19 -0300 Subject: [PATCH] fix memory issues del tensors --- build/cuda.cu.o | Bin 220904 -> 220904 bytes build/tensor.o | Bin 55224 -> 55304 bytes examples/train_multigpu.py | 19 ++++++++++++++--- examples/train_nn_mnist.ipynb | 14 +++++++++--- examples/train_singlegpu.py | 20 +++++++++++++++++- norch/__pycache__/tensor.cpython-38.pyc | Bin 20801 -> 20819 bytes norch/csrc/tensor.cpp | 16 +++++++++----- norch/libtensor.so | Bin 401384 -> 401384 bytes .../optimizers/__pycache__/sgd.cpython-38.pyc | Bin 1270 -> 1274 bytes norch/tensor.py | 5 ++++- 10 files changed, 61 insertions(+), 13 deletions(-) diff --git a/build/cuda.cu.o b/build/cuda.cu.o index 17d7461cf3c7f22015778c6a13c28257bc392057..437afebaa62eae8c802353ad66e6ca4694b15154 100644 GIT binary patch delta 24 gcmaE{m-oe9-i8*&EleesSPYX447OKXVk+nX0E(arTmS$7 delta 24 gcmaE{m-oe9-i8*&EleesSPaaJ6Sr4fVk+nX0E&4EV*mgE diff --git a/build/tensor.o b/build/tensor.o index 09cfc55a719b7d4f2b0c460b00b9aa57a7a10d05..7b38f1968ab8a8c8b86a798a75b9e79aa73444be 100644 GIT binary patch literal 55304 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 avcLB#JJv^0LD2qrySzOTx}!YW@&CUWmqjK3 literal 55224 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 TsUT?omS4JiBy~r5wB!HZFIh3o diff --git a/examples/train_multigpu.py b/examples/train_multigpu.py index 8cbaaff..8d112cb 100644 --- a/examples/train_multigpu.py +++ b/examples/train_multigpu.py @@ -38,6 +38,7 @@ def main(): ] ) + print("Loading data") train_data, test_data = norch.norchvision.datasets.MNIST.splits(transform=transform, target_transform=target_transform) distributed_sampler = DistributedSampler(dataset=train_data, num_replicas=world_size, rank=rank) train_loader = norch.utils.data.DataLoader(train_data, batch_size=BATCH_SIZE, sampler=distributed_sampler) @@ -58,6 +59,7 @@ def main(): return out + print("Creating model") model = MyModel().to(device) model = DistributedDataParallel(model) criterion = nn.CrossEntropyLoss() @@ -67,8 +69,15 @@ def main(): print(f"Starting training on Rank {rank}/{world_size}\n\n") for epoch in range(epochs): + + avg_loss = 0 + num_steps = 0 + for idx, batch in enumerate(train_loader): + if idx % 100 == 0 and rank == 0: + print(f"Epoch: {epoch}/{epochs} - Step: {idx} / {len(train_loader)}") + inputs, target = batch inputs = inputs.to(device) @@ -83,10 +92,14 @@ def main(): loss.backward() optimizer.step() - + + avg_loss += loss[0] + num_steps += 1 + + avg_loss = avg_loss / num_steps if rank == 0: - print(f'Epoch [{epoch + 1}/{epochs}], Loss: {loss[0]:.4f}') - loss_list.append(loss[0]) + print(f'Epoch [{epoch + 1}/{epochs}], Loss: {avg_loss:.4f}') + loss_list.append(avg_loss) if __name__ == "__main__": main() diff --git a/examples/train_nn_mnist.ipynb b/examples/train_nn_mnist.ipynb index 21e61f7..12c37ce 100644 --- a/examples/train_nn_mnist.ipynb +++ b/examples/train_nn_mnist.ipynb @@ -139,7 +139,11 @@ "optimizer = optim.SGD(model.parameters(), lr=0.01)\n", "loss_list = []\n", "\n", - "for epoch in range(epochs): \n", + "for epoch in range(epochs): \n", + " \n", + " avg_loss = 0 \n", + " num_steps = 0\n", + " \n", " for idx, batch in enumerate(train_loader):\n", "\n", " inputs, target = batch\n", @@ -157,8 +161,12 @@ "\n", " optimizer.step()\n", "\n", - " print(f'Epoch [{epoch + 1}/{epochs}], Loss: {loss[0]:.4f}')\n", - " loss_list.append(loss[0])" + " avg_loss += loss[0]\n", + " num_steps += 1\n", + "\n", + " avg_loss = avg_loss / num_steps\n", + " print(f'Epoch [{epoch + 1}/{epochs}], Loss: {avg_loss:.4f}')\n", + " loss_list.append(avg_loss)" ] }, { diff --git a/examples/train_singlegpu.py b/examples/train_singlegpu.py index 8c58ed6..6b0dfac 100644 --- a/examples/train_singlegpu.py +++ b/examples/train_singlegpu.py @@ -24,6 +24,8 @@ def main(): ] ) + + print("Loading data") train_data, test_data = norch.norchvision.datasets.MNIST.splits(transform=transform, target_transform=target_transform) train_loader = norch.utils.data.DataLoader(train_data, batch_size=BATCH_SIZE) @@ -43,14 +45,23 @@ def main(): return out + print("Creating model") model = MyModel().to(device) criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.01) loss_list = [] - for epoch in range(epochs): + print("Starting training") + for epoch in range(epochs): + + avg_loss = 0 + num_steps = 0 + for idx, batch in enumerate(train_loader): + if idx % 100 == 0: + print(f"Epoch: {epoch}/{epochs} - Step: {idx} / {len(train_loader)}") + inputs, target = batch inputs = inputs.to(device) @@ -64,6 +75,13 @@ def main(): loss.backward() optimizer.step() + + avg_loss += loss[0] + num_steps += 1 + + avg_loss = avg_loss / num_steps + print(f'Epoch [{epoch + 1}/{epochs}], Loss: {avg_loss:.4f}') + loss_list.append(avg_loss) if __name__ == "__main__": diff --git a/norch/__pycache__/tensor.cpython-38.pyc b/norch/__pycache__/tensor.cpython-38.pyc index 3662c857b632d3003de3385f3ae9984736bd8af5..ad61d698f8d36154b1e0a24619ee8b3895027531 100644 GIT binary patch delta 1756 zcmZ{kYfzMB6o5H<`PeH03+y7A3o9_Ju!A6G z_x-M&gRjp)#%8VffEJ8NDRH5!0Q|Tjm&4*;bkfu0(t^J& z@z_#^P&l$&V-@Zx$-`>*Bf3Wcudi8zF?VfdJ(+6lF_F}!CF*Xr;0^Z}3}K+qRqCe& zt>eo`(vlh^>0VO7P)L?5`I*9fV4aUQTeG{_tYf>e#Z$g$n0$%_W(>1K*h30Gp^heD zp<1+9yZL3$HJw$Zr39fLcbAk(LqeRom%0V7m()Bw{mRmjF7gB7^4!b2grv?V59dl)?8C~*|U;odk^ZwtS8HBUG2gsWk?Lhm9ht` zt;65jT;_CHjwE|!`8H-%jM-llre(UhmfR1k87#(+Dw?DQ+VCYY?gD*O>A`WI3+sLD z;Ni!7OfU8`RIRW+*vnCe6Q8NFK?(1vng*a$^Q3reK$aDptSRPAE4*Mu3OZj3PSluT zkWbd^(dCcQk~U@y)FXCM;3%(LrGoXHk; zu^tzWH!tI%+EaAL{`PN~yLz#@?b#_qa93DmXDE=LP$w?BQ%dR8WMmnK`tQO1x=@$p zFzqU6=U2)i!#B{-(3yXhL@k5)N|Hj?#rqm=fmNH5j%-e2u(85EEyVwg^-g0aoW;W0 z977}=-Ome~I_J_?!_g~zym`gk>-L!XiB^r&l0~XqlN#=c#KNKPgx15mT2F%Hr~S0s zV>KsOFsjC5s`4vlufHW7rTw$;ntLHS+c!{y^w4Rmcb#!X^TJ-`ExcIkNzvkH82o5cUxc5)KjQbh9Ibal!=QIN=20 z6#|_tHkr0skS5Be2!czfxL?2-t!kFbiTqj3PJ}d5aJ11SEBHh<+6MAyxYDe&s1XaKfC6 z6Fu8t%rSiYW6U1zX2~A^j6deKY)eK=wxo-jTVl35Hu>d#=bm%! zdE9gFUW2)7kh0HeH7AJQ{>hH+FDGxO+|j4BLPEj_coUB5CxGSh-}Gtlp)?H8fX9vN zta>9DqW^~`6aUnBgfkujaZrdO|Clv2tj{P$HjqlqB zbpIsa+RR00#L=hIF||R$>a6{s@8BSSS`n|vS(KJh!yh@v9B@z4CTwS7Vq zNed{7SCuhwz`=*gW&lP=KqrTS1G3zS zw<-$x3+2UNd6m>-so0I$em}oeaZ;BxLVN!il*>YPp4V?t!E$MdsqmhXEXyp+`V_CP zUzR`OzdrMm&atF#q^;eP_|#ETe#T!a_dz{YROLbR2KH3BvIa?8Q;c0L_PUUL!@sTS zhUjY|>3f5RSK#cf65d}kO+&W4u01w?1{|xC?QI6npigDfGk)( zIw|&@8B804*Z{*@Xlrn1U5SMf51a{^o4?rb04!RIbfhzd>W)(Dn@@0cXNMcEP!}Y< z-xoN|H|=!C@=$$&clqqD@|d72sD7>`mbqIzKHA%fRW1|U6+#F1xhBE*Xi&rhXAUz@ zKn(>|cOqUi%lJHK-{BDsa?cpLu)fVV}a()r>ZD)ZA|NF zMQnzi761SM diff --git a/norch/csrc/tensor.cpp b/norch/csrc/tensor.cpp index e188e7e..54882bd 100644 --- a/norch/csrc/tensor.cpp +++ b/norch/csrc/tensor.cpp @@ -26,23 +26,29 @@ extern "C" { tensor->device = strdup(device); tensor->strides = (int*)malloc(ndim * sizeof(int)); tensor->shape = (int*)malloc(ndim * sizeof(int)); - tensor->data = (float*)malloc(tensor->size * sizeof(float)); - if (tensor->device == NULL || tensor->strides == NULL || tensor->shape == NULL || tensor->data == NULL) { + if (tensor->device == NULL || tensor->strides == NULL || tensor->shape == NULL) { fprintf(stderr, "Memory allocation failed\n"); exit(1); } memcpy(tensor->shape, shape, tensor->ndim * sizeof(int)); strcpy(tensor->device, device); - memcpy(tensor->data, data, tensor->size * sizeof(float)); - + + if (strcmp(tensor->device, "cpu") == 0) { + tensor->data = (float*)malloc(tensor->size * sizeof(float)); + memcpy(tensor->data, data, tensor->size * sizeof(float)); + } else { + //already allocated on gpu + tensor->data = data; + } + int stride = 1; for (int i = ndim - 1; i >= 0; i--) { tensor->strides[i] = stride; stride *= shape[i]; } - + return tensor; } diff --git a/norch/libtensor.so b/norch/libtensor.so index d7435deb91cfd8ae2785bcd8d6871bd258a4eb33..300caf16ea98a980e0e99117b7a67309684aec8c 100755 GIT binary patch delta 45644 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

W;Y+)n$#Ox?~sQz_WVJociLj^z6ks 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 J3HP~a`(GPzSdst$ delta 45694 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 diff --git a/norch/tensor.py b/norch/tensor.py index 22061be..0287fb6 100644 --- a/norch/tensor.py +++ b/norch/tensor.py @@ -46,13 +46,16 @@ class Tensor: Tensor._C.create_tensor.argtypes = [ctypes.POINTER(ctypes.c_float), ctypes.POINTER(ctypes.c_int), ctypes.c_int, ctypes.c_char_p] Tensor._C.create_tensor.restype = ctypes.POINTER(CTensor) - self.tensor = Tensor._C.create_tensor( self.data_ctype, self.shape_ctype, self.ndim_ctype, self.device_ctype ) + + del self.data_ctype + del self.shape_ctype + del self.device_ctype else: self.tensor = None,