Аппаратное ускорение машинного обучения
Эта функция позволяет использовать GPU для ускорения задач машинного обучения, таких как интеллектуальный поиск и распознавание лиц, при этом снижая нагрузку на CPU. Так как это новая функция, она все еще экспериментальная и может не работать на всех системах.
Вам не нужно повторно запускать задания машинного обучения после включения аппаратного ускорения. Устройство ускорения будет использоваться для всех заданий, которые запускаются после его включения.
Поддерживаемые бэкенды
- ARM NN (Mali)
- CUDA (NVIDIA GPU с вычислительной способностью 5.2 или выше)
- ROCm (AMD GPU)
- OpenVINO (Intel GPU, такие как Iris Xe и Arc)
- RKNN (Rockchip)
Ограничения
- Инструкции и конфигурации здесь специфичны для 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, за счет увеличения объема оперативной памяти, используемой каждой моделью.
- В частности, установка значения
Настройка
- Если вы еще не сделали это, загрузите последний файл
hwaccel.ml.yml
и убедитесь, что он находится в той же папке, что иdocker-compose.yml
. - В файле
docker-compose.yml
в разделеimmich-machine-learning
раскомментируйте разделextends
и изменитеcpu
на соответствующий бэкенд. - По-прежнему в разделе
immich-machine-learning
, добавьте одно из -[armnn, cuda, rocm, openvino, rknn] в тэг разделаimage
в конце стр оки. - Разверните контейнер
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)