🚀 Immich 双卡硬件加速教学文档(第一次编辑代码粘上去不太习惯见谅)
本指南基于您拥有的NVIDIA Tesla P4 (dGPU)和Intel UHD Graphics 770 (iGPU)硬件,配置 Immich 实现机器学习加速和视频转码加速的分工合作。
📝 1. 准备工作与文件结构
为了实现硬件分工,Immich 采用extends关键字将通用配置与硬件加速配置分离。您需要在同一目录下准备以下三个文件:
.env:环境变量文件(包含端口、路径、数据库密码等)。
docker-compose.yml:主配置文件,定义所有服务和 NVIDIA ML 加速。
hwaccel.transcoding.yml:额外的配置文件,专门用于启用Intel QSV转码加速。
💻2.核心配置文件:docker-compose.yml
该文件是整个Immich系统的核心,它定义了四个服务,并配置了Tesla P4 (CUDA)机器学习加速。
# docker-compose.yml - Immich 最终双卡加速主配置文件
name: immich
services:
immich-server:
container_name: immich_server
# 使用中国镜像地址
image: ghcr.nju.edu.cn/immich-app/immich-server:${IMMICH_VERSION:-release}
# ⭐ 引用 hwaccel.transcoding.yml 中的 quicksync 服务,启用 Intel UHD 770 QSV 加速 ⭐
extends:
file: hwaccel.transcoding.yml
service: quicksync
volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload
- /etc/localtime:/etc/localtime:ro
# 外部媒体库挂载点 (请根据实际路径保留或修改)
- /vol2/1000/
# ... (省略其他媒体库挂载点)
env_file:
- .env
ports:
- '2283:2283'
depends_on:
- redis
- database
- immich-machine-learning
restart: always
healthcheck:
disable: false
immich-machine-learning:
container_name: immich_machine_learning
# 使用 CUDA 版本镜像
image: ghcr.nju.edu.cn/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}-cuda
# ⭐ 配置 NVIDIA Tesla P4 CUDA 加速 ⭐
runtime: nvidia
environment:
# Immich 多 GPU/指定设备配置模式
- MACHINE_LEARNING_DEVICE_IDS=0 # 假设 Tesla P4 的设备 ID 为 0 (请通过 nvidia-smi 确认)
- MACHINE_LEARNING_WORKERS=1 # 对应设备数量
volumes:
- model-cache:/cache
env_file:
- .env
restart: always
redis:
container_name: immich_redis
image: docker.io/valkey/valkey:8
healthcheck:
test: redis-cli ping || exit 1
restart: always
database:
container_name: immich_postgres
image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:739cdd626151ff1f796dc95a6591b55a714f341c737e27f045019ceabf8e8c52
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME}
POSTGRES_INITDB_ARGS: '--data-checksums'
volumes:
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
healthcheck:
test: >-
pg_isready --dbname="$${POSTGRES_DB}" --username="$${POSTRES_USER}" || exit 1;
Chksum="$$(psql --dbname="$${POSTGRES_DB}" --username="$${POSTRES_USER}" --tuples-only --no-align
--command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')";
echo "checksum failure count is $$Chksum";
[ "$$Chksum" = '0' ] || exit 1
interval: 5m
start_interval: 30s
start_period: 5m
command: >-
postgres
-c shared_preload_libraries=vectors.so
-c 'search_path="$$user", public, vectors'
-c logging_collector=on
-c max_wal_size=2GB
-c shared_buffers=512MB
-c wal_compression=on
restart: always
volumes:
model-cache:
driver: local