Перейти к основному содержимому

Аппаратное ускорение машинного обучения

Эта функция позволяет использовать GPU для ускорения задач машинного обучения, таких как интеллектуальный поиск и распознавание лиц, при этом снижая нагрузку на CPU. Так как это новая функция, она все еще экспериментальная и может не работать на всех системах.

информация

Вам не нужно повторно запускать задания машинного обучения после включения аппаратного ускорения. Устройство ускорения будет использоваться для всех заданий, которые запускаются после его включения.

Поддерживаемые бэкенды

Ограничения

  • Инструкции и конфигурации здесь специфичны для Docker Compose. Другие контейнерные движки могут требовать другой конфигурации.
  • Поддерживаются только серверы Linux и Windows (через WSL2).
  • ARM NN поддерживается только на устройствах с Mali GPU. Другие устройства Arm не поддерживаются.
  • Некоторые модели могут быть несовместимы с определенными бэкендами. CUDA является наиболее надежным.
  • Задержка при поиске не улучшается с ARM NN из-за проблем с совместимостью моделей, которые препятствуют его использованию. Однако задания умного поиска используют ARM NN.

Предварительные условия

ARM NN

  • Убедитесь, что у вас установлен соответствующий драйвер ядра Linux.
    • Обычно он предварительно установлен в Linux-образах поставщика устройства.
  • В хостовом сервере должен быть доступен /dev/mali0.
    • Вы можете подтвердить это, выполнив ls /dev, чтобы проверить существование этого файла.
  • У вас должна быть закрытая прошивка libmali.so (возможно, с дополнительным файлом прошивки).
    • Где и как получить этот файл, зависит от устройства и поставщика, но обычно поставщик устройства также предоставляет их.
    • Файл hwaccel.ml.yml предполагает, что путь к нему — /usr/lib/libmali.so, так что обновите его соответственно, если он находится в другом месте.
    • Файл hwaccel.ml.yml предполагает наличие дополнительного файла /lib/firmware/mali_csffw.bin, так что обновите его соответственно, если драйвер вашего устройства не требует этого файла.
  • Необязательно: настройте ваш файл .env, см. переменные окружения для параметров, специфичных для ARM NN.
    • В частности, MACHINE_LEARNING_ANN_FP16_TURBO может значительно улучшить производительность в обмен на очень небольшую потерю точности.

CUDA

  • GPU должен иметь вычислительную способность 5.2 или выше.
  • На сервере должен быть установлен официальный драйвер NVIDIA.
  • Установленный драйвер должен быть >= 545 (он должен поддерживать CUDA 12.3).
  • На Linux (за исключением WSL2) вам также необходимо установить NVIDIA Container Toolkit.

ROCm

  • GPU должен поддерживаться ROCm. Если он официально не поддерживается, вы можете попытаться использовать переменную окружения HSA_OVERRIDE_GFX_VERSION: HSA_OVERRIDE_GFX_VERSION=<поддерживаемая версия, например, 10.3.0>. Если это не сработает, возможно, вам также нужно будет установить HSA_USE_SVM=0.
  • Образ ROCm довольно большой и требует как минимум 35GiB свободного места на диске. Однако загрузка последующих обновлений сервиса через Docker, как правило, займет всего несколько сотен мегабайт, так как остальное будет кэшировано.
  • Этот бэкенд новый и может столкнуться с некоторыми проблемами. Например, потребление энергии GPU может быть выше обычного после выполнения вывода, даже если служба машинного обучения простаивает. В этом случае потребление энергии нормализуется только через 5 минут простоя (настраивается с помощью параметра MACHINE_LEARNING_MODEL_TTL).

OpenVINO

  • Интегрированные GPU с большей вероятностью сталкиваются с проблемами, чем дискретные GPU, особенно для старых процессоров или серверов с низким объемом оперативной памяти.
  • Убедитесь, что версия ядра сервера достаточно новая для использования устройства для аппаратного ускорения.
  • Ожидайте большего использования оперативной памяти при использовании OpenVINO по сравнению с обработкой на CPU.

RKNN

  • У вас должен быть поддерживаемый SoC Rockchip: на данный момент поддерживаются только RK3566, RK3568, RK3576 и RK3588.
  • Убедитесь, что у вас установлен соответствующий драйвер ядра Linux.
    • Обычно он предварительно установлен в Linux-образах поставщика устройства.
  • В хостовом сервере должен быть доступен драйвер RKNPU версии V0.9.8 или более поздней.
    • Вы можете подтвердить это, выполнив cat /sys/kernel/debug/rknpu/version, чтобы проверить версию.
  • Необязательно: настройте ваш файл .env, см. переменные окружения для параметров, специфичных для RKNN.
    • В частности, установка значения MACHINE_LEARNING_RKNN_THREADS равным 2 или 3 может значительно улучшить производительность для RK3576 и RK3588 по сравнению с настройкой по умолчанию равной 1, за счет увеличения объема оперативной памяти, используемой каждой моделью.

Настройка

  1. Если вы еще не сделали это, загрузите последний файл hwaccel.ml.yml и убедитесь, что он находится в той же папке, что и docker-compose.yml.
  2. В файле docker-compose.yml в разделе immich-machine-learning раскомментируйте раздел extends и измените cpu на соответствующий бэкенд.
  3. По-прежнему в разделе immich-machine-learning, добавьте одно из -[armnn, cuda, rocm, openvino, rknn] в тэг раздела image в конце строки.
  4. Разверните контейнер immich-machine-learning с этими обновленными настройками.

Подтверждение использования устройства

Вы можете подтвердить, что устройство распознается и используется, проверив его использование. Существует множество инструментов для отображения этого, например, nvtop для NVIDIA или Intel, intel_gpu_top для Intel и radeontop для AMD.

Вы также можете проверить журналы контейнера immich-machine-learning. Когда начинается задача Smart Search или Face Detection, или когда вы выполняете поиск в Immich с текстом, вы должны увидеть либо запись с Available ORT providers, содержащую соответствующий провайдер (например, CUDAExecutionProvider для CUDA), либо запись журнала Loaded ANN model без ошибок в случае ARM NN.

Один файл Compose

Некоторые платформы, включая Unraid и Portainer, не поддерживают несколько файлов Compose на момент написания. Как альтернатива, вы можете «инлайнить» соответствующее содержимое файла hwaccel.ml.yml непосредственно в сервис immich-machine-learning.

Например, секция cuda в этом файле выглядит так:

deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities:
- gpu

Вы можете добавить это в сервис immich-machine-learning вместо расширения из hwaccel.ml.yml:

immich-machine-learning:
container_name: immich_machine_learning
# Обратите внимание на `-cuda` в конце
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}-cuda
# Обратите внимание на отсутствие секции `extends`
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities:
- gpu
volumes:
- model-cache:/cache
env_file:
- .env
restart: always

После этого вы можете развернуть контейнер immich-machine-learning.

Множественные GPU

Если вы хотите использовать несколько GPU NVIDIA или Intel, вы можете установить переменную окружения MACHINE_LEARNING_DEVICE_IDS равной списку ID устройств через запятую и установить MACHINE_LEARNING_WORKERS равной количеству перечисленных устройств. Вы можете выполнить команду, например, nvidia-smi -L или glxinfo -B, чтобы увидеть доступные устройства и их соответствующие ID.

Например, если у вас есть устройства 0 и 1, установите значения следующим образом:

MACHINE_LEARNING_DEVICE_IDS=0,1
MACHINE_LEARNING_WORKERS=2

В этом примере сервис машинного обучения создаст два рабочих процесса, один из которых будет выделять модели устройству 0, а другой — устройству 1. Разные запросы будут обрабатываться одним или другим рабочим процессом.

Этот подход также можно использовать для указания конкретного устройства. Например, установка MACHINE_LEARNING_DEVICE_IDS=1 обеспечит использование устройства 1 вместо устройства 0.

Обратите внимание, что вам следует увеличить конкуррентность заданий, чтобы повысить общую загрузку и более эффективно распределять работу между несколькими GPU. Кроме того, каждый GPU должен быть способен загружать все модели. Невозможно распределить одну модель на несколько GPU, которые отдельно не имеют достаточно VRAM, или делегировать конкретную модель одному GPU.

Советы

  • Если вы сталкиваетесь с ошибкой во время работы модели, попробуйте другую модель, чтобы убедиться, является ли проблема специфичной для модели.
  • Вы можете захотеть увеличить совпадение задания выше значения по умолчанию для большей загрузки. Однако имейте в виду, что это также увеличит использование VRAM.
  • Более крупные модели выигрывают больше от аппаратного ускорения, если у вас есть для них VRAM.
  • В сравнении с ARM NN, RKNPU обладает:
    • Более широкой поддержкой моделей (включая поиск, который ARM NN не ускоряет)
    • Меньшим нагревом
    • Незначительно меньшей точностью (RKNPU всегда использует FP16, в то время как ARM NN по умолчанию использует более высокую точность FP32, если не включен MACHINE_LEARNING_ANN_FP16_TURBO)
    • Различной скоростью (протестировано на RK3588):
      • Если MACHINE_LEARNING_RKNN_THREADS имеет значение по умолчанию равное 1, RKNPU будет существенно медленнее ARM NN в большинстве случаев для заданий ML, но с аналогичной задержкой (например, при поиске)
      • Если MACHINE_LEARNING_RKNN_THREADS установить равным 3, RKNPU будет несколько быстрее ARM NN на FP32, но несколько медленнее ARM NN, если включен MACHINE_LEARNING_ANN_FP16_TURBO
      • Когда другие задачи также используют GPU (например, перекодирование), RKNPU имеет значительное преимущество над ARM NN, так как он использует иначе простаивающий NPU, вместо того чтобы конкурировать за использование GPU
    • Меньшее использование RAM, если MACHINE_LEARNING_RKNN_THREADS имеет значение по умолчанию 1, но значительно большее при значении больше 1 (что необходимо для полной загрузки NPU и, следовательно, для сравнения по скорости с ARM NN)