
1. 項目概述讓老照片煥發新生的AI魔法最近在折騰一個挺有意思的開源項目微軟研究院的“Bringing-Old-Photos-Back-to-Life”。顧名思義這玩意兒就是專門用來修復那些布滿歲月痕跡的老照片的。你可能在社交媒體上看過一些對比圖一張模糊、劃痕、褪色的舊照經過處理后變得清晰、色彩鮮艷仿佛時光倒流。這個項目就是實現這種效果的“幕后引擎”之一。它本質上是一個基于深度學習的圖像修復模型特別針對老照片的典型損傷如劃痕、污漬、噪點、褪色、面部模糊等進行了優化。與一般的超分辨率或去噪工具不同它集成了多個子網絡能綜合處理全局結構修復和局部細節增強尤其是對人臉區域的修復效果在開源方案中算是相當出色的。對于開發者、AI愛好者或者只是想親手修復家族老照片的朋友來說把這個項目部署到自己的電腦上運行是一件既有成就感又有實用價值的事。然而官方文檔雖然提供了指引但在實際部署尤其是在Windows 10環境下你會遇到一籮筐的依賴沖突、環境配置和版本兼容性問題。網上零散的教程往往只解決了某一步缺乏一個從零開始、貫穿始終的“實戰避坑”指南。我花了差不多兩個周末的時間在Windows 10上從頭到尾走通了整個部署和測試流程期間踩遍了能踩的坑。這篇文章就是這份完整的實戰記錄。我會詳細拆解每一步操作解釋背后的原理更重要的是分享那些官方文檔沒寫、搜索引擎也難找的解決方案和注意事項。無論你是想快速用起來還是想理解其技術實現都能從這里找到答案。2. 環境準備與核心依賴解析部署任何復雜的AI項目環境準備都是重中之重往往占據了80%的工作量和90%的挫敗感。“Bringing-Old-Photos-Back-to-Life”項目基于PyTorch涉及一些較老的計算機視覺庫在Windows上的兼容性挑戰不小。2.1 系統與基礎環境選擇項目官方推薦在Linux環境下運行但對于大多數個人用戶Windows 10仍是主力系統。我們的目標就是在Windows 10上搭建一個穩定可用的運行環境。方案選擇WSL2 vs 原生Windows你有兩個主要選擇Windows Subsystem for Linux 2 (WSL2)在Windows內運行一個完整的Linux內核。這是最接近官方推薦環境的方式能最大程度避免庫依賴沖突。推薦使用Ubuntu 20.04 LTS發行版。原生Windows Python環境直接在Windows上安裝Python、PyTorch等。這條路坑最多因為項目依賴的某些庫如torchvision的特定版本編譯的二進制包對Windows支持不友好。強烈建議選擇WSL2方案。它不僅避開了大量的原生Windows兼容性問題還能讓你未來無縫運行其他Linux優先的AI項目。接下來的實戰也將以WSL2 (Ubuntu 20.04) 為基礎進行。注意確保你的Windows 10版本為2004及以上且支持虛擬化。可以在PowerShell管理員中運行systeminfo查看“虛擬化已在固件中啟用”是否為“是”。如果不是需要進入BIOS/UEFI設置中開啟Intel VT-x或AMD-V。安裝WSL2步驟簡述以管理員身份打開PowerShell執行wsl --install -d Ubuntu-20.04。這條命令會啟用WSL功能、安裝WSL2內核并設置Ubuntu 20.04。安裝完成后重啟系統從開始菜單啟動“Ubuntu 20.04”完成初始用戶和密碼設置。在Ubuntu終端中運行sudo apt update sudo apt upgrade -y更新系統。2.2 Python與CUDA環境搭建項目代碼通常需要Python 3.6-3.8版本。我們選擇Python 3.8它在兼容性和新特性之間取得了較好平衡。在WSL2的Ubuntu中安裝Python 3.8sudo apt install python3.8 python3.8-venv python3.8-dev -ypython3.8-dev包包含了編譯某些Python擴展如PyTorch的定制化安裝所需的頭文件非常重要。接下來是深度學習框架的核心PyTorch和CUDA。項目的requirements.txt可能指定了較老的PyTorch版本如1.4.0但我們可以嘗試使用較新的、兼容的版本以獲得更好的性能和穩定性。關鍵決策點CUDA版本你需要根據你NVIDIA顯卡的驅動版本選擇支持的CUDA版本。在WSL2的Ubuntu中運行nvidia-smi可以查看驅動版本及最高支持的CUDA版本。例如輸出顯示“CUDA Version: 11.4”那么你可以安裝CUDA 11.3或11.4的PyTorch。實操步驟安裝CUDA ToolkitWSL2內訪問NVIDIA官網根據你的驅動版本選擇對應的CUDA Toolkit版本如11.3進行安裝。通常使用網絡安裝方式wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda_11.3.0_465.19.01_linux.run sudo sh cuda_11.3.0_465.19.01_linux.run安裝時在選項中去掉驅動安裝因為驅動由Windows主機提供只安裝CUDA Toolkit。配置環境變量將以下行添加到~/.bashrc文件末尾export PATH/usr/local/cuda-11.3/bin${PATH::${PATH}} export LD_LIBRARY_PATH/usr/local/cuda-11.3/lib64${LD_LIBRARY_PATH::${LD_LIBRARY_PATH}}執行source ~/.bashrc使配置生效。安裝PyTorch前往PyTorch官網的歷史版本頁面找到與CUDA 11.3兼容的穩定版本。例如我們可以選擇PyTorch 1.10.0。使用pip安裝pip3 install torch1.10.0cu113 torchvision0.11.0cu113 torchaudio0.10.0 -f https://download.pytorch.org/whl/cu113/torch_stable.html這里沒有完全按照項目可能要求的舊版本因為1.10.0在API上對1.4.0有較好的向后兼容性且修復了許多問題。后續我們可以通過微調代碼來解決可能的兼容性問題這比強行安裝一個非常陳舊且難以編譯的版本要可行得多。2.3 創建獨立的Python虛擬環境永遠不要在系統Python或你的主用戶Python環境中直接安裝項目依賴。使用虛擬環境是保證項目隔離、避免依賴地獄的最佳實踐。python3.8 -m venv old_photo_venv source old_photo_venv/bin/activate激活虛擬環境后你的命令行提示符前會出現(old_photo_venv)標識之后所有pip安裝的包都將僅限于此環境。3. 項目部署與依賴安裝實戰環境準備好后我們就可以開始拉取項目代碼并安裝其特定的依賴了。3.1 獲取項目源碼與初步探查git clone https://github.com/microsoft/Bringing-Old-Photos-Back-to-Life.git cd Bringing-Old-Photos-Back-to-Life首先仔細閱讀項目的README.md和requirements.txt文件。requirements.txt文件列出了核心依賴但我們需要批判性地看待它尤其是在Windows/WSL環境下。典型的requirements.txt陷阱版本鎖定過死如torch1.4.0。在2020年后的系統上直接安裝PyTorch 1.4.0的CUDA版本極其困難預編譯的wheel可能不存在。平臺特定包某些依賴可能只有Linux的二進制包。缺失依賴項目可能隱式依賴一些系統庫如libgl1-mesa-glx、libsm6、libxrender1等用于圖像處理。我們的策略是先安裝我們準備好的、較新的PyTorch1.10.0cu113。然后嘗試安裝requirements.txt中的其他依賴忽略其中對PyTorch和Torchvision的版本指定。遇到安裝錯誤時逐個分析解決。3.2 依賴安裝與沖突解決在激活的虛擬環境中執行pip install -r requirements.txt --no-deps--no-deps參數表示不安裝這些包自身的依賴這可以防止pip試圖去安裝舊版本的PyTorch。安裝后我們再手動安裝缺失的依賴。必踩的坑與解決方案torch和torchvision我們已經提前安裝跳過。如果requirements.txt強制版本可以臨時編輯該文件注釋掉這兩行。opencv-python與opencv-contrib-python可能會報錯關于libGL.so.1。需要在WSL2中安裝系統庫sudo apt install libgl1-mesa-glx libsm6 libxrender1 libxext6 -yface-alignment這個人臉對齊庫依賴dlib。dlib的安裝可能需要CMake和C編譯環境。確保已安裝sudo apt install build-essential cmake -y pip install dlib如果dlib安裝失敗可以嘗試從預編譯的wheel安裝但需要找到與Python 3.8、Linux兼容的版本。basicsr/facexlib等衍生庫這些庫可能來自其他開源項目如果直接pip安裝失敗可以查看項目是否提供了安裝方式或者嘗試從源碼安裝git clone [庫的倉庫地址] cd [庫文件夾] pip install -v -e .ninja某些PyTorch擴展需要Ninja構建系統加速編譯。sudo apt install ninja-build安裝后的驗證創建一個簡單的Python腳本test_import.pyimport torch import torchvision import cv2 import numpy as np import face_alignment import skimage import PIL print(“All core imports successful!”) print(f“PyTorch version: {torch.__version__}, CUDA available: {torch.cuda.is_available()}“)運行python test_import.py確保所有核心庫都能正常導入且CUDA可用。3.3 模型權重文件下載深度學習項目離不開預訓練模型。該項目通常需要下載多個預訓練模型權重.pth文件用于不同的修復子任務如全局修復、局部人臉增強等。下載方式官方README或項目Wiki通常會提供Google Drive或百度網盤的鏈接。將這些權重文件下載到項目目錄下指定的文件夾中例如./checkpoints或./Face_Enhancement/checkpoints。務必注意文件路徑因為代碼中會硬編碼或通過參數指定權重文件的加載路徑。常見問題網盤鏈接失效嘗試在項目的GitHub Issues中搜索其他用戶可能會分享備用鏈接。文件放置錯誤導致運行時出現“找不到模型文件”的錯誤。仔細核對代碼中—load_name或類似參數預期的路徑。4. 核心代碼結構與運行流程解析在解決依賴之后理解項目如何工作有助于我們調試和正確使用它。4.1 項目目錄結構剖析Bringing-Old-Photos-Back-to-Life/ ├── Global/ │ ├── network.py # 全局修復網絡模型定義 │ └── ... # 全局修復相關腳本和檢查點 ├── Face_Enhancement/ │ ├── networks.py # 人臉增強網絡模型定義 │ └── ... # 人臉增強相關腳本和檢查點 ├── test.py # 主測試腳本 ├── run.py # 可能提供的另一個運行入口 ├── requirements.txt └── README.md項目通常采用兩階段或聯合處理流程全局修復 (Global)處理整張圖像的劃痕、污漬、噪點、整體褪色等。人臉增強 (Face_Enhancement)專門針對圖像中檢測到的人臉區域進行超分辨率和細節修復。test.py是主要的推理腳本。它會先調用全局修復模型然后檢測人臉區域再調用人臉增強模型最后將增強后的人臉貼回原圖。4.2 運行腳本參數詳解運行前務必查看test.py的入口參數。通常包括python test.py \ —input_folder [原始圖片文件夾路徑] \ —output_folder [結果輸出文件夾路徑] \ —GPU 0 \ # 指定使用的GPU編號-1為CPU —with_scratch \ # 輸入圖像是否有劃痕啟用全局修復 —HR \ # 是否進行高分辨率輸出可能涉及人臉增強關鍵參數解讀—with_scratch如果你的老照片有明顯物理損傷折痕、劃痕一定要加上這個標志它會激活全局修復網絡。對于僅僅是模糊或褪色的照片可能不需要。—HR代表High-Resolution通常與人臉增強模塊綁定。如果想得到更清晰的人臉就啟用它。—checkpoint_name可能需要指定全局修復模型的權重文件路徑。—Face_Enhancement_checkpoint指定人臉增強模型的權重文件路徑。實操命令示例假設你的老照片放在WSL2中的/mnt/c/Users/YourName/old_photos對應Windows的C:\Users\YourName\old_photos輸出目錄設為./results命令如下python test.py \ —input_folder /mnt/c/Users/YourName/old_photos \ —output_folder ./results \ —GPU 0 \ —with_scratch \ —HR4.3 運行過程監控與初步結果運行后終端會打印日志顯示進度例如Processing image: photo1.jpg ... Running global restoration... Detecting faces... Running face enhancement for face 1... Blending... Saved to ./results/photo1.png第一次運行可能會比較慢因為需要加載模型和初始化。處理速度取決于圖片大小、GPU性能以及模型復雜度。一張1024x768像素的照片在RTX 3060上完整流程可能需要10-30秒。處理完成后去./results文件夾查看。你可能會發現多個輸出文件photo1_global.png僅經過全局修復的結果。photo1_HR.png經過全局修復人臉增強的最終結果。可能還有中間步驟的圖如人臉檢測框、單獨增強的人臉貼片等。5. 實戰中遇到的典型問題與深度解決方案這里是真正體現“踩坑”價值的部分。以下問題都是我或社區常見的問題及其根因分析和解決方案。5.1 內存不足CUDA out of memory這是最常見的問題尤其是處理高分辨率圖片或批量處理時。現象RuntimeError: CUDA out of memory. Tried to allocate 2.00 GiB...原因分析模型本身占用顯存。輸入圖片尺寸過大。模型內部可能將圖片分割成塊patch進行處理但如果原圖太大單塊尺寸或塊數過多也會爆顯存。WSL2的GPU內存分配可能有限制。解決方案降低輸入圖像分辨率在運行前先用圖像處理軟件如PIL、OpenCV將圖片的長邊縮放到一個合理尺寸例如1024或800像素。可以在test.py的預處理部分添加代碼或者單獨寫一個預處理腳本。from PIL import Image import os def resize_image(input_path, output_path, max_size1024): img Image.open(input_path) if max(img.size) max_size: ratio max_size / max(img.size) new_size tuple(int(dim * ratio) for dim in img.size) img img.resize(new_size, Image.Resampling.LANCZOS) img.save(output_path)使用CPU模式如果顯存實在太小如4GB可以嘗試使用CPU運行—GPU -1但速度會慢幾十倍。調整WSL2可用內存在Windows用戶目錄C:\Users\用戶名下創建或修改.wslconfig文件[wsl2] memory8GB # 根據你的主機內存調整例如16GB主機可分8GB給WSL2 swap4GB processors4修改后在PowerShell中執行wsl —shutdown關閉WSL2再重新啟動Ubuntu。修改代碼中的批處理大小batch size如果在test.py或模型文件中有batch_size參數將其改為1。5.2 人臉檢測失敗或增強錯位現象最終結果中人臉區域沒有被增強或者增強后的人臉錯位出現“鬼影”或重疊。日志中可能出現“No face detected”或人臉關鍵點檢測錯誤。原因分析人臉檢測器如dlib或項目內置的檢測器對側臉、模糊臉、遮擋嚴重的人臉檢測失敗。人臉對齊Face Alignment步驟出錯導致裁剪出的人臉區域不正確。人臉增強后貼回Blending原圖的算法對邊緣處理不當。解決方案嘗試不同的人臉檢測器項目可能默認使用dlib。可以嘗試換用MTCNN或OpenCV的DNN人臉檢測器如果代碼支持。你需要修改Face_Enhancement模塊中相關的檢測代碼。手動提供人臉框對于檢測失敗的特殊照片如果代碼支持可以嘗試通過參數手動輸入人臉的大致位置坐標。調整人臉檢測置信度閾值在檢測代碼中找到置信度閾值如confidence_threshold適當調低例如從0.95調到0.8以檢測更模糊的人臉。檢查人臉關鍵點模型face-alignment庫需要下載關鍵點檢測模型。確保模型文件已正確下載通常首次運行會自動下載但網絡問題可能導致失敗。可以手動從face-alignment的GitHub倉庫下載模型并放在~/.face_alignment目錄下。審視Blending邏輯如果人臉增強后貼回效果差可能是融合如泊松融合的參數問題。對于高級用戶可以調整融合部分的代碼如修改融合邊界寬度、透明度等。5.3 庫版本不兼容導致的詭異錯誤現象千奇百怪AttributeError: module ‘torch’ has no attribute ‘xxx’TypeError: … got an unexpected keyword argument ‘…’圖像顏色通道錯亂如紅藍互換。原因分析PyTorch、TorchVision、OpenCV、PILPillow、numpy等庫之間版本不匹配。例如新版本PyTorch的某些API已棄用而項目代碼基于舊版本編寫。解決方案系統化排查鎖定關鍵庫版本在虛擬環境中使用pip freeze requirements_lock.txt導出當前所有包的版本。當出現錯誤時這是一個回滾基準。針對性降級最常見的沖突點是torchvision。如果錯誤與圖像處理相關嘗試安裝與PyTorch 1.10.0更匹配的torchvision 0.11.0。我們已經這么做了。OpenCV顏色空間問題OpenCV默認使用BGR通道而PIL和PyTorch常用RGB。在代碼中如果看到cv2.imread()后直接送入模型很可能需要轉換# 錯誤做法 img cv2.imread(‘image.jpg’) # BGR # 正確做法 img cv2.imread(‘image.jpg’)[:, :, ::-1] # 轉換為RGB # 或者 img cv2.cvtColor(cv2.imread(‘image.jpg’), cv2.COLOR_BGR2RGB)檢查項目中是否有此類轉換遺漏。修改源代碼適配對于簡單的API變更如torch.nn.functional.interpolate的align_corners參數警告可以直接修改項目源碼給調用加上align_cornersFalse或True需根據情況測試。這是部署老舊開源項目的常態。5.4 模型文件加載失敗或結構不匹配現象RuntimeError: Error(s) in loading state_dict for SomeModel… Missing key(s) in state_dict… Unexpected key(s) in state_dict…原因分析下載的預訓練模型權重文件.pth與當前代碼定義的模型結構不完全一致。可能是代碼版本更新了但權重文件是舊版本的。也可能是你安裝的PyTorch版本與保存權重時使用的版本差異過大。解決方案嚴格對照版本盡可能使用項目Release中指定的代碼版本和配套的權重文件。如果項目有多個分支注意你所在的分支。忽略不匹配的鍵PyTorch加載權重時可以設置strictFalse來忽略不匹配的鍵。找到代碼中加載模型權重的部分通常是load_state_dict修改為model.load_state_dict(torch.load(weight_path), strictFalse)這允許加載匹配的部分參數不匹配的部分則隨機初始化。注意這可能會影響修復效果尤其是如果缺失的是關鍵層的參數。手動調試打印出模型的狀態字典和權重文件中的鍵對比差異。有時只是前綴名不同如多了一個module.這是因為權重是在多GPU訓練DataParallel下保存的。可以寫個小腳本進行鍵名重映射from collections import OrderedDict new_state_dict OrderedDict() for k, v in checkpoint.items(): name k[7:] if k.startswith(‘module.’) else k # 去除 ‘module.’ 前綴 new_state_dict[name] v model.load_state_dict(new_state_dict)6. 效果優化與高級使用技巧基礎運行成功后你可以通過一些技巧來獲得更好的修復效果或提升使用體驗。6.1 預處理與后處理的魔力模型的輸出并非總是完美的。合理的預處理和后處理能顯著提升最終觀感。預處理建議去噪對于噪點特別嚴重的照片可以先使用輕量級的去噪工具如OpenCV的cv2.fastNlMeansDenoisingColored預處理一下再送入模型。注意不要過度去噪導致細節丟失。對比度拉伸對于嚴重褪色的照片可以先進行自動對比度拉伸如CLAHE讓模型能“看到”更多信息。格式統一確保所有輸入圖片為RGB格式并統一轉換為.png等無損格式進行處理避免JPEG壓縮偽影干擾模型。后處理建議顏色校正模型修復后顏色有時會偏色或飽和度不足。可以使用簡單的色彩平衡工具如PIL.ImageEnhance.Color微調飽和度。智能銳化對最終輸出進行適度的USM銳化可以增強紋理感。但切忌過度否則會引入白邊。背景平滑對于非人臉的背景區域如果模型處理得比較粗糙可以結合原圖使用導向濾波等方法讓背景過渡更自然。6.2 批量處理與自動化腳本如果你有大量老照片需要處理手動一張張運行命令效率太低。編寫批量處理腳本創建一個batch_process.py腳本import os import subprocess import argparse from pathlib import Path def main(input_dir, output_dir): input_dir Path(input_dir) output_dir Path(output_dir) output_dir.mkdir(parentsTrue, exist_okTrue) image_extensions {‘.jpg’, ‘.jpeg’, ‘.png’, ‘.bmp’, ‘.tiff’} image_files [f for f in input_dir.iterdir() if f.suffix.lower() in image_extensions] for img_path in image_files: print(f“Processing: {img_path.name}“) # 這里假設你已將test.py的參數邏輯封裝或直接調用 # 一種簡單方式是使用subprocess調用原test.py但更優雅的方式是導入test.py中的函數 cmd [ ‘python’, ‘test.py’, ‘—input_folder’, str(input_dir), ‘—output_folder’, str(output_dir), ‘—GPU’, ‘0’, ‘—with_scratch’, ‘—HR’, # 如果需要指定單張圖片可能需要修改test.py以支持—input_file參數 ] # 更推薦的方式重構test.py使其核心處理函數可被導入調用 # from test import process_single_image # process_single_image(str(img_path), str(output_dir / img_path.stem)) subprocess.run(cmd, checkTrue) if __name__ ‘__main__’: parser argparse.ArgumentParser() parser.add_argument(‘—input’, typestr, requiredTrue) parser.add_argument(‘—output’, typestr, requiredTrue) args parser.parse_args() main(args.input, args.output)注意直接循環調用subprocess會反復加載模型效率極低。最佳實踐是將test.py中的模型加載和推理部分重構使模型在內存中只加載一次然后循環處理圖片。6.3 針對特定損傷類型的參數微調項目可能提供一些隱藏參數或可以通過修改代碼來調整修復的“強度”或側重點。劃痕修復強度在全局修復網絡中可能與處理劃痕的卷積核大小或迭代次數有關。可以搜索代碼中的scratch相關參數。人臉增強程度人臉增強網絡可能有一個“增強因子”參數控制細節生成的強度。過強可能導致皮膚紋理不自然像塑料。融合權重人臉區域增強后貼回原圖時有一個融合權重Alpha控制原圖與增強圖的比例。適當降低權重如從1.0降到0.7可以使增強效果更自然。這些參數通常沒有在命令行暴露需要你閱讀Face_Enhancement目錄下的test_face.py或類似腳本以及網絡定義文件去尋找可以調整的變量。7. 性能調優與資源管理讓整個流程跑得更快、更穩定。7.1 利用GPU TensorCore和半精度推理如果你的GPU支持如NVIDIA Volta架構及以后的顯卡可以使用混合精度AMP推理來加速并減少顯存占用。修改推理代碼在test.py中找到模型前向傳播的部分通常是一個with torch.no_grad():塊。可以將其修改為import torch.cuda.amp as amp with torch.no_grad(): with amp.autocast(enabledTrue): # 啟用自動混合精度 output model(input_tensor) # 后續處理...同時你需要確保模型和輸入張量都在GPU上。這通常可以帶來1.5倍到2倍的推理速度提升并減少顯存消耗。7.2 模型剪枝與量化高級對于部署到資源受限的環境可以考慮剪枝移除模型中不重要的權重減少計算量。可以使用PyTorch相關的剪枝工具。量化將模型權重從32位浮點數FP32轉換為8位整數INT8大幅減少模型大小和推理延遲。PyTorch提供了torch.quantization模塊。注意這些操作需要驗證精度損失是否在可接受范圍內并且過程較為復雜需要對模型結構有深入了解。對于老照片修復這種對視覺質量要求很高的任務量化可能會引入可見的偽影需謹慎測試。7.3 系統層面優化WSL2磁盤性能WSL2訪問Windows文件系統/mnt/c/的I/O性能較差。建議將項目代碼、模型權重和待處理的圖片全部放在WSL2的Linux原生文件系統內如~/projects/old_photo。處理完成后再將結果復制回Windows目錄。關閉不必要的進程在WSL2中運行推理時關閉其他占用GPU和內存的應用程序。監控資源使用nvidia-smi -l 1監控GPU使用情況使用htop監控CPU和內存。部署“Bringing-Old-Photos-Back-to-Life”項目就像完成一次精細的考古修復。它不僅僅是一個簡單的pip install和python run.py命令而是一個涉及環境配置、依賴管理、代碼調試和效果調優的完整工程實踐。在Windows 10上通過WSL2部署雖然繞過了最棘手的原生Windows兼容性問題但仍然需要你具備一定的Linux命令行操作和Python問題排查能力。最深的體會是處理這類研究型開源項目一定要有“刨根問底”的精神。錯誤信息就是最好的向導。遇到問題首先精讀錯誤堆棧定位到出錯的代碼行然后結合搜索引擎和項目GitHub的Issues頁面大概率能找到相似問題的討論最后大膽假設小心驗證通過修改代碼、調整環境來解決問題。每一次成功的故障排除都是對項目理解的一次加深。最后一個小技巧建立一個詳細的部署日志。記錄下每一步操作、每一個遇到的錯誤及解決方案、每一次參數調整的效果。這份日志不僅是你個人的知識財富下次換機器或幫朋友部署時也能節省大量時間。畢竟好記性不如爛筆頭在復雜的開源項目部署面前尤其如此。