|
|
|
@ -20,9 +20,23 @@
|
|
|
|
|
#include "paddle/fluid/platform/device_context.h"
|
|
|
|
|
#include "paddle/fluid/platform/enforce.h"
|
|
|
|
|
|
|
|
|
|
#ifdef WITH_GPERFTOOLS
|
|
|
|
|
#include "gperftools/profiler.h"
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
DEFINE_string(
|
|
|
|
|
tracer_profile_fname, "",
|
|
|
|
|
"Profiler filename for imperative tracer, which generated by gperftools."
|
|
|
|
|
"Only valid when compiled `WITH_PROFILER=ON`. Empty if disable.");
|
|
|
|
|
|
|
|
|
|
namespace paddle {
|
|
|
|
|
namespace imperative {
|
|
|
|
|
|
|
|
|
|
static std::once_flag gTracerProfileOnce;
|
|
|
|
|
#ifdef WITH_GPERFTOOLS
|
|
|
|
|
static bool gTracerProfilerStarted = false;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
void CreateGradOp(const framework::OpDesc& op_desc,
|
|
|
|
|
const std::unordered_set<std::string>& no_grad_set,
|
|
|
|
|
const std::vector<framework::BlockDesc*>& grad_sub_block,
|
|
|
|
@ -68,11 +82,31 @@ platform::Place GetExpectedPlace(platform::Place place, VarBasePtrMap inputs) {
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Tracer::Tracer(framework::BlockDesc* root_block) : root_block_(root_block) {
|
|
|
|
|
if (!FLAGS_tracer_profile_fname.empty()) {
|
|
|
|
|
std::call_once(gTracerProfileOnce, [] {
|
|
|
|
|
#ifdef WITH_GPERFTOOLS
|
|
|
|
|
ProfilerStart(FLAGS_tracer_profile_fname.c_str());
|
|
|
|
|
gTracerProfilerStarted = true;
|
|
|
|
|
#else
|
|
|
|
|
LOG(WARNING) << "Paddle is not compiled with gperftools. "
|
|
|
|
|
"FLAGS_tracer_profile_fname will be ignored";
|
|
|
|
|
#endif
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::set<std::string> Tracer::Trace(OpBase* op, const VarBasePtrMap& inputs,
|
|
|
|
|
const VarBasePtrMap& outputs,
|
|
|
|
|
framework::BlockDesc* block,
|
|
|
|
|
const platform::Place expected_place,
|
|
|
|
|
const bool stop_gradient) {
|
|
|
|
|
#ifdef WITH_GPERFTOOLS
|
|
|
|
|
if (gTracerProfilerStarted) {
|
|
|
|
|
ProfilerFlush();
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
std::map<std::string, VarBase*> vars;
|
|
|
|
|
|
|
|
|
|
framework::OpDesc* op_desc = op->op_desc_;
|
|
|
|
|