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,請確保您的張量已移動到 GPU(參見第 3 章的配置說明)。
- 使用
(3) 記憶體不足(RAM/VRAM):
- 症狀:您看到
OutOfMemoryError。 - 解決方案:
- 減少種群大小、問題維度或評估頻率。
- 使用 float16(半精度)或批次評估分割。
- 關閉 PyTorch 中的除錯/確定性模式。
- 僅儲存統計資料而非完整的 Pareto 前沿(對於多目標問題)。
- 升級硬體是解決記憶體瓶頸的終極方案。
(4) 收斂停滯:
- 症狀:演算法陷入局部最優。
- 解決方案:
- 增加種群多樣性(如提高變異率)。
- 嘗試不同的演算法或參數。
- 確保目標函數定義良好(不會太嘈雜或太平坦)。
- 執行多次試驗並選擇最佳結果——EvoX 使平行執行變得容易。
(5) 最佳化結果不佳:
- 症狀:最終結果低於預期。
- 解決方案:
- 檢查問題定義:確保適應度計算正確(如符號、縮放)。
- 演算法適配:嘗試其他演算法或調整超參數。
- 使用收斂曲線:
- 早期平坦 → 過早收斂。
- 振盪 → 隨機性過高。
- 調整演算法設定並分析隨時間的行為。
(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) 插入列印語句:
- 列印種群適應度、最佳個體和中間值。
- 對於大型張量,列印形狀或對較小的張量使用
.tolist()。 - 幫助您理解收斂和運算子效果。
(3) 使用 IDE 斷點:
- 使用 PyCharm 或 VS Code 在演算法
step()或評估邏輯中設定斷點。 - 檢查變數值、張量內容或狀態轉換。
- 對大型張量要謹慎——限制檢查的內容以避免崩潰。
(4) 單元測試自訂元件:
- 單獨測試交叉/變異函數。
- 使用合成輸入驗證輸出形狀和邏輯,然後再進行完整整合。
(5) 分析執行效能:
- 使用
torch.autograd.profiler.profile或time.time()來測量步驟計時。 - 幫助您定位瓶頸或無限迴圈。
- 確定延遲是在評估還是演算法邏輯中。
(6) 將輸出記錄到檔案:
- 為長時間執行將日誌寫入
.csv檔案。 - 包括每代最佳適應度、多樣性統計等。
- 當崩潰阻止看到主控台輸出時很有用。
總體而言,除錯 EvoX 專案需要在正確性檢查和結果分析之間取得平衡。首先專注於確保演算法正確執行,然後最佳化其效果。
6.3 效能調整指南
這些技巧幫助您從 EvoX 中獲得更多速度和品質:
(1) 漸進式擴展:
- 從小規模開始:使用小輸入測試邏輯。
- 逐步擴大規模並觀察執行時間如何增加。
- 如果擴展是非線性的(如 10 倍種群 → >10 倍時間),則識別低效率。
(2) 監控硬體使用:
- 使用
nvidia-smi監控 GPU,htop監控 CPU。 - 高 GPU 利用率(>50%)是理想的。
- 低 GPU 使用率可能意味著資料不在 GPU 上或頻繁的 CPU-GPU 傳輸正在拖慢速度。
(3) 調整平行度:
- 設定 CPU 執行緒:
torch.set_num_threads(n)。 - 如果使用多執行緒評估工具,避免過度訂閱。
- 對於 GPU,如果使用批次環境或資料集,最佳化
DataLoader執行緒。
(4) 利用批次評估:
- 批次評估比逐個評估更快。
- 始終向量化
Problem.evaluate()以處理整個種群。
(5) 減少 Python 開銷:
- 將繁重的邏輯移到
Algorithm或Problem內部,避免在主迴圈中使用複雜的 Python 程式碼。 - 大多數操作使用
workflow.step()。 - 如果每代診斷拖慢了執行速度,請減少它們。
(6) 調整演算法選擇:
- 嘗試 CMA-ES、GA、PSO、RVEA 等——沒有單一演算法對所有問題都是最佳的。
- 收斂更快的演算法可能比微調一個收斂緩慢的演算法節省更多時間。
效能調整是迭代的。有了耐心,您可以從數小時的執行時間縮短到幾分鐘。EvoX 為您提供了大量的「旋鈕」——明智地使用它們來平衡速度和解的品質。