Aprendizaje Automático Acelerado por Hardware
Esta característica te permite utilizar una GPU para acelerar tareas de aprendizaje automático, como Búsqueda Inteligente y Reconocimiento Facial, mientras reduces la carga en la CPU. Dado que es una nueva característica, todavía es experimental y puede que no funcione en todos los sistemas.
No necesitas rehacer ninguna tarea de aprendizaje automático después de habilitar la aceleración por hardware. El dispositivo de aceleración se utilizará para cualquier tarea que se ejecute después de habilitarla.
Backends Soportados
- ARM NN (Mali)
- CUDA (GPUs NVIDIA con capacidad de cómputo 5.2 o superior)
- ROCm (GPUs AMD)
- OpenVINO (GPUs Intel como Iris Xe y Arc)
- RKNN (Rockchip)
Limitaciones
- Las instrucciones y configuraciones aquí son específicas para Docker Compose. Otros motores de contenedores pueden requerir configuraciones diferentes.
- Solo se admiten servidores Linux y Windows (a través de WSL2).
- ARM NN solo es compatible con dispositivos que tengan GPUs Mali. Otros dispositivos Arm no son compatibles.
- Algunos modelos pueden no ser compatibles con ciertos backends. CUDA es el más confiable.
- La latencia de búsqueda no mejora con ARM NN debido a problemas de compatibilidad del modelo que evitan su uso. Sin embargo, las tareas de búsqueda inteligente sí utilizan ARM NN.
Requisitos Previos
ARM NN
- Asegúrate de tener instalado el controlador de kernel de Linux apropiado
- Este suele estar preinstalado en las imágenes de Linux del proveedor del dispositivo
/dev/mali0
debe estar disponible en el servidor host- Puedes confirmarlo ejecutando
ls /dev
para verificar que existe
- Puedes confirmarlo ejecutando
- Debes tener el firmware cerrado
libmali.so
(posiblemente con un archivo de firmware adicional)- Dónde y cómo obtener este archivo depende del dispositivo y del proveedor, pero típicamente el proveedor del dispositivo también suministra estos
- El archivo
hwaccel.ml.yml
asume que su ruta es/usr/lib/libmali.so
, por lo que actualiza en consecuencia si está en otra ubicación - El archivo
hwaccel.ml.yml
asume un archivo adicional/lib/firmware/mali_csffw.bin
, así que actualiza en consecuencia si el controlador de tu dispositivo no requiere este archivo
- Opcional: Configura tu archivo
.env
, consulta variables de entorno para configuraciones específicas de ARM NN- En particular,
MACHINE_LEARNING_ANN_FP16_TURBO
puede mejorar significativamente el rendimiento a costa de una pérdida de precisión muy ligera
- En particular,
CUDA
- La GPU debe tener una capacidad de cómputo de 5.2 o superior.
- El servidor debe tener instalado el controlador oficial de NVIDIA.
- El controlador instalado debe ser >= 545 (debe ser compatible con CUDA 12.3).
- En Linux (excepto WSL2), también debes tener instalado el NVIDIA Container Toolkit.
ROCm
- La GPU debe ser compatible con ROCm. Si no está oficialmente soportada, puedes intentar usar la variable de entorno
HSA_OVERRIDE_GFX_VERSION
:HSA_OVERRIDE_GFX_VERSION=<una versión compatible, por ejemplo, 10.3.0>
. Si esto no funciona, puede que también necesites establecerHSA_USE_SVM=0
. - La imagen ROCm es bastante grande y requiere al menos 35 GiB de espacio libre en disco. Sin embargo, las actualizaciones posteriores al servicio a través de Docker generalmente solo consumirán unos pocos cientos de megabytes, ya que el resto estará en caché.
- Este backend es nuevo y puede experimentar algunos problemas. Por ejemplo, el consumo de energía de la GPU puede ser mayor de lo habitual después de ejecutar inferencias, incluso si el servicio de aprendizaje automático está inactivo. En este caso, volverá a la normalidad después de estar inactivo durante 5 minutos (configurable con la configuración MACHINE_LEARNING_MODEL_TTL).
OpenVINO
- Es más probable que las GPUs integradas experimenten problemas que las GPUs dedicadas, especialmente en procesadores más antiguos o servidores con poca RAM.
- Asegúrate de que la versión del kernel del servidor sea lo suficientemente nueva como para usar el dispositivo con aceleración por hardware.
- Se espera un mayor uso de RAM al utilizar OpenVINO en comparación con el procesamiento en CPU.
RKNN
- Debes tener un SoC Rockchip compatible: solo se admiten RK3566, RK3568, RK3576 y RK3588 en este momento.
- Asegúrate de tener instalado el controlador de kernel de Linux apropiado
- Este suele estar preinstalado en las imágenes de Linux del proveedor del dispositivo
- El controlador RKNPU V0.9.8 o posterior debe estar disponible en el servidor host
- Puedes confirmarlo ejecutando
cat /sys/kernel/debug/rknpu/version
para verificar la versión
- Puedes confirmarlo ejecutando
- Opcional: Configura tu archivo
.env
, consulta variables de entorno para configuraciones específicas de RKNN- En particular, ajustar
MACHINE_LEARNING_RKNN_THREADS
a 2 o 3 puede mejorar dramáticamente el rendimiento para RK3576 y RK3588 en comparación con el valor predeterminado de 1, a expensas de multiplicar la cantidad de RAM que utiliza cada modelo en esa cantidad.
- En particular, ajustar
Configuración
- Si aún no lo tienes, descarga el último archivo
hwaccel.ml.yml
y asegúrate de que esté en la misma carpeta que el archivodocker-compose.yml
. - En el archivo
docker-compose.yml
dentro deimmich-machine-learning
, descomenta la secciónextends
y cambiacpu
al backend apropiado. - También en
immich-machine-learning
, agrega uno de -[armnn, cuda, rocm, openvino, rknn] a la etiqueta de la secciónimage
al final de la línea. - Vuelve a implementar el contenedor
immich-machine-learning
con estas configuraciones actualizadas.
Confirmando el Uso del Dispositivo
Puedes confirmar que el dispositivo está siendo reconocido y utilizado verificando su utilización. Hay muchas herramientas para mostrar esto, como nvtop
para NVIDIA o Intel, intel_gpu_top
para Intel y radeontop
para AMD.
También puedes revisar los registros del contenedor immich-machine-learning
. Cuando comience un trabajo de Búsqueda Inteligente o Detección Facial, o cuando busques con texto en Immich, deberías ver un registro de Available ORT providers
que contiene el proveedor correspondiente (como CUDAExecutionProvider
en el caso de CUDA), o una entrada de registro Loaded ANN model
sin errores en el caso de ARM NN.
Archivo Compose Único
Algunas plataformas, como Unraid y Portainer, no admiten múltiples archivos Compose al momento de escribir. Como alternativa, puedes “inlinear” los contenidos relevantes del archivo hwaccel.ml.yml
directamente en el servicio immich-machine-learning
.
Por ejemplo, la sección cuda
en este archivo es:
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities:
- gpu
Puedes agregar esto al servicio immich-machine-learning
en lugar de extender desde hwaccel.ml.yml
:
immich-machine-learning:
container_name: immich_machine_learning
# Notar el `-cuda` al final
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}-cuda
# Notar la falta de una sección `extends`
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities:
- gpu
volumes:
- model-cache:/cache
env_file:
- .env
restart: always
Una vez hecho esto, puedes volver a implementar el contenedor immich-machine-learning
.
Uso de Múltiples GPUs
Si deseas utilizar múltiples GPUs NVIDIA o Intel, puedes configurar la variable de entorno MACHINE_LEARNING_DEVICE_IDS
con una lista separada por comas de IDs de dispositivos y establecer MACHINE_LEARNING_WORKERS
en el número de dispositivos listados. Puedes ejecutar un comando como nvidia-smi -L
o glxinfo -B
para ver los dispositivos disponibles actualmente y sus IDs correspondientes.
Por ejemplo, si tienes los dispositivos 0 y 1, configura los valores de la siguiente manera:
MACHINE_LEARNING_DEVICE_IDS=0,1
MACHINE_LEARNING_WORKERS=2
En este ejemplo, el servicio de aprendizaje automático generará dos trabajadores, uno de los cuales asignará modelos al dispositivo 0 y el otro al dispositivo 1. Las diferentes solicitudes serán procesadas por uno u otro trabajador.
Este enfoque también puede usarse para especificar un dispositivo en particular. Por ejemplo, establecer MACHINE_LEARNING_DEVICE_IDS=1
garantizará que el dispositivo 1 siempre sea utilizado en lugar del dispositivo 0.
Ten en cuenta que debes aumentar las concurrencias de trabajo para incrementar la utilización general y distribuir más eficazmente el trabajo en varias GPUs. Además, cada GPU debe poder cargar todos los modelos. No es posible distribuir un solo modelo en múltiples GPUs que individualmente tienen VRAM insuficiente, o delegar un modelo específico a una GPU.
Consejos
- Si encuentras un error al ejecutar un modelo, intenta con un modelo diferente para ver si el problema es específico del modelo.
- Puedes aumentar la concurrencia más allá del valor predeterminado para obtener una mayor utilización. Sin embargo, ten en cuenta que esto también aumentará el consumo de VRAM.
- Los modelos más grandes se benefician más de la aceleración por hardware, si tienes suficiente VRAM para ellos.
- En comparación con ARM NN, RKNPU tiene:
- Mayor compatibilidad con modelos (incluyendo búsquedas, que ARM NN no acelera)
- Menor generación de calor
- Precisión ligeramente inferior (RKNPU siempre usa FP16, mientras que ARM NN por defecto usa precisión superior FP32 a menos que
MACHINE_LEARNING_ANN_FP16_TURBO
esté habilitado) - Velocidad variable (probada en RK3588):
- Si
MACHINE_LEARNING_RKNN_THREADS
está en el valor predeterminado de 1, RKNPU tendrá un rendimiento significativamente menor para tareas de aprendizaje automático que ARM NN en la mayoría de los casos, pero con latencia similar (por ejemplo, al buscar) - Si
MACHINE_LEARNING_RKNN_THREADS
está configurado en 3, será algo más rápido que ARM NN en FP32, pero algo más lento que ARM NN siMACHINE_LEARNING_ANN_FP16_TURBO
está habilitado - Cuando otras tareas también usan la GPU (como la transcodificación), RKNPU tiene una ventaja significativa sobre ARM NN ya que utiliza el NPU inactivo, en lugar de competir por el uso de la GPU
- Si
- Menor uso de RAM si
MACHINE_LEARNING_RKNN_THREADS
está en el valor predeterminado de 1, pero significativamente mayor si supera ese valor (lo cual es necesario para que el NPU se utilice al máximo y sea comparable en velocidad con ARM NN)