Caffe2 - C++ API
A deep learning, cross platform ML framework
profile_observer.h
1 
17 #pragma once
18 
19 #include <unordered_map>
20 
21 #include "caffe2/core/common.h"
22 #include "caffe2/core/event.h"
23 #include "caffe2/core/net.h"
24 #include "caffe2/core/observer.h"
25 #include "caffe2/core/operator.h"
26 #include "caffe2/core/timer.h"
27 #include "caffe2/observers/operator_attaching_net_observer.h"
28 
29 namespace caffe2 {
30 
38 class ProfileObserver;
40  public:
41  explicit ProfileCounter() {}
42 
43  protected:
44  Timer timer_;
45  float start_time_ = 0.0f;
46  float run_time_ = 0.0f;
47 };
48 
49 class CAFFE2_API ProfileOperatorObserver final
50  : public ProfileCounter,
51  public ObserverBase<OperatorBase> {
52  public:
53  explicit ProfileOperatorObserver(OperatorBase* subject) = delete;
54  explicit ProfileOperatorObserver(
55  OperatorBase* subject,
56  ProfileObserver* netObserver)
57  : ObserverBase<OperatorBase>(subject), netObserver_(netObserver) {
58  if (subject) {
59  net_position_ = subject->net_position();
60  }
61  }
62  explicit ProfileOperatorObserver(
63  OperatorBase* subject,
64  ProfileObserver* netObserver,
65  int net_position,
66  int rnn_order)
67  : ProfileOperatorObserver(subject, netObserver) {
68  net_position_ = net_position;
69  rnn_order_ = rnn_order;
70  }
71 
72  std::unique_ptr<ObserverBase<OperatorBase>> rnnCopy(
73  OperatorBase* subject,
74  int rnn_order) const override;
75 
76  void Dump() const;
77 
78  virtual std::string getId() const {
79  std::stringstream ss;
80  ss << net_position_;
81  if (rnn_order_ != OperatorBase::kNoNetPositionSet) {
82  ss << "-" << rnn_order_;
83  }
84  return ss.str();
85  }
86 
87  protected:
88  ProfileObserver* netObserver_;
89  int net_position_; // Needed because this is not visible in RNN Executor
90  int rnn_order_ = OperatorBase::kNoNetPositionSet;
91 
92  private:
93  void Start() override;
94  void Stop() override;
95 };
96 
97 class CAFFE2_API ProfileObserver final : public OperatorAttachingNetObserver<
98  ProfileOperatorObserver,
99  ProfileObserver> {
100  public:
101  explicit ProfileObserver(NetBase* subject)
103  subject,
104  this) {}
105 
106  void Start() override{};
107  void Stop() override{};
108 
109  private:
110  vector<const ProfileOperatorObserver*> operator_observers_;
111 };
112 
113 } // namespace caffe2
Use this to implement a Observer using the Observer Pattern template.
Definition: observer.h:15
A global dictionary that holds information about what Caffe2 modules have been loaded in the current ...
Definition: blob.h:13
A simple timer object for measuring time.
Definition: timer.h:16