train.py被拆分成三個ep介紹,ep.4介紹的是參數的部分,主要有分訓練用的必要參數、multi-GPU的非必要參數、加速模型的非必要參數;ep.5介紹了程式流程的前半部分,最一開始就是先處理如何分配工作給多個GPU,接著依照多gpu載入的方式,分別載入資料集還有載入模型。
分配工作給多個GPU有兩種分法:
tensorflow是用Data parallelism的方式,所以可以看到287行寫著要把指定的batch size,平均分給GPU們。
把資料集與糢型載入後,接著就剩下一些模型的運算(op)要定義,以及紀錄訓練情況的程式,還有最後真正執行訓練的部分。
剩下的部分,就讓我們開始吧。
train.py
(cont.)從ep.5講過的地方開始:
314行是透過tf.train提供的method去初始化模型更新次數的值。
接著317-320行在準備有關模型的參數。
321行利用模型的參數,建立多個模型副本,準備供GPU(們)使用。
325行只是在規範要取得的op的範圍,上面註解也有說只拿第一個clone的op。
326行把透過tf.get_collection,用兩個條件:1是指定拿Graph裡的update_ops,2是只拿在"clone_0"scope裡的update_ops,也就是只拿名字中有包含clone_0的update_ops。
然後with語法結束。
接著328-329行中,有看到summaries、tf.summary的程式,這些東西都會出現在event檔案中,也就是可以用tensorboard看的意思。
接著是透過tf.Graph提供的get_tensor_by_name的method,把input、output tensor給叫出來。
350-351行是把output tensor給叫出來,這裏output tensor的名稱是clone_0/semantic:0
,會是這個名稱的原因除了已經知道多gpu的命名方式之外,還有317-320行的模型參數設定部分。
接著363-375行、379-385行就是模型的learning rate、optimizer要調配,挑選的事情。
接著是quantization的部分,即進一步加強模型performance的程式,這邊注意到的是,目前程式的quantization不支援用多GPU訓練,等於說兩個只能二擇一,我現在也不清楚是這兩個理論上做不到共存,還是實作上有困難。
接著就是在optimizer已設定好的情況下,去取得loss和gradients。