Team Ai
Datasetpublic

Brunobkr/llama.cpp_AlgMor24_github

ΩFFFΣLLIa • llama.cpp • AlgMor24 ██████╗ ███████╗███████╗███████╗██╗ ██╗ ██╗ █████╗ ██╔═══██╗██╔════╝██╔════╝██╔════╝██║ ██║ ██║██╔══██╗ ██║ ██║█████╗ █████╗ █████╗ ██║ ██║ ██║███████║ ██║ ██║██╔══╝ ██╔══╝ ██╔══╝ ██║ ██║ ██║██╔══██║ ╚██████╔╝██║ ██║ ███████╗███████╗███████╗██║██║ ██║ ╚═════╝ ╚═╝ ╚═╝ ╚══════╝╚══════╝╚══════╝╚═╝╚═╝ ╚═╝ High-Performance LLM / VLM Inference & Autonomous Agentic Ecosystem… See the full description on the dataset page: https://huggingface.co/datasets/Brunobkr/llama.cpp_AlgMor24_github.

sourceHugging Faceupdated 2mo agoView on Hugging Face
0likes3.1kdownloads
minicpm.py190 linesDownload Raw Back to conversion
1from __future__ import annotations2 3from typing import Callable, Iterable, TYPE_CHECKING4 5import torch6 7if TYPE_CHECKING:8    from torch import Tensor9 10from .base import MmprojModel, ModelBase, TextModel, gguf, logger11 12from .llama import LlamaModel13from .qwen import Qwen3_5TextModel14 15 16@ModelBase.register("MiniCPMForCausalLM")17class MiniCPMModel(TextModel):18    model_arch = gguf.MODEL_ARCH.MINICPM19 20    def set_gguf_parameters(self):21        super().set_gguf_parameters()22        embedding_scale = float(self.hparams["scale_emb"])23        self.gguf_writer.add_embedding_scale(embedding_scale)24        logger.info(f"gguf: (minicpm) embedding_scale = {embedding_scale}")25        residual_scale = self.hparams["scale_depth"] / self.hparams["num_hidden_layers"] ** 0.526        self.gguf_writer.add_residual_scale(residual_scale)27        logger.info(f"gguf: (minicpm) residual_scale = {residual_scale}")28        logit_scale = self.hparams["hidden_size"] / self.hparams["dim_model_base"]29        self.gguf_writer.add_logit_scale(logit_scale)30        logger.info(f"gguf: (minicpm) logit_scale = {logit_scale}")31 32    def generate_extra_tensors(self) -> Iterable[tuple[str, Tensor]]:33        rope_dims = self.hparams["hidden_size"] // self.hparams["num_attention_heads"]34 35        long_factors = self.rope_parameters.get('long_factor')36        short_factors = self.rope_parameters.get('short_factor')37        if long_factors or short_factors:38            if long_factors is None or short_factors is None:39                raise KeyError('Missing the required key rope_scaling.long_factor or rope_scaling_short_factor')40 41            if len(long_factors) != len(short_factors) or len(long_factors) != rope_dims / 2:42                raise ValueError(f'The length of rope long and short factors must be {rope_dims / 2}')43 44            yield (self.format_tensor_name(gguf.MODEL_TENSOR.ROPE_FACTORS_LONG), torch.tensor(long_factors, dtype=torch.float32))45            yield (self.format_tensor_name(gguf.MODEL_TENSOR.ROPE_FACTORS_SHORT), torch.tensor(short_factors, dtype=torch.float32))46 47    def set_vocab(self):48        self._set_vocab_sentencepiece()49 50    def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]:51        n_head = self.hparams["num_attention_heads"]52        n_kv_head = self.hparams.get("num_key_value_heads")53 54        # HF models permute some of the tensors, so we need to undo that55        if name.endswith(("q_proj.weight")):56            data_torch = LlamaModel.permute(data_torch, n_head, n_head)57        if name.endswith(("k_proj.weight")):58            data_torch = LlamaModel.permute(data_torch, n_head, n_kv_head)59 60        yield from super().modify_tensors(data_torch, name, bid)61 62 63@ModelBase.register("MiniCPM3ForCausalLM")64class MiniCPM3Model(TextModel):65    model_arch = gguf.MODEL_ARCH.MINICPM366 67    def set_gguf_parameters(self):68        hparams = self.hparams69 70        self.gguf_writer.add_file_type(self.ftype)71        self.gguf_writer.add_context_length(hparams["max_position_embeddings"])72        self.gguf_writer.add_embedding_length(hparams["hidden_size"])73        self.gguf_writer.add_block_count(self.block_count)74        self.gguf_writer.add_feed_forward_length(hparams["intermediate_size"])75        self.gguf_writer.add_head_count(hparams["num_attention_heads"])76        self.gguf_writer.add_head_count_kv(hparams["num_key_value_heads"])77        self.gguf_writer.add_layer_norm_rms_eps(hparams["rms_norm_eps"])78        self.gguf_writer.add_vocab_size(hparams["vocab_size"])79        if "q_lora_rank" in hparams and hparams["q_lora_rank"] is not None:80            self.gguf_writer.add_q_lora_rank(hparams["q_lora_rank"])81        self.gguf_writer.add_kv_lora_rank(hparams["kv_lora_rank"])82        self.gguf_writer.add_key_length(hparams["qk_nope_head_dim"] + hparams["qk_rope_head_dim"])83        self.gguf_writer.add_rope_dimension_count(hparams["qk_rope_head_dim"])84 85    def generate_extra_tensors(self) -> Iterable[tuple[str, Tensor]]:86        long_factors = self.rope_parameters.get('long_factor')87        short_factors = self.rope_parameters.get('short_factor')88        if long_factors or short_factors:89            rope_dims = self.hparams["qk_rope_head_dim"]90 91            if long_factors is None or short_factors is None:92                raise KeyError('Missing the required key rope_scaling.long_factor or rope_scaling_short_factor')93 94            if len(long_factors) != len(short_factors) or len(long_factors) != rope_dims / 2:95                raise ValueError(f'The length of rope long and short factors must be {rope_dims / 2}')96 97            yield (self.format_tensor_name(gguf.MODEL_TENSOR.ROPE_FACTORS_LONG), torch.tensor(long_factors, dtype=torch.float32))98            yield (self.format_tensor_name(gguf.MODEL_TENSOR.ROPE_FACTORS_SHORT), torch.tensor(short_factors, dtype=torch.float32))99 100    def set_vocab(self):101        self._set_vocab_sentencepiece()102 103    def _reverse_hf_permute(self, weights: Tensor, n_head: int, n_kv_head: int | None = None) -> Tensor:104        if n_kv_head is not None and n_head != n_kv_head:105            n_head //= n_kv_head106 107        return (108            weights.reshape(n_head, 2, weights.shape[0] // n_head // 2, *weights.shape[1:])109            .swapaxes(1, 2)110            .reshape(weights.shape)111        )112 113 114# MiniCPM-V 4.6: text tower is Qwen3.5 (linear+full hybrid attention) wrapped under115# `model.language_model.*`; vision tower is SigLIP + a window-attention ViT merger116# + a final DownsampleMLP merger. The same HF arch is registered twice below: once as117# the LM (text mode) and once as the mmproj (vision mode), mirroring the Qwen3-VL setup.118 119@ModelBase.register("MiniCPMV4_6ForConditionalGeneration")120class MiniCPMV4_6TextModel(Qwen3_5TextModel):121    model_arch = gguf.MODEL_ARCH.QWEN35122 123    @classmethod124    def filter_tensors(cls, item: tuple[str, Callable[[], Tensor]]) -> tuple[str, Callable[[], Tensor]] | None:125        name, gen = item126 127        if name.startswith("model.merger."):128            return None129        # MTP tensors are not used at inference yet; align with Qwen3Next behaviour130        if name.startswith("mtp"):131            return None132 133        return super().filter_tensors(item)134 135 136@ModelBase.register("MiniCPMV4_6ForConditionalGeneration")137class MiniCPMV4_6VisionModel(MmprojModel):138    def __init__(self, *args, **kwargs):139        super().__init__(*args, **kwargs)140        self.downsample_mode = self.preprocessor_config.get("downsample_mode", "16x")141        if self.downsample_mode not in {"4x", "16x"}:142            raise ValueError(f"Unsupported downsample mode: {self.downsample_mode}")143        if self.downsample_mode == "4x":144            self.model_tensors = {145                name: tensor for name, tensor in self.model_tensors.items()146                if ".vit_merger." not in name147            }148 149        if self.hparams_vision is not None:150            # In MiniCPM-V 4.6 `vision_config.image_size` (980) describes the SigLIP151            # positional embedding bucket grid (70 x 70), while the per-slice processing152            # resolution is the preprocessor's `scale_resolution` (typically 448).153            # The CLIP loader in tools/mtmd/clip.cpp consumes `clip.vision.image_size`154            # as the slice size and warmup resolution, so report `scale_resolution` there155            # to match the upstream MiniCPMV4_6ImageProcessorPil slicing rules.156            scale_resolution = self.preprocessor_config.get("scale_resolution")157            if scale_resolution is not None:158                self.hparams_vision["image_size"] = int(scale_resolution)159 160    def set_gguf_parameters(self):161        super().set_gguf_parameters()162        assert self.hparams_vision is not None163 164        # projector type string is consumed by clip_projector_type_from_string() in clip.cpp165        # (mapped to PROJECTOR_TYPE_MINICPMV4_6).166        self.gguf_writer.add_clip_projector_type(gguf.VisionProjectorType.MINICPMV4_6)167 168        self.gguf_writer.add_vision_projector_scale_factor(169            2 if self.downsample_mode == "4x" else 4)170 171        # borrow wa_layer_indexes for vit_merger insertion point172        insert_layer_id = int(self.global_config.get(173            "insert_layer_id", self.hparams_vision.get("insert_layer_id", 6)))174        self.gguf_writer.add_vision_wa_layer_indexes([insert_layer_id])175 176        # SigLIP vision body uses gelu_pytorch_tanh, which matches ggml_gelu (tanh approx).177        self.gguf_writer.add_vision_use_gelu(True)178        self.gguf_writer.add_vision_attention_layernorm_eps(179            self.hparams_vision.get("layer_norm_eps", 1e-6))180 181    @classmethod182    def filter_tensors(cls, item: tuple[str, Callable[[], Tensor]]) -> tuple[str, Callable[[], Tensor]] | None:183        name, gen = item184 185        # lm_head / MTP -> belong to the LM file186        if name.startswith(("lm_head.", "mtp")):187            return None188 189        return super().filter_tensors(item)190 
Brunobkr/llama.cpp_AlgMor24_github · Team Ai