From 4c811701f189881f836a56d7fa4df418eb418029 Mon Sep 17 00:00:00 2001 From: leejet Date: Thu, 17 Sep 2026 02:13:07 +0800 Subject: [PATCH] refactor: remove obsolete unused tensor filtering --- src/core/backend_fit.cpp | 2 +- src/model/adapter/lora.hpp | 2 +- src/model_loader.cpp | 76 -------------------------------------- src/model_loader.h | 2 - 4 files changed, 2 insertions(+), 80 deletions(-) diff --git a/src/core/backend_fit.cpp b/src/core/backend_fit.cpp index 4eb61704e..85cfc727c 100644 --- a/src/core/backend_fit.cpp +++ b/src/core/backend_fit.cpp @@ -102,7 +102,7 @@ namespace sd::backend_fit { for (const auto& [name, stored_tensor] : loader.get_tensor_storage_map()) { TensorStorage ts = stored_tensor; ComponentKind kind; - if (is_unused_tensor(ts.name) || !classify_tensor(ts.name, kind)) { + if (!classify_tensor(ts.name, kind)) { continue; } if (ts.expected_type != GGML_TYPE_COUNT) { diff --git a/src/model/adapter/lora.hpp b/src/model/adapter/lora.hpp index 738414314..cb368fead 100644 --- a/src/model/adapter/lora.hpp +++ b/src/model/adapter/lora.hpp @@ -67,7 +67,7 @@ struct LoraModel : public GGMLRunner { std::map scalars; std::set scalar_names; for (const auto& [name, source] : sources) { - if (is_unused_tensor(name) || (filter && !filter(name))) + if (filter && !filter(name)) continue; const bool scalar = source.nelements() == 1 && (ends_with(name, ".alpha") || ends_with(name, ".scale")); auto* tensor = ggml_new_tensor(params_ctx, scalar ? GGML_TYPE_F32 : source.type, source.n_dims, source.ne); diff --git a/src/model_loader.cpp b/src/model_loader.cpp index 9a38ceb19..a2afd835c 100644 --- a/src/model_loader.cpp +++ b/src/model_loader.cpp @@ -35,52 +35,6 @@ /*================================================= Preprocess ==================================================*/ -const char* unused_tensors[] = { - "betas", - "alphas_cumprod_prev", - "sqrt_alphas_cumprod", - "sqrt_one_minus_alphas_cumprod", - "log_one_minus_alphas_cumprod", - "sqrt_recip_alphas_cumprod", - "sqrt_recipm1_alphas_cumprod", - "posterior_variance", - "posterior_log_variance_clipped", - "posterior_mean_coef1", - "posterior_mean_coef2", - "cond_stage_model.transformer.text_model.embeddings.position_ids", - "cond_stage_model.1.model.text_model.embeddings.position_ids", - "cond_stage_model.transformer.vision_model.embeddings.position_ids", - "cond_stage_model.model.logit_scale", - "conditioner.embedders.0.transformer.text_model.embeddings.position_ids", - "conditioner.embedders.0.model.logit_scale", - "conditioner.embedders.1.model.logit_scale", - "model.diffusion_model.time_embedding.cond_proj.weight", - "unet.time_embedding.cond_proj.weight", - "model_ema.decay", - "model_ema.num_updates", - "model_ema.diffusion_model", - "embedding_manager", - "denoiser.sigmas", - "text_encoders.t5xxl.transformer.encoder.embed_tokens.weight", // only used during training - "ztsnr", // Found in some SDXL vpred models - "edm_vpred.sigma_min", // Found in CosXL - // TODO: find another way to avoid the "unknown tensor" for these two - // "edm_vpred.sigma_max", // Used to detect CosXL - // "v_pred", // Used to detect SDXL vpred models - "text_encoders.llm.output.weight", - "text_encoders.llm.lm_head.", - "language_model.lm_head.", -}; - -bool is_unused_tensor(const std::string& name) { - for (size_t i = 0; i < sizeof(unused_tensors) / sizeof(const char*); i++) { - if (starts_with(name, unused_tensors[i])) { - return true; - } - } - return false; -} - void f64_to_f32_vec(double* src, float* dst, int64_t n) { // support inplace op for (int64_t i = 0; i < n; i++) { @@ -284,10 +238,6 @@ bool ModelLoader::init_from_safetensors_file(const std::string& file_path, const size_t file_index = add_file_path(file_path); for (auto& tensor_storage : tensor_storages) { - if (is_unused_tensor(tensor_storage.name)) { - continue; - } - if (!starts_with(tensor_storage.name, prefix)) { tensor_storage.name = prefix + tensor_storage.name; } @@ -356,10 +306,6 @@ bool ModelLoader::init_from_torch_legacy_file(const std::string& file_path, cons size_t file_index = add_file_path(file_path); for (auto& tensor_storage : tensor_storages) { - if (is_unused_tensor(tensor_storage.name)) { - continue; - } - if (!starts_with(tensor_storage.name, prefix)) { tensor_storage.name = prefix + tensor_storage.name; } @@ -674,10 +620,6 @@ SDVersion ModelLoader::get_sd_version() const { std::map ModelLoader::get_wtype_stat() const { std::map wtype_stat; for (auto& [name, tensor_storage] : tensor_storage_map) { - if (is_unused_tensor(tensor_storage.name)) { - continue; - } - auto iter = wtype_stat.find(tensor_storage.type); if (iter != wtype_stat.end()) { iter->second++; @@ -691,10 +633,6 @@ std::map ModelLoader::get_wtype_stat() const { std::map ModelLoader::get_conditioner_wtype_stat() const { std::map wtype_stat; for (auto& [name, tensor_storage] : tensor_storage_map) { - if (is_unused_tensor(tensor_storage.name)) { - continue; - } - if ((tensor_storage.name.find("text_encoders") == std::string::npos && tensor_storage.name.find("cond_stage_model") == std::string::npos && tensor_storage.name.find("te.text_model.") == std::string::npos && @@ -715,10 +653,6 @@ std::map ModelLoader::get_conditioner_wtype_stat() const { std::map ModelLoader::get_diffusion_model_wtype_stat() const { std::map wtype_stat; for (auto& [name, tensor_storage] : tensor_storage_map) { - if (is_unused_tensor(tensor_storage.name)) { - continue; - } - if (tensor_storage.name.find("model.diffusion_model.") == std::string::npos && tensor_storage.name.find("unet.") == std::string::npos) { continue; } @@ -736,10 +670,6 @@ std::map ModelLoader::get_diffusion_model_wtype_stat() cons std::map ModelLoader::get_vae_wtype_stat() const { std::map wtype_stat; for (auto& [name, tensor_storage] : tensor_storage_map) { - if (is_unused_tensor(tensor_storage.name)) { - continue; - } - if (tensor_storage.name.find("vae.") == std::string::npos && tensor_storage.name.find("first_stage_model") == std::string::npos) { continue; @@ -823,9 +753,6 @@ void ModelLoader::process_model_files(bool enable_mmap, bool writable_mmap) { std::vector processed_tensor_storages; for (const auto& [name, tensor_storage] : tensor_storage_map) { - if (is_unused_tensor(tensor_storage.name)) { - continue; - } processed_tensor_storages.push_back(tensor_storage); } @@ -1551,9 +1478,6 @@ int64_t ModelLoader::get_params_mem_size(ggml_backend_t backend, ggml_type type) int64_t mem_size = 0; std::vector processed_tensor_storages; for (auto [name, tensor_storage] : tensor_storage_map) { - if (is_unused_tensor(tensor_storage.name)) { - continue; - } if (tensor_should_be_converted(tensor_storage, type)) { tensor_storage.type = type; } diff --git a/src/model_loader.h b/src/model_loader.h index c5866b263..c5335b53a 100644 --- a/src/model_loader.h +++ b/src/model_loader.h @@ -28,8 +28,6 @@ struct MmapTensorStore { std::shared_ptr mmbuffer; }; -bool is_unused_tensor(const std::string& name); - class ModelLoader { public: using FileId = uint64_t;