Size: a a a

2019 December 09

AB

Alexey Belyaev in catboost_ru
Приветы!

Вопрос по текстовым фичам и безумному расходу памяти.

Есть датасет 1.5M строк: 12 категориальных фич, одна текстовая.

Эксперимента ради, чтобы понять масштаб проблемы, текстовая фича составлена следующим образом:
- в словаре два (!) слова: '0' и '555' – смысла не несут;
- из этих слов составлены предложения в текстовой фиче каждой строки;
- каждое предложение содержит не более 10 (обычно меньше) вхождений этих слов: '0 0 555 0 555 0' и тп.

Без использования текстовой фичи обучение забирает 5Г оперативки, с текстовой 15Г (!) без учета памяти GPU (8Г).

Параметры катбуста такие (взяты по умолчанию, но без биграмм):

dictionaries=['W:min_token_occurrence=5,max_dict_size=50000,token_level_type=Word'],
text_processing=['BoW+W'],

Вопросы:
- На обработку словаря из двух слов требуется 10Г памяти при том, что исходный датасет меньше 5Г – как так? =)
- Можно ли как-то это уменьшить (max_dict_size, разумеется, уменьшал, ни на что не влияет)
- Если это какое-то стандартное резервирование, то сколько памяти понадобится, например, для 5М строк (мой полный датасет – не уместилось в 32Г)?

Версия catboost==0.20
источник

A

Andrey in catboost_ru
Alexey Belyaev
Приветы!

Вопрос по текстовым фичам и безумному расходу памяти.

Есть датасет 1.5M строк: 12 категориальных фич, одна текстовая.

Эксперимента ради, чтобы понять масштаб проблемы, текстовая фича составлена следующим образом:
- в словаре два (!) слова: '0' и '555' – смысла не несут;
- из этих слов составлены предложения в текстовой фиче каждой строки;
- каждое предложение содержит не более 10 (обычно меньше) вхождений этих слов: '0 0 555 0 555 0' и тп.

Без использования текстовой фичи обучение забирает 5Г оперативки, с текстовой 15Г (!) без учета памяти GPU (8Г).

Параметры катбуста такие (взяты по умолчанию, но без биграмм):

dictionaries=['W:min_token_occurrence=5,max_dict_size=50000,token_level_type=Word'],
text_processing=['BoW+W'],

Вопросы:
- На обработку словаря из двух слов требуется 10Г памяти при том, что исходный датасет меньше 5Г – как так? =)
- Можно ли как-то это уменьшить (max_dict_size, разумеется, уменьшал, ни на что не влияет)
- Если это какое-то стандартное резервирование, то сколько памяти понадобится, например, для 5М строк (мой полный датасет – не уместилось в 32Г)?

Версия catboost==0.20
Словарь не из 2 слов, а из количества уникальных значений текстовой фичи
источник

AB

Alexey Belyaev in catboost_ru
Andrey
Словарь не из 2 слов, а из количества уникальных значений текстовой фичи
источник

A

Andrey in catboost_ru
А я думаю, что чудес не бывает. Или можно подавать на вход что угодно в двоичном представлении, и расход ОЗУ автоматически уменьшится до требуемого для бинарных фич?
источник

A

Andrey in catboost_ru
Внутри катбуста происходит векторизация, и расход памяти в конечном итоге зависит от выбранной размерности векторного представления
источник

DK

Dmitriy Kruchinin in catboost_ru
Alexey Belyaev
Приветы!

Вопрос по текстовым фичам и безумному расходу памяти.

Есть датасет 1.5M строк: 12 категориальных фич, одна текстовая.

Эксперимента ради, чтобы понять масштаб проблемы, текстовая фича составлена следующим образом:
- в словаре два (!) слова: '0' и '555' – смысла не несут;
- из этих слов составлены предложения в текстовой фиче каждой строки;
- каждое предложение содержит не более 10 (обычно меньше) вхождений этих слов: '0 0 555 0 555 0' и тп.

Без использования текстовой фичи обучение забирает 5Г оперативки, с текстовой 15Г (!) без учета памяти GPU (8Г).

Параметры катбуста такие (взяты по умолчанию, но без биграмм):

dictionaries=['W:min_token_occurrence=5,max_dict_size=50000,token_level_type=Word'],
text_processing=['BoW+W'],

Вопросы:
- На обработку словаря из двух слов требуется 10Г памяти при том, что исходный датасет меньше 5Г – как так? =)
- Можно ли как-то это уменьшить (max_dict_size, разумеется, уменьшал, ни на что не влияет)
- Если это какое-то стандартное резервирование, то сколько памяти понадобится, например, для 5М строк (мой полный датасет – не уместилось в 32Г)?

Версия catboost==0.20
Можешь, пожалуйста, сделать issue на гитхабе? Мы посмотрим.
источник

AB

Alexey Belyaev in catboost_ru
Dmitriy Kruchinin
Можешь, пожалуйста, сделать issue на гитхабе? Мы посмотрим.
Окей, сделаю. А если бегло проанализировать, такое поведение ведь не является нормальным, если исходить из объяснений в вашем экземпле? Или у вас там дополнительная внутренняя логика немасштабируемая присутствует? Или нет issue, нет комментариев?)
источник

DK

Dmitriy Kruchinin in catboost_ru
15 гб в потолке? или до конца обучения?
сама текстовая фича может много весить до того момента пока не токенизировали (в вашем случае перевели в мапу {0: 'количество 0 в фиче', 1: 'количество 555 в фиче'} для семпла) поскольку это тип String
источник

DK

Dmitriy Kruchinin in catboost_ru
текущий BoW не учитывает количество вхождений в фичу -- поэтому он 0/1 и сжимается до 1 бита на токен, в вашем случае это будет 2 бита на семпл, меньше ui32 на GPU сейчас не пишется поэтому на 5 млн семплов каждый по 4 байта потребуется примерно 19Mb
источник

AB

Alexey Belyaev in catboost_ru
Dmitriy Kruchinin
15 гб в потолке? или до конца обучения?
сама текстовая фича может много весить до того момента пока не токенизировали (в вашем случае перевели в мапу {0: 'количество 0 в фиче', 1: 'количество 555 в фиче'} для семпла) поскольку это тип String
До конца обучения
источник

AB

Alexey Belyaev in catboost_ru
Dmitriy Kruchinin
Можешь, пожалуйста, сделать issue на гитхабе? Мы посмотрим.
источник

AB

Alexey Belyaev in catboost_ru
Также написал небольшой тестовый пример. Тут только одна фича, текстовая из двух слов '0' и '1', 5М сэмплов и 25G RAM 😵

import pandas as pd
import numpy as np
from catboost import CatBoostClassifier, Pool

n = 5000000
X = pd.DataFrame((' '.join((str(np.random.randint(2)) for _ in range(np.random.randint(10)))) for _ in range(n)),
                columns=['tf'])

Y = pd.Series(np.random.randint(2, size=n))

for_train = int(n * 0.7)
X_train, Y_train, X_val, Y_val = X[:for_train], Y[:for_train], X[for_train:], Y[for_train:]

model = CatBoostClassifier(iterations=2000, learning_rate=0.01,
                          depth=6,
                          max_ctr_complexity=2,
                          loss_function='Logloss',
                          task_type='GPU',
                          devices=[0],
                          dictionaries=['W:min_token_occurrence=5,max_dict_size=50000,token_level_type=Word'],
                          text_processing=['BoW+W'])

model.fit(X_train, Y_train, text_features=[0],
         eval_set=Pool(X_val, Y_val, text_features=[0]),
         early_stopping_rounds=20)
источник

DK

Dmitriy Kruchinin in catboost_ru
Alexey Belyaev
Также написал небольшой тестовый пример. Тут только одна фича, текстовая из двух слов '0' и '1', 5М сэмплов и 25G RAM 😵

import pandas as pd
import numpy as np
from catboost import CatBoostClassifier, Pool

n = 5000000
X = pd.DataFrame((' '.join((str(np.random.randint(2)) for _ in range(np.random.randint(10)))) for _ in range(n)),
                columns=['tf'])

Y = pd.Series(np.random.randint(2, size=n))

for_train = int(n * 0.7)
X_train, Y_train, X_val, Y_val = X[:for_train], Y[:for_train], X[for_train:], Y[for_train:]

model = CatBoostClassifier(iterations=2000, learning_rate=0.01,
                          depth=6,
                          max_ctr_complexity=2,
                          loss_function='Logloss',
                          task_type='GPU',
                          devices=[0],
                          dictionaries=['W:min_token_occurrence=5,max_dict_size=50000,token_level_type=Word'],
                          text_processing=['BoW+W'])

model.fit(X_train, Y_train, text_features=[0],
         eval_set=Pool(X_val, Y_val, text_features=[0]),
         early_stopping_rounds=20)
Спасибо! Будем разбираться
источник
2019 December 11

R

Ruslan in catboost_ru
Привет! Пытаюсь собрать проект локально командой ya make -r, сборка "висела" всю ночь, это нормально? Собираю на обычном ноутбуке core i7, 8Gb, windows 7.
источник

R

Ruslan in catboost_ru
Окружение VS Community 15.9.17
источник

SK

Stanislav Kirillov in catboost_ru
Висела без прогреса?
источник

SK

Stanislav Kirillov in catboost_ru
Что на консоль вывелось?
источник

R

Ruslan in catboost_ru
Stanislav Kirillov
Висела без прогреса?
Прогресс был, слева меньше процента, справа секунды считались.
источник

R

Ruslan in catboost_ru
Stanislav Kirillov
Что на консоль вывелось?
Прогресс, сборка одного модуля.
источник

R

Ruslan in catboost_ru
Надо было заскринить 🤦‍♂
источник