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 **)) {
// load dynamic backends
ggml_backend_load_all();
params.n_chunks = value;
}
).set_examples({LLAMA_EXAMPLE_IMATRIX, LLAMA_EXAMPLE_PERPLEXITY, LLAMA_EXAMPLE_RETRIEVAL}));
- add_opt(common_arg(
- {"-fa", "--flash-attn"}, "FA",
- string_format("set Flash Attention use ('on', 'off', or 'auto', default: '%s')", llama_flash_attn_type_name(params.flash_attn_type)),
- [](common_params & params, const std::string & value) {
- if (value == "on" || value == "enabled" || value == "1") {
- params.flash_attn_type = LLAMA_FLASH_ATTN_TYPE_ENABLED;
- } else if (value == "off" || value == "disabled" || value == "0") {
- params.flash_attn_type = LLAMA_FLASH_ATTN_TYPE_DISABLED;
- } else if (value == "auto" || value == "-1") {
- params.flash_attn_type = LLAMA_FLASH_ATTN_TYPE_AUTO;
- } else {
- throw std::runtime_error(string_format("error: unkown value for --flash-attn: '%s'\n", value.c_str()));
- }
- }
- ).set_env("LLAMA_ARG_FLASH_ATTN"));
+ add_opt(common_arg({ "-fa", "--flash-attn" }, "[on|off|auto]",
+ string_format("set Flash Attention use ('on', 'off', or 'auto', default: '%s')",
+ llama_flash_attn_type_name(params.flash_attn_type)),
+ [](common_params & params, const std::string & value) {
+ if (is_truthy(value)) {
+ params.flash_attn_type = LLAMA_FLASH_ATTN_TYPE_ENABLED;
+ } else if (is_falsey(value)) {
+ params.flash_attn_type = LLAMA_FLASH_ATTN_TYPE_DISABLED;
+ } else if (is_autoy(value)) {
+ params.flash_attn_type = LLAMA_FLASH_ATTN_TYPE_AUTO;
+ } else {
+ throw std::runtime_error(
+ string_format("error: unkown value for --flash-attn: '%s'\n", value.c_str()));
+ }
+ }).set_env("LLAMA_ARG_FLASH_ATTN"));
add_opt(common_arg(
{"-p", "--prompt"}, "PROMPT",
"prompt to start generation with; for system message, use -sys",
common_log_set_file(common_log_main(), value.c_str());
}
));
- add_opt(common_arg(
- {"--log-colors"},
- "Enable colored logging",
- [](common_params &) {
- common_log_set_colors(common_log_main(), true);
- }
- ).set_env("LLAMA_LOG_COLORS"));
+ add_opt(common_arg({ "--log-colors" }, "[on|off|auto]",
+ "Set colored logging ('on', 'off', or 'auto', default: 'auto')\n"
+ "'auto' enables colors when output is to a terminal",
+ [](common_params &, const std::string & value) {
+ 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"));
add_opt(common_arg(
{"-v", "--verbose", "--log-verbose"},
"Set verbosity level to infinity (i.e. log all messages, useful for debugging)",
#include <condition_variable>
#include <cstdarg>
#include <cstdio>
+#include <cstdlib>
+#include <cstring>
#include <mutex>
#include <sstream>
#include <thread>
#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;
void common_log_set_verbosity_thold(int 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() {
return std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
}
struct common_log * common_log_main() {
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;
}
log->set_file(file);
}
-void common_log_set_colors(struct common_log * log, bool colors) {
- log->set_colors(colors);
+void common_log_set_colors(struct common_log * log, log_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) {
#define LOG_DEFAULT_DEBUG 1
#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
// set via common_log_set_verbosity()
extern int common_log_verbosity_thold;
// D - debug (stderr, V = LOG_DEFAULT_DEBUG)
//
-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_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_file (struct common_log * log, const char * file); // 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_timestamps(struct common_log * log, bool timestamps); // whether to output timestamps in the prefix
// helper macros for logging
// use these to avoid computing log arguments if the verbosity of the log is higher than the threshold