Skip to content

Commit 193c77c

Browse files
David Linfacebook-github-bot
authored andcommitted
Add mean.dtype_out op for Ads model (pytorch#7404)
Summary: title Reviewed By: manuelcandales Differential Revision: D67453766
1 parent 25d8f15 commit 193c77c

File tree

5 files changed

+90
-1
lines changed

5 files changed

+90
-1
lines changed

kernels/aten/functions.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,8 @@
257257

258258
- op: mean.out
259259

260+
- op: mean.dtype_out
261+
260262
- op: min.dim_min
261263

262264
- op: min.unary_out

kernels/portable/cpu/op_mean.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,14 @@ Tensor& mean_dim_out(
6666
return out;
6767
}
6868

69+
Tensor& mean_dtype_out(
70+
KernelRuntimeContext& ctx,
71+
const Tensor& in,
72+
optional<ScalarType> dtype,
73+
Tensor& out) {
74+
return mean_dim_out(ctx, in, ArrayRef<int64_t>(), false, dtype, out);
75+
}
76+
6977
} // namespace native
7078
} // namespace executor
7179
} // namespace torch

kernels/portable/cpu/util/reduce_util.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,7 @@ bool check_mean_dim_args(
386386
check_reduction_args(in, dim_list, keepdim, dtype, out));
387387

388388
if (dtype) {
389+
ET_LOG(Info, "dtype is %hhd", static_cast<int8_t>(dtype.value()));
389390
ET_LOG_AND_RETURN_IF_FALSE(torch::executor::isFloatingType(dtype.value()));
390391
ET_LOG_AND_RETURN_IF_FALSE(out.scalar_type() == dtype.value());
391392
} else {

kernels/portable/functions.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,11 @@
577577
- arg_meta: null
578578
kernel_name: torch::executor::mean_dim_out
579579

580+
- op: mean.dtype_out
581+
kernels:
582+
- arg_meta: null
583+
kernel_name: torch::executor::mean_dtype_out
584+
580585
- op: min.dim_min
581586
kernels:
582587
- arg_meta: null

kernels/test/op_mean_test.cpp

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#include <executorch/kernels/test/FunctionHeaderWrapper.h> // Declares the operator
1010
#include <executorch/kernels/test/TestUtil.h>
1111
#include <executorch/kernels/test/supported_features.h>
12-
#include <executorch/runtime/core/exec_aten/exec_aten.h>
12+
#include <executorch/runtime/core/error.h>
1313
#include <executorch/runtime/core/exec_aten/testing_util/tensor_factory.h>
1414
#include <executorch/runtime/core/exec_aten/testing_util/tensor_util.h>
1515
#include <executorch/runtime/core/exec_aten/util/scalar_type_util.h>
@@ -22,6 +22,7 @@ using exec_aten::ArrayRef;
2222
using exec_aten::optional;
2323
using exec_aten::ScalarType;
2424
using exec_aten::Tensor;
25+
using executorch::runtime::Error;
2526
using torch::executor::testing::TensorFactory;
2627

2728
class OpMeanOutTest : public OperatorTest {
@@ -36,6 +37,13 @@ class OpMeanOutTest : public OperatorTest {
3637
context_, self, dim, keepdim, dtype, out);
3738
}
3839

40+
Tensor& op_mean_dtype_out(
41+
const Tensor& self,
42+
optional<ScalarType> dtype,
43+
Tensor& out) {
44+
return torch::executor::aten::mean_outf(context_, self, dtype, out);
45+
}
46+
3947
template <ScalarType IN_DTYPE, ScalarType OUT_DTYPE>
4048
void test_mean_dim_out_invalid_dimensions() {
4149
TensorFactory<IN_DTYPE> tf_in;
@@ -466,3 +474,68 @@ TEST_F(OpMeanOutTest, DynamicShapeUnbound) {
466474
op_mean_out(x, ArrayRef<int64_t>{1}, false, ScalarType::Float, out);
467475
EXPECT_TENSOR_CLOSE(out, expected_result);
468476
}
477+
478+
TEST_F(OpMeanOutTest, DTypeOutFloatValid) {
479+
TensorFactory<ScalarType::Float> tf;
480+
481+
Tensor x = tf.make(
482+
{10, 10},
483+
{1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
484+
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
485+
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
486+
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
487+
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
488+
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
489+
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
490+
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0});
491+
Tensor expected_result = tf.make({}, {1.0});
492+
493+
Tensor out = tf.zeros({});
494+
Tensor ret = op_mean_dtype_out(x, ScalarType::Float, out);
495+
EXPECT_TENSOR_CLOSE(out, expected_result);
496+
}
497+
498+
TEST_F(OpMeanOutTest, DTypeOutFloatToBoolInvalid) {
499+
TensorFactory<ScalarType::Float> tf;
500+
501+
Tensor x = tf.make(
502+
{10, 10},
503+
{1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
504+
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
505+
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
506+
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
507+
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
508+
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
509+
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
510+
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0});
511+
Tensor expected_result = tf.make({}, {1.0});
512+
513+
Tensor out = tf.zeros({});
514+
515+
ET_EXPECT_KERNEL_FAILURE(
516+
context_, op_mean_dtype_out(x, ScalarType::Bool, out));
517+
}
518+
519+
TEST_F(OpMeanOutTest, DTypeOutFloatInfinity) {
520+
TensorFactory<ScalarType::Float> tf;
521+
522+
Tensor x = tf.make({2, 1}, {INFINITY, INFINITY});
523+
Tensor expected_result = tf.make({}, {INFINITY});
524+
525+
Tensor out = tf.zeros({});
526+
527+
Tensor ret = op_mean_dtype_out(x, ScalarType::Float, out);
528+
EXPECT_TENSOR_CLOSE(out, expected_result);
529+
}
530+
531+
TEST_F(OpMeanOutTest, DTypeOutFloatNAN) {
532+
TensorFactory<ScalarType::Float> tf;
533+
534+
Tensor x = tf.make({2, 1}, {NAN, INFINITY});
535+
Tensor expected_result = tf.make({}, {NAN});
536+
537+
Tensor out = tf.zeros({});
538+
539+
Tensor ret = op_mean_dtype_out(x, ScalarType::Float, out);
540+
EXPECT_TENSOR_CLOSE(out, expected_result);
541+
}

0 commit comments

Comments
 (0)