上次說到模型是由一個副程式_build_deeplab
去建立的,但由於Deeplab有支援multi GPU,所以在建立整個訓練流程時,需要部署模型與資料,也就是說,我可能需要去看model_deploy
這個東西是怎麼處理送來的_build_deeplab
。
好吧,不管怎麼樣,我就先從model_deploy
開始看吧。
model_deploy是從deployment這裡import進來的,我從github的deeplab資料夾往上層移動,但沒有看到有叫做deployment的資料夾,所以我又往deeplab的README.md
去看,找到Installation的連結,也沒有看到,只有看到slim,所以先去slim資料夾找。
幸運的是,部署的功能的確是在slim這個專案內。
趕緊來看deployment.py
deployment.py
一開始呼叫的是create_clones()
,model_fn的參數放的是_build_deeplab()這個副程式的名字,然後args放的是model_args。
create_clones
就是在處理每個GPU上需要的資源:組成模型的tensor。就一般認知而言,每個變數在同一個程式中,必須是不同的名稱,才能正常運作,但是在Deep Learning開出來的模型中,隨便就會產生出好幾百萬個變數,所以在命名時為了方便,可以加入scope,去簡單的把變數分組。
具體作法就是:假設今天有個scope叫做「Tesla」,那麼在這個with這個scope底下所有新產生的tensor,他的tensor name都會自帶Tesla/
作為標示,像是如果在這個底下建立一個conv layer, 那麼這個conv layer的名稱就會是Tesla/Conv_xx
。
然後因為slim的API預設會讓convlution layer加上一個bias,所以其實他的名稱會是
Tesla/Conv_xx/BiasAdd
的樣子
那為了能在不同的clone上辨識同名同姓的tensor,所以在使用multi gpu時,會需要把模型中同樣名稱的tensor,再用scope加入一個可以標示他屬於哪個clone的標示,就是像上圖187行在做的事一樣。
每一層關於scope的部分,都是在處理這個名稱問題。
預備處理好到時候產生model時,各clone需要調整名稱的問題,192行就呼叫了model_fn
,然後...*你以為他是return 一個outputs嗎?
*錯了!才不是呢,因為_build_deeplab()這個method根本沒有return值!!沒有吧?
他其實是把model_fn(*args, **kwargs)
整個放入outputs
這個變數,然後再把它放到Clone裡。
Clone是什麼?
這個要拉到上面看118行,他是一個有名稱的tuple,有outputs
:經過模型後的output、scope
:會建立在哪個scope裡、device
:會在哪片GPU上跑。
然後把設定append進clones
變數裡,回傳它。
講到這邊,看來似乎得去看_build_deeplab到底在做什麼,才會明白outputs
這個欄位放的是什麼東西。
我暫時無法理解,他在寫這個model_fn時,設定的這三個參數要怎麼從model_args取得,但沒關係,反正我只要知道他會傳過來就行。
總而言之,這個method會取得已經處理好的dataset做成的iterator,和訓練集的分類數量,以及忽略計算的label是哪個。
還記得我們的sample格式有key name為common.IMAGE
跟common.LABEL
的欄位。
後面的ModelOptions的呼叫方式不太懂,希望明天的我會懂。