Казалось бы, невозможно
Kaggle дарит 30 часов GPU (T4 x2) в неделю. Но есть подвох - лимит диска в 20 ГБ. Полноценная модель Gemma 4 31B в формате bfloat16 весит около 60 ГБ. Математика простая: она просто не влезет. Большинство гайдов останавливаются на этом факте, советуя арендовать A100. Это не наш метод.
Партизанский MLOps - это искусство запускать невозможное на смехотворных ресурсах. Это не про аккуратную постановку пайплайнов в Kubernetes. Это про выживание в условиях тотального дефицита. Сегодня мы заставим Gemma 4 31B (самую новую на апрель 2026 года) работать на бесплатном Kaggle, обойдя все лимиты.
Почему это работает в 2026 году: Ключ - квантование NF4 (4-bit NormalFloat) в библиотеке bitsandbytes. Оно позволяет сжать модель в 4 раза с минимальной потерей качества. Плюс, мы не будем скачивать модель целиком - только необходимые для работы слои.
1 Подготовка поля боя: ноутбук Kaggle
Создайте новый ноутбук. Убедитесь, что в настройках включен интернет и GPU (T4 x2). Первое, что нужно сделать - проверить реальные лимиты. Запустите эту ячейку:
!df -h /kaggle/working
!nvidia-smi
Вы увидите ~20 ГБ свободного места и две карты T4 с 16 ГБ VRAM каждая. Наша цель - уместить модель в 15 ГБ дискового пространства и распределить её между двумя картами.
device_map) изменится. Следите за выводом nvidia-smi.2 Установка и импорт: только самое необходимое
Мы не можем позволить себе раздутые окружения. Устанавливаем строго определенные версии. bitsandbytes 0.43.0 (последняя на 2026) критически важна для поддержки NF4.
!pip install -q torch==2.4.0 torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
!pip install -q transformers==4.45.0 accelerate==0.32.0
!pip install -q bitsandbytes==0.43.0
Импортируем библиотеки. Обратите внимание на флаг low_cpu_mem_usage=True - он предотвращает попытку загрузки всей модели в оперативную память перед отправкой в GPU.
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
import torch
import accelerate
3 Сердце хака: конфигурация квантования NF4
Вот где кроется магия. Мы указываем загрузить модель сразу в 4-битном формате, использовать двойную квантизацию для экономии памяти и вычислить нормы весов в bfloat16 для точности.
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_use_double_quant=True,
bnb_4bit_compute_dtype=torch.bfloat16
)
Почему NF4, а не обычный int4? NF4 - это нормализованный float, который лучше сохраняет распределение исходных весов модели. Это не просто сжатие, это интеллектуальное квантование. Разница в качестве заметна на сложных задачах. Если вы пробовали старые методы квантования из статьи про запуск Gemma 4 локально, то NF4 - это следующий уровень.
4 Загрузка модели: трюк с device_map
Мы не можем позволить Transformers самим решать, куда грузить слои. Kaggle может убить сессию из-за нехватки памяти. Мы явно укажем, как распределить модель.
model_id = "google/gemma-4-31b-it"
tokenizer = AutoTokenizer.from_pretrained(model_id, token= "YOUR_HF_TOKEN")
model = AutoModelForCausalLM.from_pretrained(
model_id,
quantization_config=bnb_config,
device_map="auto",
low_cpu_mem_usage=True,
trust_remote_code=True
)
Флаг device_map="auto" заставит Accelerate распределить слои модели между двумя доступными GPU. Если вы хотите больше контроля, можно задать словарь вручную, но для начала хватит и auto. Модель загрузится частями, занимая на диске не больше 15 ГБ (вместо исходных 60 ГБ).
Внимание на токен: Для доступа к Gemma 4 на Hugging Face нужен токен. Получите его на сайте. Без него загрузка упадет с ошибкой 403. Не храните токен прямо в ноутбуке, если планируете публиковать его. Используйте Secrets Kaggle.
5 Управление кэшем: безжалостная чистка
Hugging Face по умолчанию кэширует модели в /root/.cache/huggingface. На Kaggle это съедает драгоценное место. После загрузки модели мы удалим исходные файлы из кэша.
import shutil
import os
cache_dir = "/root/.cache/huggingface/hub"
model_cache_path = os.path.join(cache_dir, f"models--{model_id.replace('/', '--')}")
if os.path.exists(model_cache_path):
shutil.rmtree(model_cache_path)
print(f"Удален кэш модели: {model_cache_path}")
Это освободит еще несколько гигабайт. Риск? При следующей загрузке модель скачается заново. Но в рамках одной сессии Kaggle это не нужно. Если вы работаете с несколькими моделями, как в гайде про тонкую настройку QLoRA, чистите кэш выборочно.
6 Запуск инференса и мониторинг
Теперь можно что-то спросить у модели. Но сначала убедимся, что она использует оба GPU.
prompt = "Объясни квантовую запутанность так, чтобы понял школьник."
inputs = tokenizer(prompt, return_tensors="pt").to("cuda:0")
with torch.no_grad():
outputs = model.generate(**inputs, max_new_tokens=200)
print(tokenizer.decode(outputs[0]))
Откройте мониторинг ресурсов (правая панель Kaggle -> Resources). Вы должны увидеть нагрузку на обе карты. Если нагрузка только на одну, значит, распределение слоев прошло неоптимально. Попробуйте явно указать device_map.
Где собака зарыта: типичные ошибки
| Ошибка | Причина | Решение |
|---|---|---|
| CUDA out of memory | Слишком большой max_new_tokens или длина входного промпта. |
Уменьшите длину генерации, используйте потоковый вывод. |
| Диск почти полный | Кэш Hugging Face или временные файлы PyTorch. | Очистите кэш, как показано выше. Удалите /tmp файлы. |
| Модель тормозит | Вычисления в 4-битном формате на CPU (если compute_dtype не указан). |
Всегда ставьте bnb_4bit_compute_dtype=torch.bfloat16. |
Вопросы, которые вы боялись задать
А можно ли так же запустить Mistral или Llama 3 70B?
Да, принцип тот же. Но для Llama 3 70B даже квантованной может не хватить памяти двух T4. Потребуется дополнительный трюк - оффлоадинг части слоев в CPU (через device_map). Это будет медленно, но возможно. Для таких случаев у нас есть отдельный гайд по запуску больших MoE-моделей.
Почему не использовать GGUF и llama.cpp?
GGUF формат отлично подходит для локального запуска на CPU. Но на Kaggle у нас есть мощные GPU T4. Использование llama.cpp не даст ускорения от CUDA. Плюс, квантование NF4 через bitsandbytes интегрировано прямо в Transformers, что удобнее для экспериментов. Если же вы столкнулись с тормозами, причины могут быть глубже - об этом в статье про исправление тормозов GGUF.
Насколько падает качество модели при таком квантовании?
По последним исследованиям на 2026 год, квантование NF4 для инференса (не обучения) снижает точность на сложных benchmarks (MMLU, Hellaswag) всего на 1-3% относительно полной bfloat16 версии. Для большинства практических задач это незаметно. Если вам нужно максимальное качество для исследовательских целей - ищите другие ресурсы.
Финал: партизанская этика
Вы запустили модель, которая по паспорту требует 60 ГБ памяти, на бесплатном аккаунте с 20 ГБ диска. Теперь главное - не злоупотреблять. Kaggle предоставляет ресурсы для обучения и исследований, а не для коммерческого инференса. Очищайте сессию после работы, не занимайте GPU на сутки.
Этот гайд - доказательство, что ограничения часто находятся в наших головах. Следующий шаг - попробовать тонкую настройку с QLoRA на этих же условиях. Или даже запустить взломанную версию Gemma 4 для экспериментов без цензуры. Но это уже другая история.
Партизанский MLOps учит главному: если система не позволяет что-то сделать по правилам, нужно менять не цель, а способ её достижения. Удачи в экспериментах.