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 等包裝器將 RL 環境轉化為最佳化問題。像 ParamsAndVector 這樣的工具也包含在內,用於將 PyTorch 模型參數展平為向量以進行演化。請注意,Brax 僅在 Linux 或透過 WSL 的 Windows 上運作——原生 Windows Python 可能只能在 CPU 上運行。簡而言之,啟用或禁用 EvoX 插件是透過安裝特定的額外選項來控制的。

  • 兄弟專案:EvoX 有相關的專案,如 EvoRL(專注於演化強化學習)和 EvoGP(GPU 加速遺傳規劃)。這些專案共享 EvoX 的設計理念和介面。如果您的任務偏重於 RL,您可能會更喜歡這些專用框架。管理這些插件意味著確保版本相容性並滿足依賴關係。例如,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 的分析器 (profiler) 或 Python 的 cProfile 等工具來分析瓶頸。這有助於您識別時間是花在評估、選擇還是其他方面——以便您可以相應地進行優化(例如,透過快取重複的計算)。EvoX 專為效能而建,但實際任務仍可能遇到需要分析的獨特瓶頸。

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