- Груздев Александр - ML
- Рыжичкин Кирилл - ML
- Литвинов Максим - ML
- Аксеновский Максим - ML
- Замышевская Арина - ML
Презентация: тык
Итоговое решение представляет собой ансамбль из градиентных бустингов, обученных с применением признаков, полученных без использования моделей глубокого обучения и с использованием различных модификаций модели BERT. Для каждого тестового семпла делается два предсказания:
- Предсказание от 5 моделей, которые обучались на всех тренировочных данных с различными сидами, чтобы исключить влияние рандома
- Предсказание от 5 моделей, которые обучались на данных из конкретной категории второго уровня с различными сидами
Итоговые предсказания моделей суммируются и усредняются, а после блендятся с весами
Модель rubert-tiny-2 использовалась для генерации OOF признаков по атрибутам и по описаниям товара, соответственно. Модель distilbert-base-multilingual-cased использовалась для генерации OOF признаков только по атрибутам.
Код обучения моделей и получения OOF предсказаний: тык
Веса моделей, используемые для инференса:
Модели градиентного бустинга: Ссылка для скачивания
Процедура обучения моделей градиентного бустинга описана в файле train_boosting_models.py для общей модели и для категориальных моделей.
В процессе хакатона командой использовались следующие ресурсы для обучения моделей и генерации признаков:
- VK CLOUD SERVER, 128 Gb RAM 16 CPU Intel Ice Lake;
- Kaggle GPU accelerated environment (P100);
- Персональные компьютеры (ПК) членов команды.
В связи с этим, для воспроизведения полного пайплайна рекомендуется убедиться, что ресурсов системы достаточно. Так как, например, во время генерации признаков на тренировочном датасете может сильно скакать потребление памяти и, следовательно, объем затраченного времени.
Команда приносит свои извинения за то, что код не идеально оптимизирован, и занимает так много времени для генерации признаков для тренировки
Чтобы воспроизвести решение:
-
Создайте виртуальное окружение, активируйте его и установите необходимые библиотеки
python -m venv venv source venv/bin/cativate pip install -r requirements.txt
-
Убедитесь, что в репозитории находится папка data, имеющая следующую структуру:
/project-root-folder ├── data │ ├── train │ │ ├── train.parquet │ │ ├── attributes.parquet │ │ ├── text_and_bert.parquet │ │ ├── resnet.parquet │ ├── test │ │ ├── test.parquet │ │ ├── attributes_test.parquet │ │ ├── text_and_bert_test.parquet │ │ ├── resnet_test.parquet
-
Запустите файл generate_features_train.py
- Запустится генерация признаков на основе тренировочных данных (Файл generate_features_train.py, вызовет последовательно файлы data_preprocessing.py и feature_generation.py)
- Полученные паркеты с данными будут сохранены в data/train/.
-
Запустите файл bert_training.py
- Запустится обучение open_source моделей
- Веса моделей будут сохранены в models/BERT/
-
Запустите файл train_boosting_models.py
- Запустится скрипт обучения моделей градиентного бустинга на основе ранее полученных паркетов
- Полученные модели будут сохранены в models/CATBOOST (общая модель) и в models/CATBOOST/categories (модели для категорий)
-
Запустите файл make_submission.py
- В папке data будет создан файл submission.csv, содержаший предсказания вероятностей для каждой пары из test.parquet
- Для инференса через систему CI/CD веса моделей бустинга пушились прямо в репо, веса "тяжелых" моделей и обученные векторизаторы скачивались во время сборки docker контейнера. В связи с этим, для инференса можно скачать необходимые веса и модели напрямую. Также для локального инференса open_source моделей необходимо или скачать их базовые pretrained версии вручную по ссылкам, либо использовать команды:
huggingface-cli download cointegrated/rubert-tiny2 --local-dir='./models/basemodel/rubert' && \
huggingface-cli download distilbert-base-multilingual-cased --local-dir='./models/basemodel/distilbert'
Если команда выдает ошибку, то установите huggingface-cli
pip install huggingface-hub
- Папка notebooks содержит ноутубки, которые могут содержать куски кода для обучения признаков и/или моделей, которые не вошли в итоговое рещение. Они прикладываются исключительно с целью ознакомления и, скорее всего, могут содержать ошибки:
- Exploratory Data Analysis - содержит разведочный анализ данных
- Preprocessing & Feature Generation for Train - генерация основных признаков для обучающей выборки
- Preprocessing & Feature Generation for Test - генерация основных признаков для тестовой выборки
- Bert (Name + Attrs) OOF Predictions - получение OOF предсказаний BERT по атрибутам
- Bert (Name + Attrs) Full Training - полное обучение модели BERT на атрибутах
- Bert (Name + Desc) OOF Predictions - получение OOF предсказаний BERT по описаниям
- Bert (Name + Desc) Full Training - полное обучение модели BERT на описаниях
- Bert Inference - пример инференса BERT
- FastText Training - обучение FastText модели на описаниях
- Sampling from Train Dataset - сэмплирование выборки, похожей на тестовую по распределению категорий трёх уровней, из обучающей выборки
- Siamese Bert (Name + Attrs) Training - обучение представлений для атрибутов товаров на примере сиамской нейросети
- Siamese Bert (Name + Desc) Training - обучение представлений для описаний товаров на примере сиамской нейросети
- Transitive Chains - расширение обучающей выборки с помощью транзитивных цепочек
Запустить решение возможно используя функционал docker. Для того, чтобы собрать образ решения выполните
docker build . -t matching_object
После сборки контейнера вы можете запустить инференс используя команду
docker run -it --network none --shm-size 2G --name matching_object -v ./data:/app/data matching_object python make_submission.py
Также внутри докер контейнера есть возможность запускать другие .py файлы решения, используя, соответственно
docker run -it --network none --shm-size 2G --name matching_object -v ./data:/app/data matching_object python {sciptname.py}
Однако, в виду того, что при сборке контейнера скачиваются все веса и библиотеки, запуск может занимать много времени.