From 4f9f6aedea5709d579f2644b4f40953f0bc1865c Mon Sep 17 00:00:00 2001 From: "M. Zeeshan Siddiqui" Date: Fri, 1 May 2020 21:36:29 -0700 Subject: [PATCH] CUDA/CPU test for NegativeLogLikelihoodLoss(12) function based loss operator. (#3793) --- .../cuda/negativeloglikelihood_test.cc | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 orttraining/orttraining/test/training_ops/cuda/negativeloglikelihood_test.cc diff --git a/orttraining/orttraining/test/training_ops/cuda/negativeloglikelihood_test.cc b/orttraining/orttraining/test/training_ops/cuda/negativeloglikelihood_test.cc new file mode 100644 index 0000000000..184be72fcb --- /dev/null +++ b/orttraining/orttraining/test/training_ops/cuda/negativeloglikelihood_test.cc @@ -0,0 +1,110 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#include "test/providers/compare_provider_test_utils.h" + +using namespace std; + +namespace onnxruntime { +namespace test { + +static void TestNegativeLogLikelihoodLoss(const std::vector* X_dims, + const std::vector* index_dims, + const std::vector* weight_dims, + const std::vector* Y_dims, + const std::string& reduction, + const std::int64_t ignore_index = -1) { + CompareOpTester test("NegativeLogLikelihoodLoss", 12, onnxruntime::kOnnxDomain); + test.AddAttribute("reduction", reduction); + test.AddAttribute("ignore_index", ignore_index); + + // create rand inputs + RandomValueGenerator random{}; + std::vector X_data = random.Uniform(*X_dims, -200.0f, 200.0f); + std::vector index_data = random.Uniform(*index_dims, 0, (*X_dims)[1]); + //Add one data point that has ignore_index. + if (index_data.size() > 0) { + index_data[0] = ignore_index; + } + + test.AddInput("X", *X_dims, X_data); + test.AddInput("index", *index_dims, index_data); + + if (weight_dims) { + std::vector weight_data = random.Uniform(*weight_dims, 0.0f, 1.0f); + test.AddInput("weight", *weight_dims, weight_data); + } + + std::vector Y_data = FillZeros(*Y_dims); + + test.AddOutput("output", *Y_dims, Y_data); + + test.CompareWithCPU(kCudaExecutionProvider); +} + +TEST(CudaKernelTest, NegativeLogLikelihoodLoss_TinySizeTensor) { + std::vector X_dims{8, 2}; + std::vector index_dims{8}; + std::vector weight_dims{2}; + std::vector Y_dims{}; + std::vector Y_dims_none{8}; + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, &weight_dims, &Y_dims, "mean"); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, nullptr, &Y_dims, "mean"); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, &weight_dims, &Y_dims, "sum"); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, nullptr, &Y_dims, "sum"); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, &weight_dims, &Y_dims_none, "none"); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, nullptr, &Y_dims_none, "none"); + + // Just test ignore_index for small tensor because it will increase test time a lot with little verification gain. + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, &weight_dims, &Y_dims, "mean", 0); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, nullptr, &Y_dims, "mean", 0); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, &weight_dims, &Y_dims, "sum", 0); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, nullptr, &Y_dims, "sum", 0); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, &weight_dims, &Y_dims_none, "none", 0); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, nullptr, &Y_dims_none, "none", 0); +} + +TEST(CudaKernelTest, NegativeLogLikelihoodLoss_SmallSizeTensor) { + std::vector X_dims{8, 20, 10}; + std::vector index_dims{8, 10}; + std::vector weight_dims{20}; + std::vector Y_dims{}; + std::vector Y_dims_none{8, 10}; + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, &weight_dims, &Y_dims, "mean"); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, nullptr, &Y_dims, "mean"); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, &weight_dims, &Y_dims, "sum"); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, nullptr, &Y_dims, "sum"); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, &weight_dims, &Y_dims_none, "none"); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, nullptr, &Y_dims_none, "none"); +} + +TEST(CudaKernelTest, NegativeLogLikelihoodLoss_MediumSizeTensor) { + std::vector X_dims{8, 1024}; + std::vector index_dims{8}; + std::vector weight_dims{1024}; + std::vector Y_dims{}; + std::vector Y_dims_none{8}; + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, &weight_dims, &Y_dims, "mean"); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, nullptr, &Y_dims, "mean"); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, &weight_dims, &Y_dims, "sum"); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, nullptr, &Y_dims, "sum"); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, &weight_dims, &Y_dims_none, "none"); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, nullptr, &Y_dims_none, "none"); +} + +TEST(CudaKernelTest, NegativeLogLikelihoodLoss_LargeSizeTensor) { + std::vector X_dims{4, 512, 30528}; + std::vector index_dims{4, 30528}; + std::vector weight_dims{512}; + std::vector Y_dims{}; + std::vector Y_dims_none{4, 30528}; + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, &weight_dims, &Y_dims, "mean"); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, nullptr, &Y_dims, "mean"); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, &weight_dims, &Y_dims, "sum"); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, nullptr, &Y_dims, "sum"); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, &weight_dims, &Y_dims_none, "none"); + TestNegativeLogLikelihoodLoss(&X_dims, &index_dims, nullptr, &Y_dims_none, "none"); +} + +} // namespace test +} // namespace onnxruntime