Immich GPU 加速:利用核显赋能家庭 AI 相册
Published:
以算力铭刻记忆。
需求
前文已经提到了我的NAS的大致架构,其中相册主要使用群晖自带的Synology Photos管理,姑且还算老牌可靠。但这个相册的AI模糊搜索功能几乎没有,需要iOS的相册/Google Photos作为辅助。或许像飞牛OS之类的NAS软件会有这类新功能,不过对于群晖来说,也可以找到一个完全本地的开源替代,即Immich。
Immich中领先的AI功能主要是以文搜图。图文检索目前基本都会用CLIP类模型来实现,模型本身就对齐了视觉和文本,只需提前将相册中所有图片嵌入到向量,搜索时只要用同样嵌入向量化的文本进行余弦相似度排序即可,距离越近的图像越符合文本描述。当然,这个模型也同样可以做以图搜图或者重复识别——看看图片向量是否有过于相似即可。其他的一些AI功能,像是OCR、人脸识别等也可以实现,但由于模型没有CLIP消耗那么多资源,因此不是重点。
原理
Immich部署后默认模型是OpenAI的原版CLIP,其对多语言(比如中文)的支持并不好。大多数中文教程中都会推荐更换为XLM-Roberta-Large-Vit-B-16Plus或者nllb-clip-large-siglip__v1这两个支持多语言的模型。后者更新、规模更大、跑分更高,但为了有限的内存考虑我选择了前者。还有个问题是除了PP-OCRv5_mobile这个来自百度的模型外,其他的CLIP、面部识别模型都需要从HuggingFace下载,在国内需要使用HF-Mirror下载,或者直接从那些中文教程附带的网盘链接下载(不保证安全性),然后挂载到Immich-Machine-Learning容器的/cache目录下。我的目录结构如下所示,如果一切正常,那么目前就应该可以使用CPU推理了:
❯ tree -L 3
.
├── clip
│ ├── XLM-Roberta-Large-Vit-B-16Plus
│ │ ├── README.md
│ │ ├── config.json
│ │ ├── textual
│ │ └── visual
│ └── nllb-clip-large-siglip__v1
│ ├── README.md
│ ├── config.json
│ ├── textual
│ └── visual
├── facial-recognition
│ └── buffalo_l
│ ├── README.md
│ ├── detection
│ └── recognition
└── ocr
└── PP-OCRv5_mobile
├── detection
└── recognition
GPU加速
接下来能想到的自然是用GPU加速推理。Immich除了CPU,还提供了CUDA、ROCm、OpenVINO等选项。我用的是i5-13500H的处理器,可以使用OpenVINO在80EU的Xe核显上加速。虽然这也不是个强大的AI卡,但理论上应该会比CPU强,能耗比也会更高。我之前为了Jellyfin的硬件转码,已经在PVE上将宿主机的核显设备透传到了Docker所在的LXC中,因此只需要在Docker中再次透传即可:
services:
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.precu.re/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}-openvino
device_cgroup_rules:
- 'c 189:* rmw'
devices:
- /dev/dri:/dev/dri
volumes:
- /dev/bus/usb:/dev/bus/usb
如果一切顺利,那么当Immch智能搜索的索引任务进行时,理应能看到GPU会有负载:

这应该就说明目前ML负载都在GPU上进行了。我这边大概300K的图片全部向量化的耗时看起来不多于一个晚上,效率还是可接受的。