Skip to content

OCR uses CPU instead of iGPU #24758

Description

@Impressius

I have searched the existing issues, both open and closed, to make sure this is not a duplicate report.

  • Yes

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

  • Server
  • Web
  • Mobile

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

  1. Follow the documented steps as guided for H/W acceleration
  2. 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.

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

Image

OCR Concurrency: 7

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status
    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions