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