From 39246e602a52dc84e26b5cb1afe92ca20cccec12 Mon Sep 17 00:00:00 2001 From: gs-olive <113141689+gs-olive@users.noreply.github.com> Date: Fri, 7 Oct 2022 18:20:19 -0700 Subject: [PATCH 1/3] Augment current tests to reproduce error generating bug with standard dev / variance lowering --- tests/core/conversion/converters/test_reduce.cpp | 3 ++- tests/core/lowering/test_unpack_reduce_ops.cpp | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/core/conversion/converters/test_reduce.cpp b/tests/core/conversion/converters/test_reduce.cpp index bf5234dc19..e3e1e6d252 100644 --- a/tests/core/conversion/converters/test_reduce.cpp +++ b/tests/core/conversion/converters/test_reduce.cpp @@ -465,7 +465,8 @@ TEST(Converters, UnpackStdUnbiasedKeepDimsLowersCorrectly) { %5 : bool = prim::Constant[value=0]() # test_zeros.py:10:65 %4 : bool = prim::Constant[value=1]() # test_zeros.py:10:50 %3 : int = prim::Constant[value=0]() # test_zeros.py:10:39 - %6 : int[] = prim::ListConstruct(%3) + %one : int = prim::Constant[value=1]() + %6 : int[] = prim::ListConstruct(%3, %one) %7 : Tensor = aten::std(%x.1, %6, %4, %5) # test_zeros.py:10:26 return (%7))IR"; diff --git a/tests/core/lowering/test_unpack_reduce_ops.cpp b/tests/core/lowering/test_unpack_reduce_ops.cpp index 146e49891a..8ae6be8e8c 100644 --- a/tests/core/lowering/test_unpack_reduce_ops.cpp +++ b/tests/core/lowering/test_unpack_reduce_ops.cpp @@ -134,7 +134,8 @@ TEST(LoweringPasses, UnpackStdKeepDimsLowersCorrectly) { %5 : bool = prim::Constant[value=0]() # test_zeros.py:10:65 %4 : bool = prim::Constant[value=1]() # test_zeros.py:10:50 %3 : int = prim::Constant[value=0]() # test_zeros.py:10:39 - %6 : int[] = prim::ListConstruct(%3) + %one : int = prim::Constant[value=1]() + %6 : int[] = prim::ListConstruct(%3, %one) %7 : Tensor = aten::std(%x.1, %6, %5, %5) # test_zeros.py:10:26 return (%7))IR"; @@ -184,7 +185,8 @@ TEST(LoweringPasses, UnpackStdUnbiasedKeepDimsLowersCorrectly) { %5 : bool = prim::Constant[value=0]() # test_zeros.py:10:65 %4 : bool = prim::Constant[value=1]() # test_zeros.py:10:50 %3 : int = prim::Constant[value=0]() # test_zeros.py:10:39 - %6 : int[] = prim::ListConstruct(%3) + %one : int = prim::Constant[value=1]() + %6 : int[] = prim::ListConstruct(%3, %one) %7 : Tensor = aten::std(%x.1, %6, %4, %5) # test_zeros.py:10:26 return (%7))IR"; From c65ef4e553f834f57cfb39cf0e13b4dad4404110 Mon Sep 17 00:00:00 2001 From: gs-olive <113141689+gs-olive@users.noreply.github.com> Date: Fri, 7 Oct 2022 18:20:43 -0700 Subject: [PATCH 2/3] fix: Ensure torch.std (and torch.var) support multiple dimensions - Refactor IR code to avoid the use of select, for which only single-dimension support exists currently - Update formula in Bessel's correction (unbiased) case - Include regression tests to catch multi-dimensional indexing errors --- core/lowering/passes/unpack_var.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/core/lowering/passes/unpack_var.cpp b/core/lowering/passes/unpack_var.cpp index bbb25374be..63036c8478 100644 --- a/core/lowering/passes/unpack_var.cpp +++ b/core/lowering/passes/unpack_var.cpp @@ -26,11 +26,16 @@ void UnpackVar(std::shared_ptr& graph) { %var: Tensor = aten::sub(%sqrdmean, %meansqrd, %1) %varout : Tensor = prim::If(%unbiased) block0(): - %shape: int[] = aten::size(%input) - %shapet: Tensor = aten::tensor(%shape, %f32_dtype, %none, %false) - %dim: int = prim::ListUnpack(%dims) - %reduceddims: Tensor = aten::select(%shapet, %0, %dim) - %numel: Tensor = aten::prod(%reduceddims, %dim, %keepdim, %none) + %originalshape: int[] = aten::size(%input) + %originalshapet: Tensor = aten::tensor(%originalshape, %f32_dtype, %none, %false) + %originalnumel: Tensor = aten::prod(%originalshapet, %0, %false, %none) + + %resultingshape: int[] = aten::size(%var) + %resultingshapet: Tensor = aten::tensor(%resultingshape, %f32_dtype, %none, %false) + %resultingnumel: Tensor = aten::prod(%resultingshapet, %0, %false, %none) + + %numel: Tensor = aten::div(%originalnumel, %resultingnumel) + %mul: Tensor = aten::mul(%var, %numel) %sub: Tensor = aten::sub(%numel, %1, %1) %v: Tensor = aten::div(%mul, %sub) From 5bebd9c1339841cd59eb2418e1848c69c08db153 Mon Sep 17 00:00:00 2001 From: gs-olive <113141689+gs-olive@users.noreply.github.com> Date: Mon, 10 Oct 2022 12:23:53 -0700 Subject: [PATCH 3/3] Improved comments on IR for UnpackVar function --- core/lowering/passes/unpack_var.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/core/lowering/passes/unpack_var.cpp b/core/lowering/passes/unpack_var.cpp index 63036c8478..4a697833a0 100644 --- a/core/lowering/passes/unpack_var.cpp +++ b/core/lowering/passes/unpack_var.cpp @@ -26,16 +26,18 @@ void UnpackVar(std::shared_ptr& graph) { %var: Tensor = aten::sub(%sqrdmean, %meansqrd, %1) %varout : Tensor = prim::If(%unbiased) block0(): + # Compute number of elements in original input tensor %originalshape: int[] = aten::size(%input) %originalshapet: Tensor = aten::tensor(%originalshape, %f32_dtype, %none, %false) %originalnumel: Tensor = aten::prod(%originalshapet, %0, %false, %none) - + # Compute number of elements in resulting output tensor %resultingshape: int[] = aten::size(%var) %resultingshapet: Tensor = aten::tensor(%resultingshape, %f32_dtype, %none, %false) %resultingnumel: Tensor = aten::prod(%resultingshapet, %0, %false, %none) - + # Quotient of original number of elements and resulting number of elements + # is equal to the number of elements used per variance calculation %numel: Tensor = aten::div(%originalnumel, %resultingnumel) - + # Perform Bessel's correction on computed variance %mul: Tensor = aten::mul(%var, %numel) %sub: Tensor = aten::sub(%numel, %1, %1) %v: Tensor = aten::div(%mul, %sub)