tgoop.com/paniccode/42
Last Update:
Use this simple trick to speedup catboost preparing dataset up to 210 times (21000%)
Я недавно оптимизировал пайплайн обучения катбуста, и наткнулся на странную вещь: инициализация catboost.Pool
занимает ну адски много времени (больше, чем обучение), хотя я ему передаю подготовленные нампай массивы в идеальном виде, и казалось бы ему надо просто указатель скопировать.
Гуглеж почему он может занимать много времени или как это ускорить не выдал абсолютно ничего, что сделало эту проблему еще веселее
Т.к. идей у меня больше не было, пришлось идти писать тестовый скрипт и pprofать его, и... ну я нашел проблему, больше сказать нечего
Оказывается, катбуст умеет копировать указатель только в одном очень аккуратном супер идеальном случае: это numpy массив (пока pyarrow), массив именно np.float32, и он непрерывный. В целом разумно, тут проблем нет.
Вопрос в том, что будет, если вы не дай бог передадите np.float64? Катбусту же много лет, над ним трудится куча студентов людей, и все простые оптимизации уже были наверняка сделаны, подумаете вы
...
for i in range(len(x)):
if type(x[i]) == float:
res[i] = x[i]
(буквально это но на cython)
Да, катбуст пойдет проверять тип каждого элемента. Да, это займет вечность.
Короче дамы и господа, передавайте катбусту только numpy массивы и только float32, и будет вам счастье.
А я сделал им ишью
BY Panic! At the 0xC0D3
Share with your friend now:
tgoop.com/paniccode/42