6. 疑難排解與最佳化
在使用 EvoX 時,您可能會遇到問題或想要微調您的演算法。本章概述了常見問題與解決方案,以及除錯策略和效能調校技巧,幫助您解決問題並優化使用體驗。
6.1 常見問題與解決方案
以下是一些經常遇到的問題及其解決方法:
(1) 安裝或匯入錯誤:
- 徵兆:執行
import evox時發生錯誤。 - 解決方案:
- 檢查安裝:執行
pip show evox進行驗證。如果未安裝,請檢查您的虛擬環境並重新安裝。 - 缺少依賴項:如果您看到
ModuleNotFoundError: No module named 'torch',請按照第 2 章所述安裝 PyTorch。 - CUDA 不匹配:確保您的 PyTorch 版本與安裝的 CUDA 驅動程式相符。
- 檢查安裝:執行
(2) 未使用 GPU:
- 徵兆:EvoX 在 CPU 上運行,而不是 GPU。
- 解決方案:
- 使用
torch.cuda.is_available()檢查。如果為False,請重新安裝與 GPU 相容的 PyTorch 並檢查 CUDA 安裝。 - 如果為
True但 EvoX 仍然使用 CPU,請確保您的張量(tensors)已移動到 GPU(有關配置請參閱第 3 章)。
- 使用
(3) 記憶體不足 (RAM/VRAM):
- 徵兆:您看到
OutOfMemoryError。 - 解決方案:
- 減少族群大小、問題維度或評估頻率。
- 使用 float16(半精度)或批次評估拆分。
- 關閉 PyTorch 中的除錯/確定性模式。
- 僅儲存統計數據而不是完整的 Pareto 前沿(針對多目標)。
- 升級硬體是解決記憶體瓶頸的最終手段。
(4) 收斂停滯:
- 徵兆:演算法陷入局部最佳解。
- 解決方案:
- 增加族群多樣性(例如,提高突變率)。
- 嘗試不同的演算法或參數。
- 確保目標函數定義明確(不要太多雜訊或過於平坦)。
- 執行多次試驗並挑選最好的——EvoX 讓平行執行變得容易。
(5) 最佳化結果不佳:
- 徵兆:最終結果低於預期。
- 解決方案:
- 檢查問題定義:確保適應度(fitness)計算正確(例如符號、縮放)。
- 演算法適配:嘗試其他演算法或調整超參數。
- 使用收斂曲線:
- 早期趨於平坦 → 過早收斂。
- 震盪 → 隨機性太高。
- 調整演算法設定並分析隨時間變化的行為。
(6) 後端衝突 (JAX vs PyTorch):
- 徵兆:在使用 PyTorch 範例時意外安裝了 JAX 版本的 EvoX。
- 解決方案:預設的
pip install evox會提供 PyTorch 版本。如果您安裝了 JAX 版本,請使用 PyTorch 指令重新安裝(參見第 2 章)。JAX 功能有單獨的文件說明。
(7) 版本不匹配:
- 徵兆:API 呼叫與安裝的版本不符。
- 解決方案:
- EvoX 更新可能會更改方法名稱(例如
ask/tell→step)。 - 使用最新的穩定版本並參考其文件。
- 調整程式碼以符合您的 EvoX 版本,或考慮升級。
- EvoX 更新可能會更改方法名稱(例如
6.2 除錯技巧
由於演化演算法的隨機性質,對其進行除錯可能很棘手。以下是一些實用技巧:
(1) 使用小規模測試:
- 減少族群大小和迭代次數以簡化除錯。
- 範例:
pop_size=5,iterations=20。 - 讓追蹤族群行為和隔離問題變得更容易。
(2) 插入列印語句:
- 列印族群適應度、最佳個體和中間值。
- 對於大型張量,列印形狀(shapes)或對較小的張量使用
.tolist()。 - 幫助您了解收斂情況和運算子的影響。
(3) 使用 IDE 斷點:
- 使用 PyCharm 或 VS Code 在演算法
step()或評估邏輯內設定斷點。 - 檢查變數值、張量內容或狀態轉換。
- 對大型張量要謹慎——限制檢查內容以避免崩潰。
(4) 單元測試自訂組件:
- 單獨測試交配/突變函數。
- 在完全整合之前,使用合成輸入來驗證輸出形狀和邏輯。
(5) 效能分析 (Profile Execution):
- 使用
torch.autograd.profiler.profile或time.time()來測量步驟時間。 - 幫助您定位瓶頸或無窮迴圈。
- 識別變慢是在評估中還是在演算法邏輯中。
(6) 將輸出記錄到檔案:
- 將長時間執行的日誌寫入
.csv檔案。 - 包含每一代的最佳適應度、多樣性統計數據等。
- 當崩潰導致無法看到控制台輸出時很有用。
總體而言,除錯 EvoX 專案需要在正確性檢查和結果分析之間取得平衡。首先專注於確保演算法正常運行,然後再優化其有效性。
6.3 效能調校指南
這些技巧可幫助您從 EvoX 榨出更多速度和品質:
(1) 漸進式擴展:
- 從小規模開始:使用小輸入測試邏輯。
- 擴大規模:逐漸擴大並觀察執行時間如何增加。
- 識別低效率:如果擴展是非線性的(例如,10 倍族群 → >10 倍時間),則找出低效率之處。
(2) 監控硬體使用率:
- GPU 使用
nvidia-smi,CPU 使用htop。 - 高 GPU 使用率(>50%)是理想的。
- 低 GPU 使用率可能意味著數據不在 GPU 上,或者頻繁的 CPU-GPU 傳輸拖慢了速度。
(3) 調整平行度:
- 設定 CPU 執行緒:
torch.set_num_threads(n)。 - 如果使用多執行緒評估工具,請避免過度訂閱(oversubscription)。
- 對於 GPU,如果使用批次環境或資料集,請優化
DataLoader執行緒。
(4) 利用批次評估:
- 批次評估比逐個個體評估更快。
- 始終向量化
Problem.evaluate()以處理整個族群。
(5) 減少 Python 開銷:
- 將繁重的邏輯移至
Algorithm或Problem內部,避免在主迴圈中使用複雜的 Python 程式碼。 - 對大多數操作使用
workflow.step()。 - 如果每代診斷會拖慢執行速度,請盡量減少。
(6) 調整演算法選擇:
- 嘗試 CMA-ES、GA、PSO、RVEA 等——沒有單一演算法適用於所有問題。
- 一個收斂速度更快的演算法可能比微調一個收斂緩慢的演算法節省更多時間。
效能調校是迭代的。只要有耐心,您可以將執行時間從數小時縮短到數分鐘。EvoX 提供了許多「旋鈕」——請明智地使用它們來平衡速度和解決方案品質。