Build the Baseline One-shot Neural Architecture Search by OSNASLib

黃顯堯
10 min readOct 14, 2021

--

本篇文章介紹如何使用 one-shot NAS library — OSNASLib 來使得各位可以快速的根據不同的 tasks (e.g., classification, and face recognition) 來建構 one-shot NAS baselines。
讀者可以閱讀 提煉再提煉濃縮再濃縮:Neural Architecture Search 介紹 來更加了解什麼是 one-shot NAS。
更多詳細內容介紹: OSNASLib 論文連結

什麼是 OSNASLib

透過神經網路搜索 (Neural Architecture Search) 來提升各式各樣的 tasks (e.g., classification, face recognition, and object detection) 的 performance 並且減少運算資源在現今已經是個非常重要的一個研究方向及目標。

然而,要將 one-shot NAS 結合至不同的 tasks 當中,首先會遇到幾個挑戰:

  1. 除了對於 target tasks 非常熟悉之外,同時也需要對於 NAS 具有一定程度的了解。
  2. 大部分的 NAS 方法皆是基於圖片分類進行開發,而各式各樣的 coding style 以及 training pipelines 使得要將 NAS 結合不同的 tasks 的難度更佳的提高。

OSNASLIb (One-shot NAS library),是一個 open-source one-shot framework,在此 framework 當中,使用者可以根據需求輕鬆的將各式各樣不同的 tasks 和 one-shot NAS 整合。OSNASLib 當中主要可以分成六個主要的 components:critertion,dataflow,training agent,search space,search strategy,以及 training strategy,OSNASLib 架構如同下圖所示:

對於此六個 components,OSNASLib 皆提供了數種 baselines,使用者可以直接使用各種 baselines components 來快速組建出多種不同的 baseline one-shot NAS methods,而不需要實作演算法細節。

OSNASLib 適合以下情況的使用者:

  1. 希望學習 one-shot NAS,同時希望快速建立多種不同的 baseline codebase 的使用者。
  2. 希望將 one-shot NAS 整合進不同 application tasks 以增進 performance 的研究員。
  3. 專注於研究 one-shot NAS methods 的研究員,同時希望可以公平且快速的和其他方法進行比較。

在 OSNASLib 當中,每個 components 的 input/output 以及各個 components 之間的關係和串接方式皆已經被詳細的定義,這樣的架構在 OSNASLib 當中我們稱之為 “interface”。而透過遵守 “interface” 的當中的 api,使用者可以快速的設計出不同的各式各樣的 components,而不需要全部重新自己 implement ,也不需要耗費過多的心力在跟各個 component 進行串接。

接下來,會詳細介紹在 OSNASLib 當中所 cover 的六個 components :

Components 介紹

在 OSNASLib 當中,主要分成 6 個 components,而在每個 components 當中,OSNASLib 除了提供了多種 baseline 供使用者使用,同時也允許使用者根據 component 當中的 api 來客制各式各樣不同的 algorithms。

Training Agent

對於不同的 tasks (e.g., image classification, face recongition, or object detection),我們可能會有不同的 training pipeline。舉例來說,在 image classification 當中,我們的訓練流程便是 1) 取出圖片 2) forward 3) backward 4) 更新參數,那可想而知的這樣的流程是沒有辦法應用在所有不同的 computer vision tasks 當中。

因此在 OSNASLib 當中,我們將不同 tasks 的”訓練流程”從整個 NAS 的搜索框架中拆分開來。透過這樣的拆分,OSNASLib 允許使用者根據不同的 tasks 來自行定義不同的訓練流程 (training pipeline,training agent)。

而 OSNASLib 會透過 main agent 來將不同的 training agent 跟其他 components 進行整合來做搜索。

Criterion

對於不同的訓練流程 (training strategy) 或是搜索方法 (search strategy),使用的 loss function 往往會不同,因此在 OSNASLib 當中,允許使用者自行定義不同的 loss function。

Dataflow

對於不同的 tasks 以及不同的資料集,我們可能會需要有不同的 data preprocessing 或是不同的 data loading scheme。因此 OSNASLib 允許使用者根據不同的

Search Space

在 OSNASLib 當中,我們允許使用者根據不同的 application tasks 以及不同的 hardware constraint resources 自行定義不同的 search space。下圖展示了 search space 的架構:

要定義一個 search space,首先我們需要定義 search space configuration,當中需要詳細定義整個 search space 的設定 (e.g., 每層 layer 的所有 candidate blocks 以及每層 layer 的 input/output channel sizes)。在搜索神經網路時,main agent 便會透過 supernet builder 以及 search space configuration 建構起整個 supernet。

為了達到 “根據不同的硬體資源目標進行搜索” 的目標,OSNASLib 透過 hardware constraint lookup table 來評估在 supernet 當中每一個 sub-network 的硬體資源成本 (hardware cost),也就是説在 lookup table 當中,OSNASLib 會存放在每層 layer 當中每個 candidate block 的硬體資源成本,給定一個 sub-network,OSNASLib 會將這個 sub-network 每層 block 透過查表的方式得到該 block 所需要的硬體資源成本,並將每層的硬體資源成本鄉總,進而代表這個 sub-network 所需要的硬體資源成本,這樣的方式才許多 one-shot NAS paper 當中被採用,同時可以使得評估硬體資源成本的過程更家的快速。

在整個搜索結束之後,OSNASLib 會透過 specific model builder 來建構搜索到的神經網路,並且可以用來重新訓練來評估真正的 performance。

Search Strategy

給定一個 supernet,我們希望從中得到最高 performance,同時符合我們需求的硬體資源成本的 architecture,而要如何得到這個 “好的 architecture”,便需要依靠 search strategy,因此,好的 search strategy 可以更快速的找到更好的 architecture。

在 OSNASLib 當中,允許使用者自行定義不同的 search strategy 來更有效率的搜索出更好的 architecture。

Training Strategy

在 one-shot NAS 當中,我們透過訓練 supernet 來評估整個 search space 當中的所有 architecture,因此 supernet 的好壞會嚴重影響到最後搜索的結果好壞,i.e., 當 supernet 沒有辦法公正的表示每個 architecture 的好壞的時候,最後搜索的過程可以相當於是隨機挑選一個 architecture。

因此,在 OSNASLib 當中,允許使用者自行定義並開發各種訓練 supernet 的方法,已達到更好的搜索結果。

Baseline Components 介紹

在 OSNASLib 當中,除了允許使用者自行定義並開發各種 components 之外,同時也提供了許多不同的 baseline components 讓使用者可以更加便利進行實驗比較。以下為 OSNASLib 所提供的 baseline components:

在 OSNASLib 當中,允許使用者根據需求自由的搭配不同的 baseline component 來進行搜索

舉例來說,我們可以使用 SPOS search space,random searcher search strategy 以及 uniform sampler 來進行搜索,同時我們也可以使用 FBNet search space,random searcher search strategy 以及 uniform sampler 來進行搜索。如此一來,我們便可以以一模一樣的設定和程式碼來公平的比較不同 search space 的好壞

Interface Generator 介紹

在 OSNASLib 當中允許使用者自行定義並開發每個 components,然而要使得開發的 component 可以被其他 components 使用其實並不是件容易的事情,可想而知的是我們需要尊造 component 應有的 api,同時還要小心的 import component 至許多他應該要被 import 的地方。因此 OSNASLib 提供了 Interface Generator 來自動的生成所需要的 api template 並且進行相關需要的 import 來大幅度的減少使用者開發時所需要的負擔和麻煩。

而使用 Interface Generator 的方式很簡單,只需要一行 command line 便可以生成出所有相關的檔案,舉例來說,當使用者想要生成名為 mynas 且 class name 為 MyNAS 的 search space component,使用者便只需要以下一行指令即可生成所有相關且需要的檔案和資料夾:

當指令輸入完畢之後,便可以在 search space 的資料夾中發現以下檔案架構:

如此一來,使用者便可以直接修改這些檔案當中的內容,來快速地進行開發,更可以專心的開發演算法本身而不需要被其他瑣碎的事情影響到。

結論

OSNASLib 允許使用者簡單且彈性的將 one-shot NAS 應用至不同的 application tasks,同時透過 Interface Generator,使用者可以更加彈性的進行不同 components 的擴充。

更多詳細的使用方法和範例皆於 github repo 中有更詳細的介紹和說明,也歡迎大家送出 pull request 來使得 OSNASLib 變得更好!

--

--