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
muse_glimmer.py180 linesDownload Raw Back to conversion
1from __future__ import annotations2 3import json4from typing import Any, Iterable, TYPE_CHECKING5 6import torch7 8if TYPE_CHECKING:9    from torch import Tensor10 11from .base import MmprojModel, ModelBase, TextModel, gguf12 13 14def _unpermute_for_rope(tensor: "Tensor", n_heads: int) -> "Tensor":15    """Invert transformers' `_permute_for_rope`: HF stores Q/K in rotate_half layout,16    llama.cpp consumes the interleaved (NORM) layout."""17    if tensor.ndim == 2:18        dim1, dim2 = tensor.shape19        return tensor.view(n_heads, 2, dim1 // n_heads // 2, dim2).transpose(1, 2).reshape(dim1, dim2)20    if tensor.ndim == 1:21        (dim1,) = tensor.shape22        return tensor.view(n_heads, 2, dim1 // n_heads // 2).transpose(1, 2).reshape(dim1)23    raise ValueError(f"_unpermute_for_rope: unexpected shape {tuple(tensor.shape)}")24 25 26@ModelBase.register("MuseGlimmerForConditionalGeneration")27class MuseGlimmerModel(TextModel):28    model_arch = gguf.MODEL_ARCH.MUSE_GLIMMER29 30    def norm_shift(self, name: str) -> float:31        # All four layer norms use 1, the final norm uses 0.32        return 1.0 if name.endswith("layernorm.weight") else 0.033 34    def set_vocab(self):35        self._set_vocab_gpt2()36 37        from transformers import AutoTokenizer38        tok = AutoTokenizer.from_pretrained(self.dir_model)39        eot_id = tok.convert_tokens_to_ids("<|eot|>")40        if isinstance(eot_id, int) and eot_id >= 0:41            self.gguf_writer.add_eot_token_id(eot_id)42 43    def set_gguf_parameters(self):44        super().set_gguf_parameters()45        hparams = self.hparams46 47        self.gguf_writer.add_final_logit_softcapping(hparams["final_logit_softcapping"])48        self.gguf_writer.add_logit_scale(hparams["output_multiplier"])49        self.gguf_writer.add_sliding_window(hparams["sliding_window"])50        self.gguf_writer.add_sliding_window_pattern([t == "sliding_attention" for t in hparams["layer_types"]])51 52    def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]:53        shift = self.norm_shift(name)54        if shift != 0.0:55            data_torch = data_torch + shift56 57        # Invert transformers' `_permute_for_rope` on Q/K, we keep ggml's NORM (interleaved) rope58        if ".self_attn.q_proj." in name:59            data_torch = _unpermute_for_rope(data_torch, int(self.hparams["num_attention_heads"]))60        elif ".self_attn.k_proj." in name:61            data_torch = _unpermute_for_rope(data_torch, int(self.hparams["num_key_value_heads"]))62 63        # Synthesize QK-norm weights to absorb qk_scale_factor.64        # MuseGlimmer implementation: scaleless RMSNorm followed by qk_scale_factor..65        if bid is not None and name.endswith(f"model.layers.{bid}.self_attn.q_proj.weight"):66            head_dim = self.hparams["head_dim"]67            q_scale = float(self.hparams["qk_scale_factor"])68            yield (69                self.map_tensor_name(f"model.layers.{bid}.self_attn.q_norm.weight"),70                torch.full((head_dim,), q_scale, dtype=torch.float32),71            )72            yield (73                self.map_tensor_name(f"model.layers.{bid}.self_attn.k_norm.weight"),74                torch.ones((head_dim,), dtype=torch.float32),75            )76 77        yield from super().modify_tensors(data_torch, name, bid)78 79 80@ModelBase.register("MuseGlimmerForConditionalGeneration")81class MuseGlimmerVisionModel(MmprojModel):82    def get_vision_config(self) -> dict[str, Any] | None:83        c = self.global_config.get("vision_config")84        if not c:85            return None86        # MuseGlimmer actually uses dynamic size, initialize with nominal size87        image_size = c["pos_emb_height"] * c["patch_size"] * c["merge_size"]88        return {**c, "image_size": image_size}89 90    def set_gguf_parameters(self):91        super().set_gguf_parameters()92        assert self.hparams_vision is not None93        c = self.hparams_vision  # enriched vision_config from get_vision_config()94 95        self.gguf_writer.add_clip_projector_type(gguf.VisionProjectorType.MUSE_GLIMMER)96        self.gguf_writer.add_vision_attention_layernorm_eps(float(c["layer_norm_eps"]))97        self.gguf_writer.add_vision_spatial_merge_size(int(c["merge_size"]))98 99    @classmethod100    def filter_tensors(cls, item):101        name, gen = item102        keep = ("model.vision_tower.", "model.vision_adapter.", "model.vision_projection.")103        if not any(name.startswith(k) for k in keep):104            return None105        return super().filter_tensors((name, gen))106 107    # 3-layer projector MLP108    _MM_MLP_MAP = {109        "model.vision_adapter.fc1": (gguf.MODEL_TENSOR.V_MMPROJ, 0),110        "model.vision_adapter.fc2": (gguf.MODEL_TENSOR.V_MMPROJ, 1),111        "model.vision_projection":  (gguf.MODEL_TENSOR.V_MMPROJ, 2),112    }113 114    def modify_tensors(self, data_torch, name, bid):115        assert self.hparams_vision is not None116        if ".attn.q_proj." in name or ".attn.k_proj." in name:117            n_heads = int(self.hparams_vision["num_attention_heads"])118            data_torch = _unpermute_for_rope(data_torch, n_heads)119        # Lay out the pt=2 temporal slabs of the patch embedding as a conv2d for build_inp()120        if name.endswith("patch_embedder.patch_embedding.weight"):121            n_embd = data_torch.shape[0]122            pt = int(self.hparams_vision["patch_temporal"])123            ps = int(self.hparams_vision["patch_size"])124            data_torch = data_torch.view(n_embd, pt, 3, ps, ps).sum(dim=1)  # (n_embd, 3, ps, ps)125        stem, _, suffix = name.rpartition(".")126        if stem in self._MM_MLP_MAP:127            tensor_key, idx = self._MM_MLP_MAP[stem]128            yield (self.format_tensor_name(tensor_key, bid=idx, suffix="." + suffix), data_torch)129            return130        yield (self.map_tensor_name(name), data_torch)131 132 133@ModelBase.register("MuseGlimmerAssistantModel")134class MuseGlimmerAssistantModel(TextModel):135    model_arch = gguf.MODEL_ARCH.DFLASH136 137    def set_vocab(self):138        if self.target_model_dir is None:139            raise ValueError(140                "MuseGlimmerAssistant (DFlash drafter) requires --target-model-dir pointing to the "141                "target MuseGlimmer HF directory"142            )143 144        original_dir = self.dir_model145        self.dir_model = self.target_model_dir146 147        from . import get_model_class148        with open(self.target_model_dir / "config.json", "r", encoding="utf-8") as f:149            target_arch = json.load(f)["architectures"][0]150        target_cls = get_model_class(target_arch)151        if target_cls is not type(self):152            target_cls.set_vocab(self)  # ty: ignore[unresolved-attribute]153        else:154            super().set_vocab()155 156        self.dir_model = original_dir157 158        mask_token_id = self.hparams.get("mask_token_id")159        if mask_token_id is not None:160            self.gguf_writer.add_mask_token_id(int(mask_token_id))161 162    def set_gguf_parameters(self):163        super().set_gguf_parameters()164        h = self.hparams165 166        self.gguf_writer.add_block_size(int(h["block_size"]))167 168        # dflash.target_layers[k] refers to the inputs going into the ith layer, which come from the (i-1)th layer's output.169        # The transformers configuration refers to the outputs being recorded.170        self.gguf_writer.add_target_layers([int(x) + 1 for x in h["target_layer_ids"]])171 172        if h.get("sliding_window") and h.get("layer_types"):173            self.gguf_writer.add_sliding_window(int(h["sliding_window"]))174            self.gguf_writer.add_sliding_window_pattern([t == "sliding_attention" for t in h["layer_types"]])175 176    def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]:177        # DFlash defaults to NEOX (rotate_half) rope, matching transformers HF layout for Q/K, QK-norms178        # no permutation needed.179        yield (self.map_tensor_name(name), data_torch)180 
Brunobkr/llama.cpp_AlgMor24_github · Team Ai