From 64fb3f9edbfb6515695b6a6bf463d41a297a939e Mon Sep 17 00:00:00 2001 From: lucasdelimanogueira Date: Fri, 17 May 2024 11:39:26 -0300 Subject: [PATCH] fix sum axis autograd and reversed add broadcasted order --- build/cpu.o | Bin 11272 -> 11192 bytes build/cuda.cu.o | Bin 120000 -> 120000 bytes build/tensor.o | Bin 42568 -> 42624 bytes norch/__pycache__/tensor.cpython-38.pyc | Bin 15407 -> 15409 bytes .../__pycache__/functions.cpython-38.pyc | Bin 8063 -> 7881 bytes norch/autograd/functions.py | 11 ++++----- norch/csrc/cpu.cpp | 14 +++++++----- norch/csrc/cpu.h | 2 +- norch/csrc/tensor.cpp | 11 ++++++--- norch/libtensor.so | Bin 160224 -> 160224 bytes norch/tensor.py | 2 +- tests/test_autograd.py | 21 ++++++++++++++++-- tests/test_operations.py | 16 +++++++++++-- 13 files changed, 58 insertions(+), 19 deletions(-) diff --git a/build/cpu.o b/build/cpu.o index 6228ac23853271c276dd0881ed9552fffc806dde..054ce2e8e0f1664781c7f4b704e9d4f88cb3fc9e 100644 GIT binary patch delta 2015 zcmZuwe`s4(6u$SRYg3jr>AEFtv;JN&ZR40An_bbh>cxj_T4li^g4SPXQCXptB8?e5 zDt$a7X2(A!Y%-C-29ah4v53s3W28bE*$mif(Aag5t_3SCbkn+c?z{JOZPcMeUAB?Gb;Jm6IJ^Q52PRB16-K50^o9U{O z0x9*i>uO?7QE6($=^{9fPOmt75~icZQgm?&wK2pQ;^kzaPay>3lOczQ=WA!thlky2 z_)(r?oSPgs3y-5vO0*nRPpOHlqUuSLRCRV6_R#~OG)1YnOsCxlMDN|kAUa!3vKbyL z$ufM|NSFz}YOqWPiw+!v3$c0m%(Pj-Bb_EVA}Am5$SwerIQBLm3uy+4JVr7 z)kr(XCUut9ScWd1G+26zd+d@KM}9(*Wo1|_WGCj|a`$$Yb%tH|aY;7MWd@t?U}y z=)kQuVU?PHk#j6TS?<2^_Vak5wYxf7(%xOBiz9fSEm>otCF~*}mNe@eW2<_?U^zO4 zO8%UpY3}c7_7Kt7JY699d|qQ&x{$h?&;N9J#aa7LK-F)mI<&eg<5w$g*=$&s_;;RW zrFjqT?ASVd+~6xKbA6;dv7^}btKulJ6VCf!TXh{(p&9L4z|fAu8)(nN2-+z)S6!#% z6u4AXTf7(L4jbQs-CGIW-lBND*G_2`qb~uK` zLcWG;$o_^W&VExOV2dpQTH~qmr0;X^5VG$}_Vv=OzGt8p*$K%ywhQ(G zp7~gV2(pb>6dpNJCeWZ*$WxF&_K0N5oC5w(viYCvlKlNz(ksJqBnI?iqA zN2$r~6akLNICB#BR|r6rcrn(9-)cbOFH77n@t-ArM&i#){P->bn12awhXlTl9NR63 zm!!if=@656zr?>q+y!0Uikk1GqQNaFOYw`Ti1>Cve_bGcrLIqjcQ)2jdKG$`JoJWX z*CEp6sj85L#&0CsaIRzD@=*y1R5r$Eo1Udrx=Vz&L^2xz=xX+aVv;RF(T+_aCMDjA z7=Jh`^lU*i3;%sn9R5rep4)`;t%ZM8jt4@XAv|#tPK)r$!dutnKLj78^4?tEhSSo2 zunB)Kex=!2uVRp%R%M38zMe8)O(9yxMlC=;}3XDyJ4>7F-oAJ z^)U5AFWUX^CE9NI6YU9TXggebqFMy(hPT@emZoaODFYYqH1U8q4M4fK0@i(w{{aF@ B6E*+< delta 2065 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 LWH#+J)!qLOft1J6 diff --git a/build/tensor.o b/build/tensor.o index d330a483d7b16c0a921697663d057ddf521cc8fc..5df78192dbfd694f7baea9d517a107fdcdcef5fc 100644 GIT binary patch literal 42624 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 diff --git a/norch/__pycache__/tensor.cpython-38.pyc b/norch/__pycache__/tensor.cpython-38.pyc index eeeaf809dd0adb885c280d76e140a26090808205..d3ad7c7337ee09c4c77f1477e10593e6a27e86dd 100644 GIT binary patch delta 49 zcmZ2qv9W?Tl$V!_0SM&M-P1m9n C4GyUQ diff --git a/norch/autograd/__pycache__/functions.cpython-38.pyc b/norch/autograd/__pycache__/functions.cpython-38.pyc index b0f6eab62515c59bd55b03e38aae8bd4d31ecff8..b9738ebc3466df126c4c54d79857ec53db6d7209 100644 GIT binary patch delta 922 zcmZWnT}TvB6rOwU%>K-})4H?nxVkF&kS&2082+WMza@zU5>W_d&1O5RtKM1ZhgoD1 z>d9V?Ak@n)1w{oWR?tI1Z`FgZ(LxVB^bpy5^it=pS}hIS!ynex``Eb0E0v- zh)Nrohp6zhs$K6yC@07rPgI$A;@WZO3J;NX$b}8E3JpdS-bW&^6>ju&pf<*M9Dalk zkTs-w^?rolZws`wA6u-u1`*>!r5<;or~0C=xdezX2;bEx$-~>~K3$l52hZMLQTRY< zf{94)?gaPYS!9|#fM`vJGK|W5aLE{hhcy?-6Y$oqk##844(lh7dHhcw#!ra93tiFp zZl4#h8a+!oU_07MUc&ymZhZvx&&z5?uqL;we+|C+bHUQabmtl}JDKJuaV1^Zhh=Zz zc71ovC}yw9ng}FT$&bR9`lgt;bzIyoF1+T#EiQKEVihi?=3)#!3ZE+s7;QM{3u8vx2(WH?YHe$FY#}Qp>iOQqrE{g7;-`_(%!%e`zrMRJpe&Lxf z-d|wfKt5~`ABrw%^)!u<87hGT931P#XP;kGde+a}EnWv&6ZtRX5t@iFJHn+eMR1ce z(;>(bkWpx^=xo4&O=)gILQU8bb{QK5i#1*_!Tc=4lMOdmA4m%D`tqz&TaPj^%Sqy=fCVxpKNu{OUf0&axRLH19!j;|qIF?TFgvre%QXT@ z{MEHv2Zwv3gGMV&EMml!>l&8IUCJeF5=Z^jK4&a>ZYYM)bSztdG2=`$CGPvTSGG!q zJPcP6TqiTU1Pt8Nz$zXPfBa2aGdZrv&|xpOT&|OXRqJDe-sk6g(F_p?mN` z{0y~e?ZkVQ$8BHYUM=78|B%<>Tlo>#A{xUR;f)vww`d)d_9`#6V<~kmye##dIK2AU zqDIQ%BjZLqi3dr9Qg|=Eu5Jl+(LQhU_L81RF*b_2it31bLnz+~%I2U{6s0^UuZr>x bD67FP@!ef2#wuzGi@gP2r`O?ic^!WNxNHQW diff --git a/norch/autograd/functions.py b/norch/autograd/functions.py index e4f91f5..0023139 100644 --- a/norch/autograd/functions.py +++ b/norch/autograd/functions.py @@ -84,9 +84,9 @@ class MatmulBackward: x, y = self.input if x.ndim != y.ndim: # broadcasted case - print("KKKKKKKKK", x.ndim, y.ndim) aux = (gradient @ y.transpose(-1,-2)) - return [aux.sum(axis=0), x.transpose(-1,-2) @ gradient] + aux_sum = aux.sum(axis=0) + return [aux_sum, x.transpose(-1,-2) @ gradient] else: return [gradient @ y.transpose(-1,-2), x.transpose(-1,-2) @ gradient] @@ -133,14 +133,15 @@ class SumBackward: def backward(self, gradient): input_shape = self.input[0].shape - if self.axis is None: + if self.axis == -1: # If axis is None, sum reduces the tensor to a scalar. grad_output = float(gradient.tensor.contents.data[0]) * self.input[0].ones_like() else: # Broadcast the gradient to the input shape along the specified axis. - grad_output_shape = [1 if i in self.axis else dim for i, dim in enumerate(input_shape)] + grad_output_shape = list(input_shape) + grad_output_shape[self.axis] = 1 grad_output = gradient.reshape(grad_output_shape) - grad_output = grad_output * self.input[0].ones_like() + grad_output = grad_output + self.input[0].zeros_like() return [grad_output] class ReshapeBackward: diff --git a/norch/csrc/cpu.cpp b/norch/csrc/cpu.cpp index bde7b0c..a2f107b 100644 --- a/norch/csrc/cpu.cpp +++ b/norch/csrc/cpu.cpp @@ -11,7 +11,7 @@ void add_tensor_cpu(Tensor* tensor1, Tensor* tensor2, float* result_data) { } } -void add_broadcasted_tensor_cpu(Tensor* tensor1, Tensor* tensor2, float* result_data, int* broadcasted_shape) { +void add_broadcasted_tensor_cpu(Tensor* tensor1, Tensor* tensor2, float* result_data, int* broadcasted_shape, int broadcasted_size) { int max_ndim = tensor1->ndim > tensor2->ndim ? tensor1->ndim : tensor2->ndim; // Calculate strides for broadcasting @@ -28,12 +28,12 @@ void add_broadcasted_tensor_cpu(Tensor* tensor1, Tensor* tensor2, float* result_ int dim2 = i < tensor2->ndim ? tensor2->shape[tensor2->ndim - max_ndim + i] : 1; strides1[i] = dim1 == broadcasted_shape[i] ? stride1 : 0; strides2[i] = dim2 == broadcasted_shape[i] ? stride2 : 0; - stride1 *= broadcasted_shape[i]; - stride2 *= broadcasted_shape[i]; + stride1 *= (dim1 == broadcasted_shape[i]) ? dim1 : 1; + stride2 *= (dim2 == broadcasted_shape[i]) ? dim2 : 1; } // Perform element-wise addition with broadcasting - for (int i = 0; i < tensor1->size; i++) { + for (int i = 0; i < broadcasted_size; i++) { int index1 = 0, index2 = 0; int linear_index = i; for (int j = max_ndim - 1; j >= 0; j--) { @@ -219,7 +219,11 @@ void sum_tensor_cpu(Tensor* tensor, float* result_data, int axis) { return; } - int result_shape[tensor->ndim - 1]; + int* result_shape = (int*)malloc((tensor->ndim - 1) * sizeof(int)); + if (result_shape == NULL) { + fprintf(stderr, "Memory allocation failed\n"); + exit(1); + } int result_size = 1; int axis_stride = tensor->strides[axis]; diff --git a/norch/csrc/cpu.h b/norch/csrc/cpu.h index fad467c..2a97fd2 100644 --- a/norch/csrc/cpu.h +++ b/norch/csrc/cpu.h @@ -4,7 +4,7 @@ #include "tensor.h" void add_tensor_cpu(Tensor* tensor1, Tensor* tensor2, float* result_data); -void add_broadcasted_tensor_cpu(Tensor* tensor1, Tensor* tensor2, float* result_data, int* broadcasted_shape); +void add_broadcasted_tensor_cpu(Tensor* tensor1, Tensor* tensor2, float* result_data, int* broadcasted_shape, int broadcasted_size); void sum_tensor_cpu(Tensor* tensor, float* result_data, int axis); void sub_tensor_cpu(Tensor* tensor1, Tensor* tensor2, float* result_data); void sub_broadcasted_tensor_cpu(Tensor* tensor1, Tensor* tensor2, float* result_data, int* broadcasted_shape); diff --git a/norch/csrc/tensor.cpp b/norch/csrc/tensor.cpp index 104994e..730d204 100644 --- a/norch/csrc/tensor.cpp +++ b/norch/csrc/tensor.cpp @@ -149,20 +149,25 @@ extern "C" { broadcasted_shape[max_ndim - 1 - i] = dim1 > dim2 ? dim1 : dim2; } + int broadcasted_size = 1; + for (int i = 0; i < max_ndim; i++) { + broadcasted_size *= broadcasted_shape[i]; + } + if (strcmp(tensor1->device, "cuda") == 0) { float* result_data; - cudaMalloc((void **)&result_data, tensor1->size * sizeof(float)); + cudaMalloc((void **)&result_data, broadcasted_size * sizeof(float)); add_broadcasted_tensor_cuda(tensor1, tensor2, result_data, broadcasted_shape); return create_tensor(result_data, broadcasted_shape, max_ndim, tensor1->device); } else { - float* result_data = (float*)malloc(tensor1->size * sizeof(float)); + float* result_data = (float*)malloc(broadcasted_size * sizeof(float)); if (result_data == NULL) { fprintf(stderr, "Memory allocation failed\n"); exit(1); } - add_broadcasted_tensor_cpu(tensor1, tensor2, result_data, broadcasted_shape); + add_broadcasted_tensor_cpu(tensor1, tensor2, result_data, broadcasted_shape, broadcasted_size); return create_tensor(result_data, broadcasted_shape, max_ndim, tensor1->device); } } diff --git a/norch/libtensor.so b/norch/libtensor.so index 06f1149ad1e7f471af0f85187b24903bc3f88fb5..9f15e450bdefc73779a4026e40a6c89dcbd07b43 100755 GIT binary patch delta 22521 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 delta 22515 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