Писать о практическом применении облачных технологий и машинного обучения так, чтобы у читателя не возникло желания с улыбкой вспомнить шутку про «эджайл, блокчейн и машин-лернинг», непросто. Но мы постараемся. 🙂 Чтобы показать, как все это работает не в теории, а в реальных крупных проектах, мы пообщались с по-настоящему серьезными парнями — технарями и менеджерами федеральной торговой площадки РТС-тендер.

Основная задача этой площадки — обеспечить проведение эффективных закупочных процедур в электронной форме в соответствии с требованиями регулятора, обеспечить гласность и прозрачность. Поставщики и заказчики сами ищут друг друга, а площадка предлагает инструменты для того, чтобы поставщики находили релевантные закупки, могли принять в них участие, а заказчики могли качественно повысить уровень конкуренции в закупках. Простыми словами, площадка помогает поставщикам и заказчикам найти друг друга. Задача не такая тривиальная, какой кажется на первый взгляд. Хотя для хранения данных о поставщиках и закупках не требуется огромных ресурсов, сам расчет рекомендаций довольно ресурсоемкая задача, нуждающаяся в значительных вычислительных мощностях. Для получения актуальных рекомендаций приходится применять технологии машинного обучения, но обо всем по порядку.

 

Как это работает?

Площадка РТС-тендер с помощью облачных сервисов Microsoft Azure решает одну важную задачу: предоставляет рекомендации для каждой из возможных пар «поставщик — закупка».

В общем процесс выглядит примерно так: анонимизированные данные об активности поставщиков выгружаются в облачную БД Azure SQL DB. Регулярно запускается сервис Azure Functions, он, в свою очередь, с помощью сервиса Azure Batch запускает пулы виртуальных машин, задача которых — организовать распределенные вычисления рекомендаций для поставщиков.

Сервис Batch удобен возможностью гибко масштабировать количество используемых вычислительных мощностей в зависимости от потребности в таких ресурсах. Рассчитанные рекомендации также хранятся в базе Azure SQL DB.

INFO

РТС-тендер — федеральная электронная площадка, уполномоченная для проведения госзакупок по 44-ФЗ, закупок в соответствии с 223-ФЗ, имущественных торгов, торгов по коммерческим закупкам, закупкам по капитальному ремонту общего имущества в многоквартирных домах в соответствии с 615-ПП РФ.

За время работы площадки суммарно по 44-ФЗ (94-ФЗ) и 223-ФЗ было проведено порядка двух миллионов торгов на сумму свыше 5,4 триллиона рублей. Площадка имеет широкую сеть из пяти филиалов и 28 представительств в регионах РФ.

Стратегическими партнерами площадки являются: ПАО «Совкомбанк», общественная организация малого и среднего предпринимательства «ОПОРА РОССИИ», общественная организация «Ассоциация заказчиков и поставщиков» и общероссийская общественная организация Российский союз промышленников и предпринимателей.

 

Выбор облачной платформы

Почему была выбрана платформа Azure, а не, скажем, тот же Amazon? Решающим фактором при выборе облачной платформы стало то, что компания РТС-тендер — золотой партнер компании Microsoft. Благодаря этому имелась возможность оперативно получить помощь от специалистов Microsoft на начальном этапе внедрения новых технологий, что очень важно для любого серьезного проекта. Да и в функциональности продуктов Microsoft никто не сомневался. Их доля на рынке облачных технологий, сравнимая с долей Amazon, говорит сама за себя.

Кроме того, компания уже накопила значительный опыт в работе с продуктами Microsoft, который используется и при внедрении облачных сервисов этого вендора.

 

Методы и технологии машинного обучения, используемые в проекте

На этапе использования облачных сервисов главной целью компании было построить продуктивную систему инференса (расчета рекомендаций) на больших объемах данных, а также доставку результатов непосредственно к пользователям. Обучение пока происходит на собственных вычислительных ресурсах компании РТС-тендер. Полученные модели сериализуются и затем используются в облаке для расчета рекомендаций.

Рекомендации рассчитываются на основе готовых алгоритмов из открытых библиотек, таких как, например, библиотека машинного обучения sklearn. При этом компания экспериментирует и пробует разные методы — линейные модели, деревья решений, нейронные сети, ансамблевые методы, выбирая в итоге те, которые показывают наилучший результат на обрабатываемых данных.

WWW

Scikit-learn (sklearn) — это библиотека для языка Python, в которой реализовано большинство алгоритмов машинного обучения. С помощью этой библиотеки можно реализовать некоторое подобие искусственного интеллекта.

Scikit-learn взаимодействует с библиотеками NumPy и SciPy. Дополнительную информацию можно получить в официальном руководстве. Также будет полезен сборник примеров.

 

Наиболее эффективные методы рекомендательной системы

Для целей рекомендательной системы были выбраны ансамблевые методы на основе решающих деревьев, поскольку они лучше работают на задачах ранжирования в нашем случае, а также обеспечивают необходимый баланс точности и скорости инференса.

 

Деревья решений

Деревья решений (деревья принятия решений, регрессионные деревья, Classification and Regression Trees, CART) — средство принятия решений, использующееся в статистике и анализе данных для моделей прогнозов. Структура дерева представляет собой «листья» и «ветки». На ребрах («ветках») дерева решения записаны атрибуты, от которых зависит целевая функция, в «листьях» записаны значения целевой функции, а в остальных узлах — атрибуты, по которым различаются случаи.

Деревья решений также реализованы в библиотеке Scikit-learn. Загрузить поддержку решений можно так:

from sklearn.tree import DecisionTreeClassifier

Небольшой пример кода:

## Decision Tree Classifier
from sklearn import datasets
from sklearn import metrics
from sklearn.tree import DecisionTreeClassifier

## Загрузка данных iris
dataset = datasets.load_iris()
## Настройка модели CART по выборке данных
model = DecisionTreeClassifier()
model.fit(dataset.data, dataset.target)
print(model)

## Прогноз
expected = dataset.target
predicted = model.predict(dataset.data)
## Оценка качества работы предсказательной модели
print(metrics.classification_report(expected, predicted))
print(metrics.confusion_matrix(expected, predicted))

 

Приятие решений, или как понять, что поставщику подходит определенная закупка?

У компании есть большой массив исторических данных о проведенных на площадке торгах. На основе этих данных «натаскивают» модель машинного обучения, рассчитывающую количественную оценку потенциального интереса поставщиков к тем или иным закупкам, для которых открыт прием заявок на участие. Таким образом, можно индивидуально для каждого поставщика выдавать подборку закупок, которые могут его заинтересовать.

Массив исторических данных — это завершившиеся закупки и заявки поставщиков на участие в этих закупках. И закупки, и заявки хранятся в виде таблиц в базе данных.

Решение принимается на основе оценки сочетаемости поставщика, имеющего какую-то историю заявок, с каждой из вновь появляющихся на площадке закупок.
До вывода новых моделей в продуктив специалисты компании тщательно тестируют их офлайн при помощи различных метрик качества, а потом также проводят онлайн-тесты, то есть А/Б-тестирование.

Специалисты РТС-тендер постоянно мониторят рекомендации в продуктивной системе. Хотя какая-то их часть может оказаться нерелевантной, она не столь значительна, да и небольшое количество «плохих» рекомендаций бывает, как говорится, by design. Ведь нужно стремиться не только повысить точность рекомендаций и показывать максимально релевантные закупки, но также и увеличить такую метрику, как полнота, стараясь предоставить поставщику максимальный выбор закупок.

Иначе говоря, нулевое количество нерелевантных рекомендаций можно показать, только если совсем не показывать рекомендацию. 🙂 С другой стороны, модели не только отбирают закупки для каждого поставщика, но и правильно их ранжируют. То есть редкие малорелевантные для поставщика закупки окажутся у него в самом низу списка рекомендованных закупок.

 

Средства тестирования

Прежде чем выводить новую модель окончательно в продуктив, компания тестирует ее на небольшом (в пределах 10%) количестве поставщиков. Проводится ряд статистических тестов (utest, chi-squared test, bootstrap), чтобы убедиться, что модель работает, как ожидалось.

Систему тестирования компания РТС-тендер продолжает дорабатывать для себя самой, сторонних средств автоматизации не используется.

 

Необходимые ресурсы

С точки зрения базы данных много ресурсов для реализации подобного проекта не требуется, рекомендательная система использует довольно простые базы объемом в несколько десятков гигабайт. Но все равно это дополнительные ресурсы хранилища, памяти и вычислительной мощности, которые развернуть в облаке получилось более оперативно, чем выделить в своем дата-центре.

А вот расчет рекомендаций — это уже тяжелая задача, на которую могут выделяться десятки (а в будущем, возможно, и сотни) виртуальных машин одновременно в зависимости от сложности пайплайнов и моделей машинного обучения.

 

Основные процессы обработки данных

Новые актуальные данные выгружаются постоянно, и они всегда готовы к использованию. Есть два основных процесса, которые используют эти данные:

  1. Расчет рекомендаций. В этом процессе выполняются загрузка актуальных данных из базы, необходимые преобразования данных (препроцессинг), инференс на преобразованных данных, выгрузка результатов обратно в облачную базу.
  2. Предоставление готовых рекомендаций для того или иного поставщика по запросу от электронной площадки РТС-тендер, с какой-то фильтрацией на основе исходных данных.
 

Механизм распределенных вычислений рекомендаций

Для инференса используется сервис Azure Batch, который предоставляет удобные инструменты распараллеливания расчетов, как бы пряча под капот процессы управления очередью, балансировки нагрузки, обработки проблем с недоступностью нод (виртуальных машин пула). При регулярном расчете рекомендаций процесс может выглядеть следующим образом:

  • Регулярно по тайм-триггеру запускается функция сервиса Azure Functions, создающая пул в аккаунте сервиса Azure Batch, которому передает все необходимые скрипты.
  • Начальный скрипт загружает актуальные данные из базы Azure SQL в хранилище Azure Storage, создавая необходимые контейнеры для входящих и исходящих данных. Также доустанавливается некоторый дополнительный софт на нодах.
  • Сценарий с помощью встроенных методов Azure Batch отправляет сервису задачи, распараллеленные по поставщикам. То есть каждая задача обрабатывает только небольшую часть поставщиков.
  • Сервис Azure Batch автоматически направляет задачи на ноды из очереди задач, каждая нода выполняет множество задач. При этом в пуле разворачивается столько нод, сколько требуется для выполнения задач, но с задаваемым пользователем ограничением по количеству нод в пуле.
  • На каждую ноду также направляется исполняющий скрипт, который для каждой задачи загружает данные из хранилища и рассчитывает рекомендации по содержащимся в задаче поставщикам, а после расчета выкладывает рекомендации в базу Azure SQL DB или в хранилище Azure Storage.
  • После завершения расчетов и выгрузки их результатов виртуальные машины удаляются из пула для экономии средств компании.

Вот так работает площадка РТС-тендер. Надеемся, приведенная информация будет полезна при реализации других проектов машинного обучения. Также обрати внимание на врезки, в которых содержится дополнительная полезная инфа.

Линейные модели описывают поведение непрерывной переменной как функции одной или нескольких переменных. Используются для понимания и предсказания поведения сложных систем или анализа экспериментальных, финансовых и биологических данных.

Нейронные сети — это модели (а также их программная/аппаратная реализация), построенные по принципу организации и функционирования биологических сетей нервных клеток живого организма. Библиотека Scikit-learn поддерживает нейронные сети, начиная с версии 0.18. Заинтересовавшиеся могут ознакомиться со статьей Хосе Портиллы A Beginner’s Guide to Neural Networks.

Chi-squared test — статистическая проверка, которая выявляет значимость расхождения распределения выборки и нормального распределения. Данный вид тестирования доступен в библиотеке SciPy.

Utest — библиотека для модульного тестирования в Python. Поддерживается только Python 3. Дополнительная информация и примеры доступны по ссылке.

Bootstrapped — это библиотека Python, позволяющая создавать доверительные интервалы из набора данных. Это полезно в том числе для A/B-тестирования. Код библиотеки и примеры использования доступны по ссылке. Еще одна очень рекомендуемая к прочтению статья.

Небольшой пример:

import numpy as np
import bootstrapped.bootstrap as bs
import bootstrapped.stats_functions as bs_stats

mean = 100
stdev = 10

population = np.random.normal(loc=mean, scale=stdev, size=50000)

## Возьмем 1000 образцов из population
samples = population[:1000]

print(bs.bootstrap(samples, stat_func=bs_stats.mean))
>> 100.08 (99.46, 100.69)

print(bs.bootstrap(samples, stat_func=bs_stats.std))
>> 9.49 (9.92, 10.36) 

 

Заключение

Площадка РТС-тендер — яркий пример применения на практике всевозможных средств машинного обучения. Надеюсь, она послужит стимулом для разработки других полезных проектов.

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии