char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
fa88ae936
char/aliceai-t5-moe
1from __future__import annotations 2 3from typing import Iterable ,TYPE_CHECKING 4 5import torch 6 7if TYPE_CHECKING : 8from torch import Tensor 9 10from .base import ModelBase ,TextModel ,gguf ,logger 11 12 13@ ModelBase . register ( "MellumForCausalLM" ) 14@ ModelBase . example ( "JetBrains/Mellum2-12B-A2.5B-Base" ) 15class MellumModel (TextModel ): 16model_arch = gguf .MODEL_ARCH .MELLUM 17 18def set_gguf_parameters (self ): 19super ().set_gguf_parameters () 20if (moe_intermediate_size := self .hparams .get ("moe_intermediate_size" ))is not None : 21self .gguf_writer .add_expert_feed_forward_length (moe_intermediate_size ) 22logger .info (f"gguf: expert feed forward length = { moe_intermediate_size } " ) 23 24use_sliding_window = self .hparams .get ("use_sliding_window" ) 25sliding_window = self .hparams .get ("sliding_window" ) 26if (use_sliding_window is True or use_sliding_window is None )and sliding_window is not None : 27self .gguf_writer .add_sliding_window (sliding_window ) 28logger .info (f"gguf: sliding window = { sliding_window } " ) 29self .gguf_writer .add_sliding_window_pattern ([t == "sliding_attention" for t in self .hparams ["layer_types" ]]) 30logger .info (f"gguf: sliding window pattern length = { len ( self . hparams [ 'layer_types' ]) } " ) 31 32_experts :list [dict [str ,Tensor ]]| None = None 33 34def modify_tensors (self ,data_torch :Tensor ,name :str ,bid :int | None )-> Iterable [tuple [str ,Tensor ]]: 35if name .find ("experts" )!= - 1 : 36n_experts = self .find_hparam (["num_local_experts" ,"num_experts" ]) 37assert bid is not None 38 39if self ._experts is None : 40self ._experts = [{}for _ in range (self .block_count )] 41 42self ._experts [bid ][name ]= data_torch 43 44if len (self ._experts [bid ])>= n_experts * 3 : 45for w_name in ["down_proj" ,"gate_proj" ,"up_proj" ]: 46datas :list [Tensor ]= [] 47 48for xid in range (n_experts ): 49ename = f"model.layers. { bid } .mlp.experts. { xid } . { w_name } .weight" 50datas .append (self ._experts [bid ][ename ]) 51del self ._experts [bid ][ename ] 52 53data_torch = torch .stack (datas ,dim = 0 ) 54 55merged_name = f"model.layers. { bid } .mlp.experts. { w_name } .weight" 56 57yield from super ().modify_tensors (data_torch ,merged_name ,bid ) 58return 59else : 60return 61 62yield from super ().modify_tensors (data_torch ,name ,bid )