Хотел сэкономить на API — потерял ноутбук на вечер

Для Элис мы собирали бенчмарк — набор сценариев из реальных профессий, по которым проверяем, справляется ли ассистент с задачей. Прогонять его приходится десятки раз. Каждый прогон через облачную модель стоит денег, поэтому идея напрашивалась сама: поставить небольшую нейросеть прямо на ноутбук (Qwen на 7 миллиардов параметров через Ollama) и гонять бесплатно.

Ожидание: медленнее, зато даром. Пилот на паре сценариев прошёл отлично, и я запустил полный прогон. Параллельно открыт редактор, браузер, контейнеры стенда.

Минут через двадцать курсор начал дёргаться. Потом замер. Ноутбук не падал — он делал вид, что работает: диск шуршит, вентилятор воет, ни одно окно не отвечает. Ждал. Не дождался. Кнопка питания, перезагрузка, куча зависших процессов и полностью потерянное состояние прогона.

Первая мысль — модель кривая или бенч где-то зациклился. Но логи обрывались посреди нормальной работы, никаких ошибок. Тогда я пошёл с другой стороны: что делала сама машина? Ответ нашёлся в системной статистике. Ollama грузит модель в видеопамять, а то, что туда не помещается, оставляет в обычной оперативке и считает на процессоре. Так и вышло: модель заняла всю видеопамять, остаток слоёв лёг в RAM — а там уже жили стенд, контейнеры и браузер. Оперативка кончилась, система начала вытеснять страницы памяти в своп и заняла все его 2 ГБ. Дальше классический thrashing: процессы постоянно обращаются к страницам, которые только что ушли на диск, ядро без конца гоняет их туда и обратно, и почти всё время уходит на ожидание диска, а не на полезную работу. Вдобавок жёсткий лимит памяти, который я сам выставил контейнеру бенча, загонял его процессы в своп ещё раньше.

Что доработали: • добавили сторожа памяти — скрипт, который следит за свободной RAM и своп-активностью и останавливает прогон раньше, чем система начнёт задыхаться; • увеличили своп и настроили, насколько охотно ядро в него вытесняет (параметр swappiness); • убрали лимит памяти контейнера, который душил бенч; • по умолчанию переключили прогоны на облачную модель, но локальную обвязку не удалили — она осталась для быстрых пилотов без интернета и без затрат.

Почему не выкинули локальный режим совсем? Потому что для проверки одной идеи он идеален. Проблема была не в нём, а в том, что я запустил марафон на велосипеде для прогулок.

Урок: локальная модель — для пилота, облако — для полного прогона. И любая тяжёлая задача должна сама следить за памятью, а не надеяться на удачу.

А вас локальная нейросеть «съедала» вместе с машиной? Как выкручивались?

#Элис #ЭлисAI #факапы

Хотел сэкономить на API — потерял ноутбук на вечер | Сетка — социальная сеть от hh.ru