MMF的初步介紹:一個規範化的視覺-語言多模態任務框架

El_Psy_Congroo發表於2021-06-07

  在VQA, Image Caption等任務中,構建模型是一件工作量較大的工作。有沒有什麼能減少這些重複的工作量呢?與此同時,Pytorch,tensorflow等開源的深度學習工具包釋出,大大減少了研究人員在構建模型上的重複工作。於是,有機構開始著手以Pytorch為基礎,構建了VQA的框架。由Facebook AI Research實驗室使用python語言,以pytorch為基礎,編寫的框架MMF解決了這個問題。同時,MMF不僅包括了VQA,還有其它的很多VL多模態任務,如Image Caption等。

  如何執行MMF框架

  MMF的官方程式碼在Github上可以看到,而且附帶了大量的說明。同時,其官方網站https://mmf.sh/上也有較為詳細的介紹。但是初學者很容易”亂花漸欲迷人眼“,所以我就根據自己以前執行MMF的一些經驗教訓,介紹幾個重點的內容,方便小白入門理解。

 

 

 

  1. MMF框架是用python語言寫成的,使用了大量Pytorch工具包中的程式碼。所以要順利執行程式碼,需要一些python的基礎知識。python是指令碼語言,和C++、Java等語言有所不同,python是邊解釋邊執行的。其本身並沒有嚴格的一個”主程式入口“,也就是每一個檔案理論上都可以執行。當然,為了規範,python還是會用一些語法規則模擬出一個主程式入口。如果工程中一個.py檔案中有類似的如下語句,那麼這個檔案很大機率就是要執行的程式的入口,執行這個檔案一般就可以執行程式。
    if __name__=="__main__":
        function()  #do something
  1. 深度學習模型是千變萬化的,僅各種引數就有很多種組合,如果僅僅依靠執行一個檔案不能靈活地滿足實驗中引數修改的需求。python提供了一種方便調整引數的方法,使用如下格式。當然,可修改的引數arg1,arg2,…,argn要在檔案的程式碼中定義。
    python executeFile.py --arg1 arg2 ...
  2. 以上的方法還是有些不太靈活,python中還支援這樣的方式:將引數配置,編寫成能夠被讀取的.yaml格式的檔案,例如default.yaml,dataset.yaml等。呼叫yaml配置檔案的程式碼需要在檔案中定義好。當訓練時,執行程式通過呼叫儲存在具體位置的yaml配置檔案,從中獲取引數配置,例如使用哪一種方式訓練,使用哪一種資料集,迭代次數,batch_size等資訊。這樣,當訓練計劃有變時,我們只需要改變相應的yaml配置檔案中的引數,執行同樣的指令仍然可以實現程式的調整執行。該型別的指令如下:
    python configs/default.yaml  dataset=XXX train_val   '''類似的格式,不是完全符合'''
  3. 在mmf/setup.py中,對這種命令格式進行了進一步的打包,3中的指令,變為以下型別。在該更改中,會涉及到setuptools工具包,具體的使用說明請查閱該python工具包的文件。

    mmf_run configs/default.yaml  dataset=XXX train_val   '''類似的格式,不是完全符合'''

  如果你已經學習了python的一些基本的語法知識,同時瞭解以上幾種python程式執行方式,那麼你離成功執行程式成功前進了一大步。因為你知道了程式的入口,也就把握住了整體。

  下一步。就是為程式配置各種檔案環境了。因為python程式的一大特點是有很多種封裝好可下載的工具包,一些程式的編寫離不開這些包的支援,所以你需要確認一下requirement.txt中的各種要求有沒有滿足,沒有的要下載到正確的位置。這方面的知識,包括pytorch的安裝使用,其它包的安裝,如果包下載速度慢如何使用映象網站資源進行快速下載,anaconda、cuda等的安裝。這些問題各種網站上已經有詳細的說明解答,我就不多說了。
  安裝、配置好各種檔案後,我們繼續按照mmf的說明一步一步進行。

  下一步,就是mmf的直接執行,相關步驟在mmf的官方網站上寫的已經比較清楚了:

 

  

  在Quickstart中,以執行VQA中經典的M4C模型為樣例,通過在Linux的終端輸入training下方的命令列,進行執行。

  注意,訓練時會使用到很多引數,但以上的命令列中出現的config,dataset,model,run_type這些都是不可或缺的引數,而其它沒有輸入指明的,都是採用已經配置好的預設引數,這些引數可以在配置檔案如 mmf/configs/defaults.yaml , mmf/configs/models/ 等位置中找到,並且可以通過修改這些數值更改預設選項。

 

   當然,你也可以在命令列中新增這些引數,讓這一次的執行引數改變:

mmf_run config=projects/m4c/configs/textvqa/defaults.yaml \
    datasets=textvqa \
    model=m4c \
    run_type=train_val \
    training.batch_size=32 \
    training.max_updates=44000 \
    training.log_interval=10 \
    training.checkpoint_interval=100 \
    training.evaluation_interval=1000 \
   env.save_dir = /xxx/path_for_save_checkpoint_file \
checkpoint.resume_file = /xxx/path_for_load_specific_checkpoint_file
  

  執行前,最好把requirements.txt 檔案中記錄的python程式所需要的各種包一次下載好。

  輸入Quickstart命令後,程式開始執行,首先要載入各種準備資料,評價結果的工具包,以及其它訓練引數等。

  注意,模型訓練需要的資料很大!(約64GB),雖然這個程式會在指定路徑檢測不到資料集的情況下自動下載資料,但是由於網路等問題,經常會下了半天中斷又重新開始,所以建議最好先在本地找個可靠的網路,使用mmf/configs/zoo裡面的配置檔案中記錄的資料集連結,進行下載,然後將壓縮檔案上傳到配置檔案configs/dataset中的指定路徑下。

 

   後面是模型的載入,模型結構的輸出,可以看出模型層數還是非常多的:

 

   列印模型的引數結構後,如果沒有問題,模型就開始訓練了。在當前調整後的引數下,程式總共迭代44000次,每100次列印結果,訓練使用的m4c_decoding_bce_with_mask損失,即BCE二元交叉熵損失,每1000次儲存checkpoints檔案作為記錄,同時計算當前訓練引數下,模型在val驗證集上的指標得分。一般來說,隨著迭代次數的增加,損失loss整體下降。準確率等指標逐漸上升,就說明當前模型訓練整體是正確的。

 

 

   我是在伺服器上訓練的模型,使用一塊GTX2080的顯示卡,訓練結果大約花費了11個小時。尾聲階段,可以看出訓練的結果在驗證集上的準確率39%左右,這個和M4C的論文Iterative Answer Prediction with Pointer-Augmented,CVPR2020 中提到的結果是基本一樣的,這說明我們成功地復現了該模型的程式碼。

 

 

 

  該論文中,還有一個M4C(ours, w/ST-VQA)的情況,這個取得了更高的得分,需要在資料集中新增額外的ST-VQA作為輔助的訓練資料集,具體的操作請查閱mmf文件,以及M4C模型多個更改好的配置檔案。

 

相關文章