I have searched the existing issues, both open and closed, to make sure this is not a duplicate report.
The bug
OCR Jobs won't use iGPU and use CPU instead.
I have an Intel Core i5-1334U and Intel Iris Xe and WSL 2 that iI used as a bridge for immich. I've set the docker-compose.yml and hwaccel.ml.yml correctly and it's proven by when I run other ML Jobs (Smart Search, Duplicate, Face detection, Facial Recognition) they use my iGPU just fine and as expected. But when i run the OCR job, it uses CPU instead of my iGPU, and it's visible through Task Manager that my CPU usage are ~90% while my GPU 0 usage is ~1-2%. I don't know what was wrong, I've tried my best, but I couldn't find what was wrong
The OS that Immich Server is running on
Windows 11 on WSL 2 & Docker Desktop
Version of Immich Server
v2.4.1
Version of Immich Mobile App
v2.4.1 build.3030
Platform with the issue
Device make and model
Redmi 12
Your docker-compose.yml content
#
# WARNING: To install Immich, follow our guide: https://docs.immich.app/install/docker-compose
#
# Make sure to use the docker-compose.yml of the current release:
#
# https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
#
# The compose file on main may not be compatible with the latest release.
name: immich
services:
immich-server:
container_name: immich_server
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
# extends:
# file: hwaccel.transcoding.yml
# service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
volumes:
# Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file
- ${UPLOAD_LOCATION}:/data
- ${THUMB_LOCATION}:/data/thumbs
- ${ENCODED_VIDEO_LOCATION}:/data/encoded-video
- ${PROFILE_LOCATION}:/data/profile
- ${BACKUP_LOCATION}:/data/backups
- /etc/localtime:/etc/localtime:ro
- '/mnt/host/h/[02] Media Library:/ExternalLibrary'
env_file:
- .env
ports:
- '2283:2283'
depends_on:
- redis
- database
restart: always
healthcheck:
disable: false
immich-machine-learning:
container_name: immich_machine_learning
# For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag.
# Example tag: ${IMMICH_VERSION:-release}-cuda
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}-openvino
extends: # uncomment this section for hardware acceleration - see https://docs.immich.app/features/ml-hardware-acceleration
file: hwaccel.ml.yml
service: openvino-wsl # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference - use the `-wsl` version for WSL2 where applicable
volumes:
- model-cache:/cache
env_file:
- .env
restart: always
healthcheck:
disable: false
redis:
container_name: immich_redis
image: docker.io/valkey/valkey:9@sha256:fb8d272e529ea567b9bf1302245796f21a2672b8368ca3fcb938ac334e613c8f
healthcheck:
test: redis-cli ping || exit 1
restart: always
database:
container_name: immich_postgres
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME}
POSTGRES_INITDB_ARGS: '--data-checksums'
# Uncomment the DB_STORAGE_TYPE: 'HDD' var if your database isn't stored on SSDs
# DB_STORAGE_TYPE: 'HDD'
volumes:
# Do not edit the next line. If you want to change the database storage location on your system, edit the value of DB_DATA_LOCATION in the .env file
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
shm_size: 128mb
restart: always
volumes:
model-cache:
Your .env content
# You can find documentation for all the supported env variables at https://docs.immich.app/install/environment-variables
# The location where your uploaded files are stored
UPLOAD_LOCATION=/mnt/host/h/[02] Media Library/[01] Immich Uploads
THUMB_LOCATION=./library/thumbs
ENCODED_VIDEO_LOCATION=./library/encoded-video
PROFILE_LOCATION=./library/profile
BACKUP_LOCATION=./library/backups
# The location where your database files are stored. Network shares are not supported for the database
DB_DATA_LOCATION=./postgres
# To set a timezone, uncomment the next line and change Etc/UTC to a TZ identifier from this list: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
TZ=Asia/Jakarta
# The Immich version to use. You can pin this to a specific version like "v2.1.0"
IMMICH_VERSION=release
# Connection secret for postgres. You should change it to a random password
# Please use only the characters `A-Za-z0-9`, without special characters or spaces
DB_PASSWORD=Stellar
# The values below this line do not need to be changed
###################################################################################
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
Reproduction steps
- Follow the documented steps as guided for H/W acceleration
- The OCR won't use iGPU, and use CPU instead even though other ML jobs uses iGPU as fine.
Relevant log output
immich-machine-learning
[12/21/25 20:48:27] INFO Setting execution providers to
['OpenVINOExecutionProvider',
'CPUExecutionProvider'], in descending order of
preference
[12/21/25 20:48:28] INFO Loading recognition model 'EN__PP-OCRv5_mobile' to
memory
[12/21/25 20:48:28] INFO Setting execution providers to
['OpenVINOExecutionProvider',
'CPUExecutionProvider'], in descending order of
preference
[INFO] 2025-12-21 20:48:28,285 [RapidOCR] base.py:22: Using engine_name: onnxruntime
Additional information
My hwaccel.ml.yml file
Configurations for hardware-accelerated machine learning
If using Unraid or another platform that doesn't allow multiple Compose files,
you can inline the config for a backend by copying its contents
into the immich-machine-learning service in the docker-compose.yml file.
services:
armnn:
devices:
- /dev/mali0:/dev/mali0
volumes:
- /lib/firmware/mali_csffw.bin:/lib/firmware/mali_csffw.bin:ro # Mali firmware for your chipset (not always required depending on the driver)
- /usr/lib/libmali.so:/usr/lib/libmali.so:ro # Mali driver for your chipset (always required)
rknn:
security_opt:
- systempaths=unconfined
- apparmor=unconfined
devices:
- /dev/dri:/dev/dri
cpu: {}
cuda:
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities:
- gpu
rocm:
group_add:
- video
devices:
- /dev/dri:/dev/dri
- /dev/kfd:/dev/kfd
openvino:
device_cgroup_rules:
- 'c 189:* rmw'
devices:
- /dev/dri:/dev/dri
volumes:
- /dev/bus/usb:/dev/bus/usb
openvino-wsl:
devices:
- /dev/dxg:/dev/dxg
volumes:
- /usr/lib/wsl:/usr/lib/wsl
My Task Manager when I started running OCR job
OCR Concurrency: 7
I have searched the existing issues, both open and closed, to make sure this is not a duplicate report.
The bug
OCR Jobs won't use iGPU and use CPU instead.
I have an Intel Core i5-1334U and Intel Iris Xe and WSL 2 that iI used as a bridge for immich. I've set the docker-compose.yml and hwaccel.ml.yml correctly and it's proven by when I run other ML Jobs (Smart Search, Duplicate, Face detection, Facial Recognition) they use my iGPU just fine and as expected. But when i run the OCR job, it uses CPU instead of my iGPU, and it's visible through Task Manager that my CPU usage are ~90% while my GPU 0 usage is ~1-2%. I don't know what was wrong, I've tried my best, but I couldn't find what was wrong
The OS that Immich Server is running on
Windows 11 on WSL 2 & Docker Desktop
Version of Immich Server
v2.4.1
Version of Immich Mobile App
v2.4.1 build.3030
Platform with the issue
Device make and model
Redmi 12
Your docker-compose.yml content
Your .env content
Reproduction steps
Relevant log output
immich-machine-learning [12/21/25 20:48:27] INFO Setting execution providers to ['OpenVINOExecutionProvider', 'CPUExecutionProvider'], in descending order of preference [12/21/25 20:48:28] INFO Loading recognition model 'EN__PP-OCRv5_mobile' to memory [12/21/25 20:48:28] INFO Setting execution providers to ['OpenVINOExecutionProvider', 'CPUExecutionProvider'], in descending order of preference [INFO] 2025-12-21 20:48:28,285 [RapidOCR] base.py:22: Using engine_name: onnxruntimeAdditional information
My hwaccel.ml.yml file
Configurations for hardware-accelerated machine learning
If using Unraid or another platform that doesn't allow multiple Compose files,
you can inline the config for a backend by copying its contents
into the immich-machine-learning service in the docker-compose.yml file.
See https://docs.immich.app/features/ml-hardware-acceleration for info on usage.
services:
armnn:
devices:
- /dev/mali0:/dev/mali0
volumes:
- /lib/firmware/mali_csffw.bin:/lib/firmware/mali_csffw.bin:ro # Mali firmware for your chipset (not always required depending on the driver)
- /usr/lib/libmali.so:/usr/lib/libmali.so:ro # Mali driver for your chipset (always required)
rknn:
security_opt:
- systempaths=unconfined
- apparmor=unconfined
devices:
- /dev/dri:/dev/dri
cpu: {}
cuda:
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities:
- gpu
rocm:
group_add:
- video
devices:
- /dev/dri:/dev/dri
- /dev/kfd:/dev/kfd
openvino:
device_cgroup_rules:
- 'c 189:* rmw'
devices:
- /dev/dri:/dev/dri
volumes:
- /dev/bus/usb:/dev/bus/usb
openvino-wsl:
devices:
- /dev/dxg:/dev/dxg
volumes:
- /usr/lib/wsl:/usr/lib/wsl
My Task Manager when I started running OCR job
OCR Concurrency: 7