Вопрос или проблема
Мы используем модуль ультрааналитики Easy OCR для одного из приложений. Мы принимаем видеовход и обрабатываем его с помощью модуля для распознавания текста. Код работает нормально как на GPU, так и на CPU. Я развернул это на сервере одного из клиентов, используя Docker и Jenkins. Код действительно развертывается.
Но во время обработки видео он выдает ошибку [W1102 18:08:49.641464899 NNPACK.cpp:61] Не удалось инициализировать NNPACK! Причина: неподдерживаемое оборудование и вызывает сбой контейнера
Из этих строк можно сказать, что видео обрабатывалось перед тем, как произошло падение с ошибкой.
Скорость: 4.9мс предварительная обработка, 434.4мс вывод, 3.2мс постобработка на изображение при форме (1, 3, 384, 640)
Скорость: 3.2мс предварительная обработка, 401.5мс вывод, 1.9мс постобработка на изображение при форме (1, 3, 384, 640)
Ниже приведен файл requirements.txt, используемый в Docker-файле.
Flask==2.1.2
flask_cors==3.0.10
requests==2.27.1
ultralytics==8.0.134
Werkzeug==2.0.3
matplotlib>=3.2.2
numpy>=1.18.5
opencv-python-headless>=4.1.1 # Изменено на безголовную версию для сервера
Pillow<10.0.0 # Обеспечивает отсутствие проблемы 'ANTIALIAS'
PyYAML>=5.3.1
requests>=2.23.0
scipy>=1.4.1
tqdm>=4.64.0
tensorboard>=2.4.1
pandas>=1.1.4
seaborn>=0.11.0
ipython
psutil
thop>=0.1.1
Dockerfile
# Используйте официальный легковесный образ Python
FROM python:3.10-slim
# Установите переменную окружения
ENV USE_NNPACK=0
# Установите рабочую директорию
WORKDIR /app
# Скопируйте содержимое текущей директории в контейнер в /app
COPY . /app
# Установите системные зависимости
RUN apt-get update && \
apt-get install -y \
libgl1-mesa-glx \
libglib2.0-0 && \
rm -rf /var/lib/apt/lists/*
# Установите зависимости Python
COPY requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir -r requirements.txt && \
pip install easyocr==1.6.2 && \
pip uninstall -y opencv-python-headless opencv-python && \
pip install opencv-python
# Откройте порт приложения
EXPOSE 5001
# Запустите приложение
CMD ["python", "ANPR_Test.py"]
Ответ или решение
Ошибка инициализации NNPACK в вашем приложении, сопровождающаяся сообщением «Unsupported hardware», может быть вызвана несколькими факторами, связанными с конфигурацией окружения Docker и архитектурными особенностями самого сервера. В этом ответе мы рассмотрим основные причины этой ошибки и предложим возможные решения для ее устранения.
Причины проблемы
-
Аппаратная несовместимость: NNPACK (Neural Network PACK) — это библиотека, разработанная для оптимизации выполнения нейронных сетей на многоядерных процессорах. Если сервер вашей клиентской машины не поддерживает некоторые инструкции, требуемые для работы NNPACK (например, AVX, AVX2, или другие SIMD-инструкции), это может привести к ошибкам инициализации. Убедитесь, что CPU вашего сервера поддерживает необходимые инструкции.
-
Настройки окружения: Переменная окружения
USE_NNPACK=0
, которая установлена в вашем Dockerfile, отключает использование NNPACK. Вероятно, это было сделано в контексте тестирования на неподдерживаемом оборудовании, но в конечном счете, если вы хотите использовать NNPACK для улучшения производительности, вам следует убедиться, что это значение ожидаемо равно 1. -
Конфликты с зависимостями: Установка конфликтующих версий пакетов может привести к непредсказуемому поведению. Проверьте, правильно ли установлены версии зависимостей в вашем
requirements.txt
, и убедитесь, что они совместимы друг с другом.
Решения
-
Проверьте поддержку инструкций:
- Используйте утилиту, такую как
lscpu
илиcat /proc/cpuinfo
, для проверки поддерживаемых инструкций вашего процессора. Если ваша архитектура не поддерживает эти инструкции, вы можете рассмотреть возможность использования сервера с более современной аппаратной конфигурацией.
- Используйте утилиту, такую как
-
Настройка переменной окружения:
- Если ваш сервер поддерживает необходимые инструкции, измените установку переменной окружения на
ENV USE_NNPACK=1
в вашем Dockerfile. Не забудьте пересобрать образ Docker после внесенных изменений.
- Если ваш сервер поддерживает необходимые инструкции, измените установку переменной окружения на
-
Отключение NNPACK:
- Если ваше оборудование не поддерживает нужные инструкции и нет возможности его заменить, вы можете оставить использование NNPACK отключенным. В этом случае выполнить следующие шаги:
- Убедитесь, что переменная окружающей среды
USE_NNPACK
установлена в 0, как уже реализовано. - Рассмотрите возможность использования других оптимизаций, например, использование более ресурсоемких моделей или изменение настроек обработки видео для уменьшения нагрузки на систему.
- Убедитесь, что переменная окружающей среды
- Если ваше оборудование не поддерживает нужные инструкции и нет возможности его заменить, вы можете оставить использование NNPACK отключенным. В этом случае выполнить следующие шаги:
-
Тестирование:
- Перед развертыванием на облачном сервере, тестируйте приложение на локальной машине с аналогичными спецификациями, чтобы убедиться, что среда работает должным образом.
Заключение
Ошибка инициализации NNPACK может возникать как из-за аппаратных ограничений, так и из-за неправильной конфигурации окружения. Оцените характеристики вашего серверного оборудования. Если стабильно вы получаете данную ошибку, возможно, вам стоит рассмотреть альтернативные решения для обработки видео, которые не требуют использования NNPACK, или обновить оборудование вашего сервера. Учитывайте вышеперечисленные шаги, чтобы минимизировать вероятность возникновения подобных проблем в будущем.