一次訓練迭代可能產生多次觀測:損失、評估回報,以及隨後修正的指標。把每次寫入當成新迭代會打亂實驗對齊,丟棄重複步又會損失資訊。強化學習與演化學習框架 EvoRL 於北京時間 2026 年 11 月 12 日將本機 JSONL 記錄功能合入 main,並在 11 月 13 日完成檔名後續調整。兩次更新共同提供原始寫入記錄,以及獨立的、按訓練步對齊的分析檢視。

概念插畫:保留每次觀測,按訓練步整理合併後的檢視。
讓本機檔案帶上實驗背景資訊
選擇 recorders=[log,jsonl],即可在普通紀錄旁儲存機器可讀指標,無需額外的追蹤服務 SDK。版本化快速入門文件說明了訓練指令碼共用的記錄器配置,因此 JSONL 後端會收到專案、執行名稱、解析後的配置、標籤、輸出路徑和可選分組。
初始化時,這些背景資訊會寫入後設資料頭。此後每次寫入都會追加一個包含所提供整數 step 和巢狀 data 的 JSON 物件,並將檔案緩衝區寫出。原始檔案保留到達順序,包括亂序的訓練步和重複寫入。把實驗輸出目錄移到獨立分析機器時,配置與觀測可以隨同一個可讀的本機檔案一起轉移。
讀取時合併,記錄時保留
從 evorl.recorders 匯出的 load_jsonl_records(path) 會讀取完整資料集,傳回按訓練步排序的清單。它遞迴合併同一步的字典:後續寫入替換衝突值,未提及的指標保持不變。陣列整體替換,後續 null 也會覆蓋舊值。載入器跳過可選的首行後設資料頭,不把它放入指標清單。
例如,在第 10 步分別寫入訓練損失和評估回報,之後再修正該步的損失。原始檔案保留全部三次寫入;載入後的記錄包含最新損失和原有評估回報。即使第 8 步記錄更晚到達,排序後仍在第 10 步之前。這直接影響學習曲線:迭代身份由 step 決定,而不是檔案行號或紀錄呼叫次數。
明確序列化會保留什麼
實作及回歸測試覆蓋 NumPy、JAX 和 pandas 值。陣列和 Series 轉為清單;DataFrame 保留欄位與各列資料,但不保留索引。NaN、無窮值及 pandas 缺失值轉為 JSON null。如果 DataFrame 索引用於標識樣本,應先將其轉成明確的欄位;這是由實際儲存的表格結構決定的。
格式錯誤或不完整的行會觸發帶檔名和行號的錯誤,載入器不會默默丟棄被截斷的末條記錄。它會將完整資料集載入到記憶體,因此分析記憶體應按累積檔案規模規劃。應用自身名為 step 的指標仍保留在 data 內,與記錄器外層的迭代欄位區分。
每次執行使用獨立目標路徑
後續調整讓 JSONL 和指令碼建立的紀錄檔案共用 sanitize_filename。它將 / 替換為 _,例如 MetaWorld/Hammer-v3 變成 MetaWorld_Hammer-v3。其他字元不變,後設資料保留原始執行名稱。兩種檔案分別使用 .jsonl 和 .log 副檔名。這取代了首次提交的百分號編碼規則;檔名規範化並不保證唯一性。
重新初始化相同 JSONL 檔案路徑會覆蓋原有內容。每次執行應使用獨立輸出目錄或檔名,尤其要注意僅以斜線和底線區分的名稱。在包含這兩次提交的原始碼檢出版本上使用上述配置,先載入一個小實驗,檢查後設資料頭、重複步合併結果和輸出位置,再開展長時間執行。此前的 EvoRL 開發報道介紹了梯度、裝置和指標形狀的背景;本次更新讓這些觀測更容易在本機留存和重新分析。