Forge:如何管理你的機器學習實驗
【導讀】在開始機器學習實驗時,大多數人都會經歷幾個步驟。首先快速寫出模型原型和訓練指令碼。然而幾天之後,程式碼庫變得不規則,並且由於程式碼間混亂的依賴性和沒有固定結構,任何修改都需要花費很多時間。因此,我們隊模型進行重構,模型的各個部分被包裝成單獨的,有意義的物件。更進一步,我們經常面臨支援多個數據集和模型的變體,其中模型變體之間的差異不僅僅是超引數 - 它們通常在結構上不同並且具有不同的輸入或輸出。此時,我們開始複製訓練指令碼以支援模型變體。設定很簡單,但維護變成了一場噩夢:程式碼在不同的檔案中,一旦需要對程式碼修改,所有的檔案都要改一遍。
典型的實驗結構
而機器學習實驗的共性讓我們思考,有沒有一個通用的工具幫助我們管理實驗? 機器學習實驗有以下幾個共性:
指定資料和相應的超引數。
自定義定義模型及其超引數。
執行訓練指令碼並在訓練期間儲存模型checkpoints和日誌。
一旦訓練收斂,可在另一個指令碼或筆記本中載入模型checkpoints以進行全面評估或部署模型。
如果實驗確實存在一般結構,那麼應該管理實驗的工具。. Sacred and artemis非常適合管理配置檔案和實驗結果;您可以檢索實驗的配置,但是如果要在筆記本中載入已儲存的模型,則需要知道如何使用配置例項化模型。當談到TensorFlow時,有keras和其他api簡化模型構建,擬合和評估。雖然通常很有用,但它們相當繁重,難以訪問低階模型功能。
所有這些都表明我們可以從用於管理ML實驗的輕量級實驗框架中受益。對我來說,它需要滿足以下幾個要求:
它應該需要最少的設定。
它必須與tensorflow相容(這些天我是ML的主要工具)。
理想情況下,它應該可用於非張量流模型 - 軟體發展迅速,我的下一個專案可能在pytorch中。
應單獨指定和配置資料集和模型,以便以後可以混合和匹配它們。
應該為每個實驗儲存超引數引數和配置檔案,我們可以快速瀏覽它們而不使用非標準應用程式。
載入模開銷應該很少,理想情況下不需要觸及原始的模型構建程式碼。指出一個特定的實驗就足夠了。
Forge
配置
配置可能是Forge中最有用的元件。我們的想法是,我們可以將任意複雜的配置檔案指定為python函式,然後我們可以使用forge.load(config_file,* args,* kwargs)載入它,其中config_file是檔案系統上的路徑。慣例是配置檔案應該使用以下簽名定義load函式:load(config, args,** kwargs)。傳遞給forge.load的引數和kw-args會自動轉發到配置檔案中的load函式。為什麼要通過提供檔案路徑來載入配置?使程式碼維護更容易!在訓練/實驗指令碼中編寫配置載入程式碼後,最好不再改寫它。但是如何交換配置檔案?不觸及訓練指令碼:如果我們將檔案路徑指定為命令列引數,那麼我們可以輕鬆完成。這是一個例子。假設我們的資料配置檔案data_config.py如下:
模型檔案定義了一個簡單的單層全連線神經網路,分類損失和model_config.py中的一些指標。 如下所示。
現在我們可以編寫一個名為experiment.py的簡單指令碼來載入一些資料和模型配置檔案,並做一些有意思的事。
這是最好的部分。你可以執行python experiment.py來執行上面給出的配置檔案的指令碼。但是如果你想執行一個不同的配置,你可以執行python experiment.py --data_config some / config / file / path.py而不需要觸及實驗程式碼。所有這些都非常輕量級,因為配置檔案可以返回任何內容並獲取您認為必要的任何引數。
智慧checkpoints
鑑於我們有非常通用和靈活的配置檔案,應該可以抽象出模型載入。例如,如果我們可以載入模型快照而不指向用於訓練模型的配置檔案(一般來說是在模型程式碼中),那將是很棒的。我們可以通過使用模型快照儲存配置檔案來實現。它可以顯著簡化模型評估和部署,並提高我們實驗的可重複性。我們該怎麼做呢?
智慧checkpoints框架取決於以下資料夾結構。
results_dir是包含潛在許多特定於實驗的資料夾的頂級目錄,其中每個實驗都有一個由run_name表示的單獨資料夾。 我們可能想重新執行一個特定的實驗,因此,每次執行它時,forge都會建立一個資料夾,其名稱是一個整數 - 這個執行的編號。 它從一開始,每次開始同一個實驗的新執行時都會遞增。 我們也可以通過傳遞標誌來恢復最後一次,而不是開始新的執行。 在這種情況下,我們不為其建立新資料夾,但使用編號最大的資料夾並載入最新的模型快照。
首先,我們需要匯入forge.experiment_tools並定義以下標誌。
然後我們可以解析標誌並初始化我們的checkpoints。
fet.init_checkpoint做了一些有用的事情:
建立上面提到的目錄結構。
將資料和模型配置檔案複製到checkpoints資料夾。
在flags.json中儲存所有配置標誌和當前git提交的雜湊(如果我們在git repo中,對於可重複性非常有用),或者如果restore為True則恢復標誌。
弄清楚是否存在應載入的模型快照檔案。
logdir是我們的checkpoint資料夾的路徑,並且計算結果為results_dir / run_name / <integer>。 如果resume為True,則resume_checkpoint是checkpoints的路徑,通常為results_dir / run_name / <integer> /model.ckpt- <maximum global step>,否則為None。
現在我們需要使用logdir和resume_checkpoint來儲存任何日誌和模型快照。 例如:
如果我們想在另一個指令碼eval.py中載入我們的模型快照,那麼我們可以非常直接的這樣做。
原文連結:
https://akosiorek.github.io/ml/2018/11/28/forge.html
Github地址:
https://github.com/akosiorek/forge
原文釋出時間為:2018-12-1
本文作者:專知
本文來自雲棲社群合作伙伴“ofollow,noindex">專知 ”,瞭解相關資訊可以關注“Quan_Zhuanzhi”微信公眾號