// Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "paddle/fluid/pir/dialect/operator/ir/op_attribute.h" #include "paddle/fluid/pir/dialect/operator/ir/op_dialect.h" #include "paddle/fluid/pir/dialect/operator/ir/pd_op.h" #include "paddle/fluid/sub_graph/sub_graph_checker.h" #include "paddle/pir/include/core/ir_context.h" using namespace paddle::test; // NOLINT std::shared_ptr<::pir::Program> BuildBasicProgram() { ::pir::IrContext* ctx = ::pir::IrContext::Instance(); ctx->GetOrRegisterDialect(); auto program = std::make_shared<::pir::Program>(ctx); ::pir::Builder builder = ::pir::Builder(ctx, program->block()); // full -> softmax(max -> subtract -> exp -> sum -> divide) const float value_one = 1.0; const std::vector shape = {128, 12, 128, 128}; std::string input_name = std::string(kInputPrefix) + "0"; auto x = builder .Build( input_name, shape, phi::DataType::FLOAT32, phi::GPUPlace()) .result(0); auto out = builder.Build(x, -1).result(0); return program; } std::shared_ptr<::pir::Program> BuildPrimProgram() { ::pir::IrContext* ctx = ::pir::IrContext::Instance(); ctx->GetOrRegisterDialect(); auto program = std::make_shared<::pir::Program>(ctx); ::pir::Builder builder = ::pir::Builder(ctx, program->block()); std::string input_name = std::string(kInputPrefix) + "0"; const float value_one = 1.0; const std::vector shape = {128, 12, 128, 128}; auto x = builder .Build( input_name, shape, phi::DataType::FLOAT32, phi::GPUPlace()) .result(0); // auto out = builder.Build(x).result(0); auto max = builder.Build(x, std::vector{-1}, true) .result(0); auto sub = builder.Build(x, max).result(0); auto exp = builder.Build(sub).result(0); auto sum = builder .Build( exp, std::vector{-1}, phi::DataType::FLOAT32, true) .result(0); auto out = builder.Build(exp, sum).result(0); return program; } std::shared_ptr<::pir::Program> BuildDropOutPrimProgram() { ::pir::IrContext* ctx = ::pir::IrContext::Instance(); ctx->GetOrRegisterDialect(); auto program = std::make_shared<::pir::Program>(ctx); ::pir::Builder builder = ::pir::Builder(ctx, program->block()); std::string input_name = std::string(kInputPrefix) + "0"; auto x = builder .Build(input_name, std::vector({128, 128, 768}), phi::DataType::FLOAT32, phi::GPUPlace()) .result(0); auto prob = builder .Build(std::vector({1}), 0.5, phi::DataType::FLOAT32, phi::GPUPlace()) .result(0); auto random = builder .Build( std::vector({128, 128, 768}), phi::DataType::FLOAT32, 0.0, 1.0, 0, phi::GPUPlace()) .result(0); auto mask = builder.Build(random, prob).result(0); auto mask1 = builder.Build(mask, phi::DataType::FLOAT32) .result(0); auto mul = builder.Build(x, mask1).result(0); auto neg_prob = prob = builder .Build(std::vector({1}), 0.5, phi::DataType::FLOAT32, phi::GPUPlace()) .result(0); auto out = builder.Build(mul, neg_prob).result(0); return program; } std::shared_ptr<::pir::Program> BuildDropOutPhiProgram() { ::pir::IrContext* ctx = ::pir::IrContext::Instance(); ctx->GetOrRegisterDialect(); auto program = std::make_shared<::pir::Program>(ctx); ::pir::Builder builder = ::pir::Builder(ctx, program->block()); std::string input_name = std::string(kInputPrefix) + "0"; auto x = builder .Build(input_name, std::vector({128, 128, 768}), phi::DataType::FLOAT32, phi::GPUPlace()) .result(0); auto out = builder .Build( x, pir::Value(), 0.5, false, "upscale_in_train", 0, false) .result(0); return program; } TEST(sub_graph_checker, test_softmax) { auto basic_program = BuildBasicProgram(); auto prim_program = BuildPrimProgram(); paddle::test::SubGraphChecker sub_graph_checker(basic_program, prim_program); ASSERT_TRUE(sub_graph_checker.CheckResult()); std::vector speed_data = sub_graph_checker.CheckSpeed(); ASSERT_EQ(speed_data.size(), 2u); } TEST(sub_graph_checker, test_dropout) { auto basic_program = BuildDropOutPhiProgram(); auto prim_program = BuildDropOutPrimProgram(); paddle::test::SubGraphChecker sub_graph_checker(basic_program, prim_program); ASSERT_TRUE(sub_graph_checker.CheckResult()); std::vector speed_data = sub_graph_checker.CheckSpeed(); ASSERT_EQ(speed_data.size(), 2u); }