| #pragma once |
| #include <torch/csrc/Export.h> |
| #include <memory> |
| #include <ostream> |
| #include <string> |
| #include <unordered_map> |
| |
| // `TorchScript` offers a simple logging facility that can enabled by setting an |
| // environment variable `PYTORCH_JIT_LOG_LEVEL`. |
| |
| // Logging is enabled on a per file basis. To enable logging in |
| // `dead_code_elimination.cpp`, `PYTORCH_JIT_LOG_LEVEL` should be |
| // set to `dead_code_elimination.cpp` or, simply, to `dead_code_elimination` |
| // (i.e. `PYTORCH_JIT_LOG_LEVEL=dead_code_elimination`). |
| |
| // Multiple files can be logged by separating each file name with a colon `:` as |
| // in the following example, |
| // `PYTORCH_JIT_LOG_LEVEL=dead_code_elimination:guard_elimination` |
| |
| // There are 3 logging levels available for your use ordered by the detail level |
| // from lowest to highest. |
| |
| // * `GRAPH_DUMP` should be used for printing entire graphs after optimization |
| // passes |
| // * `GRAPH_UPDATE` should be used for reporting graph transformations (i.e. |
| // node deletion, constant folding, etc) |
| // * `GRAPH_DEBUG` should be used for providing information useful for debugging |
| // the internals of a particular optimization pass or analysis |
| |
| // The default logging level is `GRAPH_DUMP` meaning that only `GRAPH_DUMP` |
| // statements will be enabled when one specifies a file(s) in |
| // `PYTORCH_JIT_LOG_LEVEL`. |
| |
| // `GRAPH_UPDATE` can be enabled by prefixing a file name with an `>` as in |
| // `>alias_analysis`. |
| // `GRAPH_DEBUG` can be enabled by prefixing a file name with an `>>` as in |
| // `>>alias_analysis`. |
| // `>>>` is also valid and **currently** is equivalent to `GRAPH_DEBUG` as there |
| // is no logging level that is higher than `GRAPH_DEBUG`. |
| |
| namespace torch { |
| namespace jit { |
| |
| struct Node; |
| struct Graph; |
| |
| enum class JitLoggingLevels { |
| GRAPH_DUMP = 0, |
| GRAPH_UPDATE, |
| GRAPH_DEBUG, |
| }; |
| |
| TORCH_API std::string get_jit_logging_levels(); |
| |
| TORCH_API void set_jit_logging_levels(std::string level); |
| |
| TORCH_API void set_jit_logging_output_stream(std::ostream& out_stream); |
| |
| TORCH_API std::ostream& get_jit_logging_output_stream(); |
| |
| TORCH_API std::string getHeader(const Node* node); |
| |
| TORCH_API std::string log_function(const std::shared_ptr<Graph>& graph); |
| |
| TORCH_API ::torch::jit::JitLoggingLevels jit_log_level(); |
| |
| // Prefix every line in a multiline string \p IN_STR with \p PREFIX. |
| TORCH_API std::string jit_log_prefix( |
| const std::string& prefix, |
| const std::string& in_str); |
| |
| TORCH_API std::string jit_log_prefix( |
| ::torch::jit::JitLoggingLevels level, |
| const char* fn, |
| int l, |
| const std::string& in_str); |
| |
| TORCH_API bool is_enabled( |
| const char* cfname, |
| ::torch::jit::JitLoggingLevels level); |
| |
| TORCH_API std::ostream& operator<<( |
| std::ostream& out, |
| ::torch::jit::JitLoggingLevels level); |
| |
| #define JIT_LOG(level, ...) \ |
| if (is_enabled(__FILE__, level)) { \ |
| ::torch::jit::get_jit_logging_output_stream() \ |
| << ::torch::jit::jit_log_prefix( \ |
| level, __FILE__, __LINE__, ::c10::str(__VA_ARGS__)); \ |
| } |
| |
| // tries to reconstruct original python source |
| #define SOURCE_DUMP(MSG, G) \ |
| JIT_LOG( \ |
| ::torch::jit::JitLoggingLevels::GRAPH_DUMP, \ |
| MSG, \ |
| "\n", \ |
| ::torch::jit::log_function(G)); |
| // use GRAPH_DUMP for dumping graphs after optimization passes |
| #define GRAPH_DUMP(MSG, G) \ |
| JIT_LOG( \ |
| ::torch::jit::JitLoggingLevels::GRAPH_DUMP, MSG, "\n", (G)->toString()); |
| // use GRAPH_UPDATE for reporting graph transformations (i.e. node deletion, |
| // constant folding, CSE) |
| #define GRAPH_UPDATE(...) \ |
| JIT_LOG(::torch::jit::JitLoggingLevels::GRAPH_UPDATE, __VA_ARGS__); |
| // use GRAPH_DEBUG to provide information useful for debugging a particular opt |
| // pass |
| #define GRAPH_DEBUG(...) \ |
| JIT_LOG(::torch::jit::JitLoggingLevels::GRAPH_DEBUG, __VA_ARGS__); |
| // use GRAPH_EXPORT to export a graph so that the IR can be loaded by a script |
| #define GRAPH_EXPORT(MSG, G) \ |
| JIT_LOG( \ |
| ::torch::jit::JitLoggingLevels::GRAPH_DEBUG, \ |
| MSG, \ |
| "\n<GRAPH_EXPORT>\n", \ |
| (G)->toString(), \ |
| "</GRAPH_EXPORT>"); |
| |
| #define GRAPH_DUMP_ENABLED \ |
| (is_enabled(__FILE__, ::torch::jit::JitLoggingLevels::GRAPH_DUMP)) |
| #define GRAPH_UPDATE_ENABLED \ |
| (is_enabled(__FILE__, ::torch::jit::JitLoggingLevels::GRAPH_UPDATE)) |
| #define GRAPH_DEBUG_ENABLED \ |
| (is_enabled(__FILE__, ::torch::jit::JitLoggingLevels::GRAPH_DEBUG)) |
| } // namespace jit |
| } // namespace torch |