Silent bugs

Silent bugs

Evgenii Nikitin

В прошлом году мы заключили контракты на поставку наших систем в 18 регионах России. Кто-то согласился на облако, но для многих критическим условием был деплой в закрытом контуре региона. Регион закупает сервер с GPU и даёт нам какой-то доступ до этой машины для настройки. Где-то это было просто SSH-подключение из-под VPN, но есть варианты и позабористее.

В одном из регионов случился баг коммуникации, и закупили машину с видеокарточкой AMD. Я сразу сказал, что во избежание проблем рекомендую всё-таки заменить на NVIDIA, несмотря на то, что второй PyTorch вроде бы как официально поддерживает AMD. В итоге карту сумели заменить на какие-то старые теслы. Ещё один важный прикол - это оказался единственный регион с отечественной операционнкой Ред ОС (грубо говоря, импортозамещённый CentOS). В остальных регионах всё разворачивается либо на убунте, либо на её российском аналоге - Astra Linux.

В общем, всё задеплоили, чекнули работоспособность, коробочки рисуются, вероятности считаются. Через часик нам пишут клиенты - ребята, а зачем вы нас накормили голубцами с говном?

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

Быстро были проверены простые гипотезы:

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

На всякий случай я параллельно попросил развернуть у нас тачку с Ред Осом, чтоб удобнее было дебажить - на той тачке не было даже доступа к интернету. Но подозрения мои тем временем сдвинулись к видеокарте - я увидел, что это какие-то старинные Tesla M10 2016 года. Подробное изучение логов контейнера с нейронкой указало на такую строчку среди других сообщений о старте сервиса: error in DeformablePSROIPoolForward: no kernel image is available for execution on the device.

В сетке у нас используется хитрый деформабл пулинг типа такого, который компилируется и устанавливается в момент сборки образа. До этого проблем это не вызывало, но, очевидно, на карте со старой архитектурой работать он отказался. Проблема в том, что сделал он это весьма экстравагантным способом - пульнул одну строчку в логи при старте, а внутри сетки просто тихонечко отдавал нулевой тензор той же формы вместо правильного. Отсюда и хрень вместо предиктов. Быстрое и костыльное решение - устанавливать нужный пакет при старте контейнера с сеткой. Всё сразу прекрасно заработало.

Какие выводы можно сделать? Например, такие:

  • Сетки могут баговаться очень тихо.
  • Какой бы закрытый и защищённый контур ни был, настаивайте на прогоне базовых тестов и визуальном анализе хотя бы пары исследований.
  • В инференс-код нужно зашивать всякие проверки и сейфгарды, особенно если вы используете кастомные CUDA-модули.
  • С особой осторожностью подходите к деплою на старом (и новом) и незнакомом оборудовании.
  • Внимательно читайте логи.

Report Page