Комментарии 16
Интересная статья. Вопрос: как вы "продукционализируете" модели? Например, алгоритмы из scikit-learn запускаются в питоне в 1 поток (имеется ввиду поток управления, numpy под капотом иногда параллелится по ядрам — думаю, того же tensorflow это тоже касается); пишете ли какие-то свои обвязки для распараллеливания? Используете ли готовые библиотеки? Как параллелится обработка входных данных?
Другими словами, от исследовательского "я запилил модель в notebook" до "вот смотрите как у нас круто на проде" проходит (наверно) много времени и технической работы программистов по внедрению "ноутбука" в продакшн. Поделитесь опытом?
Чтобы эту модель было возможно (и удобно) эксплуатировать в продакшене, нужно, как минимум:
— написать для нее «человеческое» HTTP API, которое будет возвращать вместо тензоров и весов названия классов («собака», «кошка»), вероятности или что-то подобное;
— настроить очереди задач и мониторинги для новой модели;
— если исследователь использует фреймворк, о котором vision еще не знает, то предстоит написать оболочку вокруг этого фреймворка и встроить ее в vision;
— полностью переписать скрипт исследователя, т.к. vision для запуска нейросетей использует С++ код;
Насчет фреймворков и оболочек над ними. Нейросетевых фреймворков существует довольно много — некоторые удобны для исследователей, у некоторых богаче набор слоев, у некоторых — быстрый инференс. Vision, навскидку, умеет работать с torch, pytorch, caffe, caffe2, tensorflow, но абстракции верхнего уровня мало что знают о конкретных реализациях — это позволяет иметь один и тот же код для работы с очередями задач, метриками, изображениями и прочей обвязкой.
Стоит зайти в BIOS и выбрать режим performance. Тогда процессор будет всё время работать на максимальной частоте.
Тем самым вы отключите Turbo Boost и процессор всегда будет работать на номинальной частоте. В общем случае лучше выставить такие настройки энергосбережения:
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
Тем самым вы отключите Turbo Boost и процессор всегда будет работать на номинальной частоте.
можете немного раскрыть мысль? почему Turbo Boost отключается в режиме performance?
Подробно описано в книжке, главное не пугайтесь слова VMware в названии, там половину занимает общая теория, которая применима везде.
А можете сказать какие масштабы инсталляции? Сколько видеокарт? Сколько видеокарт на одном сервере? Как часто выходят из строя видеокарты? И какими вы пользуетесь?
Я немного сомневаюсь на счет того, что могу указать тут прямо конкретные модели видеокарт, поэтому просто скажу — nvidia.
Насчет выхода из строя, примерно так: один раз за два года в одной видеокарте сломались вентиляторы.
И иногда, примерно раз в полгода, на некоторых видеокартах возникает ситуация, когда любое обращение к GPU провоцирует ошибку наподобие «GPU is lost. Reboot the system to recover this GPU» — на такие ошибки, конечно, должен быть настроен мониторинг.
PS: кстати, насчет конкретных моделей видеокарт. разные поколения GPU поддерживают разные наборы команд. поэтому, в том числе, приходится собирать нейросетевые фреймворки «руками», вручную указывая набор поддерживаемых архитектур.
Спасибо за ответ! Наша инсталляция примерно в шесть раз меньше. И мы изучаем наиболее подходящую платформу для видеокарт.
Пока устаканились на 4 или 8 видеокарт на сервер. Ну и да, тоже nvidia.
А про мониторинг, есть ли у вас в открытом доступе обертка над nvidia-smi? Или, скажите а как и какие метрики снимаете?
обертка над nvidia-smi
Она позволяет делать довольно сложные запросы к железу, например — вывести всякие важные показатели в формате 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
Высоконагруженный сервис для вычислений на GPU