Skip to content

Commit 9b17d74

Browse files
authored
mtmd: add mtmd_log_set (#17268)
1 parent e1fcf8b commit 9b17d74

File tree

12 files changed

+92
-29
lines changed

12 files changed

+92
-29
lines changed

common/common.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -355,11 +355,7 @@ bool parse_cpu_mask(const std::string & mask, bool (&boolmask)[GGML_MAX_N_THREAD
355355
}
356356

357357
void common_init() {
358-
llama_log_set([](ggml_log_level level, const char * text, void * /*user_data*/) {
359-
if (LOG_DEFAULT_LLAMA <= common_log_verbosity_thold) {
360-
common_log_add(common_log_main(), level, "%s", text);
361-
}
362-
}, NULL);
358+
llama_log_set(common_log_default_callback, NULL);
363359

364360
#ifdef NDEBUG
365361
const char * build_type = "";

common/log.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,3 +442,9 @@ void common_log_set_prefix(struct common_log * log, bool prefix) {
442442
void common_log_set_timestamps(struct common_log * log, bool timestamps) {
443443
log->set_timestamps(timestamps);
444444
}
445+
446+
void common_log_default_callback(enum ggml_log_level level, const char * text, void * /*user_data*/) {
447+
if (LOG_DEFAULT_LLAMA <= common_log_verbosity_thold) {
448+
common_log_add(common_log_main(), level, "%s", text);
449+
}
450+
}

common/log.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ extern int common_log_verbosity_thold;
3636

3737
void common_log_set_verbosity_thold(int verbosity); // not thread-safe
3838

39+
void common_log_default_callback(enum ggml_log_level level, const char * text, void * user_data);
40+
3941
// the common_log uses an internal worker thread to print/write log messages
4042
// when the worker thread is paused, incoming log messages are discarded
4143
struct common_log;

tools/mtmd/clip-impl.h

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,6 @@ static void clip_log_callback_default(enum ggml_log_level level, const char * te
224224
}
225225

226226
struct clip_logger_state {
227-
ggml_log_level verbosity_thold;
228227
ggml_log_callback log_callback;
229228
void * log_callback_user_data;
230229
};
@@ -258,17 +257,11 @@ static void clip_log_internal(enum ggml_log_level level, const char * format, ..
258257
va_end(args);
259258
}
260259

261-
#define LOG_TMPL(level, ...) \
262-
do { \
263-
if ((level) >= g_logger_state.verbosity_thold) { \
264-
clip_log_internal((level), __VA_ARGS__); \
265-
} \
266-
} while (0)
267-
#define LOG_INF(...) LOG_TMPL(GGML_LOG_LEVEL_INFO, __VA_ARGS__)
268-
#define LOG_WRN(...) LOG_TMPL(GGML_LOG_LEVEL_WARN, __VA_ARGS__)
269-
#define LOG_ERR(...) LOG_TMPL(GGML_LOG_LEVEL_ERROR, __VA_ARGS__)
270-
#define LOG_DBG(...) LOG_TMPL(GGML_LOG_LEVEL_DEBUG, __VA_ARGS__)
271-
#define LOG_CNT(...) LOG_TMPL(GGML_LOG_LEVEL_CONT, __VA_ARGS__)
260+
#define LOG_INF(...) clip_log_internal(GGML_LOG_LEVEL_INFO, __VA_ARGS__)
261+
#define LOG_WRN(...) clip_log_internal(GGML_LOG_LEVEL_WARN, __VA_ARGS__)
262+
#define LOG_ERR(...) clip_log_internal(GGML_LOG_LEVEL_ERROR, __VA_ARGS__)
263+
#define LOG_DBG(...) clip_log_internal(GGML_LOG_LEVEL_DEBUG, __VA_ARGS__)
264+
#define LOG_CNT(...) clip_log_internal(GGML_LOG_LEVEL_CONT, __VA_ARGS__)
272265

273266
//
274267
// cpp wrappers

tools/mtmd/clip.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@
2424
#include <array>
2525
#include <functional>
2626

27-
// TODO: allow to pass callback from user code
28-
struct clip_logger_state g_logger_state = {GGML_LOG_LEVEL_CONT, clip_log_callback_default, NULL};
27+
struct clip_logger_state g_logger_state = {clip_log_callback_default, NULL};
2928

3029
enum ffn_op_type {
3130
FFN_GELU,
@@ -3507,7 +3506,6 @@ struct clip_model_loader {
35073506
};
35083507

35093508
struct clip_init_result clip_init(const char * fname, struct clip_context_params ctx_params) {
3510-
g_logger_state.verbosity_thold = ctx_params.verbosity;
35113509
clip_ctx * ctx_vision = nullptr;
35123510
clip_ctx * ctx_audio = nullptr;
35133511

tools/mtmd/clip.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ enum clip_flash_attn_type {
3131

3232
struct clip_context_params {
3333
bool use_gpu;
34-
enum ggml_log_level verbosity;
3534
enum clip_flash_attn_type flash_attn_type;
3635
int image_min_tokens;
3736
int image_max_tokens;

tools/mtmd/mtmd-cli.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,6 @@ struct mtmd_cli_context {
135135
mparams.use_gpu = params.mmproj_use_gpu;
136136
mparams.print_timings = true;
137137
mparams.n_threads = params.cpuparams.n_threads;
138-
mparams.verbosity = params.verbosity > 0 ? GGML_LOG_LEVEL_DEBUG : GGML_LOG_LEVEL_INFO;
139138
mparams.flash_attn_type = params.flash_attn_type;
140139
mparams.image_min_tokens = params.image_min_tokens;
141140
mparams.image_max_tokens = params.image_max_tokens;
@@ -277,6 +276,7 @@ int main(int argc, char ** argv) {
277276
}
278277

279278
common_init();
279+
mtmd_helper_log_set(common_log_default_callback, nullptr);
280280

281281
if (params.mmproj.path.empty()) {
282282
show_additional_info(argc, argv);

tools/mtmd/mtmd-helper.cpp

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,65 @@
3232
#define STB_IMAGE_IMPLEMENTATION
3333
#include "stb/stb_image.h"
3434

35-
#define LOG_INF(...) fprintf(stdout, __VA_ARGS__)
36-
#define LOG_ERR(...) fprintf(stderr, __VA_ARGS__)
35+
//
36+
// internal logging functions
37+
//
38+
39+
struct mtmd_helper_logger {
40+
ggml_log_callback default_callback = [](ggml_log_level level, const char * text, void * user_data) {
41+
(void) level;
42+
(void) user_data;
43+
fputs(text, stderr);
44+
fflush(stderr);
45+
};
46+
47+
ggml_log_callback log_callback = default_callback;
48+
void * log_callback_user_data;
49+
50+
void log_v(enum ggml_log_level level, const char * format, va_list args) {
51+
if (format == NULL) {
52+
return;
53+
}
54+
va_list args_copy;
55+
va_copy(args_copy, args);
56+
char buffer[128];
57+
int len = vsnprintf(buffer, 128, format, args);
58+
if (len < 128) {
59+
log_callback(level, buffer, log_callback_user_data);
60+
} else {
61+
char * buffer2 = (char *) calloc(len + 1, sizeof(char));
62+
vsnprintf(buffer2, len + 1, format, args_copy);
63+
buffer2[len] = 0;
64+
log_callback(level, buffer2, log_callback_user_data);
65+
free(buffer2);
66+
}
67+
va_end(args_copy);
68+
}
69+
70+
void log(enum ggml_log_level level, const char * format, ...) {
71+
va_list args;
72+
va_start(args, format);
73+
log_v(level, format, args);
74+
va_end(args);
75+
}
76+
} g_logger;
77+
78+
#define LOG_INF(...) g_logger.log(GGML_LOG_LEVEL_INFO, __VA_ARGS__)
79+
#define LOG_WRN(...) g_logger.log(GGML_LOG_LEVEL_WARN, __VA_ARGS__)
80+
#define LOG_ERR(...) g_logger.log(GGML_LOG_LEVEL_ERROR, __VA_ARGS__)
81+
82+
void mtmd_helper_log_set(ggml_log_callback log_callback, void * user_data) {
83+
if (log_callback == nullptr) {
84+
log_callback = g_logger.default_callback;
85+
}
86+
g_logger.log_callback = log_callback;
87+
g_logger.log_callback_user_data = user_data;
88+
mtmd_log_set(log_callback, user_data);
89+
}
90+
91+
//
92+
// helper functions
93+
//
3794

3895
size_t mtmd_helper_get_n_tokens(const mtmd_input_chunks * chunks) {
3996
size_t n_tokens = 0;
@@ -325,7 +382,7 @@ int32_t mtmd_helper_eval_chunks(mtmd_context * ctx,
325382
llama_pos * new_n_past) {
326383
size_t n_chunks = mtmd_input_chunks_size(chunks);
327384
if (n_chunks == 0) {
328-
LOG_ERR("no chunks to eval\n");
385+
LOG_WRN("no chunks to eval\n");
329386
return 0;
330387
}
331388

tools/mtmd/mtmd-helper.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ extern "C" {
2020
// BREAKING CHANGES are expected.
2121
//
2222

23+
// Set callback for all future logging events.
24+
// If this is not called, or NULL is supplied, everything is output on stderr.
25+
// Note: this also call mtmd_log_set() internally
26+
MTMD_API void mtmd_helper_log_set(ggml_log_callback log_callback, void * user_data);
27+
2328
// helper function to construct a mtmd_bitmap from a file
2429
// it calls mtmd_helper_bitmap_init_from_buf() internally
2530
// returns nullptr on failure

tools/mtmd/mtmd.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@ mtmd_context_params mtmd_context_params_default() {
105105
/* use_gpu */ true,
106106
/* print_timings */ true,
107107
/* n_threads */ 4,
108-
/* verbosity */ GGML_LOG_LEVEL_INFO,
109108
/* image_marker */ MTMD_DEFAULT_IMAGE_MARKER,
110109
/* media_marker */ mtmd_default_marker(),
111110
/* flash_attn_type */ LLAMA_FLASH_ATTN_TYPE_AUTO,
@@ -175,7 +174,6 @@ struct mtmd_context {
175174

176175
clip_context_params ctx_clip_params {
177176
/* use_gpu */ ctx_params.use_gpu,
178-
/* verbosity */ ctx_params.verbosity,
179177
/* flash_attn_type */ CLIP_FLASH_ATTN_TYPE_AUTO,
180178
/* image_min_tokens */ ctx_params.image_min_tokens,
181179
/* image_max_tokens */ ctx_params.image_max_tokens,
@@ -1096,3 +1094,8 @@ mtmd_input_chunks * mtmd_test_create_input_chunks() {
10961094

10971095
return chunks;
10981096
}
1097+
1098+
void mtmd_log_set(ggml_log_callback log_callback, void * user_data) {
1099+
g_logger_state.log_callback = log_callback ? log_callback : clip_log_callback_default;
1100+
g_logger_state.log_callback_user_data = user_data;
1101+
}

0 commit comments

Comments
 (0)