tracer.h 2.8 KB
Newer Older
X
Xin Pan 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// Copyright (c) 2018 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.

#pragma once

X
Xin Pan 已提交
17
#include <map>
X
Xin Pan 已提交
18
#include <string>
X
Xin Pan 已提交
19
#include <vector>
X
Xin Pan 已提交
20

X
Xin Pan 已提交
21
#include "paddle/fluid/framework/op_desc.h"
X
Xin Pan 已提交
22 23
#include "paddle/fluid/framework/op_registry.h"
#include "paddle/fluid/framework/scope.h"
X
Xin Pan 已提交
24
#include "paddle/fluid/imperative/engine.h"
X
Xin Pan 已提交
25
#include "paddle/fluid/imperative/layer.h"
X
Xin Pan 已提交
26 27 28 29 30 31 32 33

namespace paddle {
namespace imperative {

class Tracer {
 public:
  Tracer() {}

X
Xin Pan 已提交
34 35
  void Trace(OpBase* op, const std::vector<VarBase*>& inputs,
             const std::vector<VarBase*>& outputs) {
X
Xin Pan 已提交
36
    framework::OpDesc* op_desc = op->op_desc_;
X
Xin Pan 已提交
37 38 39
    LOG(ERROR) << "tracer tracing " << op_desc->Type();
    op_desc->InferShape(*block_);
    op_desc->InferVarType(block_);
X
Xin Pan 已提交
40
    std::unique_ptr<framework::OperatorBase> op_base =
X
Xin Pan 已提交
41
        framework::OpRegistry::CreateOp(*op_desc);
X
Xin Pan 已提交
42 43 44 45

    *op->input_vars_ = inputs;
    for (VarBase* input : inputs) {
      const std::string vname = input->var_desc_->Name();
X
Xin Pan 已提交
46 47 48 49 50 51 52 53 54 55
      framework::Variable* var = scope_->Var(vname);
      if (!var->IsInitialized()) {
        framework::VarDesc* var_desc = block_->FindVar(vname);
        if (var_desc->GetType() == framework::proto::VarType::LOD_TENSOR) {
          var->GetMutable<framework::LoDTensor>();
        } else {
          LOG(ERROR) << "tracer doesn't support yet";
        }
      }
    }
X
Xin Pan 已提交
56 57 58 59

    *op->output_vars_ = outputs;
    for (auto output : outputs) {
      const std::string vname = output->var_desc_->Name();
X
Xin Pan 已提交
60 61 62 63 64 65 66 67 68
      framework::Variable* var = scope_->Var(vname);
      if (!var->IsInitialized()) {
        framework::VarDesc* var_desc = block_->FindVar(vname);
        if (var_desc->GetType() == framework::proto::VarType::LOD_TENSOR) {
          var->GetMutable<framework::LoDTensor>();
        } else {
          LOG(ERROR) << "tracer doesn't support yet";
        }
      }
X
Xin Pan 已提交
69
      output->pre_op_ = op;
X
Xin Pan 已提交
70
    }
X
Xin Pan 已提交
71
    op_base->Run(*scope_, platform::CPUPlace());
X
Xin Pan 已提交
72 73
  }

X
Xin Pan 已提交
74 75 76 77 78 79 80 81
  void SetScope(framework::Scope* scope) { scope_ = scope; }

  void SetBlock(framework::BlockDesc* block) { block_ = block; }

  framework::Scope* Scope() const { return scope_; }

  framework::BlockDesc* Block() const { return block_; }

X
Xin Pan 已提交
82
 private:
X
Xin Pan 已提交
83 84
  framework::BlockDesc* block_;
  framework::Scope* scope_;
X
Xin Pan 已提交
85 86 87 88 89
  std::vector<Runnable*> runnables_;
};

}  // namespace imperative
}  // namespace paddle