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 Callable ,Iterable ,TYPE_CHECKING 4 5import torch 6 7if TYPE_CHECKING : 8from torch import Tensor 9 10from .base import ModelBase ,gguf 11 12from .llama import LlamaModel 13 14 15@ ModelBase . register ( "AfmoeForCausalLM" ) 16@ ModelBase . example ( "arcee-ai/Trinity-Large-Thinking" ) 17class AfmoeModel (LlamaModel ): 18model_arch = gguf .MODEL_ARCH .AFMOE 19 20def set_gguf_parameters (self ): 21super ().set_gguf_parameters () 22 23# MoE parameters 24if (n_shared_experts := self .hparams .get ("num_shared_experts" ))is not None : 25self .gguf_writer .add_expert_shared_count (n_shared_experts ) 26if (moe_intermediate_size := self .hparams .get ("moe_intermediate_size" ))is not None : 27self .gguf_writer .add_expert_feed_forward_length (moe_intermediate_size ) 28if (n_dense_layers := self .hparams .get ("num_dense_layers" ))is not None : 29self .gguf_writer .add_leading_dense_block_count (n_dense_layers ) 30 31# Route normalization and scaling 32if (route_norm := self .hparams .get ("route_norm" ))is not None : 33self .gguf_writer .add_expert_weights_norm (route_norm ) 34if (route_scale := self .hparams .get ("route_scale" ))is not None : 35self .gguf_writer .add_expert_weights_scale (route_scale ) 36 37# Sliding window attention 38if (sliding_window := self .hparams .get ("sliding_window" ))is not None : 39self .gguf_writer .add_sliding_window (sliding_window ) 40 41@classmethod 42def filter_tensors (cls ,item :tuple [str ,Callable [[],Tensor ]])-> tuple [str ,Callable [[],Tensor ]]| None : 43name ,gen = item 44 45if name .endswith (".expert_bias" ): 46name = name .replace (".expert_bias" ,".expert_bias.bias" ) 47 48return super ().filter_tensors ((name ,gen )) 49 50def modify_tensors (self ,data_torch :Tensor ,name :str ,bid :int | None )-> Iterable [tuple [str ,Tensor ]]: 51# Handle expert weights - they're already merged in the HF format 52# process the experts separately 53if name .find ("mlp.experts" )!= - 1 : 54n_experts = self .find_hparam (["num_local_experts" ,"num_experts" ]) 55assert bid is not None 56 57if self ._experts is None : 58self ._experts = [{}for _ in range (self .block_count )] 59 60self ._experts [bid ][name ]= data_torch 61 62if len (self ._experts [bid ])>= n_experts * 3 : 63# merge the experts into a single 3d tensor 64for w_name in ["gate_proj" ,"up_proj" ,"down_proj" ]: 65datas :list [Tensor ]= [] 66 67for xid in range (n_experts ): 68ename_to_retrieve = f"model.layers. { bid } .mlp.experts. { xid } . { w_name } .weight" 69datas .append (self ._experts [bid ][ename_to_retrieve ]) 70del self ._experts [bid ][ename_to_retrieve ] 71 72data_torch = torch .stack (datas ,dim = 0 ) 73merged_name = f"model.layers. { bid } .mlp.experts. { w_name } .weight" 74yield from ModelBase .modify_tensors (self ,data_torch ,merged_name ,bid ) 75 76return 77else : 78return 79 80yield from ModelBase .modify_tensors (self ,data_torch ,name ,bid )