|
|
#ifndef C10_UTIL_LOGGING_H_
|
|
|
#define C10_UTIL_LOGGING_H_
|
|
|
|
|
|
#include <climits>
|
|
|
#include <exception>
|
|
|
#include <functional>
|
|
|
#include <limits>
|
|
|
#include <sstream>
|
|
|
|
|
|
#include <c10/macros/Macros.h>
|
|
|
#include <c10/util/Backtrace.h>
|
|
|
#include <c10/util/Exception.h>
|
|
|
#include <c10/util/Flags.h>
|
|
|
#include <c10/util/StringUtil.h>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef CAFFE2_LOG_THRESHOLD
|
|
|
|
|
|
|
|
|
#define CAFFE2_LOG_THRESHOLD INT_MIN
|
|
|
#endif
|
|
|
|
|
|
|
|
|
#ifdef C10_USE_GLOG
|
|
|
#include <c10/util/logging_is_google_glog.h>
|
|
|
#else
|
|
|
#include <c10/util/logging_is_not_google_glog.h>
|
|
|
#endif
|
|
|
|
|
|
C10_DECLARE_int(caffe2_log_level);
|
|
|
C10_DECLARE_bool(caffe2_use_fatal_for_enforce);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef LOG_EVERY_MS
|
|
|
#define C10_LOG_EVERY_MS(severity, ms) LOG_EVERY_MS(severity, ms)
|
|
|
#else
|
|
|
#define C10_LOG_EVERY_MS(severity, ms) LOG(severity)
|
|
|
#endif
|
|
|
|
|
|
|
|
|
#ifdef LOG_FIRST_N
|
|
|
#define C10_LOG_FIRST_N(severity, n) LOG_FIRST_N(severity, n)
|
|
|
#else
|
|
|
#define C10_LOG_FIRST_N(severity, n) LOG(severity)
|
|
|
#endif
|
|
|
|
|
|
|
|
|
#ifdef LOG_EVERY_N
|
|
|
#define C10_LOG_EVERY_N(severity, n) LOG_EVERY_N(severity, n)
|
|
|
#else
|
|
|
#define C10_LOG_EVERY_N(severity, n) LOG(severity)
|
|
|
#endif
|
|
|
|
|
|
namespace c10 {
|
|
|
|
|
|
#if !defined(C10_NODEPRECATED)
|
|
|
using std::string;
|
|
|
#endif
|
|
|
|
|
|
|
|
|
C10_API bool InitCaffeLogging(int* argc, char** argv);
|
|
|
C10_API void UpdateLoggingLevelsFromFlags();
|
|
|
|
|
|
[[noreturn]] C10_API void ThrowEnforceNotMet(
|
|
|
const char* file,
|
|
|
const int line,
|
|
|
const char* condition,
|
|
|
const std::string& msg,
|
|
|
const void* caller = nullptr);
|
|
|
|
|
|
[[noreturn]] C10_API void ThrowEnforceNotMet(
|
|
|
const char* file,
|
|
|
const int line,
|
|
|
const char* condition,
|
|
|
const char* msg,
|
|
|
const void* caller = nullptr);
|
|
|
|
|
|
[[noreturn]] C10_API inline void ThrowEnforceNotMet(
|
|
|
const char* file,
|
|
|
const int line,
|
|
|
const char* condition,
|
|
|
detail::CompileTimeEmptyString ,
|
|
|
const void* caller = nullptr) {
|
|
|
ThrowEnforceNotMet(file, line, condition, "", caller);
|
|
|
}
|
|
|
|
|
|
[[noreturn]] C10_API void ThrowEnforceFiniteNotMet(
|
|
|
const char* file,
|
|
|
const int line,
|
|
|
const char* condition,
|
|
|
const std::string& msg,
|
|
|
const void* caller = nullptr);
|
|
|
|
|
|
[[noreturn]] C10_API void ThrowEnforceFiniteNotMet(
|
|
|
const char* file,
|
|
|
const int line,
|
|
|
const char* condition,
|
|
|
const char* msg,
|
|
|
const void* caller = nullptr);
|
|
|
|
|
|
[[noreturn]] C10_API inline void ThrowEnforceFiniteNotMet(
|
|
|
const char* file,
|
|
|
const int line,
|
|
|
const char* condition,
|
|
|
detail::CompileTimeEmptyString ,
|
|
|
const void* caller = nullptr) {
|
|
|
ThrowEnforceFiniteNotMet(file, line, condition, "", caller);
|
|
|
}
|
|
|
|
|
|
constexpr bool IsUsingGoogleLogging() {
|
|
|
#ifdef C10_USE_GLOG
|
|
|
return true;
|
|
|
#else
|
|
|
return false;
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C10_API void ShowLogInfoToStderr();
|
|
|
|
|
|
C10_API void SetStackTraceFetcher(std::function<::c10::Backtrace()> fetcher);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C10_API void SetStackTraceFetcher(std::function<std::string()> fetcher);
|
|
|
|
|
|
using EnforceNotMet = ::c10::Error;
|
|
|
|
|
|
#define CAFFE_ENFORCE(condition, ...) \
|
|
|
do { \
|
|
|
if (C10_UNLIKELY(!(condition))) { \
|
|
|
::c10::ThrowEnforceNotMet( \
|
|
|
__FILE__, __LINE__, #condition, ::c10::str(__VA_ARGS__)); \
|
|
|
} \
|
|
|
} while (false)
|
|
|
|
|
|
#define CAFFE_ENFORCE_FINITE(condition, ...) \
|
|
|
do { \
|
|
|
if (C10_UNLIKELY(!(condition))) { \
|
|
|
::c10::ThrowEnforceFiniteNotMet( \
|
|
|
__FILE__, __LINE__, #condition, ::c10::str(__VA_ARGS__)); \
|
|
|
} \
|
|
|
} while (false)
|
|
|
|
|
|
#define CAFFE_ENFORCE_WITH_CALLER(condition, ...) \
|
|
|
do { \
|
|
|
if (C10_UNLIKELY(!(condition))) { \
|
|
|
::c10::ThrowEnforceNotMet( \
|
|
|
__FILE__, __LINE__, #condition, ::c10::str(__VA_ARGS__), this); \
|
|
|
} \
|
|
|
} while (false)
|
|
|
|
|
|
#define CAFFE_THROW(...) \
|
|
|
::c10::ThrowEnforceNotMet(__FILE__, __LINE__, "", ::c10::str(__VA_ARGS__))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace enforce_detail {
|
|
|
|
|
|
template <typename T1, typename T2>
|
|
|
std::string enforceFailMsgImpl(const T1& x, const T2& y) {
|
|
|
return c10::str(x, " vs ", y);
|
|
|
}
|
|
|
|
|
|
template <typename T1, typename T2, typename... Args>
|
|
|
std::string enforceFailMsgImpl(const T1& x, const T2& y, const Args&... args) {
|
|
|
return c10::str(x, " vs ", y, ". ", args...);
|
|
|
}
|
|
|
|
|
|
template <typename Pred, typename T1, typename T2, typename GetFailMsgFunc>
|
|
|
void enforceThatImpl(
|
|
|
Pred p,
|
|
|
const T1& lhs,
|
|
|
const T2& rhs,
|
|
|
const char* file,
|
|
|
int line,
|
|
|
const char* expr,
|
|
|
const void* caller,
|
|
|
GetFailMsgFunc getFailMsg) {
|
|
|
if (C10_UNLIKELY(!(p(lhs, rhs)))) {
|
|
|
::c10::ThrowEnforceNotMet(file, line, expr, getFailMsg(lhs, rhs), caller);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
#define CAFFE_ENFORCE_THAT_IMPL(op, lhs, rhs, expr, ...) \
|
|
|
::c10::enforce_detail::enforceThatImpl( \
|
|
|
op, \
|
|
|
(lhs), \
|
|
|
(rhs), \
|
|
|
__FILE__, \
|
|
|
__LINE__, \
|
|
|
expr, \
|
|
|
nullptr, \
|
|
|
[&](const auto& arg1, const auto& arg2) { \
|
|
|
return ::c10::enforce_detail::enforceFailMsgImpl( \
|
|
|
arg1, arg2, ##__VA_ARGS__); \
|
|
|
})
|
|
|
|
|
|
#define CAFFE_ENFORCE_THAT_IMPL_WITH_CALLER(op, lhs, rhs, expr, ...) \
|
|
|
::c10::enforce_detail::enforceThatImpl( \
|
|
|
op, \
|
|
|
(lhs), \
|
|
|
(rhs), \
|
|
|
__FILE__, \
|
|
|
__LINE__, \
|
|
|
expr, \
|
|
|
this, \
|
|
|
[&](const auto& arg1, const auto& arg2) { \
|
|
|
return ::c10::enforce_detail::enforceFailMsgImpl( \
|
|
|
arg1, arg2, ##__VA_ARGS__); \
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
#define CAFFE_ENFORCE_THAT(cmp, op, lhs, rhs, ...) \
|
|
|
CAFFE_ENFORCE_THAT_IMPL(cmp, lhs, rhs, #lhs " " #op " " #rhs, ##__VA_ARGS__)
|
|
|
|
|
|
#define CAFFE_ENFORCE_BINARY_OP(cmp, op, x, y, ...) \
|
|
|
CAFFE_ENFORCE_THAT_IMPL(cmp, x, y, #x " " #op " " #y, ##__VA_ARGS__)
|
|
|
#define CAFFE_ENFORCE_EQ(x, y, ...) \
|
|
|
CAFFE_ENFORCE_BINARY_OP(std::equal_to<void>(), ==, x, y, ##__VA_ARGS__)
|
|
|
#define CAFFE_ENFORCE_NE(x, y, ...) \
|
|
|
CAFFE_ENFORCE_BINARY_OP(std::not_equal_to<void>(), !=, x, y, ##__VA_ARGS__)
|
|
|
#define CAFFE_ENFORCE_LE(x, y, ...) \
|
|
|
CAFFE_ENFORCE_BINARY_OP(std::less_equal<void>(), <=, x, y, ##__VA_ARGS__)
|
|
|
#define CAFFE_ENFORCE_LT(x, y, ...) \
|
|
|
CAFFE_ENFORCE_BINARY_OP(std::less<void>(), <, x, y, ##__VA_ARGS__)
|
|
|
#define CAFFE_ENFORCE_GE(x, y, ...) \
|
|
|
CAFFE_ENFORCE_BINARY_OP(std::greater_equal<void>(), >=, x, y, ##__VA_ARGS__)
|
|
|
#define CAFFE_ENFORCE_GT(x, y, ...) \
|
|
|
CAFFE_ENFORCE_BINARY_OP(std::greater<void>(), >, x, y, ##__VA_ARGS__)
|
|
|
|
|
|
#define CAFFE_ENFORCE_BINARY_OP_WITH_CALLER(cmp, op, x, y, ...) \
|
|
|
CAFFE_ENFORCE_THAT_IMPL_WITH_CALLER( \
|
|
|
cmp, x, y, #x " " #op " " #y, ##__VA_ARGS__)
|
|
|
#define CAFFE_ENFORCE_EQ_WITH_CALLER(x, y, ...) \
|
|
|
CAFFE_ENFORCE_BINARY_OP_WITH_CALLER( \
|
|
|
std::equal_to<void>(), ==, x, y, ##__VA_ARGS__)
|
|
|
#define CAFFE_ENFORCE_NE_WITH_CALLER(x, y, ...) \
|
|
|
CAFFE_ENFORCE_BINARY_OP_WITH_CALLER( \
|
|
|
std::not_equal_to<void>(), !=, x, y, ##__VA_ARGS__)
|
|
|
#define CAFFE_ENFORCE_LE_WITH_CALLER(x, y, ...) \
|
|
|
CAFFE_ENFORCE_BINARY_OP_WITH_CALLER( \
|
|
|
std::less_equal<void>(), <=, x, y, ##__VA_ARGS__)
|
|
|
#define CAFFE_ENFORCE_LT_WITH_CALLER(x, y, ...) \
|
|
|
CAFFE_ENFORCE_BINARY_OP_WITH_CALLER(std::less<void>(), <, x, y, ##__VA_ARGS__)
|
|
|
#define CAFFE_ENFORCE_GE_WITH_CALLER(x, y, ...) \
|
|
|
CAFFE_ENFORCE_BINARY_OP_WITH_CALLER( \
|
|
|
std::greater_equal<void>(), >=, x, y, ##__VA_ARGS__)
|
|
|
#define CAFFE_ENFORCE_GT_WITH_CALLER(x, y, ...) \
|
|
|
CAFFE_ENFORCE_BINARY_OP_WITH_CALLER( \
|
|
|
std::greater<void>(), >, x, y, ##__VA_ARGS__)
|
|
|
|
|
|
struct IValue;
|
|
|
class C10_API EventSampledHandler {
|
|
|
public:
|
|
|
virtual void log(
|
|
|
std::string_view model_id,
|
|
|
const std::vector<c10::IValue>& args) = 0;
|
|
|
virtual ~EventSampledHandler() = default;
|
|
|
};
|
|
|
|
|
|
#define C10_LOG_EVENT_SAMPLED(event, ...) \
|
|
|
static const std::unique_ptr<::c10::EventSampledHandler>& \
|
|
|
_##event##EventSampledHandler = ::c10::GetEventSampledHandler(#event); \
|
|
|
if (_##event##EventSampledHandler) { \
|
|
|
_##event##EventSampledHandler->log(__VA_ARGS__); \
|
|
|
}
|
|
|
|
|
|
|
|
|
C10_API void InitEventSampledHandlers(
|
|
|
std::vector<
|
|
|
std::pair<std::string_view, std::unique_ptr<EventSampledHandler>>>);
|
|
|
C10_API const std::unique_ptr<EventSampledHandler>& GetEventSampledHandler(
|
|
|
std::string_view);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define C10_LOG_API_USAGE_ONCE(...) \
|
|
|
[[maybe_unused]] static bool C10_ANONYMOUS_VARIABLE(logFlag) = \
|
|
|
::c10::detail::LogAPIUsageFakeReturn(__VA_ARGS__);
|
|
|
|
|
|
|
|
|
C10_API void SetAPIUsageLogger(std::function<void(const std::string&)> logger);
|
|
|
C10_API void LogAPIUsage(const std::string& context);
|
|
|
|
|
|
C10_API void SetAPIUsageMetadataLogger(
|
|
|
std::function<void(
|
|
|
const std::string&,
|
|
|
const std::map<std::string, std::string>& metadata_map)> logger);
|
|
|
C10_API void LogAPIUsageMetadata(
|
|
|
const std::string& context,
|
|
|
const std::map<std::string, std::string>& metadata_map);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct DDPLoggingData {
|
|
|
|
|
|
std::map<std::string, std::string> strs_map;
|
|
|
|
|
|
std::map<std::string, int64_t> ints_map;
|
|
|
};
|
|
|
|
|
|
C10_API void SetPyTorchDDPUsageLogger(
|
|
|
std::function<void(const DDPLoggingData&)> logger);
|
|
|
C10_API void LogPyTorchDDPUsage(const DDPLoggingData& ddpData);
|
|
|
|
|
|
namespace detail {
|
|
|
|
|
|
C10_API bool LogAPIUsageFakeReturn(const std::string& context);
|
|
|
}
|
|
|
|
|
|
|
|
|
C10_API void initLogging();
|
|
|
|
|
|
|
|
|
C10_API void SetGlobalRank(int64_t rank);
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|