mirror of
				https://github.com/ggml-org/llama.cpp.git
				synced 2025-10-31 08:51:55 +00:00 
			
		
		
		
	llama : add StableLM2 12B (#6635)
* StableLM2 12B support for huggingface -> GGUF * StableLM12 tensormapping and constants * StableLM-2-12b model support * fix * Added 12B support * Removed autoformatting; resolved bug where model_arch was not selecting StableLM2 * Formatting * Do QK norm stacking in model conversion step * Converge StableLM and StableLM2 code to simplify graph construction * Fix accidental removal * Removed warnings * Revert formatter * Move QK norm stack to private function so it's easier to read * refactor stablelm graph builder to support 1.6, 3b and 12b more efficiently * Proper check for None type for new_name to avoid crash; formatting; revert change to base class `write_tensors()` * Format * Formatting * format Co-authored-by: compilade <git@compilade.net> * Fix incorrect check for K norm * space after commas; Keep indentation multiple of 4 spaces * Flake8 format * Removed unnecessary conditional branches * Removed unused comment * Fixed incorrect tensor passing * Format --------- Co-authored-by: compilade <git@compilade.net>
This commit is contained in:
		| @@ -1207,9 +1207,91 @@ class StableLMModel(Model): | ||||
|         rotary_factor = self.find_hparam(["partial_rotary_factor", "rope_pct"]) | ||||
|         self.gguf_writer.add_rope_dimension_count(int(rotary_factor * (hparams["hidden_size"] // hparams["num_attention_heads"]))) | ||||
|         self.gguf_writer.add_head_count(hparams["num_attention_heads"]) | ||||
|         self.gguf_writer.add_head_count_kv(hparams["num_key_value_heads"]) | ||||
|         self.gguf_writer.add_parallel_residual(hparams["use_parallel_residual"] if "use_parallel_residual" in hparams else True) | ||||
|         self.gguf_writer.add_layer_norm_eps(self.find_hparam(["layer_norm_eps", "norm_eps"])) | ||||
|  | ||||
|     def write_tensors(self): | ||||
|         block_count = self.hparams.get("n_layers", self.hparams.get("num_hidden_layers", self.hparams.get("n_layer"))) | ||||
|         tensor_map = gguf.get_tensor_name_map(self.model_arch, block_count) | ||||
|         n_head = self.hparams.get("num_attention_heads") | ||||
|         n_kv_head = self.hparams.get("num_key_value_heads") | ||||
|         q_norms = dict() | ||||
|         k_norms = dict() | ||||
|         for name, data_torch in self.get_tensors(): | ||||
|             # we don't need these | ||||
|             if name.endswith((".attention.masked_bias", ".attention.bias", ".attention.rotary_emb.inv_freq")): | ||||
|                 continue | ||||
|  | ||||
|             old_dtype = data_torch.dtype | ||||
|  | ||||
|             # convert any unsupported data types to float32 | ||||
|             if data_torch.dtype not in (torch.float16, torch.float32): | ||||
|                 data_torch = data_torch.to(torch.float32) | ||||
|  | ||||
|             data = data_torch.squeeze().numpy() | ||||
|             n_dims = len(data.shape) | ||||
|             if name.find("q_layernorm.norms") != -1: | ||||
|                 q_norms[name] = data | ||||
|                 if len(q_norms) >= (block_count * n_head): | ||||
|                     self._stack_qk_norm(block_count, name, tensor_map, n_head, q_norms, n_dims, layer_name="q_layernorm") | ||||
|                 continue | ||||
|             if name.find("k_layernorm.norms") != -1: | ||||
|                 k_norms[name] = data | ||||
|                 if len(k_norms) >= (block_count * n_kv_head): | ||||
|                     self._stack_qk_norm(block_count, name, tensor_map, n_kv_head, k_norms, n_dims, layer_name="k_layernorm") | ||||
|                 continue | ||||
|  | ||||
|             # map tensor names | ||||
|             new_name = tensor_map.get_name(name, try_suffixes=(".weight", ".bias")) | ||||
|             if new_name is None: | ||||
|                 print(f"Can not map tensor {name!r}") | ||||
|                 sys.exit() | ||||
|  | ||||
|             n_dims = len(data.shape) | ||||
|             data_dtype = data.dtype | ||||
|  | ||||
|             # if f32 desired, convert any float16 to float32 | ||||
|             if self.ftype == 0 and data_dtype == np.float16: | ||||
|                 data = data.astype(np.float32) | ||||
|  | ||||
|             # TODO: Why cant we use these float16 as-is? There should be not reason to store float16 as float32 | ||||
|             if self.ftype == 1 and data_dtype == np.float16 and (n_dims == 1 or new_name.endswith("_norm.weight")): | ||||
|                 data = data.astype(np.float32) | ||||
|  | ||||
|             # if f16 desired, convert any float32 2-dim weight tensors to float16 | ||||
|             if self.ftype == 1 and data_dtype == np.float32 and name.endswith(".weight") and not new_name.endswith("_norm.weight") and n_dims == 2: | ||||
|                 data = data.astype(np.float16) | ||||
|  | ||||
|             print(f"{new_name}, n_dims = {n_dims}, {old_dtype} --> {data.dtype}") | ||||
|  | ||||
|             self.gguf_writer.add_tensor(new_name, data) | ||||
|  | ||||
|     def _stack_qk_norm(self, block_count, name, tensor_map, n_head, norms, n_dims, layer_name="q_layernorm"): | ||||
|         for bid in range(block_count): | ||||
|             datas = [] | ||||
|             for xid in range(n_head): | ||||
|                 ename = f"model.layers.{bid}.self_attn.{layer_name}.norms.{xid}.weight" | ||||
|                 datas.append(norms[ename]) | ||||
|                 del norms[ename] | ||||
|             data = np.stack(datas, axis=0) | ||||
|             data_dtype = data.dtype | ||||
|             merged_name = f"model.layers.{bid}.self_attn.{layer_name}.weight" | ||||
|             new_name = tensor_map.get_name(merged_name, try_suffixes=(".weight", ".bias")) | ||||
|             if new_name is None: | ||||
|                 print(f"Can not map tensor {name!r}") | ||||
|                 sys.exit() | ||||
|             if self.ftype == 1 and data_dtype == np.float16 and (n_dims == 1 or new_name.endswith("_norm.weight")): | ||||
|                 data = data.astype(np.float32) | ||||
|  | ||||
|             # if f16 desired, convert any float32 2-dim weight tensors to float16 | ||||
|             if self.ftype == 1 and data_dtype == np.float32 and name.endswith(".weight") and not new_name.endswith("_norm.weight") and n_dims == 2: | ||||
|                 data = data.astype(np.float16) | ||||
|  | ||||
|             print(f"{new_name}, n_dims = {len(data.shape)}, shape = {data.shape} --> {data.dtype}") | ||||
|  | ||||
|             self.gguf_writer.add_tensor(new_name, data) | ||||
|  | ||||
|  | ||||
| @Model.register("LlamaForCausalLM", "MistralForCausalLM", "MixtralForCausalLM") | ||||
| class LlamaModel(Model): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Ashish
					Ashish