mirror of
				https://github.com/ggml-org/llama.cpp.git
				synced 2025-10-31 08:51:55 +00:00 
			
		
		
		
	llama : fix segfault from unknown model arch name (#5820)
* llama : fix segfault from unknown model arch name * llama : make all LLM maps const This also requires using `std::map::at` instead of its `operator[]` which does not exist for const maps. * llama : name LLM_ARCH_UNKNOWN to "(unknown)" This avoids errors from `std::map::at` when getting the general name of the model architecture. Using "(unknown)" instead of an empty string as per suggestion https://github.com/ggerganov/llama.cpp/pull/5820#issuecomment-1973735284 * llama : remove redundant inner const for LLM_TENSOR_NAMES The extra const won't do anything here as const maps return const references to values. Co-authored-by: Jared Van Bortel <cebtenzzre@gmail.com> * llama : remove redundant nullptr check in llm_arch_from_string Since LLM_ARCH_NAMES is a const map, no spurious elements with a NULL name are inserted anymore, so this check is dead code. --------- Co-authored-by: Jared Van Bortel <cebtenzzre@gmail.com>
This commit is contained in:
		
							
								
								
									
										31
									
								
								llama.cpp
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								llama.cpp
									
									
									
									
									
								
							| @@ -216,7 +216,7 @@ enum llm_arch { | |||||||
|     LLM_ARCH_UNKNOWN, |     LLM_ARCH_UNKNOWN, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static std::map<llm_arch, const char *> LLM_ARCH_NAMES = { | static const std::map<llm_arch, const char *> LLM_ARCH_NAMES = { | ||||||
|     { LLM_ARCH_LLAMA,           "llama"      }, |     { LLM_ARCH_LLAMA,           "llama"      }, | ||||||
|     { LLM_ARCH_FALCON,          "falcon"     }, |     { LLM_ARCH_FALCON,          "falcon"     }, | ||||||
|     { LLM_ARCH_GPT2,            "gpt2"       }, |     { LLM_ARCH_GPT2,            "gpt2"       }, | ||||||
| @@ -241,6 +241,7 @@ static std::map<llm_arch, const char *> LLM_ARCH_NAMES = { | |||||||
|     { LLM_ARCH_MINICPM,         "minicpm"    }, |     { LLM_ARCH_MINICPM,         "minicpm"    }, | ||||||
|     { LLM_ARCH_GEMMA,           "gemma"      }, |     { LLM_ARCH_GEMMA,           "gemma"      }, | ||||||
|     { LLM_ARCH_STARCODER2,      "starcoder2" }, |     { LLM_ARCH_STARCODER2,      "starcoder2" }, | ||||||
|  |     { LLM_ARCH_UNKNOWN,         "(unknown)"  }, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| enum llm_kv { | enum llm_kv { | ||||||
| @@ -301,7 +302,7 @@ enum llm_kv { | |||||||
|     LLM_KV_TOKENIZER_RWKV, |     LLM_KV_TOKENIZER_RWKV, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static std::map<llm_kv, const char *> LLM_KV_NAMES = { | static const std::map<llm_kv, const char *> LLM_KV_NAMES = { | ||||||
|     { LLM_KV_GENERAL_ARCHITECTURE,          "general.architecture"                  }, |     { LLM_KV_GENERAL_ARCHITECTURE,          "general.architecture"                  }, | ||||||
|     { LLM_KV_GENERAL_QUANTIZATION_VERSION,  "general.quantization_version"          }, |     { LLM_KV_GENERAL_QUANTIZATION_VERSION,  "general.quantization_version"          }, | ||||||
|     { LLM_KV_GENERAL_ALIGNMENT,             "general.alignment"                     }, |     { LLM_KV_GENERAL_ALIGNMENT,             "general.alignment"                     }, | ||||||
| @@ -365,7 +366,7 @@ struct LLM_KV { | |||||||
|     llm_arch arch; |     llm_arch arch; | ||||||
|  |  | ||||||
|     std::string operator()(llm_kv kv) const { |     std::string operator()(llm_kv kv) const { | ||||||
|         return ::format(LLM_KV_NAMES[kv], LLM_ARCH_NAMES[arch]); |         return ::format(LLM_KV_NAMES.at(kv), LLM_ARCH_NAMES.at(arch)); | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -400,7 +401,7 @@ enum llm_tensor { | |||||||
|     LLM_TENSOR_LAYER_OUT_NORM, |     LLM_TENSOR_LAYER_OUT_NORM, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static std::map<llm_arch, std::map<llm_tensor, std::string>> LLM_TENSOR_NAMES = { | static const std::map<llm_arch, std::map<llm_tensor, std::string>> LLM_TENSOR_NAMES = { | ||||||
|     { |     { | ||||||
|         LLM_ARCH_LLAMA, |         LLM_ARCH_LLAMA, | ||||||
|         { |         { | ||||||
| @@ -833,38 +834,38 @@ struct LLM_TN { | |||||||
|     llm_arch arch; |     llm_arch arch; | ||||||
|  |  | ||||||
|     std::string operator()(llm_tensor tensor) const { |     std::string operator()(llm_tensor tensor) const { | ||||||
|         if (LLM_TENSOR_NAMES[arch].find(tensor) == LLM_TENSOR_NAMES[arch].end()) { |         if (LLM_TENSOR_NAMES.at(arch).find(tensor) == LLM_TENSOR_NAMES.at(arch).end()) { | ||||||
|             return "__missing__"; |             return "__missing__"; | ||||||
|         } |         } | ||||||
|         return LLM_TENSOR_NAMES[arch].at(tensor); |         return LLM_TENSOR_NAMES.at(arch).at(tensor); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     std::string operator()(llm_tensor tensor, const std::string & suffix) const { |     std::string operator()(llm_tensor tensor, const std::string & suffix) const { | ||||||
|         if (LLM_TENSOR_NAMES[arch].find(tensor) == LLM_TENSOR_NAMES[arch].end()) { |         if (LLM_TENSOR_NAMES.at(arch).find(tensor) == LLM_TENSOR_NAMES.at(arch).end()) { | ||||||
|             return "__missing__"; |             return "__missing__"; | ||||||
|         } |         } | ||||||
|         return LLM_TENSOR_NAMES[arch].at(tensor) + "." + suffix; |         return LLM_TENSOR_NAMES.at(arch).at(tensor) + "." + suffix; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     std::string operator()(llm_tensor tensor, int bid) const { |     std::string operator()(llm_tensor tensor, int bid) const { | ||||||
|         if (LLM_TENSOR_NAMES[arch].find(tensor) == LLM_TENSOR_NAMES[arch].end()) { |         if (LLM_TENSOR_NAMES.at(arch).find(tensor) == LLM_TENSOR_NAMES.at(arch).end()) { | ||||||
|             return "__missing__"; |             return "__missing__"; | ||||||
|         } |         } | ||||||
|         return ::format(LLM_TENSOR_NAMES[arch].at(tensor).c_str(), bid); |         return ::format(LLM_TENSOR_NAMES.at(arch).at(tensor).c_str(), bid); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     std::string operator()(llm_tensor tensor, const std::string & suffix, int bid) const { |     std::string operator()(llm_tensor tensor, const std::string & suffix, int bid) const { | ||||||
|         if (LLM_TENSOR_NAMES[arch].find(tensor) == LLM_TENSOR_NAMES[arch].end()) { |         if (LLM_TENSOR_NAMES.at(arch).find(tensor) == LLM_TENSOR_NAMES.at(arch).end()) { | ||||||
|             return "__missing__"; |             return "__missing__"; | ||||||
|         } |         } | ||||||
|         return ::format(LLM_TENSOR_NAMES[arch].at(tensor).c_str(), bid) + "." + suffix; |         return ::format(LLM_TENSOR_NAMES.at(arch).at(tensor).c_str(), bid) + "." + suffix; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     std::string operator()(llm_tensor tensor, const std::string & suffix, int bid, int xid) const { |     std::string operator()(llm_tensor tensor, const std::string & suffix, int bid, int xid) const { | ||||||
|         if (LLM_TENSOR_NAMES[arch].find(tensor) == LLM_TENSOR_NAMES[arch].end()) { |         if (LLM_TENSOR_NAMES.at(arch).find(tensor) == LLM_TENSOR_NAMES.at(arch).end()) { | ||||||
|             return "__missing__"; |             return "__missing__"; | ||||||
|         } |         } | ||||||
|         return ::format(LLM_TENSOR_NAMES[arch].at(tensor).c_str(), bid, xid) + "." + suffix; |         return ::format(LLM_TENSOR_NAMES.at(arch).at(tensor).c_str(), bid, xid) + "." + suffix; | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -872,7 +873,7 @@ struct LLM_TN { | |||||||
| // gguf helpers | // gguf helpers | ||||||
| // | // | ||||||
|  |  | ||||||
| static std::map<int32_t, const char *> LLAMA_ROPE_SCALING_TYPES = { | static const std::map<int32_t, const char *> LLAMA_ROPE_SCALING_TYPES = { | ||||||
|     { LLAMA_ROPE_SCALING_TYPE_NONE,   "none"   }, |     { LLAMA_ROPE_SCALING_TYPE_NONE,   "none"   }, | ||||||
|     { LLAMA_ROPE_SCALING_TYPE_LINEAR, "linear" }, |     { LLAMA_ROPE_SCALING_TYPE_LINEAR, "linear" }, | ||||||
|     { LLAMA_ROPE_SCALING_TYPE_YARN,   "yarn"   }, |     { LLAMA_ROPE_SCALING_TYPE_YARN,   "yarn"   }, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 compilade
					compilade