From b4c61f5c78754ebc9437da556838bbc5390c958f Mon Sep 17 00:00:00 2001 From: chen2016013 Date: Fri, 9 May 2025 07:25:05 +0000 Subject: [PATCH 1/5] fix dpa bug --- paddle/cinn/hlir/framework/pir/fusion_info.cc | 13 +-- .../control_flow/yield_instruction.cc | 79 +++++++++++++++++-- .../control_flow/yield_instruction.h | 2 + .../pir_adaptor/pir_adaptor_util.cc | 10 +++ .../pir_adaptor/pir_adaptor_util.h | 2 + 5 files changed, 86 insertions(+), 20 deletions(-) diff --git a/paddle/cinn/hlir/framework/pir/fusion_info.cc b/paddle/cinn/hlir/framework/pir/fusion_info.cc index ec5021b6e8d18d..881fedb8475f73 100644 --- a/paddle/cinn/hlir/framework/pir/fusion_info.cc +++ b/paddle/cinn/hlir/framework/pir/fusion_info.cc @@ -218,18 +218,7 @@ std::size_t FusionInfo::hash() const { } std::ostream& operator<<(std::ostream& os, const FusionInfo& fusion_info) { - os << "FusionInfo - " << fusion_info.hash(); - if (VLOG_IS_ON(5)) { - os << "{\n"; - if (!FLAGS_enable_cinn_compile_cache) - os << "fn_name: " << fusion_info.unique_fn_name_ << ", "; - os << "input_dim_exprs: {"; - for (const auto& dim_expr : fusion_info.input_dim_exprs_) - os << " " << dim_expr; - os << " }\n"; - for (const auto& op_info : fusion_info.op_infos_) os << op_info << "\n"; - os << "}\n"; - } + os << "fn_name: " << fusion_info.unique_fn_name_ << "\n"; return os; } diff --git a/paddle/fluid/framework/new_executor/instruction/control_flow/yield_instruction.cc b/paddle/fluid/framework/new_executor/instruction/control_flow/yield_instruction.cc index e0077dae7669fc..a610f2edee9e1a 100644 --- a/paddle/fluid/framework/new_executor/instruction/control_flow/yield_instruction.cc +++ b/paddle/fluid/framework/new_executor/instruction/control_flow/yield_instruction.cc @@ -17,7 +17,11 @@ #include "paddle/fluid/framework/new_executor/instruction/instruction_util.h" #include "paddle/fluid/framework/new_executor/new_executor_defs.h" #include "paddle/fluid/framework/new_executor/pir_adaptor/pir_adaptor_util.h" +#include "paddle/fluid/framework/op_kernel_type.h" #include "paddle/fluid/pir/dialect/operator/ir/control_flow_op.h" +#include "paddle/phi/api/include/context_pool.h" +#include "paddle/phi/kernels/full_kernel.h" +#include "paddle/pir/include/core/builtin_type.h" namespace paddle { namespace framework { @@ -26,11 +30,9 @@ YieldInstruction::YieldInstruction(size_t id, const phi::Place &place, ::pir::Operation *op, ValueExecutionInfo *value_exe_info) - : InstructionBase(id, place), op_(op) { + : InstructionBase(id, place), op_(op), value_exe_info_(value_exe_info) { VLOG(6) << "construct yield instruction"; - auto parent_op = op->GetParentOp(); - std::unordered_map> inputs; for (size_t i = 0; i < op->num_operands(); ++i) { // Skip the first input (cond) when the parent op is a while op. @@ -39,8 +41,24 @@ YieldInstruction::YieldInstruction(size_t id, } auto in = op->operand_source(i); if (in) { - inputs.emplace(in, GetValueIds(in, *value_exe_info)); - input_vars_.push_back(value_exe_info->GetVarByValue(in)); + inputs.emplace(in, GetValueIds(in, *value_exe_info_)); + input_vars_.push_back(value_exe_info_->GetVarByValue(in)); + } else { + // value 为空的时候根据 parent op 输出 value 的 meta 信息填一个全 0 + // tensor进去 build instruction 的时候先创建 var + if (parent_op->result(i) && parent_op->result(i).type()) { + auto out_type = parent_op->result(i).type(); + std::string new_name = "_fake_var_op_" + std::to_string(op->id()) + + "_input_" + std::to_string(i) + "_"; + Variable *fake_var = value_exe_info_->GetScope()->Var(new_name); + if (out_type.isa()) { + fake_var->GetMutable(); + input_vars_.push_back(fake_var); + } else { + PADDLE_THROW(common::errors::Unimplemented( + "unsupported type %d", out_type.dyn_cast().type_id())); + } + } } } SetInputs(inputs); @@ -62,11 +80,56 @@ YieldInstruction::YieldInstruction(size_t id, output_vars_.size())); } +template +void FullFakeTensor(const pir::Value &output_value, Variable *output_var) { + if (!output_value || !output_var) { + output_var = nullptr; + return; + } + auto out_tensor_type = output_value.type().dyn_cast(); + auto abs_dims = out_tensor_type.dims(); + for (int i = 0; i < abs_dims.size(); ++i) { + // dynamic shape, set to 1 + if (abs_dims[i] == -1) { + abs_dims[i] = 1; + } + } + const auto GetNumElementsFromDim = [](const ::pir::DDim &dim) -> int64_t { + return ::common::product(dim); + }; + int64_t numel = GetNumElementsFromDim(abs_dims); +#ifdef PADDLE_WITH_CUDA + phi::DeviceContextPool &pool = phi::DeviceContextPool::Instance(); + auto *dev_ctx = pool.Get(phi::GPUPlace()); + phi::DataType dtype = + paddle::dialect::TransToPhiDataType(out_tensor_type.dtype()); + phi::FullKernel( + *(static_cast(dev_ctx)), + phi::IntArray(common::vectorize(abs_dims)), + 0.0, + dtype, + output_var->GetMutable()); +#else + VLOG(1) << "unsupported Device for Fake Tensor."; + output_var = nullptr; + return; +#endif +} void YieldInstruction::Run() { for (size_t i = 0; i < input_vars_.size(); ++i) { - if (input_vars_[i]->IsType()) { - output_vars_[i]->GetMutable()->ShareDataWith( - input_vars_[i]->Get()); + if (input_vars_[i] == nullptr) { + output_vars_[i] = nullptr; + } else if (input_vars_[i]->IsType()) { + if (input_vars_[i]->IsInitialized() && + !input_vars_[i]->Get().initialized()) { + // 对应 input 为 NULL VALUE 的情况,fake tensor + FullFakeTensor( + value_exe_info_->GetValueByVar(output_vars_[i]), output_vars_[i]); + } else { + output_vars_[i]->GetMutable()->ShareDataWith( + input_vars_[i]->Get()); + } } else if (input_vars_[i]->IsType()) { const auto &inner_array = input_vars_[i]->Get(); auto *output_array = output_vars_[i]->GetMutable(); diff --git a/paddle/fluid/framework/new_executor/instruction/control_flow/yield_instruction.h b/paddle/fluid/framework/new_executor/instruction/control_flow/yield_instruction.h index 8f411e559e5b7b..9077739305c1dd 100644 --- a/paddle/fluid/framework/new_executor/instruction/control_flow/yield_instruction.h +++ b/paddle/fluid/framework/new_executor/instruction/control_flow/yield_instruction.h @@ -41,6 +41,8 @@ class YieldInstruction : public InstructionBase { std::vector input_vars_; std::vector output_vars_; + + ValueExecutionInfo* value_exe_info_; }; } // namespace framework diff --git a/paddle/fluid/framework/new_executor/pir_adaptor/pir_adaptor_util.cc b/paddle/fluid/framework/new_executor/pir_adaptor/pir_adaptor_util.cc index 7ecef0a54751f5..095f5b6166b238 100644 --- a/paddle/fluid/framework/new_executor/pir_adaptor/pir_adaptor_util.cc +++ b/paddle/fluid/framework/new_executor/pir_adaptor/pir_adaptor_util.cc @@ -136,6 +136,16 @@ Variable* ValueExecutionInfo::GetVarByValue(pir::Value value) const { return scope_->FindVar(GetVarName(value)); } +::pir::Value ValueExecutionInfo::GetValueByVar(const Variable* var) const { + for (const auto& pair : value_2_var_name_) { + if (pair.second == GetVarName(var)) { + return pair.first; + } + } + PADDLE_THROW(::common::errors::InvalidArgument("Cannot find value by var %s", + GetVarName(var))); +} + const std::unordered_map<::pir::Value, std::string>& ValueExecutionInfo::GetValue2VarName() const { return value_2_var_name_; diff --git a/paddle/fluid/framework/new_executor/pir_adaptor/pir_adaptor_util.h b/paddle/fluid/framework/new_executor/pir_adaptor/pir_adaptor_util.h index 00f8bf00f1fa56..0bbcf6564e1ef0 100644 --- a/paddle/fluid/framework/new_executor/pir_adaptor/pir_adaptor_util.h +++ b/paddle/fluid/framework/new_executor/pir_adaptor/pir_adaptor_util.h @@ -69,6 +69,8 @@ class ValueExecutionInfo { Variable* GetVarByValue(pir::Value value) const; + ::pir::Value GetValueByVar(const Variable* var) const; + const std::unordered_map<::pir::Value, std::string>& GetValue2VarName() const; void AddValue2VarName(::pir::Value value, const std::string& var_name); From 1526c1759f578f0b689cb22300153fef609197cd Mon Sep 17 00:00:00 2001 From: chen2016013 <111894720+chen2016013@users.noreply.github.com> Date: Fri, 9 May 2025 15:34:06 +0800 Subject: [PATCH 2/5] Update fusion_info.cc --- paddle/cinn/hlir/framework/pir/fusion_info.cc | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/paddle/cinn/hlir/framework/pir/fusion_info.cc b/paddle/cinn/hlir/framework/pir/fusion_info.cc index 881fedb8475f73..ec5021b6e8d18d 100644 --- a/paddle/cinn/hlir/framework/pir/fusion_info.cc +++ b/paddle/cinn/hlir/framework/pir/fusion_info.cc @@ -218,7 +218,18 @@ std::size_t FusionInfo::hash() const { } std::ostream& operator<<(std::ostream& os, const FusionInfo& fusion_info) { - os << "fn_name: " << fusion_info.unique_fn_name_ << "\n"; + os << "FusionInfo - " << fusion_info.hash(); + if (VLOG_IS_ON(5)) { + os << "{\n"; + if (!FLAGS_enable_cinn_compile_cache) + os << "fn_name: " << fusion_info.unique_fn_name_ << ", "; + os << "input_dim_exprs: {"; + for (const auto& dim_expr : fusion_info.input_dim_exprs_) + os << " " << dim_expr; + os << " }\n"; + for (const auto& op_info : fusion_info.op_infos_) os << op_info << "\n"; + os << "}\n"; + } return os; } From 3876d30e18b2a6c351029f1aa67b970ba4f504ba Mon Sep 17 00:00:00 2001 From: chen2016013 Date: Fri, 9 May 2025 07:41:05 +0000 Subject: [PATCH 3/5] update --- .../framework/new_executor/pir_adaptor/pir_adaptor_util.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/paddle/fluid/framework/new_executor/pir_adaptor/pir_adaptor_util.cc b/paddle/fluid/framework/new_executor/pir_adaptor/pir_adaptor_util.cc index 095f5b6166b238..4bdeb99deaa707 100644 --- a/paddle/fluid/framework/new_executor/pir_adaptor/pir_adaptor_util.cc +++ b/paddle/fluid/framework/new_executor/pir_adaptor/pir_adaptor_util.cc @@ -142,8 +142,8 @@ ::pir::Value ValueExecutionInfo::GetValueByVar(const Variable* var) const { return pair.first; } } - PADDLE_THROW(::common::errors::InvalidArgument("Cannot find value by var %s", - GetVarName(var))); + PADDLE_THROW(::common::errors::Unimplemented("Cannot find value by var %s", + GetVarName(var))); } const std::unordered_map<::pir::Value, std::string>& From 96bedec60a4c30f63a08076decfd9a21387fdba0 Mon Sep 17 00:00:00 2001 From: chen2016013 <111894720+chen2016013@users.noreply.github.com> Date: Fri, 9 May 2025 17:00:33 +0800 Subject: [PATCH 4/5] Update yield_instruction.cc --- .../new_executor/instruction/control_flow/yield_instruction.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paddle/fluid/framework/new_executor/instruction/control_flow/yield_instruction.cc b/paddle/fluid/framework/new_executor/instruction/control_flow/yield_instruction.cc index a610f2edee9e1a..d8114b0bd511ad 100644 --- a/paddle/fluid/framework/new_executor/instruction/control_flow/yield_instruction.cc +++ b/paddle/fluid/framework/new_executor/instruction/control_flow/yield_instruction.cc @@ -45,7 +45,7 @@ YieldInstruction::YieldInstruction(size_t id, input_vars_.push_back(value_exe_info_->GetVarByValue(in)); } else { // value 为空的时候根据 parent op 输出 value 的 meta 信息填一个全 0 - // tensor进去 build instruction 的时候先创建 var + // tensor。Build instruction 的时候先创建 var if (parent_op->result(i) && parent_op->result(i).type()) { auto out_type = parent_op->result(i).type(); std::string new_name = "_fake_var_op_" + std::to_string(op->id()) + From bdd891b8d0c1fc952b8f1759a6f22932dae5873a Mon Sep 17 00:00:00 2001 From: chen2016013 <111894720+chen2016013@users.noreply.github.com> Date: Fri, 9 May 2025 17:39:07 +0800 Subject: [PATCH 5/5] Update yield_instruction.cc --- .../instruction/control_flow/yield_instruction.cc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/paddle/fluid/framework/new_executor/instruction/control_flow/yield_instruction.cc b/paddle/fluid/framework/new_executor/instruction/control_flow/yield_instruction.cc index d8114b0bd511ad..95c0131b219184 100644 --- a/paddle/fluid/framework/new_executor/instruction/control_flow/yield_instruction.cc +++ b/paddle/fluid/framework/new_executor/instruction/control_flow/yield_instruction.cc @@ -94,10 +94,6 @@ void FullFakeTensor(const pir::Value &output_value, Variable *output_var) { abs_dims[i] = 1; } } - const auto GetNumElementsFromDim = [](const ::pir::DDim &dim) -> int64_t { - return ::common::product(dim); - }; - int64_t numel = GetNumElementsFromDim(abs_dims); #ifdef PADDLE_WITH_CUDA phi::DeviceContextPool &pool = phi::DeviceContextPool::Instance(); auto *dev_ctx = pool.Get(phi::GPUPlace());