Недавно я потратил некоторое время на решение проблемы с задержкой в ​​одном из наших сервисов машинного обучения, который построен с использованием Python и множества библиотек машинного обучения Python, включая numpy, scipy, sklearn и pandas. Оказывается, виноваты sklearn и pandas.

sk-learn реализован на чистом языке Python (поправьте меня, если я ошибаюсь), что неизбежно приводит к некоторым проблемам с задержкой из-за неэффективности языка Python. В нашем случае мы обнаружили, что одна функция sk-learn, sklearn.preprocessing.MultiLabelBinarizer, вызывает задержку около 80 мс при преобразовании слов в векторы. Это немного удивительно, так как это должен быть просто поиск по словарю. К счастью, на сайте sk-learn они предоставляют исходный код, чтобы я мог посмотреть, как они его реализуют.

По-видимому, они не кэшируют словарь, и при вызове эта функция создаст словарь на лету, и поэтому это стоило нашему сервису около 80 мс ненужной задержки.

Кстати, 80 мс кажутся маленькими и игнорируемыми, когда вы думаете об обучении алгоритмов глубокого обучения на машинах с графическим процессором за несколько дней, однако это значительная задержка, которую мы не можем себе позволить в онлайн-сервисе, где общий бюджет задержки составляет около 200 млн. ~ 500 мс.

В конце концов, мне пришлось сделать уродливый «патч», чтобы обойти это, не внося серьезных изменений в коды. Я очень надеюсь, что sk-learn может предоставить функцию для создания словаря и сохранения словаря как части объекта.

Точно так же я обнаружил, что создание Pandas DataFrame потребует значительных накладных расходов. В качестве синтаксического сахара его не стоит использовать в срочных сценариях, таких как онлайн-сервисы.

Numpy, с другой стороны, это шедевр ИМО. Матричные операции Numpy используют SSE и быстро сокращаются в матричных операциях. Он может умножить вектор 100x1 на огромную матрицу 100x1 000 000 за 100 мс. То есть найти ближайшего соседа из 1 миллиона выборок в 100-мерном пространстве за 100 мс. Это настолько быстро, что делает алгоритмы ANN (приблизительный ближайший сосед) ненужными в приложениях среднего размера, которые имеют около пары миллионов выборок.

Я считаю, что sk-learn со временем будет развиваться, и мне не нужно будет беспокоиться об этом в будущем. А пока будьте осторожны.