inline void Monitor::toc_print() { auto results = toc(); std::vector<float> data(1); for (auto& stat : results) { NDArray ndarray = std::get<2>(stat); std::string str; if (ndarray.Size() == 1) { if (ndarray.GetContext().GetDeviceType() != DeviceType::kGPU) { data[0] = ndarray.GetData()[0]; } else { ndarray.SyncCopyToCPU(&data); } str = std::to_string(data[0]); } else { std::ostringstream out; out << ndarray; str = out.str(); } LG << "Batch: " << std::get<0>(stat) << ' ' << std::get<1>(stat) << ' ' << str; } }
inline NDArray _default_monitor_func(const NDArray &x) { return Operator("norm").PushInput(x).Invoke()[0] / std::sqrt(x.Size()); }