4. 進階功能

4. 進階功能

EvoX 提供了許多進階功能以滿足更複雜的需求。在熟悉基礎知識後,本章介紹如何自訂框架配置、管理可選的外掛模組以及最佳化效能——使您能在必要時擴展和調整 EvoX。

自訂配置

EvoX 的預設設定適合大多數情況,但有時您可能想要自訂框架的行為或參數。例如:

  • 調整演算法參數:除了基本的種群大小和迭代次數外,許多演算法還公開了進階參數。例如,CMA-ES 允許配置初始協方差矩陣,NSGA-II 公開了擁擠距離參數。您可以將參數傳遞給演算法的建構函數,例如 GA(crossover_prob=0.9, mutation_prob=0.1) 自訂遺傳演算法中的交叉和變異機率。調整這些可以微調效能。請參考 EvoX 文件中每個演算法的 API,其中列出了可用的參數和預設值。

  • 替換運算元件:您可以替換內部的演化運算子(如選擇或變異策略)。某些演算法類別支援傳入自訂運算子物件。例如,差分演化(DE)可能支援自訂變異運算子,允許您提供自訂函數或 Operator 類別。EvoX 的模組化設計支援這種「外掛式」替換。這通常需要了解演算法內部結構,對於標準使用場景通常不是必需的。

  • 多目標設定:對於多目標最佳化,您可能需要配置偏好或權重——例如為加權求和方法設定權重向量,或在演化過程中調整參考點。這些配置通常透過問題或演算法類別中的參數公開。例如,problem = DTLZ2(d=12, m=3) 定義了一個 12 維、3 目標的問題。某些演算法允許傳入自訂參考向量。閱讀演算法文件有助於您充分利用這些設定。

  • 日誌和輸出:預設的 EvalMonitor 已經記錄了關鍵的最佳化指標。如果您需要額外資訊(如種群多樣性或每代的平均適應度),您可以自訂監控器或在迴圈中手動記錄。對於長時間執行的任務,您可能想要記錄到檔案。這可以使用 Python 的 logging 函式庫或簡單的檔案 I/O 來附加結果以供後續分析。

總之,自訂配置意味著為特定任務修改 EvoX 的預設行為。這通常涉及更深入地使用 EvoX 的 API。我們將在開發與擴展部分中介紹更多內容。對於初學者,只需記住:EvoX 提供了靈活的介面,讓有經驗的使用者可以調整幾乎每個細節——但您也可以堅持使用預設值並快速獲得結果。

外掛管理

這裡的「外掛」指的是 EvoX 中的可選元件或擴展模組——如視覺化工具、強化學習環境包裝器,以及 EvoX 生態系統中的相關專案。在 EvoX 中管理外掛主要涉及安裝和使用可選模組。以下是一些關鍵擴展及其管理方式:

  • 視覺化外掛:EvoX 包含 evox.vis_tools 模組,其中包含用於繪圖的 plot 子模組,並支援 .exv 日誌格式用於即時資料串流。要使用視覺化功能,請使用 vis 額外選項安裝 EvoX:pip install evox[vis]。(如果初始安裝時未包含,您可以稍後安裝,或直接執行 pip install plotly 來滿足相依性。)使用視覺化工具時,您通常在監控器記錄資料後呼叫繪圖函數——例如,EvalMonitor.plot() 使用 vis_tools.plot。確保安裝了此外掛可以避免因缺少 matplotlib 等函式庫而產生的錯誤。

  • 神經演化外掛:EvoX 支援強化學習環境(如 Brax 物理引擎)和神經個體最佳化(神經演化)。這些功能捆綁在 neuroevolution 擴展中,透過 pip install "evox[neuroevolution]" 安裝。這包括 Google Brax 函式庫、Gym 等。安裝後,您可以使用 evox.problems.neuroevolution 中的 BraxProblem 等包裝器將強化學習環境轉換為最佳化問題。ParamsAndVector 等工具也包含在內,用於將 PyTorch 模型參數展平為向量以進行演化。請注意,Brax 僅在 Linux 或透過 WSL 的 Windows 上運作——原生 Windows Python 可能只能在 CPU 上執行。簡而言之,啟用或停用 EvoX 外掛是透過安裝特定的額外選項來控制的。

  • 相關專案:EvoX 有相關專案,如 EvoRL(專注於演化強化學習)和 EvoGP(GPU 加速的遺傳程式設計)。這些共享 EvoX 的設計理念和介面。如果您的任務以強化學習為主,您可能更偏好這些專用框架。管理這些外掛意味著確保版本相容性和滿足相依性。例如,EvoRL 使用 JAX 和 Brax,而 EvoGP 可能需要符號樹函式庫。這些函式庫通常可以共存而不會衝突。將它們視為可以從主 EvoX 專案呼叫的互補工具——或者完全省略以保持精簡設定。

  • 自訂外掛:得益於 EvoX 的模組化,您可以建構自己的「外掛」。例如,建立一個自訂的 Monitor 類別來追蹤獨特的指標,或建立一個自訂的 Problem 子類別來包裝第三方模擬器。這些有效地擴展了 EvoX 的功能。最佳實踐是遵循 EvoX 的介面約定——例如,確保您的自訂 Problem 有一個 evaluate() 方法,或者您的自訂 Monitor 繼承自基底類別。經過測試後,您甚至可以將其貢獻給 EvoX 的未來版本。

總體而言,EvoX 中的外掛管理是關於靈活擴展和相依性控制。作為初學者,在安裝時,您可以決定是否包含 visneuroevolution 擴展。如果初始安裝時未包含,可以稍後新增。有了外掛,您可以更輕鬆地監控最佳化進度,並將 EvoX 與外部工具整合以獲得更強大的功能。

效能最佳化

效能是 EvoX 的一大優勢。即使使用相同的演算法,EvoX 的 GPU 支援也可以將速度提升數個數量級。然而,要充分發揮這一點,您需要遵循一些技巧:

  • 使用 GPU 平行化:首先,確保您的程式碼確實在 GPU 上執行。如前所述,安裝支援 CUDA 的 PyTorch 並將資料移動到 GPU 裝置。如果速度似乎很慢,請使用 torch.cuda.is_available() 檢查——它應該返回 True。如果 GPU 存在但未被使用,很可能是因為張量預設建立在 CPU 上。透過明確設定 device 或確保輸入張量(如 lb/ub)在 CUDA 上來修復此問題。EvoX 會跟隨這些輸入的裝置。在多 GPU 系統上,EvoX 通常使用每個程序一個 GPU。要利用多個 GPU,您可以使用不同的 GPU 執行多個程序,或等待未來對協調多 GPU 執行的支援。

  • 平行評估:演化演算法中的一個關鍵瓶頸是適應度評估。由於評估通常是獨立的,它們可以被平行化。EvoX 在可能的情況下批次處理評估——例如,神經網路評估或多項式函數可以使用 GPU 平行計算。對於自訂問題,避免使用 Python 迴圈——向量化您的評估程式碼以一次處理整批候選者。這充分利用了 PyTorch 的平行能力。簡而言之:讓您的問題的 evaluate() 函數對批次操作——而不是單個解——以獲得大幅加速。

  • 編譯最佳化:PyTorch 2.0 引入了 torch.compile,它可以 JIT 編譯模型/函數以提升效能。如果您的評估邏輯很複雜,考慮在執行前進行編譯:

    jit_state_step = torch.compile(workflow.step())

    這可以顯著提升效能。

    注意:

編譯會增加額外開銷,且並非所有函數或問題都支援。最適合大規模、長時間執行的任務。在 Windows 上,確保安裝了 Triton 才能使 torch.compile 正常工作。

  • 調整種群大小:較大的種群增加了多樣性和全域搜尋能力——但也增加了每代的計算量。透過調整 pop_size 來平衡品質和速度。在 GPU 上,您通常可以增加種群大小而不會線性增加時間成本(得益於平行化)。但過大的種群可能導致記憶體問題。如果 GPU 記憶體不足,請減少種群大小或問題維度,或使用 FP16 來節省空間(透過 torch.set_float32_matmul_precision('medium') 設定)。

  • 減少 Python 開銷:EvoX 將大部分核心計算移至 torch.Tensor,但使用者編寫的迴圈或自訂運算子應避免過多的 Python 層級操作。避免頻繁列印(高 I/O 成本)、列表或資料類型轉換。保持程式碼向量化/張量化,以利用底層快速的 C++/CUDA 核心並減少 Python 直譯器開銷。

  • 分散式部署:對於超大規模問題,考慮跨多台機器執行。EvoX 支援多節點設定(透過後端通訊和分片)。雖然對初學者不太友善,但了解這一點很有用。有了 GPU 叢集,請參考 EvoX 的文件進行分散式部署。通常,您需要設定環境變數或使用特殊腳本啟動。該架構允許相同的程式碼在單節點或多節點設定上執行。首次嘗試時,可以在一台機器上使用多個程序來模擬。

  • 效能分析:要深入了解,請使用 PyTorch 的分析器或 Python 的 cProfile 等工具來分析瓶頸。這有助於您確定時間花在評估、選擇還是其他地方——以便您可以相應地最佳化(例如透過快取重複計算)。EvoX 在架構層面已經過最佳化,但實際任務可能仍會遇到需要分析的獨特瓶頸。

簡而言之,雖然 EvoX 在架構層面已經過最佳化,但使用者可以透過正確使用 GPU批次計算調整參數來進一步提升效能。在追求速度的同時,也要記住保持結果品質——平衡是關鍵。隨著您對 EvoX 越來越熟悉,效能調整將成為第二天性。