Модель, которая классифицирует сетевое соединение как заслуживающее внимания или нет, работая на том же самом Mac, который это соединение установил, меняет сразу три вещи: что покидает машину, во сколько обходится запуск и продолжает ли она работать, когда под подозрением оказывается сама сеть. Все три момента важнее для инструмента безопасности, чем для большинства других применений языковой модели, поэтому эта статья посвящена именно случаю запуска на устройстве, а не вызову API.
Почему на устройстве, именно для триажа
Отправка строки лога соединения облачной модели для классификации означает, что при каждом отдельном решении передаётся, какое приложение на вашем Mac сейчас общается с каким хостом и на каком порту. Всё это не секрет в том смысле, в каком секрет — пароль, но это именно тот тип метаданных, распространение которых стремится минимизировать любая настройка, заботящаяся о безопасности, а у инструмента, чья единственная цель — решать, что вашему Mac разрешено отправлять вовне, есть очевидная причина самому не зависеть от отправки чего-либо вовне при каждом принимаемом решении. Запуск модели локально полностью убирает эту зависимость: строка лога никогда не покидает устройство, потому что в пути принятия решения вообще нет сетевого вызова.
Вторая причина — непрерывность работы. Этап триажа, основанный на облаке, доступен ровно настолько, насколько доступны ваше интернет-соединение и API поставщика, а это как раз то, что может быть ухудшено или намеренно отключено во время реального инцидента. Модель, работающая в локальной памяти, продолжает отвечать даже при отключённой сети, выключенном Wi-Fi или подозреваемой компрометации именно того канала, который использовался бы для вызова API.
MLX: собственный фреймворк массивов от Apple
MLX — это фреймворк массивов, созданный исследовательской командой Apple по машинному обучению специально для Apple silicon, с API для Python, C++, C и Swift. Собственная документация описывает единую модель памяти как ключевое архитектурное решение: массивы в MLX живут в общей памяти, и операции над ними могут выполняться на любом поддерживаемом устройстве — CPU или GPU — без предварительного копирования весов модели между отдельными пулами памяти. Это имеет конкретное значение для ноутбука: машине с дискретным GPU приходится копировать веса модели через шину в память GPU, прежде чем начать какие-либо вычисления, что стоит времени и удваивает объём занятой памяти; в архитектуре единой памяти Mac CPU и GPU уже используют одну и ту же физическую память, так что копировать нечего.
mlx-lm, сопутствующий пакет для запуска языковых моделей на MLX, устанавливается одной командой и сразу поставляется с моделью по умолчанию:
pip install mlx-lm
# runs the default model (mlx-community/Llama-3.2-3B-Instruct-4bit)
mlx_lm.generate --prompt "How tall is Mt Everest?"
# or name a specific quantized model from the mlx-community hub
mlx_lm.generate --model mlx-community/Mistral-7B-Instruct-v0.3-4bit --prompt "..."
# interactive chat session instead of a single prompt
mlx_lm.chat
# convert and quantize a model yourself
mlx_lm.convert --model mistralai/Mistral-7B-Instruct-v0.3 -qllama.cpp: переносимый вариант
llama.cpp — более старый и куда более широко портированный из двух вариантов, написанный на C/C++, не требующий рантайма Python во время инференса. Собственный README проекта прямо формулирует его позицию по этому оборудованию: Apple silicon рассматривается, по словам самого проекта, как «полноценная платформа первого класса — оптимизированная через фреймворки ARM NEON, Accelerate и Metal», а документация по сборке подтверждает, что в macOS бэкенд GPU Metal включён по умолчанию, с флагом времени сборки для его отключения, если вам конкретно нужен инференс только на CPU.
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
cmake -B build
cmake --build build --config Release
# Metal is on by default on macOS; add -DGGML_METAL=OFF to the first
# command above if you need to force CPU-only inference
llama cli -hf ggml-org/Qwen3.5-0.8B-GGUF
# or run it as a local server instead of a one-shot command
llama serve -hf ggml-org/Qwen3.5-0.8B-GGUFllama.cpp работает с файлами GGUF — однофайловым форматом моделей, объединяющим квантованные веса и всё необходимое для их запуска; команда выше загружает такой файл прямо из репозитория Hugging Face по имени. MLX, напротив, ближе к нативному рабочему процессу на Python: модели конвертируются и квантуются в его собственный формат заранее. Ни один из вариантов не лучше другого в принципе: llama.cpp стоит выбирать, если нужен единый скомпилированный бинарный файл без зависимости от Python, MLX — если остальная часть вашего конвейера уже строится на Python и вам нужен полноценный доступ к единой модели памяти Apple прямо оттуда.
Квантование: чем вы на самом деле жертвуете ради меньшей модели
Квантование хранит каждый вес модели в меньшем числе бит, чем те 16 или 32, в которых модель обучалась, уменьшая и файл на диске, и объём памяти, нужный для запуска, ценой некоторого снижения качества вывода. Собственная документация llama.cpp по квантованию приводит точные цифры бит на вес для каждой поддерживаемой схемы, что даёт более точный способ рассуждать об этом компромиссе, чем привычные сокращения вроде «4-битный» или «8-битный»:
| Семейство схем | Примеры схем | Бит на вес |
|---|---|---|
| Полная точность (эталон) | F16 | 16,0 |
| Почти без потерь | Q8_0 | 8,50 |
| Более качественный средний диапазон | Q5_K_S / Q5_K_M | 5,57–5,70 |
| Баланс качества и размера | Q4_K_S / Q4_K_M | 4,67–4,89 |
| Меньше, но с бо́льшими потерями | Q3_K_S / Q3_K_M / Q3_K_L | 3,64–4,30 |
| Экстремальное сжатие | IQ2_XXS ... IQ2_M | 2,00–2,93 |
Умножение числа параметров модели на показатель бит на вес даёт грубую оценку памяти только для весов: модели с 7 миллиардами параметров при 4,89 бита на вес у Q4_K_M нужно примерно 7 000 000 000 × 4,89 ÷ 8 байт, то есть около 4,3 ГБ, ещё до учёта контекстного окна и промежуточных активаций, которые добавляются сверху в зависимости от того, сколько текста вы подаёте. Это расчёт на основе процитированного показателя бит на вес, а не цифра, которую публикует напрямую какой-либо из проектов, и реальное потребление памяти окажется выше, как только будет загружен настоящий промпт вместе с контекстом. Практический вывод из таблицы прост: для задачи вроде классификации одной строки лога соединения за раз, где вход короткий, а требуемый вывод — небольшой структурированный вердикт, модель класса Q4_K_M очень часто оказывается правильным выбором — заметно меньше и быстрее, чем Q8_0 или F16, но без падения до уровня экстремального сжатия, где качество вывода деградирует куда резче.
Ни один из проектов не публикует требования к памяти для конкретной конфигурации Mac, так что практичный подход — отталкиваться от приведённой выше оценки в обратную сторону и оставлять реальный запас: сама macOS, ваш браузер и всё остальное, что запущено, тоже нуждаются в единой памяти, а модель, которая едва помещается при отсутствии других открытых программ, начнёт использовать своп или зависать в момент переключения на другое приложение. На Mac со скромным объёмом единой памяти это говорит в пользу того, чтобы держаться ближе к меньшему концу приведённой выше таблицы — несколько миллиардов параметров при Q4_K_M, а не намного более крупная модель с тем же квантованием, — и оставлять более крупные, более точные варианты для машин с запасом памяти. Для узкой задачи классификации, о которой идёт речь в этой статье, модель поменьше, которой задан точный вопрос, как правило, оказывается и быстрее, и на практике стабильнее, чем более крупная модель, которой задан расплывчатый вопрос.
Оба проекта активно развиваются, и честное сравнение — это скорее не «что лучше», а «что подходит вашему конвейеру». llama.cpp компилируется в единый бинарный файл, не требующий рантайма Python во время инференса, что важно, если вы хотите встроить его в другую программу, не поставляя вместе с ней интерпретатор Python. MLX предполагает, что вы уже работаете на Python (или на Swift, для которого он тоже поставляет привязки), и вознаграждает за это более тесной интеграцией с собственным стеком машинного обучения Apple и описанной выше моделью единой памяти. Инструмент безопасности, построенный как самостоятельное приложение для macOS, — а именно в такой ситуации находится сам FireAI, — ближе к концу спектра llama.cpp; исследовательский блокнот, изучающий, какой шаблон промпта работает лучше всего, ближе к концу спектра MLX.
Шаблон промпта для триажа одного соединения
Чем уже вопрос, который вы задаёте небольшой локальной модели, тем надёжнее её ответ. Для одного соединения это означает передать ей ровно те поля, на которые смотрел бы человек-рецензент, — не больше и ничего додуманного, — и запросить структурированный вердикт, а не свободный текст:
System: You review one outbound network connection at a time. You are
given only the fields listed below. Do not assume anything not stated.
Respond with exactly two lines: a verdict (allow, ask, or block) and a
one-sentence reason a non-expert could understand.
Connection:
app: UpdaterHelper.app
code_signature: unsigned
destination: 91.203.xxx.xxx:4444
protocol: TCP
threat_feed_hit: none
first_seen: yes (no prior rule for this app)
Verdict:Важны те поля, которые проверка цифровой подписи и фид угроз действительно способны дать без догадок: подписан ли бинарный файл и кем, куда и на какой порт он пытается подключиться, встречается ли этот адрес в фиде угроз и пытается ли это приложение подключиться впервые вообще. Требование фиксированного двухстрочного вывода вместо развёрнутого объяснения облегчает логирование, облегчает сравнение по тысячам соединений и значительно затрудняет модели разбавление ответа обтекаемыми формулировками, которые звучат авторитетно, но не говорят ничего проверяемого.
Небольшая модель всё равно время от времени будет игнорировать запрошенный формат — три строки вместо двух, лишняя оговорка, слово-вердикт, не входящее в три запрошенных варианта. Относитесь к этому как к инженерной проблеме, а не как к проблеме самой модели: проверяйте вывод на соответствие точно ожидаемой форме и, если он не совпадает, либо переспрашивайте, либо откатывайтесь к самому безопасному вердикту (ask, то есть показать человеку), а не пытайтесь распарсить менее строгий ответ. Этап триажа, который безопасно отказывает при некорректном выводе, куда полезнее, чем тот, что изредка выдаёт уверенно выглядящую, но непарсящуюся строку и молча её отбрасывает.
Если применять этот шаблон не к одному соединению за раз, а ко всем попыткам за целый день, характер нагрузки меняется: большинство соединений — от приложений с уже существующим правилом и вообще не доходят до модели, меньшая часть — действительно впервые встреченные и получают вердикт, и лишь часть этих вердиктов оказывается чем-то иным, кроме обычного разрешения. Реальная задача модели в этот момент — не быть экспертом по безопасности, а сократить длинный список впервые встреченных соединений до небольшого подмножества, которое человеку действительно нужно просмотреть, а это гораздо более достижимая цель для модели на несколько миллиардов параметров, чем открытое суждение о безопасности.
Где это может пойти не так
- Небольшая локальная модель может выдать уверенную, хорошо написанную, но полностью неверную причину. Запуск локально никак не меняет этот риск — он меняет только то, где происходит ошибка, а не то, может ли она произойти.
- Контекстные окна конечны, и длинный, зашумлённый лог в них не помещается. Суммирование или предварительная фильтрация до того, как модель увидит данные, вносит собственную точку отказа — можно потерять ту самую важную строку ещё до того, как модель вообще успеет на неё взглянуть.
- Модель видит только то, что содержится в строке лога. Она не может заглянуть внутрь зашифрованного трафика, не может проверить актуальность фида угроз и не может знать ваше намерение — соединение от инструмента, который вы только что намеренно установили, выглядит идентично соединению от инструмента, о котором вы никогда не слышали.
- Вердикт — это не действие. Ничто из описанного здесь не должно самостоятельно блокировать, удалять или молча разрешать соединение; человеку по-прежнему нужно увидеть причину и подтвердить её, а также иметь возможность отменить решение, если модель ошиблась.
Этот последний пункт — не ограничение, специфичное для небольшой квантованной модели на ноутбуке, — это верно для любого автоматизированного решения по безопасности, локального или облачного, маленькой модели или большой. Ценность локального запуска в том, что он убирает из уравнения (зависимость от сети, регулярный счёт, третью сторону, получающую метаданные ваших соединений), а не в утверждении, что он убирает необходимость участия человека.
Где в этот шаблон вписывается FireAI
FireAI, файрвол HisnLabs для Mac, поставляется с чем-то, построенным на той же идее, но с гораздо более узким охватом, чем универсальная чат-модель: опциональной локальной моделью, дополнительной загрузкой примерно в 1,5 ГБ, которая целиком работает на Mac и проверяет соединения от приложений, для которых ещё нет правила. Она требует macOS 14 или новее на Apple silicon, применяет публичные фиды угроз локально, а не сверяет их с удалённым сервисом, и показывает причину своего решения прямо в том же запросе разрешения, которым просит вас разрешить или отклонить соединение — каждое такое решение становится видимым, редактируемым правилом, и любое из них можно отменить. Стоит точно оговорить, чем это является, а чем нет: это не открытая, многомиллиардная чат-модель, описанная в этой статье, и не антивирус и не VPN — она выполняет одну узкую задачу классификации, локально, и оставляет итоговое решение тому, кто читает запрос.
Какое место здесь занимают FireAI и HisnLabs
FireAI’s own connection reviewer is this exact bet, made narrower still: an optional, roughly 1.5 GB on-device model, macOS 14 and up, Apple silicon only, reviewing one thing (should this unknown app reach this destination) with a visible reason and an undo button — and, like the triage pattern in this article, it still needs a person to confirm anything consequential.
FireAI — это собственный продукт HisnLabs: ИИ-файрвол, работающий прямо на вашем Mac. Он показывает простым языком каждое соединение, которое устанавливают ваши приложения, и позволяет вам решать, что покидает ваш Mac, — его ИИ работает локально, поэтому ваш трафик никогда не отправляется ни нам, ни кому-либо ещё. Команда исследователей безопасности HisnLabs — это те, кто поддерживает точность этих решений: они каталогизируют, какие домены являются обычной телеметрией, а какие — реальным сервисом, отслеживают страну и сеть, стоящие за соединением, и обучают локальную модель (функцию Autopilot) на реальных шаблонах трафика — и ничего из этого не покидает ваш Mac.
Вы можете прочитать о технических решениях, лежащих в его основе, или попробовать FireAI в течение 17 дней на странице FireAI от HisnLabs.