Зачем собирать монстра на 384 ГБ памяти?
Представь, что тебе нужно проанализировать миллион строк кода на предмет уязвимостей за выходные. Или сгенерировать умопомрачительное количество тестовых данных для фаззинга новой библиотеки. Обычные облачные API скупы на контекст, медленны и дороги. Локальные модели в 7-70 миллиардов параметров спотыкаются на сложной логике. Ответ — запустить настоящих гигантов, Qwen 122B и 397B, локально. На четырёх RTX 6000 Pro с их 96 ГБ памяти каждая ты получаешь полигон в 384 ГБ VRAM. Этого хватит, чтобы загнать 122B в нативном BF16 или 397B в агрессивном, но точном квантовании Q6_K. Результат? Модель, которая не просто угадывает уязвимости, а понимает контекст программы, как senior security engineer с 20-летним стажем.
Это не игрушка. Потребление системы под нагрузкой перевалит за 1.5 кВт. Убедись в надёжности электропроводки и охлаждения. Четыре карты вплотную — это адская печь. Изучи наш тест "4 видеокарты RTX Pro 6000 вплотную" прежде чем включать.
1 Подготовка железа и ПО
Сначала о железе. Материнская плата — обязательна с поддержкой PCIe 4.0/5.0 x16 на четыре слота. Лучше взять плату для рабочих станций (например, на чипсете WRX80 или W790). Процессор — мощный, с большим количеством линий PCIe. Оперативка — от 128 ГБ DDR5. Блок питания — 1600+ Вт от проверенного бренда. Система охлаждения — массивные вентиляторы или профессиональная СВО.
Установи самые свежие драйверы NVIDIA (на 22.03.2026 это ветка 560.xx или новее). Для работы с моделями в формате GGUF нам нужен llama.cpp. Клонируем и собираем с поддержкой всех наших карт:
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
make clean
# Сборка с поддержкой CUDA для всех GPU
make LLAMA_CUDA=1 -j$(nproc)
2 Выбор и конвертация моделей
Нам интересны две модели: Qwen3.5-122B и Qwen3.5-397B. Первая — баланс между размером и производительностью. Вторая — абсолютный монстр для самых сложных задач. На 22.03.2025 эти модели — одни из лучших в своём классе для кодогенерации и анализа.
Скачай оригинальные веса в формате Hugging Face. Для 122B мы будем использовать точность BF16 — это даст максимальное качество при разумном размере (~244 ГБ). Для 397B придётся квантовать, иначе она не влезет даже в нашу сборку. Вариант Q6_K — отличный компромисс, потеря точности минимальна (около 1-2%), а модель сжимается до ~297 ГБ. Если нужен максимальный контекст, можно взять Q4_K_M, но для анализа кода лучше выше точность.
Конвертируем модель в формат GGUF с помощью скрипта convert.py из llama.cpp:
# Для Qwen 122B в BF16
python3 convert.py ./qwen3.5-122b-hf/ --outfile qwen122b-bf16.gguf --outtype bf16
# Для Qwen 397B в Q6_K
python3 convert.py ./qwen3.5-397b-hf/ --outfile qwen397b-q6_k.gguf --outtype q6_k
Процесс займёт время и много оперативной памяти. Убедись, что на SSD достаточно места — каждая модель займёт сотни гигабайт.
3 Магия распределения по GPU
Вот где начинается самое интересное. Нужно заставить llama.cpp равномерно распределить слои модели по четырём картам. Если сделать это неправильно, одна карта будет загружена на 100%, а остальные простаивать, или система рухнет из-за нехватки памяти.
Для Qwen 122B (80 слоёв) и Qwen 397B (112 слоёв) логично распределить слои поровну. Используем флаги --split-mode и --tensor-split.
| Модель / Параметр | Количество слоёв | Распределение (tensor-split) | Примерный объём VRAM |
|---|---|---|---|
| Qwen 122B (BF16) | 80 | 24,24,24,24 (или 20,20,20,20) | ~244 ГБ (61 ГБ на карту) |
| Qwen 397B (Q6_K) | 112 | 28,28,28,28 | ~297 ГБ (74 ГБ на карту) |
Команда для запуска Qwen 122B в режиме интерактивного аудита кода:
./main -m ./models/qwen122b-bf16.gguf \
-ngl 80 \
--tensor-split 24,24,24,24 \
-c 32768 \
-t 48 \
--temp 0.1 \
--top-p 0.95 \
--repeat-penalty 1.1 \
-p "Проанализируй представленный код на C++ на наличие уязвимостей безопасности, включая переполнение буфера, XSS, инъекции и race conditions. Код:\n"
Флаг -ngl 80 загружает все 80 слоёв на GPU. --tensor-split распределяет нагрузку. -c 32768 задаёт большой контекст, чтобы модель могла анализировать целые файлы. -t 48 — количество потоков CPU для обработки ввода-вывода.
Для фаззинга с Qwen 397B нам нужна более креативная генерация:
./main -m ./models/qwen397b-q6_k.gguf \
-ngl 112 \
--tensor-split 28,28,28,28 \
-c 16384 \
-t 32 \
--temp 0.8 \
--top-k 40 \
--repeat-penalty 1.05 \
-p "Сгенерируй 10 уникальных, потенциально краевых случаев для функции, которая парсит заголовки HTTP запроса. Включай экзотичные кодировки, очень длинные строки, null-байты. Формат: каждый случай на новой строке."
Не слепо копируй tensor-split значения. Запусти nvidia-smi после старта и проверь загрузку памяти на каждой карте. Если распределение неравномерное, поиграйся с числами. Иногда из-за различий в слоях нагрузка ложится криво.
4 Оптимизация под задачу: фаззинг против аудита
Настройки модели для этих задач — как два разных спортивных автомобиля. Для аудита кода важна точность, внимательность к деталям, минимум «галлюцинаций». Здесь работают низкая температура (0.1-0.3), высокий penalty за повторения (1.1-1.2), небольшой top-p (0.9).
Для фаззинга нужна «безумная» креативность. Модель должна придумывать неочевидные, извращённые входные данные. Подними температуру до 0.7-0.9, используй top-k (40-60), снизь penalty за повторения (1.0-1.05), чтобы модель не боялась генерировать похожие, но разные случаи.
Создай два отдельных bash-скрипта с предустановленными параметрами для каждой задачи. Это сэкономит кучу времени.
5 Интеграция в рабочий процесс
Запускать модель вручную из консоли для каждого файла — безумие. Нужна автоматизация.
Вариант 1: Запусти llama.cpp в серверном режиме (./server) и пиши клиентские скрипты на Python. Можешь сделать REST API, который принимает код и возвращает отчёт об уязвимостях или набор тестовых данных.
Вариант 2: Интеграция с CI/CD. Напиши плагин для GitLab CI или GitHub Actions, который перед мержем запускает анализ новой кодобазы через твою локальную модель и блокирует мерж, если найдены критические уязвимости.
Пример простого Python-клиента для аудита:
import requests
import json
def audit_code_with_qwen(code_snippet, server_url="http://localhost:8080"):
"""Отправляет код на анализ модели Qwen 122B."""
prompt = f"""Ты — эксперт по безопасности. Проанализируй код ниже и перечисли все потенциальные уязвимости с CWE ID. Оцени критичность от 1 до 10.
Код:
```c
{code_snippet}
```"""
data = {
"prompt": prompt,
"n_predict": 2048,
"temperature": 0.1,
"top_p": 0.9,
"stop": ["\n###"]
}
try:
response = requests.post(f"{server_url}/completion", json=data, timeout=120)
return response.json()["content"]
except Exception as e:
return f"Ошибка: {e}"
# Использование
result = audit_code_with_qwen("void copy(char* src) { char buf[10]; strcpy(buf, src); }")
print(result)
Почему это работает лучше облаков и мелких моделей?
Облачные API GPT-4o или Claude 3.5 ограничивают контекст (часто 128K токенов) и скорость. Анализ крупного репозитория требует разбивки на части, теряется связность. Наша сборка с 32K+ контекстом позволяет загрузить десятки файлов целиком. Модели на 122B и 397B параметров показывают глубокое понимание семантики кода, они не просто ищут шаблоны, а строят мысленную модель программы. Для фаззинга они генерируют более осмысленные и целенаправленные данные, чем случайные генераторы.
И главное — полная приватность. Исходный код никогда не покидает твой сервер. Это критично для аудита проприетарного софта или государственных систем.
Где собака зарыта: подводные камни
- Потребление энергии. Система под нагрузкой съедает 1.5-2 кВт·ч. Умножь на 24 часа — и счёт за электричество будет внушительным. Запускай только когда нужно.
- Нагрев и шум. Даже с хорошим охлаждением карты будут разогреваться до 80-85°C. Шум вентиляторов будет, как на взлётной полосе. Выдели для этой системы отдельное помещение.
- Сложность отладки. Если что-то пошло не так (например, падение из-за нехватки памяти), диагностика сложнее, чем с одной картой. Веди лог всех запусков.
- Обновления. Новая версия llama.cpp может сломать совместимость с твоими скриптами или оптимизациями. Не обновляйся сразу на продакшене.
Что дальше? Продвинутые трюки
Система собрана и работает. Куда развиваться?
- Fine-tuning под домен. Добей максимальной точности в твоей предметной области (например, аудит ядра Linux или фаззинг парсеров PDF). Возьми датасет из реальных багов CVE и дообучи модель с LoRA. Процесс долгий, но результат окупится.
- Агентный подход. Заставь модель не только находить уязвимости, но и писать эксплойты или патчи. Это требует сложного промпт-инжиниринга и цепочек вызовов.
- Смешение моделей. Запусти одновременно 122B для глубокого анализа и какую-нибудь мелкую, быструю модель (например, Qwen2.5-Coder-7B) для первичной фильтрации кода. Используй распределённую архитектуру.
- Аппаратный апгрейд. Следи за выходом новых карт. Если появятся RTX 7000 Pro с 128+ ГБ памяти, можно будет загрузить 397B в BF16 или ждать Qwen-триллионника.
Собирать такую систему — это как строить собственный суперкомпьютер в гараже. Дорого, сложно, иногда бесит. Но когда ты получаешь отчёт с уязвимостью zero-day в собственном коде, который пропустили десять статических анализаторов, — это ощущение бесценно. Ты перестаёшь зависеть от капризов облаков и ограничений коммерческих продуктов. Ты создаёшь инструмент, который думает как хакер, но работает на тебя.
P.S. Если кажется, что 4x RTX 6000 Pro — это overkill, вспомни простое правило: аппетит приходит во время еды. Начнёшь с аудита кода, потом захочешь фаззинг, затем автоматическое исправление багов, генерацию security-тестов... И вот уже 384 ГБ VRAM кажутся скромным минимумом.