@@ -81,7 +81,7 @@ const char* unused_tensors[] = {
8181 " first_stage_model.bn." ,
8282};
8383
84- bool is_unused_tensor (std::string name) {
84+ bool is_unused_tensor (const std::string& name) {
8585 for (size_t i = 0 ; i < sizeof (unused_tensors) / sizeof (const char *); i++) {
8686 if (starts_with (name, unused_tensors[i])) {
8787 return true ;
@@ -687,8 +687,8 @@ std::map<ggml_type, uint32_t> ModelLoader::get_vae_wtype_stat() {
687687 return wtype_stat;
688688}
689689
690- static std::vector<std::pair<std::string, ggml_type>> parse_tensor_type_rules (const std::string& tensor_type_rules) {
691- std::vector<std::pair<std::string, ggml_type>> result;
690+ TensorTypeRules parse_tensor_type_rules (const std::string& tensor_type_rules) {
691+ TensorTypeRules result;
692692 for (const auto & item : split_string (tensor_type_rules, ' ,' )) {
693693 if (item.size () == 0 )
694694 continue ;
@@ -1121,91 +1121,6 @@ bool ModelLoader::tensor_should_be_converted(const TensorStorage& tensor_storage
11211121 return false ;
11221122}
11231123
1124- bool ModelLoader::save_to_gguf_file (const std::string& file_path, ggml_type type, const std::string& tensor_type_rules_str) {
1125- auto tensor_type_rules = parse_tensor_type_rules (tensor_type_rules_str);
1126- auto get_tensor_type = [&](const TensorStorage& tensor_storage) -> ggml_type {
1127- const std::string& name = tensor_storage.name ;
1128- ggml_type tensor_type = tensor_storage.type ;
1129- ggml_type dst_type = type;
1130-
1131- for (const auto & tensor_type_rule : tensor_type_rules) {
1132- std::regex pattern (tensor_type_rule.first );
1133- if (std::regex_search (name, pattern)) {
1134- dst_type = tensor_type_rule.second ;
1135- break ;
1136- }
1137- }
1138-
1139- if (tensor_should_be_converted (tensor_storage, dst_type)) {
1140- tensor_type = dst_type;
1141- }
1142-
1143- return tensor_type;
1144- };
1145-
1146- auto backend = ggml_backend_cpu_init ();
1147- size_t mem_size = 1 * 1024 * 1024 ; // for padding
1148- mem_size += tensor_storage_map.size () * ggml_tensor_overhead ();
1149- mem_size += get_params_mem_size (backend, type);
1150- LOG_INFO (" model tensors mem size: %.2fMB" , mem_size / 1024 .f / 1024 .f );
1151- ggml_context* ggml_ctx = ggml_init ({mem_size, nullptr , false });
1152-
1153- if (ggml_ctx == nullptr ) {
1154- LOG_ERROR (" ggml_init failed for GGUF writer" );
1155- ggml_backend_free (backend);
1156- return false ;
1157- }
1158-
1159- std::vector<ggml_tensor*> tensors;
1160- std::mutex tensor_mutex;
1161- auto on_new_tensor_cb = [&](const TensorStorage& tensor_storage, ggml_tensor** dst_tensor) -> bool {
1162- const std::string& name = tensor_storage.name ;
1163- ggml_type tensor_type = get_tensor_type (tensor_storage);
1164-
1165- std::lock_guard<std::mutex> lock (tensor_mutex);
1166- ggml_tensor* tensor = ggml_new_tensor (ggml_ctx, tensor_type, tensor_storage.n_dims , tensor_storage.ne );
1167- if (tensor == nullptr ) {
1168- LOG_ERROR (" ggml_new_tensor failed" );
1169- return false ;
1170- }
1171- ggml_set_name (tensor, name.c_str ());
1172-
1173- // LOG_DEBUG("%s %d %s %d[%d %d %d %d] %d[%d %d %d %d]", name.c_str(),
1174- // ggml_nbytes(tensor), ggml_type_name(tensor_type),
1175- // tensor_storage.n_dims,
1176- // tensor_storage.ne[0], tensor_storage.ne[1], tensor_storage.ne[2], tensor_storage.ne[3],
1177- // tensor->n_dims, tensor->ne[0], tensor->ne[1], tensor->ne[2], tensor->ne[3]);
1178-
1179- if (!tensor->data ) {
1180- GGML_ASSERT (ggml_nelements (tensor) == 0 );
1181- // avoid crashing the gguf writer by setting a dummy pointer for zero-sized tensors
1182- LOG_DEBUG (" setting dummy pointer for zero-sized tensor %s" , name.c_str ());
1183- tensor->data = ggml_get_mem_buffer (ggml_ctx);
1184- }
1185-
1186- *dst_tensor = tensor;
1187- tensors.push_back (tensor);
1188-
1189- return true ;
1190- };
1191-
1192- bool success = load_tensors (on_new_tensor_cb);
1193- ggml_backend_free (backend);
1194- LOG_INFO (" load tensors done" );
1195-
1196- std::string error;
1197- if (success) {
1198- success = write_gguf_file (file_path, tensors, &error);
1199- }
1200-
1201- if (!success && !error.empty ()) {
1202- LOG_ERROR (" %s" , error.c_str ());
1203- }
1204-
1205- ggml_free (ggml_ctx);
1206- return success;
1207- }
1208-
12091124int64_t ModelLoader::get_params_mem_size (ggml_backend_t backend, ggml_type type) {
12101125 size_t alignment = 128 ;
12111126 if (backend != nullptr ) {
@@ -1225,28 +1140,3 @@ int64_t ModelLoader::get_params_mem_size(ggml_backend_t backend, ggml_type type)
12251140
12261141 return mem_size;
12271142}
1228-
1229- bool convert (const char * input_path,
1230- const char * vae_path,
1231- const char * output_path,
1232- sd_type_t output_type,
1233- const char * tensor_type_rules,
1234- bool convert_name) {
1235- ModelLoader model_loader;
1236-
1237- if (!model_loader.init_from_file (input_path)) {
1238- LOG_ERROR (" init model loader from file failed: '%s'" , input_path);
1239- return false ;
1240- }
1241-
1242- if (vae_path != nullptr && strlen (vae_path) > 0 ) {
1243- if (!model_loader.init_from_file (vae_path, " vae." )) {
1244- LOG_ERROR (" init model loader from file failed: '%s'" , vae_path);
1245- return false ;
1246- }
1247- }
1248- if (convert_name) {
1249- model_loader.convert_tensors_name ();
1250- }
1251- return model_loader.save_to_gguf_file (output_path, (ggml_type)output_type, tensor_type_rules);
1252- }
0 commit comments