常見的 PyTorch 錯誤和解決方案¶
我的訓練太慢了 [新手 / 中級]¶
在某些情況下,眾所周知強化學習是 CPU 密集型的。即使並行執行少量環境,透過在叢集上請求比您正在處理的環境數量更多的核心(例如兩倍),您也會看到巨大的速度提升。對於需要渲染的環境尤其如此(即使它們是在 GPU 上渲染的)。
訓練速度取決於幾個因素,沒有一種萬能的解決方案適用於所有問題。常見的瓶頸是:
資料收集:模擬器速度可能會影響效能,後續的資料轉換也是如此。加速環境互動通常透過向量化(如果模擬器支援,例如 Brax 和其他基於 Jax 的模擬器)或並行化(在 gym 和其他庫中不恰當地稱為向量化環境)來實現。在 TorchRL 中,轉換通常可以在裝置上執行。
經驗回放緩衝區儲存和取樣:如果底層操作需要大量的記憶體操作或繁瑣的索引(例如使用優先順序經驗回放緩衝區),將條目儲存到經驗回放緩衝區可能會耗時。如果資料不是連續儲存且/或執行了耗時的堆疊或連線操作,取樣也可能花費相當長的時間。TorchRL 在這些情況下提供了高效的連續儲存解決方案以及高效的寫入和取樣解決方案。
優勢計算:計算優勢函式也可能構成計算瓶頸,因為這些通常是使用簡單的 for 迴圈編寫的。如果效能分析表明此操作耗時較長,請考慮改用我們完全向量化的解決方案。
損失計算:損失計算和最佳化步驟經常佔用了相當一部分計算時間。一些技術可以加速此過程。例如,如果使用了多個目標網路,使用向量化對映和函數語言程式設計(透過 functorch)而不是遍歷模型配置,可以顯著提高速度。
常見 bug¶
對於與 mujoco 相關的 bug(包括 DeepMind Control suite 和其他庫),請參考 MUJOCO_INSTALLATION 檔案。
ValueError: bad value(s) in fds_to_keep:這可能有多種原因。在 torchrl 中常見的一個原因是,您試圖在程序之間傳送一個作為另一個張量檢視的張量。例如,當在程序之間傳送張量b = tensor.expand(new_shape)時,對原始內容的引用將丟失(因為expand操作保留了對原始張量的引用)。要除錯此問題,請查詢此類操作(view,permute,expand等),並在呼叫函式後呼叫clone()或contiguous()。