diff --git a/paddle/framework/backward.cc b/paddle/framework/backward.cc index 0a4688db9c930201c95d4a47658f43cad87fdbca..9a5c4e9cf0af0d54da264f2742505b1de3a1b767 100644 --- a/paddle/framework/backward.cc +++ b/paddle/framework/backward.cc @@ -378,6 +378,7 @@ std::vector> MakeBlockBackward( backward_descs[dup_op[i]]->Rename(out_name, new_name); sum_op_inputs.emplace_back(new_name); } + LOG(INFO) << "fuck " << sum_op_inputs.size(); std::unique_ptr sum_op(new OpDescBind( "sum", {{"X", sum_op_inputs}}, {{"Out", {out_name}}}, {})); pending_sum_ops.push_back({dup_op.back(), std::move(sum_op)}); diff --git a/paddle/framework/executor.cc b/paddle/framework/executor.cc index bbc7f77a94cfb8a921bf2660cf637d810f10ab64..ee6243a9bf0675691d1e54da735fd1024b34e851 100644 --- a/paddle/framework/executor.cc +++ b/paddle/framework/executor.cc @@ -74,7 +74,8 @@ void Executor::Run(const ProgramDesc& pdesc, Scope* scope, int block_id) { std::vector should_run = Prune(pdesc, block_id); PADDLE_ENFORCE_EQ(should_run.size(), block.ops_size()); for (size_t i = 0; i < should_run.size(); ++i) { - if (should_run[i]) { + // if (should_run[i]) { + if (true) { for (auto& var : block.ops(i).outputs()) { for (auto& argu : var.arguments()) { if (local_scope.FindVar(argu) == nullptr) { @@ -82,7 +83,17 @@ void Executor::Run(const ProgramDesc& pdesc, Scope* scope, int block_id) { } } } + LOG(INFO) << block.ops(i).type(); + if (block.ops(i).type() == "sum") { + LOG(INFO) << "Here"; + for (auto& var : block.ops(i).inputs()) { + for (auto& argu : var.arguments()) { + LOG(INFO) << var.parameter() << " " << argu; + } + } + } auto op = paddle::framework::OpRegistry::CreateOp(block.ops(i)); + LOG(INFO) << op->DebugString(); op->Run(local_scope, *device); } } diff --git a/paddle/framework/executor_test.cc b/paddle/framework/executor_test.cc index b64ba1c98f381e03c8ed96ec6ea13fc09e6090e7..12be79d01b9c41000058340e660b6bf1b6c01c0f 100644 --- a/paddle/framework/executor_test.cc +++ b/paddle/framework/executor_test.cc @@ -30,6 +30,7 @@ USE_OP(gaussian_random); USE_OP(feed); USE_OP(fetch); USE_OP(mul); +USE_OP(sum); USE_OP(squared_l2_distance); using std::string; @@ -104,40 +105,63 @@ class ExecutorTesterRandom : public ::testing::Test { virtual void SetUp() override { int input_dim = 5, batch_size = 2, embed_dim = 5; - auto temp_root_block = pdesc_.add_blocks(); - temp_root_block->set_idx(0); - temp_root_block->set_parent_idx(-1); - paddle::framework::ProgramDescBind& program = - paddle::framework::ProgramDescBind::Instance(&pdesc_); - paddle::framework::BlockDescBind* root_block = program.Block(0); + auto temp_init_root_block = init_pdesc_.add_blocks(); + temp_init_root_block->set_idx(0); + temp_init_root_block->set_parent_idx(-1); + paddle::framework::ProgramDescBind& init_program = + paddle::framework::ProgramDescBind::Instance(&init_pdesc_); + paddle::framework::BlockDescBind* init_root_block = init_program.Block(0); - // block[0] AddOp("gaussian_random", {}, {{"Out", {"w1"}}}, - {{"dims", std::vector{input_dim, embed_dim}}}, root_block); + {{"dims", std::vector{input_dim, embed_dim}}}, init_root_block); AddOp("gaussian_random", {}, {{"Out", {"w2"}}}, - {{"dims", std::vector{embed_dim, input_dim}}}, root_block); + {{"dims", std::vector{embed_dim, input_dim}}}, init_root_block); AddOp("fetch", {{"Input", {"w1"}}}, {}, {{"dims", std::vector{input_dim, embed_dim}}, {"col", 0}}, - root_block); + init_root_block); AddOp("fetch", {{"Input", {"w2"}}}, {}, {{"dims", std::vector{embed_dim, input_dim}}, {"col", 1}}, - root_block); + init_root_block); + + // flush + init_program.Proto(); + + auto temp_root_block = pdesc_.add_blocks(); + temp_root_block->set_idx(0); + temp_root_block->set_parent_idx(-1); + paddle::framework::ProgramDescBind& program = + paddle::framework::ProgramDescBind::Instance(&pdesc_); + paddle::framework::BlockDescBind* root_block = program.Block(0); - // block[1] - paddle::framework::BlockDescBind* run_block = - program.AppendBlock(*root_block); AddOp("gaussian_random", {}, {{"Out", {"a"}}}, - {{"dims", std::vector{batch_size, input_dim}}}, run_block); + {{"dims", std::vector{batch_size, input_dim}}}, root_block); AddOp("mul", {{"X", {"a"}}, {"Y", {"w1"}}}, {{"Out", {"b"}}}, {}, - run_block); + root_block); AddOp("mul", {{"X", {"b"}}, {"Y", {"w2"}}}, {{"Out", {"a_out"}}}, {}, - run_block); + root_block); AddOp("squared_l2_distance", {{"X", {"a"}}, {"Y", {"a_out"}}}, {{"Out", {"l2_distance"}}, {"sub_result", {"l2_distance_sub"}}}, {}, - run_block); - AddOp("fetch", {{"Input", {"l2_distance"}}}, {}, - {{"dims", std::vector{batch_size}}, {"col", 1}}, run_block); + root_block); + AddOp("gaussian_random", {}, {{"Out", {"l2_distance@GRAD"}}}, + {{"dims", std::vector{batch_size, 1}}}, root_block); + AppendBackward(program, {}); + + program.Proto(); + + for (auto& op : pdesc_.blocks(0).ops()) { + if (op.type() == "sum") { + LOG(INFO) << "Here"; + for (auto& var : op.inputs()) { + for (auto& argu : var.arguments()) { + LOG(INFO) << var.parameter() << " " << argu; + } + } + } + } + + AddOp("fetch", {{"Input", {"l2_distance"}}}, {}, + {{"dims", std::vector{batch_size}}, {"col", 1}}, root_block); // flush program.Proto(); @@ -146,6 +170,7 @@ class ExecutorTesterRandom : public ::testing::Test { } protected: + ProgramDesc init_pdesc_; ProgramDesc pdesc_; }; @@ -200,8 +225,8 @@ TEST_F(ExecutorTesterRandom, CPU) { std::unique_ptr executor(new Executor(places)); + executor->Run(init_pdesc_, GetGlobalScope(), 0); executor->Run(pdesc_, GetGlobalScope(), 0); - executor->Run(pdesc_, GetGlobalScope(), 1); std::vector> result = GetFetchVariable(); } @@ -248,8 +273,8 @@ TEST_F(ExecutorTesterRandom, GPU) { std::unique_ptr executor(new Executor(places)); + executor->Run(init_pdesc_, GetGlobalScope(), 0); executor->Run(pdesc_, GetGlobalScope(), 0); - executor->Run(pdesc_, GetGlobalScope(), 1); std::vector> result = GetFetchVariable(); } diff --git a/paddle/operators/feed_op.cc b/paddle/operators/feed_op.cc index dcd5f7fb779f8120b69206bef872d91fd5d800ef..b15bc86ae12da3f1ab3b81bc358a5e63189bbc08 100644 --- a/paddle/operators/feed_op.cc +++ b/paddle/operators/feed_op.cc @@ -22,7 +22,7 @@ class FeedOp : public framework::OperatorWithKernel { using framework::OperatorWithKernel::OperatorWithKernel; protected: - void InferShape(framework::InferShapeContextBase* ctx) const override { + void InferShape(framework::InferShapeContext* ctx) const override { typedef std::vector FeedInputs; PADDLE_ENFORCE(ctx->HasOutput("Out"), "Output should be not null."); int col = ctx->Attrs().Get("col"); diff --git a/paddle/operators/fetch_op.cc b/paddle/operators/fetch_op.cc index 5adb83144a06b6301e2161c7fff22f8d0f78801d..7ca3762c36e84ce82865c0a3f2ec75c8dd48b271 100644 --- a/paddle/operators/fetch_op.cc +++ b/paddle/operators/fetch_op.cc @@ -22,7 +22,7 @@ class FetchOp : public framework::OperatorWithKernel { using framework::OperatorWithKernel::OperatorWithKernel; protected: - void InferShape(framework::InferShapeContextBase* ctx) const override { + void InferShape(framework::InferShapeContext* ctx) const override { typedef std::vector FetchOutputs; PADDLE_ENFORCE(ctx->HasInput("Input"), "Input should be not null."); int col = ctx->Attrs().Get("col");