💻 How to run (Summoning Guide)
If you want to see with your own eyes how the transplanted brain of a neural network sounds, here is the code:
import torchfrom transformers import AutoModelForCausalLM, AutoTokenizer repo_id = "livadies/DeepGemma-V4-Chimera-Ghetto-MoE" print("📡 Summoning Chimera...")tokenizer = AutoTokenizer.from_pretrained(repo_id, trust_remote_code=True)model = AutoModelForCausalLM.from_pretrained( repo_id, device_map="auto", torch_dtype=torch.float16, trust_remote_code=True) # Router patch to bypass dimension conflicts during inferencedef ghetto_route_final(self, logits): w = torch.nn.functional.softmax(logits.view(-1, logits.shape[-1]) + 1e-6, dim=-1) tw, ti = torch.topk(w, k=self.top_k, dim=-1) return ti, tw * self.routed_scaling_factor for layer in model.model.layers: if hasattr(layer, 'mlp') and hasattr(layer.mlp, 'route_tokens_to_experts'): layer.mlp.route_tokens_to_experts = ghetto_route_final.__get__(layer.mlp) print("✨ Consciousness check...")inputs = tokenizer("The experimental hybrid AI said:", return_tensors="pt").to(model.device) with torch.no_grad(): outputs = model.generate(**inputs, max_new_tokens=40, do_sample=True, temperature=0.85) print("\n📟 RESPONSE:\n" + tokenizer.decode(outputs[0], skip_special_tokens=True))
🏁 Conclusion
This experiment proves: there are no insurmountable architectural barriers in Machine Learning. There is only a lack of persistence. Welcome to Ghetto MLOps.
🇷🇺 Русская версия
⚠️ WARNING: ЭТА МОДЕЛЬ БЕЗУМНА.
Данный репозиторий — это концептуальный арт-проект и экстремальный стресс-тест инфраструктуры машинного обучения. Модель генерирует «цифровую шизофрению» (поток сознания, склеенные слова, инопланетный синтаксис). Она является результатом прямой хирургической пересадки весов между двумя абсолютно несовместимыми архитектурами без какого-либо дообучения (Fine-Tuning).
Это памятник тому, что в Python и PyTorch возможно всё, если у вас есть достаточно костылей, monkey-patching'а и упрямства.
🧬 Анатомия Мутанта
Химера была собрана в спартанских условиях Kaggle (2x T4 GPU, 30 GB RAM) с использованием методологии Ghetto MLOps.
- Скелет (Экзоскелет): Архитектура и MoE-роутер от
DeepSeek-V4-Pro (обрезанный до 2 экспертов).
- Плоть (Веса): 4 слоя от
Gemma-4-31B-Base-NF4 (в 4-битной квантизации).
- Среда: Полностью изолированное GPU-разделение (Донор на GPU 1, Скелет на CPU -> GPU 0).
Чтобы заставить эту модель дышать, нам пришлось обойти 5 уровней защиты библиотеки transformers и PyTorch. Вот полный список наших "преступлений" против чистого кода:
1. Identity Theft (Кража личности модели)
Библиотека отказывалась признавать кастомную архитектуру gemma4.
Решение: Мы принудительно взломали внутренний реестр Hugging Face:
from transformers import CONFIG_MAPPING, GemmaConfigCONFIG_MAPPING.register("gemma4", GemmaConfig, exist_ok=True)
2. Бронебойный патч конфигурации (Nuclear to_dict Patch)
Внутри недр transformers (в модуле generation) происходил странный баг: библиотека превращала объект конфигурации в обычный словарь (dict), а затем сама же падала с ошибкой AttributeError: 'dict' object has no attribute 'to_dict'.
Решение: Мы переписали метод from_model_config на лету, добавив try...except, который ловит эту ошибку и насильно заворачивает словари в наш кастомный Proxy-класс, имитирующий нужные методы.
3. Блокиратор случайных чисел (Анти-NotImplementedError)
При сборке скелета DeepSeek библиотека пыталась инициализировать недостающие слои случайным шумом (normal_). Но веса Геммы были в 4-битах (uint8). PyTorch падал, потому что не умеет генерировать дробный шум (float) поверх байтов.
Решение: Мы перехватили вызов TORCH_INIT_FUNCTIONS["normal_"] и запретили библиотеке трогать тензоры, если они сжаты в int8/uint8.
4. Умный сонар (Smart Router Bypass)
Авторы DeepSeek спрятали своих MoE-экспертов в неитерируемый монолитный класс DeepseekV2Experts (TypeError: 'DeepseekV2Experts' object is not iterable).
Решение: Был написан рекурсивный сканер find_experts(), который пробивал структуру класса на любую глубину, находил матрицы gate_proj, up_proj, down_proj и возвращал их нам для пересадки весов.
5. VRAM Juggling (Жонглирование памятью)
Распаковка 31B модели в float16 взрывала оперативную память Kaggle (OOM).
Решение: Веса переносились по одному матричному куску. Мы отрезали нужный shape, вызывали .clone(), пересаживали в скелет, а остаток немедленно уничтожали с помощью gc.collect() и torch.cuda.empty_cache() на каждой итерации цикла.
💻 Как запустить (Инструкция по вызову демона)
См. английскую версию выше для получения кода запуска.
🏁 Заключение
Этот эксперимент доказывает: в машинном обучении нет непреодолимых архитектурных барьеров. Есть только недостаток настойчивости. Добро пожаловать в Ghetto MLOps.