6. 疑難排解與最佳化

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/tellstep)。
    • 使用最新的穩定版本並參考其文件。
    • 調整程式碼以符合您的 EvoX 版本或考慮升級。

6.2 除錯技巧

由於演化演算法的隨機性質,除錯可能很棘手。以下是實用技巧:

(1) 使用小規模測試

  • 減少種群大小和迭代次數以簡化除錯。
  • 範例:pop_size=5iterations=20
  • 使追蹤種群行為和隔離問題更容易。

(2) 插入列印語句

  • 列印種群適應度、最佳個體和中間值。
  • 對於大型張量,列印形狀或對較小的張量使用 .tolist()
  • 幫助您理解收斂和運算子效果。

(3) 使用 IDE 斷點

  • 使用 PyCharm 或 VS Code 在演算法 step() 或評估邏輯中設定斷點。
  • 檢查變數值、張量內容或狀態轉換。
  • 對大型張量要謹慎——限制檢查的內容以避免崩潰。

(4) 單元測試自訂元件

  • 單獨測試交叉/變異函數。
  • 使用合成輸入驗證輸出形狀和邏輯,然後再進行完整整合。

(5) 分析執行效能

  • 使用 torch.autograd.profiler.profiletime.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 開銷

  • 將繁重的邏輯移到 AlgorithmProblem 內部,避免在主迴圈中使用複雜的 Python 程式碼。
  • 大多數操作使用 workflow.step()
  • 如果每代診斷拖慢了執行速度,請減少它們。

(6) 調整演算法選擇

  • 嘗試 CMA-ES、GA、PSO、RVEA 等——沒有單一演算法對所有問題都是最佳的。
  • 收斂更快的演算法可能比微調一個收斂緩慢的演算法節省更多時間。

效能調整是迭代的。有了耐心,您可以從數小時的執行時間縮短到幾分鐘。EvoX 為您提供了大量的「旋鈕」——明智地使用它們來平衡速度和解的品質。