mirror of
https://github.com/ggml-org/llama.cpp.git
synced 2025-10-28 08:31:25 +00:00
Implement --log-colors with always/never/auto (#15792)
With auto by default Signed-off-by: Eric Curtin <ericcurtin17@gmail.com>
This commit is contained in:
@@ -1263,6 +1263,18 @@ static std::string list_builtin_chat_templates() {
|
|||||||
return msg.str();
|
return msg.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool is_truthy(const std::string & value) {
|
||||||
|
return value == "on" || value == "enabled" || value == "1";
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool is_falsey(const std::string & value) {
|
||||||
|
return value == "off" || value == "disabled" || value == "0";
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool is_autoy(const std::string & value) {
|
||||||
|
return value == "auto" || value == "-1";
|
||||||
|
}
|
||||||
|
|
||||||
common_params_context common_params_parser_init(common_params & params, llama_example ex, void(*print_usage)(int, char **)) {
|
common_params_context common_params_parser_init(common_params & params, llama_example ex, void(*print_usage)(int, char **)) {
|
||||||
// load dynamic backends
|
// load dynamic backends
|
||||||
ggml_backend_load_all();
|
ggml_backend_load_all();
|
||||||
@@ -1544,21 +1556,21 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
|||||||
params.n_chunks = value;
|
params.n_chunks = value;
|
||||||
}
|
}
|
||||||
).set_examples({LLAMA_EXAMPLE_IMATRIX, LLAMA_EXAMPLE_PERPLEXITY, LLAMA_EXAMPLE_RETRIEVAL}));
|
).set_examples({LLAMA_EXAMPLE_IMATRIX, LLAMA_EXAMPLE_PERPLEXITY, LLAMA_EXAMPLE_RETRIEVAL}));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg({ "-fa", "--flash-attn" }, "[on|off|auto]",
|
||||||
{"-fa", "--flash-attn"}, "FA",
|
string_format("set Flash Attention use ('on', 'off', or 'auto', default: '%s')",
|
||||||
string_format("set Flash Attention use ('on', 'off', or 'auto', default: '%s')", llama_flash_attn_type_name(params.flash_attn_type)),
|
llama_flash_attn_type_name(params.flash_attn_type)),
|
||||||
[](common_params & params, const std::string & value) {
|
[](common_params & params, const std::string & value) {
|
||||||
if (value == "on" || value == "enabled" || value == "1") {
|
if (is_truthy(value)) {
|
||||||
params.flash_attn_type = LLAMA_FLASH_ATTN_TYPE_ENABLED;
|
params.flash_attn_type = LLAMA_FLASH_ATTN_TYPE_ENABLED;
|
||||||
} else if (value == "off" || value == "disabled" || value == "0") {
|
} else if (is_falsey(value)) {
|
||||||
params.flash_attn_type = LLAMA_FLASH_ATTN_TYPE_DISABLED;
|
params.flash_attn_type = LLAMA_FLASH_ATTN_TYPE_DISABLED;
|
||||||
} else if (value == "auto" || value == "-1") {
|
} else if (is_autoy(value)) {
|
||||||
params.flash_attn_type = LLAMA_FLASH_ATTN_TYPE_AUTO;
|
params.flash_attn_type = LLAMA_FLASH_ATTN_TYPE_AUTO;
|
||||||
} else {
|
} else {
|
||||||
throw std::runtime_error(string_format("error: unkown value for --flash-attn: '%s'\n", value.c_str()));
|
throw std::runtime_error(
|
||||||
|
string_format("error: unkown value for --flash-attn: '%s'\n", value.c_str()));
|
||||||
}
|
}
|
||||||
}
|
}).set_env("LLAMA_ARG_FLASH_ATTN"));
|
||||||
).set_env("LLAMA_ARG_FLASH_ATTN"));
|
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-p", "--prompt"}, "PROMPT",
|
{"-p", "--prompt"}, "PROMPT",
|
||||||
"prompt to start generation with; for system message, use -sys",
|
"prompt to start generation with; for system message, use -sys",
|
||||||
@@ -3134,13 +3146,21 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
|
|||||||
common_log_set_file(common_log_main(), value.c_str());
|
common_log_set_file(common_log_main(), value.c_str());
|
||||||
}
|
}
|
||||||
));
|
));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg({ "--log-colors" }, "[on|off|auto]",
|
||||||
{"--log-colors"},
|
"Set colored logging ('on', 'off', or 'auto', default: 'auto')\n"
|
||||||
"Enable colored logging",
|
"'auto' enables colors when output is to a terminal",
|
||||||
[](common_params &) {
|
[](common_params &, const std::string & value) {
|
||||||
common_log_set_colors(common_log_main(), true);
|
if (is_truthy(value)) {
|
||||||
|
common_log_set_colors(common_log_main(), LOG_COLORS_ENABLED);
|
||||||
|
} else if (is_falsey(value)) {
|
||||||
|
common_log_set_colors(common_log_main(), LOG_COLORS_DISABLED);
|
||||||
|
} else if (is_autoy(value)) {
|
||||||
|
common_log_set_colors(common_log_main(), LOG_COLORS_AUTO);
|
||||||
|
} else {
|
||||||
|
throw std::invalid_argument(
|
||||||
|
string_format("error: unkown value for --log-colors: '%s'\n", value.c_str()));
|
||||||
}
|
}
|
||||||
).set_env("LLAMA_LOG_COLORS"));
|
}).set_env("LLAMA_LOG_COLORS"));
|
||||||
add_opt(common_arg(
|
add_opt(common_arg(
|
||||||
{"-v", "--verbose", "--log-verbose"},
|
{"-v", "--verbose", "--log-verbose"},
|
||||||
"Set verbosity level to infinity (i.e. log all messages, useful for debugging)",
|
"Set verbosity level to infinity (i.e. log all messages, useful for debugging)",
|
||||||
|
|||||||
@@ -4,17 +4,52 @@
|
|||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
#include <cstdarg>
|
#include <cstdarg>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#if defined(_WIN32)
|
||||||
|
# include <io.h>
|
||||||
|
# include <windows.h>
|
||||||
|
# define isatty _isatty
|
||||||
|
# define fileno _fileno
|
||||||
|
#else
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif // defined(_WIN32)
|
||||||
|
|
||||||
int common_log_verbosity_thold = LOG_DEFAULT_LLAMA;
|
int common_log_verbosity_thold = LOG_DEFAULT_LLAMA;
|
||||||
|
|
||||||
void common_log_set_verbosity_thold(int verbosity) {
|
void common_log_set_verbosity_thold(int verbosity) {
|
||||||
common_log_verbosity_thold = verbosity;
|
common_log_verbosity_thold = verbosity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Auto-detect if colors should be enabled based on terminal and environment
|
||||||
|
static bool common_log_should_use_colors_auto() {
|
||||||
|
// Check NO_COLOR environment variable (https://no-color.org/)
|
||||||
|
if (const char * no_color = std::getenv("NO_COLOR")) {
|
||||||
|
if (no_color[0] != '\0') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check TERM environment variable
|
||||||
|
if (const char * term = std::getenv("TERM")) {
|
||||||
|
if (std::strcmp(term, "dumb") == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if stdout and stderr are connected to a terminal
|
||||||
|
// We check both because log messages can go to either
|
||||||
|
bool stdout_is_tty = isatty(fileno(stdout));
|
||||||
|
bool stderr_is_tty = isatty(fileno(stderr));
|
||||||
|
|
||||||
|
return stdout_is_tty || stderr_is_tty;
|
||||||
|
}
|
||||||
|
|
||||||
static int64_t t_us() {
|
static int64_t t_us() {
|
||||||
return std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
|
return std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
|
||||||
}
|
}
|
||||||
@@ -353,6 +388,11 @@ struct common_log * common_log_init() {
|
|||||||
|
|
||||||
struct common_log * common_log_main() {
|
struct common_log * common_log_main() {
|
||||||
static struct common_log log;
|
static struct common_log log;
|
||||||
|
static std::once_flag init_flag;
|
||||||
|
std::call_once(init_flag, [&]() {
|
||||||
|
// Set default to auto-detect colors
|
||||||
|
log.set_colors(common_log_should_use_colors_auto());
|
||||||
|
});
|
||||||
|
|
||||||
return &log;
|
return &log;
|
||||||
}
|
}
|
||||||
@@ -380,8 +420,19 @@ void common_log_set_file(struct common_log * log, const char * file) {
|
|||||||
log->set_file(file);
|
log->set_file(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
void common_log_set_colors(struct common_log * log, bool colors) {
|
void common_log_set_colors(struct common_log * log, log_colors colors) {
|
||||||
log->set_colors(colors);
|
if (colors == LOG_COLORS_AUTO) {
|
||||||
|
log->set_colors(common_log_should_use_colors_auto());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (colors == LOG_COLORS_DISABLED) {
|
||||||
|
log->set_colors(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
GGML_ASSERT(colors == LOG_COLORS_ENABLED);
|
||||||
|
log->set_colors(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void common_log_set_prefix(struct common_log * log, bool prefix) {
|
void common_log_set_prefix(struct common_log * log, bool prefix) {
|
||||||
|
|||||||
@@ -24,6 +24,12 @@
|
|||||||
#define LOG_DEFAULT_DEBUG 1
|
#define LOG_DEFAULT_DEBUG 1
|
||||||
#define LOG_DEFAULT_LLAMA 0
|
#define LOG_DEFAULT_LLAMA 0
|
||||||
|
|
||||||
|
enum log_colors {
|
||||||
|
LOG_COLORS_AUTO = -1,
|
||||||
|
LOG_COLORS_DISABLED = 0,
|
||||||
|
LOG_COLORS_ENABLED = 1,
|
||||||
|
};
|
||||||
|
|
||||||
// needed by the LOG_TMPL macro to avoid computing log arguments if the verbosity lower
|
// needed by the LOG_TMPL macro to avoid computing log arguments if the verbosity lower
|
||||||
// set via common_log_set_verbosity()
|
// set via common_log_set_verbosity()
|
||||||
extern int common_log_verbosity_thold;
|
extern int common_log_verbosity_thold;
|
||||||
@@ -66,7 +72,7 @@ void common_log_add(struct common_log * log, enum ggml_log_level level, const ch
|
|||||||
//
|
//
|
||||||
|
|
||||||
void common_log_set_file (struct common_log * log, const char * file); // not thread-safe
|
void common_log_set_file (struct common_log * log, const char * file); // not thread-safe
|
||||||
void common_log_set_colors (struct common_log * log, bool colors); // not thread-safe
|
void common_log_set_colors (struct common_log * log, log_colors colors); // not thread-safe
|
||||||
void common_log_set_prefix (struct common_log * log, bool prefix); // whether to output prefix to each log
|
void common_log_set_prefix (struct common_log * log, bool prefix); // whether to output prefix to each log
|
||||||
void common_log_set_timestamps(struct common_log * log, bool timestamps); // whether to output timestamps in the prefix
|
void common_log_set_timestamps(struct common_log * log, bool timestamps); // whether to output timestamps in the prefix
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user