tracer.h 2.7 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 36
  void Trace(OpBase* op, const std::map<std::string, VarBase*>& inputs,
             const std::map<std::string, VarBase*>& outputs) {
    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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
        framework::OpRegistry::CreateOp(*op_desc);
    for (const std::string& vname : op_desc->InputArgumentNames()) {
      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";
        }
      }
    }
    for (const std::string& vname : op_desc->OutputArgumentNames()) {
      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 已提交
64
    op_base->Run(*scope_, platform::CPUPlace());
X
Xin Pan 已提交
65 66
  }

X
Xin Pan 已提交
67 68 69 70 71 72 73 74
  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 已提交
75
 private:
X
Xin Pan 已提交
76 77
  framework::BlockDesc* block_;
  framework::Scope* scope_;
X
Xin Pan 已提交
78 79 80 81 82
  std::vector<Runnable*> runnables_;
};

}  // namespace imperative
}  // namespace paddle