我试过好几次,想把照片从云端存储服务里搬出来,但最终都滚回去了。谷歌相册和苹果手机自带的相册,那种打磨程度真的很难超越。存文件这件事从来不是问题,问题出在存完之后。我能打出“海滩”两个字,就把所有海滩照片翻出来;点一张脸,就能看完一个人十五年的变化。这部分,我的家庭实验室一直做不好,直到我往这套系统里塞了一张独立显卡,Immich瞬间变得好用了不少。

Immich这套软件本身,从纸面上看早就达到了“够用”的水平。大家容易忽略的是,让它用起来像谷歌相册的那些功能——智能搜索和人脸识别——背后靠的不是免费算力。智能搜索的工作原理,是把每一张图喂进一个叫CLIP的模型里,生成一个嵌入向量,相当于给照片内容打上一串数字指纹,这样以后你就能用文字描述来搜图,而不是靠文件名。人脸识别则要对整个照片库单独跑一遍检测流程。这两件事都属于批量机器学习任务,而在我那台装着酷睿i7-6700K处理器的小服务器上,它们跑得慢悠悠的。

打开网易新闻 查看精彩图片

对于一颗2015年发布的四核Skylake架构芯片来说,它能撑住我扔给它的几乎所有自托管任务,唯独Immich有点重。它技术上确实能跑Immich的机器学习作业,但速度慢到几乎没有实用价值,尤其是我这个体量的照片库。我把任务启动起来,第二天再去看,进度条几乎没怎么动。于是搜索功能一直是个摆设,而搜索一旦没用,就正是我一次次退回谷歌相册的原因。

往机器学习容器里塞进一张GTX 1070之后,计算逻辑被彻底改写了。在CUDA加速的加持下,原本以天为单位计算的嵌入生成和人脸检测任务,一夜之间就能跑完。任务跑完之后,文字搜索和人脸搜索都变成了瞬间响应的事,因为真正吃算力的部分发生在建立索引的阶段,而不是你输入查询的时候。当然,这一下并非没有代价,配置过程中碰到的麻烦事不少。1070这张卡用的是帕斯卡架构,而帕斯卡在这里过的是借来的日子。更新版本的cuDNN——也就是Immich依赖的英伟达机器学习容器所调用的加速库——已经直接放弃了对帕斯卡的支持。我的卡到现在还能用,完全是因为Immich的维护者刻意锁定了一个旧版的cuDNN,保持这些老GPU的存活空间。这件事本身也相当折腾人,并且要求你把显卡驱动维持在一个稍微过时的版本上。帕斯卡需要的是旧版驱动和旧版CUDA工具栈,不是最新版,一旦升级,Immich一定会崩。

把功能跑通是一码事,和它们朝夕相处是另一码事。谷歌相册最黏人的地方,恰恰藏在日常交互的细微之处。