1. 程式人生 > >神經網路自動化調參框架MultiRunner詳解

神經網路自動化調參框架MultiRunner詳解

MultiRunner說明文件

注意,本包的使用極度簡潔,原始碼完全無需改動,使用本包的時候,包含import語句在內,僅需加入四行程式碼。

如果你遇到了以下問題之一,你可能需要這個包:

  • 你是一個機器學習調參俠,你有多臺共享硬碟的主機(節點,CPU,GPU,aws等),你需要以不同的引數執行一個函式多次,該函式針對每個引數返回一個結果(你可能想知道最好的那個結果所對應的引數,沒錯,我說的就是深度煉丹)。你想讓這些主機並行地為你跑程式,但是你懶得手動一個個輸入命令,且由於不同的主機運算能力不同,你不知道該如何為不同的節點分配不同的任務量,你不願意坐在電腦前等著程式執行結束,也不想一個個手動輸入命令

  • 你有一臺普通電腦,你需要以不同的引數執行一個函式多次並得到結果,你想盡力將其並行化,但是你不想學習Multiprocessing庫

先看一個例子,你原來的程式碼可能是這樣的:

# old_run.py

def train_a_model(batch_size,hidden_layer_number,learning_rate):
    #your code here
    return accuracy

for batch_size in [16,64,256]:
    for hidden_layer_number in [1,2]:
        for learning_rate in
[0.001,0.01,0.1]: print batch_size,hidden_layer_number,learning_rate my_result = train_a_model(batch_size,hidden_layer_number,learning_rate) print my_result

現在它可以是這樣:

# new_run.py

def train_a_model(batch_size,hidden_layer_number,learning_rate):
    #your code here
return accuracy from MultiRunner import MultiRunner a=MultiRunner() a.generate_ini([[16,64,256], [1,2], [0.001,0.01,0.1]])#注意這裡,所有的引數列表要最後用一個list或者tuple括起來 a.run(train_a_model)

注意:新的程式碼可以在多臺共享硬碟的主機上同時跑,多臺主機會並行地跑不同的實驗,一個主機上的某個實驗跑完之後將以檔案格式儲存該實驗結果並立即執行下一個沒跑過的實驗。我們已經在程式碼中做了充分的多程序衝突處理,而這一切都是封裝好的。

你只要需要在多個節點的同一個目錄下分別執行 python new_run.py 即可

執行該程式碼後,最先執行該程式碼的程序會建立./ini目錄,並在其中以檔案的格式儲存引數用於程序同步,以剛剛的程式碼為例,該資料夾內會有3*2*3=18個檔案,檔案以pickle格式儲存,分明命名為0_to_run, 1_to_run …… 17_to_run

實驗過程中,每個正在執行的實驗字尾會被改為XX_running,以5_to_run為例,該引數對應的實驗過程中,5_to_run將被改名為5_running,若該實驗成功執行完畢,實驗結果以pickle檔案格式成功儲存於./results/5,5_running將被重新命名為5_finished。

程式碼可以處理實驗過程中的錯誤情況,如果某個引數的實驗中出現了錯誤,該引數對應的檔案XX_running會自動回滾為XX_to_run,之後該主機將會選擇另一個引數進行實驗,當一個程序合計錯誤次數達到一定值的時候,該程序將退出,預設值是5,該值可以通過物件建立時候的max_error_times引數進行設定。

進階內容

  • run方法中的 if_torch_use_best_nvidia_gpu 引數,預設值為0,當代碼使用pytorch的cuda操作且該引數賦值為1的時候,將自動選擇該主機上最空閒的nvidia驅動的顯示卡。
  • 為最大化地優化實驗速度,如果某程序執行完一個實驗後,進行下一個實驗引數選擇的時候發現所有的引數都已經實驗完畢或者實驗正在執行的,該程序會隨機選擇一個正在執行的實驗引數執行,這樣設計的目的是避免出現以下情況:A, B主機執行速度很快,C主機執行速度很慢,C選取了一個引數慢慢執行,A, B雖然沒有任務但是無法為C分擔,實驗速度被C拖慢。本設計中,如果遇到上述情況,A, B在執行完自己的實驗後都會執行C的實驗,並在C執行完畢前得到實驗結果,因此提高了實驗速度。但是,程式碼也會存在實驗結果已經全部得出但是仍有程序在執行的問題。

有任何問題都可以直接提issue,也可以發郵件聯絡我。

歡迎給Star,歡迎fork,歡迎提新需求。