Приветы! Активно используем CatBoost в продакшене: прогнозируем качество RTB трафика до его покупки. Абсолютно нет вопросов к качеству обучения, однако, присутствуют некоторые неприятные моменты в эксплуатации:
1. На наборе из 7-10КК объектов, состоящих из ~40 категориальных фич (файл .csv на 4ГБ) может получиться бинарный классификатор весом в 13ГБ (300+ деревьев): приходится ограничивать количество деревьев 50-60ю. При этом модель умещается в 4ГБ, но граница порога принятися решения перестает быть такой четкой, как в полностью обученной модели в 13Г+.
Насколько я понимаю, дело во встроенной методике преобразования категориальных фич в числовые, так как подобного эффекта нет при работе с числовыми фичами.
Снизить размер моделей (примерно в 10 раз) помогает параметр model_size_reg, но он недоступен при обучении на GPU, также модели, обученные с ним, теряют в скорости применения примерно в 2-3 раза. Хотя, возможно, на скорость влияет увеличенное количество деревьев - не могу точно сказать.
Вопросы:
- Есть ли какие-либо способы существенно уменьшить модели при обучении на GPU без сокращения числа деревьев?
- В данный момент размер модели резко увеличивается с каждым новым деревом, что может говорить о том, что каждое дерево тащит за собой огромную таблицу преобразований. Возможно, имеет смысл вынести работу с категориальными фичами за скобки и проделывать один раз? Возможно, я тут глупость говорю, так как не в полной мере владею внутренным устройством инструмента. Поправьте)
2. Наш микросервис на Go, выполняющий роль аппликатора, обращается к вашей динамическую библиотеке
libcatboostmodel.so для работы с моделями. Периодически модели необходимо обновлять. Тут возникает следующая проблема:
- вызов функций ModelCalcerDelete не приводит к полному освобождению памяти от старой модели (остается от 20% до половины),
- затем после вызова ModelCalcerCreate и LoadFullModelFromFile микросервис уже занимает памяти больше, чем мог бы при рестарте
- справедливости ради нужно отметить, что ингода при вызове ModelCalcerCreate и LoadFullModelFromFile часть неудаленной (от старой модели) памяти все таки освобождается (не вся)
- но в долгосрочном периоде работы (месяц, например) микросервис с катбустом может захватить все пространство сервера
Сталкивались ли вы с чем-то подобным при перезагрузке моделей без перезагрузки сервиса? Возможно, у вас все хорошо, и как-то влияет взимодействие с Go?