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 ( "GPT2LMHeadModel" ) 14@ ModelBase . example ( "openai-community/gpt2" ) 15class GPT2Model (TextModel ): 16model_arch = gguf .MODEL_ARCH .GPT2 17 18def set_gguf_parameters (self ): 19self .gguf_writer .add_block_count (self .block_count ) 20self .gguf_writer .add_context_length (self .hparams ["n_ctx" ]) 21self .gguf_writer .add_embedding_length (self .hparams ["n_embd" ]) 22self .gguf_writer .add_feed_forward_length (4 * self .hparams ["n_embd" ]) 23self .gguf_writer .add_head_count (self .hparams ["n_head" ]) 24self .gguf_writer .add_layer_norm_eps (self .hparams ["layer_norm_epsilon" ]) 25self .gguf_writer .add_file_type (self .ftype ) 26 27def modify_tensors (self ,data_torch :Tensor ,name :str ,bid :int | None )-> Iterable [tuple [str ,Tensor ]]: 28# we don't need these 29if name .endswith ((".attn.bias" ,".attn.masked_bias" )): 30yield from super ().modify_tensors (data_torch ,name ,bid ) 31return 32 33if name .endswith ((".c_attn.weight" ,".c_proj.weight" ,".c_fc.weight" ,".c_proj.weight" )): 34data_torch = data_torch .transpose (1 ,0 ) 35 36new_name = self .map_tensor_name (name ) 37 38yield from super ().modify_tensors (data_torch ,new_name ,bid ) 39 40 41@ ModelBase . register ( "RuGPT3XLForCausalLM" ) 42@ ModelBase . example ( "evilfreelancer/ruGPT3XL" ) 43class RuGPT3XLModel (TextModel ): 44model_arch = gguf .MODEL_ARCH .GPT2 45 46_qkv_parts :list [dict [str ,Tensor ]]| None = None 47 48def modify_tensors (self ,data_torch :Tensor ,name :str ,bid :int | None )-> Iterable [tuple [str ,Tensor ]]: 49# Fuse separate Q, K, V projections into a single QKV tensor 50if ".self_attn.q_proj." in name or ".self_attn.k_proj." in name or ".self_attn.v_proj." in name : 51suffix = "weight" if name .endswith (".weight" )else "bias" 52part = "q" if ".q_proj." in name else ("k" if ".k_proj." in name else "v" ) 53key = f" { part } . { suffix } " 54 55assert bid is not None 56if self ._qkv_parts is None : 57self ._qkv_parts = [{}for _ in range (self .block_count )] 58self ._qkv_parts [bid ][key ]= data_torch 59 60q_key ,k_key ,v_key = f"q. { suffix } " ,f"k. { suffix } " ,f"v. { suffix } " 61if all (k in self ._qkv_parts [bid ]for k in [q_key ,k_key ,v_key ]): 62q = self ._qkv_parts [bid ].pop (q_key ) 63k = self ._qkv_parts [bid ].pop (k_key ) 64v = self ._qkv_parts [bid ].pop (v_key ) 65data_torch = torch .cat ([q ,k ,v ],dim = 0 ) 66name = self .format_tensor_name (gguf .MODEL_TENSOR .ATTN_QKV ,bid ,f". { suffix } " ) 67logger .debug (f"Fused Q/K/V { suffix } for layer { bid } -> { name } " ) 68else : 69return 70 71yield from super ().modify_tensors (data_torch ,name ,bid ) 72 73def prepare_tensors (self ): 74super ().prepare_tensors () 75 76if self ._qkv_parts is not None : 77# flatten `list[dict[str, Tensor]]` into `list[str]` 78parts = [f"( { i } ) { k } " for i ,d in enumerate (self ._qkv_parts )for k in d .keys ()] 79if len (parts )> 0 : 80raise ValueError (f"Unprocessed Q/K/V parts: { parts } " )