blob: dcac8a00118cc408e67bd4b220e7800db6eead87 [file] [log] [blame]
// This file defines classes that hold profiling information for
// NeuralNetOperator and NeuralNetData.
#pragma once
#include "caffe2/contrib/prof/prof_dag_net.h"
#include "caffe2/proto/prof_dag.pb.h"
namespace caffe2 {
namespace contrib {
namespace prof {
// Accumulates data points and generates two point summary: mean, stddev.
class TwoNumberStats {
public:
TwoNumberStats() : sum_(0), squareSum_(0), count_(0) {}
// To prepopulate state of the TwoNumberStats accumulator.
TwoNumberStats(float mean, float stddev, int count)
: sum_(mean * count),
squareSum_((stddev * stddev + mean * mean) * count),
count_(count) {}
// This is a small structure and so it's OK to copy (and move).
TwoNumberStats(const TwoNumberStats& other) = default;
TwoNumberStats(TwoNumberStats&& other) = default;
void addPoint(float point) {
sum_ += point;
squareSum_ += point * point;
count_++;
}
float getMean() const {
if (count_ == 0) {
return 0;
}
return sum_ / count_;
}
// Returns population stddev.
float getStddev() const {
if (count_ == 0) {
return 0;
}
return sqrt((count_ * squareSum_ - sum_ * sum_) / (count_ * count_));
}
// Serializes the internal state.
TwoNumberStatsProto ToProto() const {
TwoNumberStatsProto proto;
proto.set_mean(getMean());
proto.set_stddev(getStddev());
proto.set_count(count_);
return proto;
}
// Merges another stat accumulator into this one.
void Merge(const TwoNumberStats& other) {
sum_ += other.sum_;
squareSum_ += other.squareSum_;
count_ += other.count_;
}
private:
// Sum of data points.
float sum_;
// Sum of square of data points.
float squareSum_;
// Sample count.
int count_;
};
// Annotations used when profiling a NeuralNetOperator.
class ProfilingOperatorAnnotation {
public:
ProfilingOperatorAnnotation() {}
explicit ProfilingOperatorAnnotation(const ProfDAGProto& stats_proto)
: execution_time_ms_(
stats_proto.execution_time().mean(),
stats_proto.execution_time().stddev(),
stats_proto.execution_time().count()) {}
ProfilingOperatorAnnotation(ProfilingOperatorAnnotation&&) = default;
// Accessors
const TwoNumberStats& getExecutionTimeMs() const {
return execution_time_ms_;
}
TwoNumberStats* getMutableExecutionTimeMs() {
return &execution_time_ms_;
}
private:
// Statistics for how long this op took to execute.
TwoNumberStats execution_time_ms_;
};
// Annotations used when profiling a NeuralNetData. Data this class
// stores is translatable to/from BlobProfile. Note: translation
// may be lossy due to use of floating point arithmetic.
class ProfilingDataAnnotation {
public:
ProfilingDataAnnotation() {}
explicit ProfilingDataAnnotation(const BlobProfile& profile)
: used_bytes_(
profile.bytes_used().mean(),
profile.bytes_used().stddev(),
profile.bytes_used().count()) {}
ProfilingDataAnnotation(ProfilingDataAnnotation&&) = default;
// Accessors
const TwoNumberStats& getUsedBytes() const {
return used_bytes_;
}
TwoNumberStats* getMutableUsedBytes() {
return &used_bytes_;
}
private:
// Statistics for how much data this tensor/parameter used (per invocation of
// the op that generated the data).
TwoNumberStats used_bytes_;
};
} // namespace prof
} // namespace contrib
} // namespace caffe2