Pull to refresh

Comments 16

Интересная статья. Вопрос: как вы "продукционализируете" модели? Например, алгоритмы из scikit-learn запускаются в питоне в 1 поток (имеется ввиду поток управления, numpy под капотом иногда параллелится по ядрам — думаю, того же tensorflow это тоже касается); пишете ли какие-то свои обвязки для распараллеливания? Используете ли готовые библиотеки? Как параллелится обработка входных данных?


Другими словами, от исследовательского "я запилил модель в notebook" до "вот смотрите как у нас круто на проде" проходит (наверно) много времени и технической работы программистов по внедрению "ноутбука" в продакшн. Поделитесь опытом?

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

Чтобы эту модель было возможно (и удобно) эксплуатировать в продакшене, нужно, как минимум:
— написать для нее «человеческое» HTTP API, которое будет возвращать вместо тензоров и весов названия классов («собака», «кошка»), вероятности или что-то подобное;
— настроить очереди задач и мониторинги для новой модели;
— если исследователь использует фреймворк, о котором vision еще не знает, то предстоит написать оболочку вокруг этого фреймворка и встроить ее в vision;
— полностью переписать скрипт исследователя, т.к. vision для запуска нейросетей использует С++ код;

Насчет фреймворков и оболочек над ними. Нейросетевых фреймворков существует довольно много — некоторые удобны для исследователей, у некоторых богаче набор слоев, у некоторых — быстрый инференс. Vision, навскидку, умеет работать с torch, pytorch, caffe, caffe2, tensorflow, но абстракции верхнего уровня мало что знают о конкретных реализациях — это позволяет иметь один и тот же код для работы с очередями задач, метриками, изображениями и прочей обвязкой.
Кстати, NVIDIA, TF и так далее уже написали API для моделей — позволяющее их динамически загружать и вызывать извне. У первой — это TRT Server и DeepStream, у второй — Serving.
Стоит зайти в BIOS и выбрать режим performance. Тогда процессор будет всё время работать на максимальной частоте.

Тем самым вы отключите Turbo Boost и процессор всегда будет работать на номинальной частоте. В общем случае лучше выставить такие настройки энергосбережения:
Скрытый текст
Power & Performance:
CPU Power and Performance Policy: Balanced Performance
Workload Configuration: Balanced

Power & Performance > CPU P State Control:
Enhanced Intel Speed Step: Enabled
Intel Turbo Boost Technology: Enabled
Energy Effecient Turbo: Disabled

Power & Performance > CPU C State Control:
CPU C-State: Enabled
C1E Autopromote: Enabled
Processor C3: Enabled
Processor C6: Enabled

System Acoustic and Performance Configuration:
Set Fan Profile: Performance
C-State настоятельно не рекомендую включать, по практике тех же HP будет плохо)

C-стейты не любит всякий рилтайм, где критична равномерность выполнения кода, но там и P-стейтам не место.

Тем самым вы отключите Turbo Boost и процессор всегда будет работать на номинальной частоте.

можете немного раскрыть мысль? почему Turbo Boost отключается в режиме performance?
Maximum Performance отключает C- и P-стейты, так что у ЦП почти не остаётся запаса по TDP и Turbo Boost считается как при всех загруженных ядрах — на Skylake он хоть как-то работает, а с Broadwell было совсем грустно.

Подробно описано в книжке, главное не пугайтесь слова VMware в названии, там половину занимает общая теория, которая применима везде.

А можете сказать какие масштабы инсталляции? Сколько видеокарт? Сколько видеокарт на одном сервере? Как часто выходят из строя видеокарты? И какими вы пользуетесь?

В настоящее время от сотни до двух сотен серверов. На сервере в подавляющем большинстве случаев 4 видеокарты.
Я немного сомневаюсь на счет того, что могу указать тут прямо конкретные модели видеокарт, поэтому просто скажу — nvidia.
Насчет выхода из строя, примерно так: один раз за два года в одной видеокарте сломались вентиляторы.
И иногда, примерно раз в полгода, на некоторых видеокартах возникает ситуация, когда любое обращение к GPU провоцирует ошибку наподобие «GPU is lost. Reboot the system to recover this GPU» — на такие ошибки, конечно, должен быть настроен мониторинг.

PS: кстати, насчет конкретных моделей видеокарт. разные поколения GPU поддерживают разные наборы команд. поэтому, в том числе, приходится собирать нейросетевые фреймворки «руками», вручную указывая набор поддерживаемых архитектур.

Спасибо за ответ! Наша инсталляция примерно в шесть раз меньше. И мы изучаем наиболее подходящую платформу для видеокарт.
Пока устаканились на 4 или 8 видеокарт на сервер. Ну и да, тоже nvidia.


А про мониторинг, есть ли у вас в открытом доступе обертка над nvidia-smi? Или, скажите а как и какие метрики снимаете?

На самом деле, сама nvidia-smi — обертка над библиотекой libnvidia-ml.so, которая является частью cuda.
Она позволяет делать довольно сложные запросы к железу, например — вывести всякие важные показатели в формате csv, повторять раз в секунду:
$ nvidia-smi --query-gpu=index,timestamp,power.draw,clocks.sm,clocks.mem,clocks.gr,utilization.gpu,utilization.memory,temperature.gpu --format=csv -l 1

0, 2019/10/27 17:58:48.593, 17.28 W, 135 MHz, 405 MHz, 135 MHz, 0 %, 0 %, 36
0, 2019/10/27 17:58:49.596, 17.37 W, 135 MHz, 405 MHz, 135 MHz, 0 %, 0 %, 36

вывод этой команды можно ловить однострочником и складывать в графит или другую БД с метриками )

А мы пока что, по историческим причинам, используем libnvidia-ml.so напрямую — делать это тривиально, а библиотека прекрасно документирована. Выглядит примерно так (проверка ошибок опущена):
#include <nvml.h>

nvmlInit();

int device_id = 0;
nvmlDevice_t device;
nvmlDeviceGetHandleByIndex(id, &device);

nvmlTemperatureSensors_t sensors = NVML_TEMPERATURE_GPU;
unsigned int t = 0;
nvmlDeviceGetTemperature(device, sensors, &t);  // в t записывается температура GPU

Снимаем, насколько помню, как минимум температуру, память и утилизацию.
А обязательно ли иметь установленную графическую оболочку для этого?

Например, у нас не получается управлять кулерами на видеокарте, без графики

DISPLAY=:0 XAUTHORITY=/var/run/lightdm/root/:0 /usr/bin/nvidia-settings -a [gpu:0]/GpuFanControlState=1 -a [fan:0]/GPUTargetFanSpeed=100
Под графической оболочкой имеется в виду что-то вроде gnome или kde?
Нет, у нас ничего такого на серверах не стоит.
Только драйверы к gpu.
TensorRT — штука хорошая, но сконвертированные в нее модели обязательно валидировать — особенно если они на Keras/TensorFlow. Даже если все слои поддерживаются — результат выполнения модели на тех же данных может сильно отличаться. Это происходит из-за того, что авторы TensorRT делали «как в PyTorch» (если я правильно помню) — а он отличается от вышеназванных некоторыми деталями padding-ов и других преобразований.
Sign up to leave a comment.