From 9f63b4f1ebe677d7c6bb0602d49b5e7f2b0924a5 Mon Sep 17 00:00:00 2001 From: "javaai.org" Date: Thu, 28 Dec 2023 23:43:39 +0800 Subject: [PATCH 1/3] Change ModelLoader::load_tensors() method read file by wide character path(wchar_t *) to support all language path. --- model.cpp | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/model.cpp b/model.cpp index 41d3347b5..576e1f628 100644 --- a/model.cpp +++ b/model.cpp @@ -14,6 +14,33 @@ #include "ggml/ggml-backend.h" #include "ggml/ggml.h" + + +#if defined(_MSC_VER) +#include +// windows.h, naming conflict with micros: std::min, sdt::max, SDLogLevel::ERROR + +#undef ERROR +static wchar_t* str2wstr(const char* str) { + size_t len = strlen(str) + 1; + wchar_t* wstr = (wchar_t*)malloc(len * sizeof(wchar_t)); + MultiByteToWideChar(CP_UTF8, 0, str, (int)(len * sizeof(char)), wstr, + (int)len); + return wstr; +}; + + //#include + // donot only include stringapiset.h, C1189 #error: "No Target Architecture" + +#else // defined(_MSC_VER) + +#endif // defined(_MSC_VER) + + + + + + #define ST_HEADER_SIZE_LEN 8 uint64_t read_u64(uint8_t* buffer) { @@ -1203,7 +1230,17 @@ bool ModelLoader::load_tensors(on_new_tensor_cb_t on_new_tensor_cb) { std::string file_path = file_paths_[file_index]; LOG_DEBUG("loading tensors from %s", file_path.c_str()); + +#if defined(_MSC_VER) + const char * c_file_path = file_path.c_str(); + const wchar_t * c_w_file_path = str2wstr(c_file_path); + std::ifstream file(c_w_file_path, std::ios::binary); + delete c_w_file_path; + +#else // defined(_MSC_VER) std::ifstream file(file_path, std::ios::binary); +#endif // defined(_MSC_VER) + if (!file.is_open()) { LOG_ERROR("failed to open '%s'", file_path.c_str()); return false; From e25f8a8ac1c7f83493fa8bcf81a80bc8862cb671 Mon Sep 17 00:00:00 2001 From: "javaai.org" Date: Sat, 30 Dec 2023 00:19:54 +0800 Subject: [PATCH 2/3] Fix Exception thrown: read access violation when delete StableDiffusion's pointer. --- stable-diffusion.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/stable-diffusion.cpp b/stable-diffusion.cpp index c1ffdc804..21a1b1605 100644 --- a/stable-diffusion.cpp +++ b/stable-diffusion.cpp @@ -1361,8 +1361,8 @@ struct FrozenCLIPEmbedderWithCustomWords { // context and memory buffers struct ggml_context* ctx; - ggml_backend_buffer_t params_buffer; - ggml_backend_buffer_t compute_buffer; // for compute + ggml_backend_buffer_t params_buffer = NULL; + ggml_backend_buffer_t compute_buffer = NULL; // for compute struct ggml_allocr* compute_alloc = NULL; size_t compute_memory_buffer_size = -1; @@ -2283,8 +2283,8 @@ struct UNetModel { struct ggml_tensor* out_2_b; // [out_channels, ] struct ggml_context* ctx; - ggml_backend_buffer_t params_buffer; - ggml_backend_buffer_t compute_buffer; // for compute + ggml_backend_buffer_t params_buffer = NULL; + ggml_backend_buffer_t compute_buffer = NULL; // for compute struct ggml_allocr* compute_alloc = NULL; size_t compute_memory_buffer_size = -1; @@ -3513,8 +3513,8 @@ struct AutoEncoderKL { Decoder decoder; struct ggml_context* ctx; - ggml_backend_buffer_t params_buffer; - ggml_backend_buffer_t compute_buffer; // for compute + ggml_backend_buffer_t params_buffer = NULL; + ggml_backend_buffer_t compute_buffer = NULL; // for compute struct ggml_allocr* compute_alloc = NULL; int memory_buffer_size = 0; @@ -4184,8 +4184,8 @@ struct TinyAutoEncoder { ggml_context* ctx; bool decode_only = false; - ggml_backend_buffer_t params_buffer; - ggml_backend_buffer_t compute_buffer; // for compute + ggml_backend_buffer_t params_buffer = NULL; + ggml_backend_buffer_t compute_buffer = NULL; // for compute struct ggml_allocr* compute_alloc = NULL; int memory_buffer_size = 0; @@ -4623,8 +4623,8 @@ struct ESRGAN { ggml_context* ctx; bool decode_only = false; - ggml_backend_buffer_t params_buffer; - ggml_backend_buffer_t compute_buffer; // for compute + ggml_backend_buffer_t params_buffer = NULL; + ggml_backend_buffer_t compute_buffer = NULL; // for compute struct ggml_allocr* compute_alloc = NULL; int memory_buffer_size = 0; From 86dd8545d88cf9d23599b042c489ad5ed97a5554 Mon Sep 17 00:00:00 2001 From: "javaai.org" Date: Tue, 2 Apr 2024 12:28:42 +0800 Subject: [PATCH 3/3] Add custom log output support. --- stable-diffusion.cpp | 5 ++- util.cpp | 74 ++++++++++++++++++++++++++++---------------- util.h | 3 ++ 3 files changed, 55 insertions(+), 27 deletions(-) diff --git a/stable-diffusion.cpp b/stable-diffusion.cpp index 4a988ab28..650309d2d 100644 --- a/stable-diffusion.cpp +++ b/stable-diffusion.cpp @@ -108,7 +108,10 @@ void pretty_progress(int step, int steps, float time) { } } progress += "|"; - printf(time > 1.0f ? "\r%s %i/%i - %.2fs/it" : "\r%s %i/%i - %.2fit/s", + //printf(time > 1.0f ? "\r%s %i/%i - %.2fs/it" : "\r%s %i/%i - %.2fit/s", + // progress.c_str(), step, steps, + // time > 1.0f || time == 0 ? time : (1.0f / time)); + LOG_DEBUG(time > 1.0f ? "\r%s %i/%i - %.2fs/it" : "\r%s %i/%i - %.2fit/s", progress.c_str(), step, steps, time > 1.0f || time == 0 ? time : (1.0f / time)); fflush(stdout); // for linux diff --git a/util.cpp b/util.cpp index 084aca149..7cd5684f8 100644 --- a/util.cpp +++ b/util.cpp @@ -170,34 +170,56 @@ void set_sd_log_level(SDLogLevel level) { log_level = level; } + +void set_sd_log_callback(LOG_CALLBACK lcb) { + log_callback = lcb; +} + + void log_printf(SDLogLevel level, const char* file, int line, const char* format, ...) { - if (level < log_level) { - return; - } - va_list args; - va_start(args, format); - - if (level == SDLogLevel::DEBUG) { - printf("[DEBUG] %s:%-4d - ", basename(file).c_str(), line); - vprintf(format, args); - printf("\n"); - fflush(stdout); - } else if (level == SDLogLevel::INFO) { - printf("[INFO] %s:%-4d - ", basename(file).c_str(), line); - vprintf(format, args); - printf("\n"); - fflush(stdout); - } else if (level == SDLogLevel::WARN) { - fprintf(stdout, "[WARN] %s:%-4d - ", basename(file).c_str(), line); - vfprintf(stdout, format, args); - fprintf(stdout, "\n"); - fflush(stdout); + + + LOG_CALLBACK callback_temp = log_callback; + if (callback_temp != NULL) { + + va_list args_temp; + va_start(args_temp, format); + callback_temp(level, file, line, format, args_temp); + va_end(args_temp); + } else { - fprintf(stderr, "[ERROR] %s:%-4d - ", basename(file).c_str(), line); - vfprintf(stderr, format, args); - fprintf(stderr, "\n"); - fflush(stderr); + if (level < log_level) { + return; + } + va_list args; + va_start(args, format); + + + if (level == SDLogLevel::DEBUG) { + printf("[DEBUG] %s:%-4d - ", basename(file).c_str(), line); + vprintf(format, args); + printf("\n"); + fflush(stdout); + } else if (level == SDLogLevel::INFO) { + printf("[INFO] %s:%-4d - ", basename(file).c_str(), line); + vprintf(format, args); + printf("\n"); + fflush(stdout); + } else if (level == SDLogLevel::WARN) { + fprintf(stdout, "[WARN] %s:%-4d - ", basename(file).c_str(), line); + vfprintf(stdout, format, args); + fprintf(stdout, "\n"); + fflush(stdout); + } else { + fprintf(stderr, "[ERROR] %s:%-4d - ", basename(file).c_str(), line); + vfprintf(stderr, format, args); + fprintf(stderr, "\n"); + fflush(stderr); + } + + va_end(args); } - va_end(args); + + } diff --git a/util.h b/util.h index 10bdcd1b4..36083dfe8 100644 --- a/util.h +++ b/util.h @@ -32,6 +32,9 @@ enum SDLogLevel { }; void set_sd_log_level(SDLogLevel level); +typedef void (*LOG_CALLBACK)(SDLogLevel level, const char* file, int line, const char* format, va_list args); +static LOG_CALLBACK log_callback = NULL; +void set_sd_log_callback(LOG_CALLBACK); void log_printf(SDLogLevel level, const char* file, int line, const char* format, ...);