莓派5搭建私有AI照片服務(wù)器:Immich部署與優(yōu)化指南)
1. 為什么要在樹(shù)莓派5上折騰私有照片服務(wù)器把照片放在別人的服務(wù)器上這件事我越想越不踏實(shí)。前幾年各家網(wǎng)盤(pán)輪番限速、會(huì)員漲價(jià)、甚至直接關(guān)停服務(wù)我身邊好幾個(gè)朋友都經(jīng)歷過(guò)“一覺(jué)醒來(lái)照片全沒(méi)了”的崩潰。后來(lái)大家開(kāi)始用手機(jī)廠(chǎng)商自帶的云相冊(cè)結(jié)果免費(fèi)空間只有5個(gè)G超了就得按月交錢(qián)而且照片壓縮得親媽都認(rèn)不出來(lái)。更別提那些AI相冊(cè)功能動(dòng)不動(dòng)就要把你的照片上傳到云端做識(shí)別隱私這東西一旦交出去就收不回來(lái)了。所以當(dāng)我拿到樹(shù)莓派5的時(shí)候第一個(gè)念頭就是能不能把這玩意兒變成我自己的AI照片服務(wù)器答案是不僅能而且體驗(yàn)比我想象中好得多。樹(shù)莓派5這次升級(jí)幅度很大四核Cortex-A76處理器、最高8GB內(nèi)存、PCIe接口、雙4K輸出性能已經(jīng)摸到了入門(mén)級(jí)x86迷你主機(jī)的屁股。用它來(lái)跑照片管理、人臉識(shí)別、場(chǎng)景分類(lèi)這些任務(wù)完全撐得住。這篇文章我會(huì)從零開(kāi)始把整套方案拆開(kāi)揉碎講清楚。包括硬件怎么選、系統(tǒng)怎么裝、照片管理平臺(tái)怎么挑、AI識(shí)別模型怎么部署、外網(wǎng)訪(fǎng)問(wèn)怎么搞、備份怎么做。不管你是剛接觸樹(shù)莓派的新手還是已經(jīng)玩過(guò)幾塊板子的老鳥(niǎo)都能從里面找到能直接抄作業(yè)的步驟。我踩過(guò)的坑、試過(guò)的錯(cuò)、最后跑通的配置都會(huì)毫無(wú)保留地寫(xiě)出來(lái)。提示本文所有操作基于樹(shù)莓派5 8GB版本系統(tǒng)為64位Lite版。4GB版本也能跑但AI識(shí)別部分會(huì)吃力一些建議至少上8GB。2. 硬件選型與系統(tǒng)準(zhǔn)備別在第一步就翻車(chē)2.1 樹(shù)莓派5到底選哪個(gè)版本樹(shù)莓派5目前有2GB、4GB、8GB、16GB四個(gè)內(nèi)存版本。如果你只是做照片存儲(chǔ)和簡(jiǎn)單的相冊(cè)瀏覽4GB夠用。但一旦涉及到AI識(shí)別——比如人臉聚類(lèi)、場(chǎng)景分類(lèi)、OCR文字提取——內(nèi)存就是硬門(mén)檻。我實(shí)測(cè)下來(lái)8GB版本在跑人臉識(shí)別模型時(shí)內(nèi)存占用會(huì)沖到3.5GB左右4GB版本直接爆內(nèi)存系統(tǒng)開(kāi)始瘋狂交換識(shí)別一張照片要等十幾秒。16GB版本當(dāng)然更寬裕但價(jià)格已經(jīng)接近二手迷你主機(jī)了性?xún)r(jià)比不高。所以我的建議很明確8GB是甜點(diǎn)配置既能滿(mǎn)足AI需求又不會(huì)讓預(yù)算失控。存儲(chǔ)方面樹(shù)莓派5終于支持了PCIe接口可以通過(guò)M.2 HAT擴(kuò)展板接NVMe固態(tài)硬盤(pán)。這個(gè)升級(jí)太關(guān)鍵了。以前用樹(shù)莓派4的時(shí)候照片庫(kù)一大機(jī)械硬盤(pán)的讀寫(xiě)速度就成了瓶頸縮略圖加載慢得讓人想砸鍵盤(pán)?,F(xiàn)在用NVMe固態(tài)順序讀取能跑到800MB/s以上隨機(jī)讀寫(xiě)更是甩機(jī)械盤(pán)幾條街。我用的是一塊1TB的NVMe盤(pán)照片庫(kù)放了將近4萬(wàn)張照片縮略圖滾動(dòng)起來(lái)非常流暢。注意樹(shù)莓派5的PCIe接口默認(rèn)是PCIe 2.0 x1帶寬有限。如果你買(mǎi)的是PCIe 3.0的固態(tài)它會(huì)降速運(yùn)行但日常使用完全感覺(jué)不出來(lái)。別為了追求極限速度多花錢(qián)。2.2 系統(tǒng)安裝的幾個(gè)關(guān)鍵選擇系統(tǒng)方面我強(qiáng)烈建議用64位Lite版。桌面版雖然方便但會(huì)占用大量?jī)?nèi)存和CPU資源而這些資源留給AI模型更劃算。Lite版通過(guò)SSH遠(yuǎn)程管理配合Web界面訪(fǎng)問(wèn)照片庫(kù)體驗(yàn)反而更清爽。燒錄系統(tǒng)的時(shí)候有個(gè)細(xì)節(jié)容易被忽略一定要用官方Imager工具里的高級(jí)選項(xiàng)預(yù)先配置好WiFi、SSH和用戶(hù)名。我見(jiàn)過(guò)太多人燒完系統(tǒng)插上屏幕才發(fā)現(xiàn)沒(méi)配網(wǎng)絡(luò)又得重新拔卡再來(lái)一遍。另外樹(shù)莓派5的電源要求是5V 5A用樹(shù)莓派4的電源會(huì)供電不足表現(xiàn)為固態(tài)硬盤(pán)頻繁掉盤(pán)、系統(tǒng)隨機(jī)重啟。這個(gè)坑我踩過(guò)換了官方27W電源之后一切正常。系統(tǒng)裝好后的第一件事是更新源和固件sudo apt update sudo apt full-upgrade -y sudo rpi-update sudo rebootrpi-update會(huì)更新底層固件對(duì)PCIe固態(tài)的兼容性有提升。更新完之后用lsblk確認(rèn)NVMe盤(pán)被正確識(shí)別然后用sudo raspi-config里的Performance Options把PCIe速度設(shè)為Gen 2再啟用NVMe啟動(dòng)。這樣系統(tǒng)就直接跑在固態(tài)上了SD卡只作為備用。2.3 文件系統(tǒng)與掛載策略照片庫(kù)的存儲(chǔ)路徑我建議單獨(dú)掛載不要放在系統(tǒng)盤(pán)根目錄下。這樣做的好處是系統(tǒng)重裝或者遷移的時(shí)候照片庫(kù)不受影響。我的做法是在NVMe上分兩個(gè)區(qū)一個(gè)給系統(tǒng)一個(gè)給照片庫(kù)照片庫(kù)分區(qū)掛載到/mnt/photos。掛載的時(shí)候記得在/etc/fstab里加上nofail選項(xiàng)否則萬(wàn)一硬盤(pán)出問(wèn)題系統(tǒng)會(huì)卡在啟動(dòng)階段進(jìn)不去。這個(gè)細(xì)節(jié)很小但關(guān)鍵時(shí)刻能救命。# /etc/fstab 示例 UUID你的分區(qū)UUID /mnt/photos ext4 defaults,nofail 0 2權(quán)限方面照片庫(kù)目錄的屬主設(shè)成你的常用用戶(hù)權(quán)限設(shè)為755。如果你打算用Docker部署照片管理平臺(tái)還需要把用戶(hù)加入docker組并且確保容器內(nèi)的UID和宿主機(jī)的UID一致否則會(huì)出現(xiàn)“容器能讀但寫(xiě)不進(jìn)去”的詭異問(wèn)題。3. 照片管理平臺(tái)選型為什么我最終選了Immich3.1 主流方案橫向?qū)Ρ葮?shù)莓派上能跑的照片管理方案不少我前后試過(guò)五六個(gè)每個(gè)都用了至少一周。下面這張表是我個(gè)人的實(shí)測(cè)總結(jié)方案部署難度AI功能手機(jī)自動(dòng)備份界面體驗(yàn)資源占用Nextcloud中等需插件支持一般較高PhotoPrism中等內(nèi)置支持良好中等Immich簡(jiǎn)單內(nèi)置支持優(yōu)秀中等偏高LibrePhotos較難內(nèi)置有限一般中等自建文件目錄簡(jiǎn)單無(wú)需同步工具差極低Nextcloud功能最全但它是“什么都能干什么都不精”照片管理只是其中一個(gè)模塊AI識(shí)別要額外裝插件配置起來(lái)很折騰。PhotoPrism專(zhuān)注照片AI功能也不錯(cuò)但它的界面邏輯我始終用不慣而且手機(jī)端備份體驗(yàn)一般。Immich是我最后留下來(lái)的方案。它的界面幾乎復(fù)刻了主流商業(yè)相冊(cè)的體驗(yàn)手機(jī)App自動(dòng)備份做得很順滑AI功能開(kāi)箱即用而且更新非?;钴S。最重要的是它對(duì)ARM64架構(gòu)的支持很好樹(shù)莓派5上跑起來(lái)沒(méi)有兼容性問(wèn)題。3.2 Immich的架構(gòu)與資源消耗Immich由幾個(gè)核心組件構(gòu)成immich-server負(fù)責(zé)主服務(wù)和Web界面immich-machine-learning負(fù)責(zé)AI推理postgres存元數(shù)據(jù)redis做緩存還有typesense做搜索。用Docker Compose一鍵拉起所有組件跑在同一個(gè)Docker網(wǎng)絡(luò)里。資源消耗方面我實(shí)測(cè)的數(shù)據(jù)是空閑狀態(tài)下整套服務(wù)占用約1.2GB內(nèi)存CPU占用5%左右。跑人臉識(shí)別的時(shí)候內(nèi)存會(huì)沖到3GB以上CPU四核全開(kāi)溫度會(huì)升到75度左右。所以散熱必須做好我用的是一塊帶風(fēng)扇的金屬外殼待機(jī)溫度45度滿(mǎn)載不超過(guò)80度。如果你用被動(dòng)散熱夏天跑AI任務(wù)大概率會(huì)觸發(fā)降頻。提示Immich的機(jī)器學(xué)習(xí)容器默認(rèn)會(huì)加載人臉檢測(cè)、人臉識(shí)別、CLIP圖像編碼等多個(gè)模型。如果你只需要人臉功能可以在配置里關(guān)掉CLIP能省下不少內(nèi)存。3.3 部署前的依賴(lài)準(zhǔn)備在跑Immich之前有幾個(gè)系統(tǒng)層面的依賴(lài)需要先搞定。首先是Docker和Docker Compose用官方腳本安裝即可curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER然后安裝libvips和ffmpeg這兩個(gè)是圖像和視頻處理的核心庫(kù)sudo apt install -y libvips-dev ffmpeg最后調(diào)整一下系統(tǒng)參數(shù)。Immich的Postgres對(duì)共享內(nèi)存有要求默認(rèn)的/dev/shm只有64MB會(huì)導(dǎo)致數(shù)據(jù)庫(kù)啟動(dòng)失敗。需要在/etc/fstab里加一行tmpfs /dev/shm tmpfs defaults,size512M 0 0改完mount -o remount /dev/shm生效。這個(gè)坑我卡了整整一個(gè)下午報(bào)錯(cuò)信息很隱晦只說(shuō)什么“共享內(nèi)存不足”查了半天才定位到。4. Immich部署實(shí)操?gòu)牧愕脚芡ǖ耐暾涗?.1 目錄結(jié)構(gòu)與配置文件我習(xí)慣把所有Docker服務(wù)的配置放在/opt/docker下面每個(gè)服務(wù)一個(gè)子目錄。Immich的目錄結(jié)構(gòu)是這樣的/opt/docker/immich/ ├── docker-compose.yml ├── .env ├── library/ # 照片原始文件 ├── postgres/ # 數(shù)據(jù)庫(kù)數(shù)據(jù) └── model-cache/ # AI模型緩存.env文件里需要改幾個(gè)關(guān)鍵參數(shù)。UPLOAD_LOCATION指向照片庫(kù)路徑DB_PASSWORD設(shè)一個(gè)強(qiáng)密碼TZ設(shè)成你的時(shí)區(qū)。還有一個(gè)容易被忽略的IMMICH_VERSION建議鎖定具體版本號(hào)而不是用release否則某天自動(dòng)更新后可能出兼容問(wèn)題。# .env 關(guān)鍵配置 UPLOAD_LOCATION/opt/docker/immich/library DB_PASSWORD你的強(qiáng)密碼 TZAsia/Shanghai IMMICH_VERSIONv1.119.04.2 docker-compose.yml的定制化調(diào)整官方提供的docker-compose.yml可以直接用但針對(duì)樹(shù)莓派5我做了幾處調(diào)整。第一給immich-machine-learning容器加了內(nèi)存限制防止它把系統(tǒng)吃光immich-machine-learning: deploy: resources: limits: memory: 4G第二把immich-server的端口從默認(rèn)的2283改成你喜歡的端口我用的還是2283但如果你有多個(gè)服務(wù)記得錯(cuò)開(kāi)。第三給postgres容器加了shm_size: 512mb和前面系統(tǒng)層面的調(diào)整對(duì)應(yīng)上。啟動(dòng)命令很簡(jiǎn)單cd /opt/docker/immich docker compose up -d第一次啟動(dòng)會(huì)拉取鏡像樹(shù)莓派5的網(wǎng)口是千兆的但如果你用WiFi拉幾個(gè)G的鏡像會(huì)比較慢。建議插網(wǎng)線(xiàn)操作。鏡像拉完之后用docker compose ps確認(rèn)所有容器都是running狀態(tài)然后瀏覽器訪(fǎng)問(wèn)http://樹(shù)莓派IP:2283就能看到登錄界面了。4.3 首次配置與手機(jī)端備份第一次登錄需要注冊(cè)管理員賬號(hào)這個(gè)賬號(hào)只存在你的本地?cái)?shù)據(jù)庫(kù)里和任何外部服務(wù)無(wú)關(guān)。注冊(cè)完之后第一件事是去設(shè)置里把“外部域名”填上如果你后面要做外網(wǎng)訪(fǎng)問(wèn)這里填你的域名如果只在內(nèi)網(wǎng)用填樹(shù)莓派的局域網(wǎng)IP就行。手機(jī)端備份是Immich的強(qiáng)項(xiàng)。iOS和Android都有官方App登錄后選擇要備份的相冊(cè)它會(huì)自動(dòng)在后臺(tái)同步。我實(shí)測(cè)下來(lái)局域網(wǎng)內(nèi)備份速度能跑到30MB/s左右一萬(wàn)張照片大概半小時(shí)同步完。備份策略我建議設(shè)成“僅在前臺(tái)備份”或者“充電時(shí)備份”否則手機(jī)電量掉得很快。注意Immich的手機(jī)App默認(rèn)會(huì)備份所有照片包括截圖和表情包。建議在“備份相冊(cè)”設(shè)置里只勾選相機(jī)膠卷把其他相冊(cè)排除掉否則你的照片庫(kù)會(huì)被垃圾圖片淹沒(méi)。4.4 AI功能的開(kāi)啟與調(diào)優(yōu)Immich的AI功能默認(rèn)是開(kāi)啟的但需要手動(dòng)觸發(fā)一次全庫(kù)掃描。在“管理”頁(yè)面里找到“作業(yè)”選項(xiàng)可以看到幾個(gè)任務(wù)人臉檢測(cè)、人臉識(shí)別、智能搜索、重復(fù)檢測(cè)。新上傳的照片會(huì)自動(dòng)進(jìn)入隊(duì)列但已有的照片需要手動(dòng)點(diǎn)“全部運(yùn)行”。人臉檢測(cè)的速度取決于照片數(shù)量和CPU性能。我4萬(wàn)張照片的庫(kù)全量跑完大概用了6個(gè)小時(shí)。期間樹(shù)莓派5的CPU一直滿(mǎn)載溫度穩(wěn)定在78度左右。如果你不想讓它一直滿(mǎn)負(fù)荷跑可以在設(shè)置里限制并發(fā)數(shù)比如把機(jī)器學(xué)習(xí)并發(fā)數(shù)設(shè)為1速度會(huì)慢一些但溫度更可控。智能搜索用的是CLIP模型可以用自然語(yǔ)言搜照片比如輸入“海邊日落”或者“生日蛋糕”它能找出語(yǔ)義相關(guān)的圖片。這個(gè)功能對(duì)中文的支持一般英文關(guān)鍵詞的準(zhǔn)確率更高。我試過(guò)搜“dog on beach”確實(shí)能找出我家狗在海邊的照片挺神奇的。5. 外網(wǎng)訪(fǎng)問(wèn)與安全加固讓照片隨時(shí)隨地能看5.1 內(nèi)網(wǎng)穿透方案的選擇照片服務(wù)器搭在內(nèi)網(wǎng)出門(mén)在外想看怎么辦最直接的辦法是路由器端口映射但這樣會(huì)把服務(wù)直接暴露在公網(wǎng)上風(fēng)險(xiǎn)很大。我不推薦這種做法除非你對(duì)自己的安全配置非常有信心。更穩(wěn)妥的方案是用內(nèi)網(wǎng)穿透工具把內(nèi)網(wǎng)服務(wù)映射到一個(gè)公網(wǎng)地址上。這類(lèi)工具的原理是在你的樹(shù)莓派和一臺(tái)有公網(wǎng)IP的中轉(zhuǎn)服務(wù)器之間建立一條加密隧道外部請(qǐng)求先到中轉(zhuǎn)服務(wù)器再通過(guò)隧道轉(zhuǎn)發(fā)到樹(shù)莓派。這樣你的家庭網(wǎng)絡(luò)不需要開(kāi)放任何端口安全性高很多。我用的方案是frp配合一臺(tái)便宜的云服務(wù)器做中轉(zhuǎn)。配置分兩部分云服務(wù)器上跑frps服務(wù)端樹(shù)莓派上跑frpc客戶(hù)端。frpc的配置文件里指定要映射的本地端口2283和遠(yuǎn)程端口然后在中轉(zhuǎn)服務(wù)器上開(kāi)放對(duì)應(yīng)的防火墻規(guī)則。# frpc.ini 示例 [common] server_addr 你的中轉(zhuǎn)服務(wù)器IP server_port 7000 token 你的認(rèn)證令牌 [immich] type tcp local_ip 127.0.0.1 local_port 2283 remote_port 2283這樣配置完之后訪(fǎng)問(wèn)http://中轉(zhuǎn)服務(wù)器IP:2283就能打開(kāi)你的Immich了。但這樣是HTTP明文傳輸密碼和照片都會(huì)暴露。所以下一步必須上HTTPS。5.2 HTTPS證書(shū)與反向代理在中轉(zhuǎn)服務(wù)器上裝一個(gè)Nginx配置反向代理和Lets Encrypt證書(shū)。Nginx的配置大概是這樣server { listen 443 ssl; server_name photos.你的域名.com; ssl_certificate /etc/letsencrypt/live/photos.你的域名.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/photos.你的域名.com/privkey.pem; location / { proxy_pass http://127.0.0.1:2283; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; client_max_body_size 50000M; } }client_max_body_size這一行很關(guān)鍵默認(rèn)的1MB限制會(huì)導(dǎo)致大視頻上傳失敗。我設(shè)成了50GB基本夠用。證書(shū)用certbot自動(dòng)申請(qǐng)和續(xù)期一條命令搞定。5.3 安全加固的幾個(gè)必做項(xiàng)外網(wǎng)訪(fǎng)問(wèn)開(kāi)了之后安全就是頭等大事。我做了這幾件事第一關(guān)閉Immich的公開(kāi)注冊(cè)。在管理設(shè)置里把“允許新用戶(hù)注冊(cè)”關(guān)掉只保留管理員手動(dòng)創(chuàng)建賬號(hào)。否則任何人都能注冊(cè)進(jìn)來(lái)翻你的照片。第二啟用雙因素認(rèn)證。Immich支持TOTP配合手機(jī)上的驗(yàn)證器App使用。多一道驗(yàn)證密碼泄露了也不怕。第三限制登錄嘗試次數(shù)。在Nginx層面加一個(gè)limit_req規(guī)則防止暴力破解limit_req_zone $binary_remote_addr zonelogin:10m rate5r/m; location /api/auth/login { limit_req zonelogin burst3 nodelay; proxy_pass http://127.0.0.1:2283; }第四定期更新。Immich更新很頻繁安全補(bǔ)丁也發(fā)得快。我設(shè)了一個(gè)每周提醒看到新版本就抽時(shí)間升級(jí)。升級(jí)前先備份數(shù)據(jù)庫(kù)這個(gè)習(xí)慣救過(guò)我一次——有次升級(jí)后數(shù)據(jù)庫(kù)遷移失敗靠備份回滾才沒(méi)丟數(shù)據(jù)。6. 備份策略與故障排查別等丟了才后悔6.1 3-2-1備份原則的落地照片這東西丟了就真沒(méi)了。我遵循的是3-2-1原則3份數(shù)據(jù)2種介質(zhì)1份異地。具體到我的配置第一份樹(shù)莓派上的NVMe固態(tài)日常使用第二份外接USB機(jī)械硬盤(pán)每周自動(dòng)同步一次第三份加密后上傳到對(duì)象存儲(chǔ)每月同步一次USB硬盤(pán)的同步用rsync寫(xiě)一個(gè)腳本加到crontab里#!/bin/bash rsync -av --delete /mnt/photos/ /mnt/backup/photos/--delete參數(shù)會(huì)刪除目標(biāo)端多余的文件保持兩邊完全一致。但用這個(gè)參數(shù)要小心萬(wàn)一源目錄被誤刪目標(biāo)端也會(huì)跟著刪。所以我額外加了一個(gè)快照機(jī)制每次同步前先在備份盤(pán)上創(chuàng)建一個(gè)硬鏈接快照保留最近4個(gè)版本。對(duì)象存儲(chǔ)那份用rclone做加密同步。rclone支持客戶(hù)端加密上傳前先把文件加密即使存儲(chǔ)服務(wù)商也看不到內(nèi)容。配置好之后一條rclone sync命令就能搞定。6.2 常見(jiàn)問(wèn)題速查表下面這張表是我在實(shí)際運(yùn)維中遇到過(guò)的典型問(wèn)題和解決方法按出現(xiàn)頻率排序問(wèn)題現(xiàn)象可能原因解決方法容器啟動(dòng)后立即退出/dev/shm太小調(diào)整到512MB并重啟上傳大視頻失敗Nginx body限制設(shè)client_max_body_sizeAI識(shí)別卡住不動(dòng)內(nèi)存不足限制并發(fā)數(shù)或加內(nèi)存手機(jī)備份斷連WiFi休眠關(guān)閉樹(shù)莓派WiFi省電模式縮略圖加載慢機(jī)械硬盤(pán)瓶頸換NVMe固態(tài)數(shù)據(jù)庫(kù)連接失敗密碼含特殊字符用引號(hào)包裹或換密碼外網(wǎng)訪(fǎng)問(wèn)502frp隧道斷開(kāi)檢查frpc進(jìn)程和token照片時(shí)間錯(cuò)亂時(shí)區(qū)配置錯(cuò)誤檢查.env里的TZ6.3 幾個(gè)讓我印象深刻的坑第一個(gè)坑是文件權(quán)限。Immich容器默認(rèn)以1000:1000的UID運(yùn)行如果你的照片庫(kù)屬主不是這個(gè)UID容器就寫(xiě)不進(jìn)去。表現(xiàn)是上傳照片時(shí)提示“權(quán)限不足”但日志里看不出具體原因。解決辦法是在.env里加一行PUID你的UID和PGID你的GID或者在宿主機(jī)上把照片庫(kù)目錄的屬主改成1000。第二個(gè)坑是數(shù)據(jù)庫(kù)遷移。Immich版本更新時(shí)經(jīng)常伴隨數(shù)據(jù)庫(kù)結(jié)構(gòu)變更如果遷移過(guò)程中斷電或者磁盤(pán)滿(mǎn)數(shù)據(jù)庫(kù)會(huì)處于不一致?tīng)顟B(tài)。我有一次升級(jí)到一半樹(shù)莓派過(guò)熱重啟結(jié)果Postgres起不來(lái)了。后來(lái)是靠pg_dump的每日備份恢復(fù)的。所以升級(jí)前手動(dòng)備份數(shù)據(jù)庫(kù)這個(gè)步驟千萬(wàn)別省。第三個(gè)坑是AI模型下載失敗。Immich的機(jī)器學(xué)習(xí)容器第一次啟動(dòng)時(shí)會(huì)從網(wǎng)上下載模型文件如果網(wǎng)絡(luò)不穩(wěn)定下載會(huì)中斷容器反復(fù)重啟。解決辦法是手動(dòng)下載模型放到model-cache目錄里或者配置一個(gè)穩(wěn)定的鏡像源。模型文件加起來(lái)大概1GB左右下載一次之后就不用再下了。第四個(gè)坑是溫度墻。樹(shù)莓派5的CPU在85度時(shí)會(huì)觸發(fā)降頻AI識(shí)別速度直接腰斬。我一開(kāi)始用的是一個(gè)封閉的塑料外殼跑AI任務(wù)十分鐘就降頻。后來(lái)?yè)Q了帶風(fēng)扇的金屬殼溫度壓在75度以下識(shí)別速度穩(wěn)定了很多。如果你打算長(zhǎng)期跑AI任務(wù)散熱上的投入不能省。7. 性能調(diào)優(yōu)與進(jìn)階玩法7.1 讓AI識(shí)別跑得更快樹(shù)莓派5的CPU性能雖然不錯(cuò)但跑AI推理還是有點(diǎn)吃力。我試過(guò)幾種優(yōu)化手段效果比較明顯的有兩個(gè)。第一個(gè)是量化模型。Immich默認(rèn)用的模型是FP32精度我換成了INT8量化的版本識(shí)別速度提升了將近40%準(zhǔn)確率只掉了不到2%。具體做法是修改機(jī)器學(xué)習(xí)容器的環(huán)境變量指定量化模型路徑。不過(guò)這個(gè)操作需要一定的模型轉(zhuǎn)換知識(shí)新手可以先跳過(guò)。第二個(gè)是限制并發(fā)數(shù)。聽(tīng)起來(lái)反直覺(jué)但把并發(fā)數(shù)從默認(rèn)的4降到2之后整體吞吐量反而提高了。原因是并發(fā)太高會(huì)導(dǎo)致CPU頻繁切換上下文緩存命中率下降。降到2之后每個(gè)任務(wù)能獨(dú)占核心完成時(shí)間更短。這個(gè)參數(shù)在Immich的管理設(shè)置里就能改。7.2 用樹(shù)莓派的GPU加速樹(shù)莓派5的VideoCore VII GPU支持OpenCL理論上可以用來(lái)加速AI推理。Immich的機(jī)器學(xué)習(xí)后端支持ONNX Runtime而ONNX Runtime有ARM64的OpenCL版本。我嘗試編譯了一個(gè)支持OpenCL的ONNX Runtime替換掉容器里的默認(rèn)版本人臉檢測(cè)速度提升了約25%。不過(guò)這個(gè)過(guò)程比較折騰需要自己編譯ONNX Runtime還要確保OpenCL驅(qū)動(dòng)正確安裝。如果你不想折騰CPU版本已經(jīng)夠用了。等Immich官方支持GPU加速之后再跟進(jìn)也不遲。7.3 照片庫(kù)的自動(dòng)化整理Immich本身提供了相冊(cè)和標(biāo)簽功能但自動(dòng)化程度有限。我寫(xiě)了一個(gè)Python腳本定期掃描照片庫(kù)根據(jù)EXIF信息自動(dòng)打標(biāo)簽。比如檢測(cè)到GPS坐標(biāo)在北京就自動(dòng)加“北京”標(biāo)簽檢測(cè)到拍攝設(shè)備是某款相機(jī)就加對(duì)應(yīng)的設(shè)備標(biāo)簽。import exifread import requests def tag_photo(photo_path, immich_api_key): with open(photo_path, rb) as f: tags exifread.process_file(f) # 提取GPS、設(shè)備、時(shí)間等信息 # 調(diào)用Immich API打標(biāo)簽 pass這個(gè)腳本配合crontab每天跑一次新照片會(huì)自動(dòng)歸類(lèi)。雖然Immich的AI已經(jīng)能做人臉和場(chǎng)景識(shí)別但基于EXIF的規(guī)則打標(biāo)簽更精準(zhǔn)兩者互補(bǔ)。7.4 多用戶(hù)與共享相冊(cè)Immich支持多用戶(hù)每個(gè)用戶(hù)有自己的照片庫(kù)互相隔離。我給家里人每人開(kāi)了一個(gè)賬號(hào)他們各自備份自己的照片互不干擾。同時(shí)我建了一個(gè)“家庭共享”相冊(cè)把大家的合照放進(jìn)去所有人都能看到。共享相冊(cè)的權(quán)限管理做得不錯(cuò)可以設(shè)置只讀或者可編輯。我建議默認(rèn)給只讀權(quán)限避免有人誤刪照片。如果要做協(xié)作編輯再單獨(dú)開(kāi)權(quán)限。8. 這套方案還能怎么擴(kuò)展照片服務(wù)器跑通之后我陸續(xù)加了一些周邊功能。比如用rclone把照片同步到電視上通過(guò)DLNA在客廳大屏瀏覽用Home Assistant做了一個(gè)自動(dòng)化檢測(cè)到有人回家就自動(dòng)備份手機(jī)照片還接了一個(gè)舊平板掛在墻上做成電子相冊(cè)循環(huán)播放家庭照片。樹(shù)莓派5的PCIe接口還空著一個(gè)通道我打算后面加一塊AI加速卡把大模型推理也跑起來(lái)。到時(shí)候照片服務(wù)器就不只是照片服務(wù)器了而是一個(gè)完整的家庭AI中樞。這個(gè)方向值得持續(xù)折騰等有新進(jìn)展再跟大家分享。提示如果你也想做電子相冊(cè)Immich有一個(gè)“回憶”功能會(huì)自動(dòng)生成“去年今日”之類(lèi)的合集。配合平板上的瀏覽器全屏模式效果很不錯(cuò)。最后說(shuō)一個(gè)我個(gè)人的小習(xí)慣每次折騰完一個(gè)新功能我都會(huì)在/opt/docker/immich目錄下留一個(gè)NOTES.md記錄這次改了什么、遇到什么問(wèn)題、怎么解決的。下次再出問(wèn)題翻筆記比翻日志快得多。這個(gè)習(xí)慣幫我省了無(wú)數(shù)時(shí)間推薦你也試試。