最佳做法和建議的工作流程

假設您已執行教學課程,本頁面會概述 Agent Platform Neural Architecture Search 的最佳做法。第一部分概述完整工作流程,您可以按照這個流程執行 Agent Platform Neural Architecture Search 工作。其他章節則會詳細說明每個步驟。強烈建議您先詳閱本頁面,再執行第一個 Agent Platform Neural Architecture Search 工作。

建議的工作流程

以下摘要說明 Agent Platform Neural Architecture Search 的建議工作流程,並提供相關章節的連結,方便您查看詳細資訊:

  1. 分割訓練資料集,用於第 1 階段搜尋。
  2. 請確認搜尋空間符合我們的規範。
  3. 使用基準模型執行完整訓練,並取得驗證曲線。
    1. 最佳化基準模型的訓練時間。
  4. 執行代理任務設計工具,找出最佳代理任務。
  5. 對 Proxy 工作進行最終檢查。
  6. 設定適當的總試驗次數和並行試驗次數,然後開始搜尋。
  7. 監控搜尋圖,並在收斂、顯示大量錯誤或沒有收斂跡象時停止。
  8. 從搜尋結果中選擇前 10 名左右的試驗,執行完整訓練,取得最終結果。如要進行完整訓練,您可以使用更多增強功能或預先訓練的權重,盡可能提高效能。
  9. 分析搜尋結果中儲存的指標/資料,並得出結論,以便日後疊代搜尋空間。

NAS 搜尋。

上圖顯示一般的 Agent Platform Neural Architecture Search 曲線。這裡的 Y-axis 顯示試驗獎勵,X-axis 則顯示目前為止啟動的試驗次數。前 100 到 200 次試驗,大多是控制器對搜尋空間的隨機探索。在這些初始探索期間,獎勵會顯示較大的變異數,因為系統正在嘗試搜尋空間中的多種模型。隨著試驗次數增加,控制器會開始找出更好的模型。因此,獎勵一開始會增加,但之後獎勵變異和獎勵成長會開始減少,進而呈現收斂。收斂時的試驗次數可能會因搜尋空間大小而異,但通常約為 2,000 次。

Agent Platform Neural Architecture Search 的兩個階段:Proxy 工作和完整訓練

Agent Platform Neural Architecture Search 的運作方式分為兩個階段:

  • Stage1-search 使用的完整訓練表示法小得多,通常會在 1 到 2 小時內完成。這種表示法稱為「代理任務」,有助於降低搜尋成本。

  • Stage2-full-training 涉及對 stage1-search 中分數最高的前 10 個模型進行完整訓練。由於搜尋具有隨機性,stage1-search 的最頂層模型可能不是 stage2-full-training 的最頂層模型,因此請務必選取一組模型進行完整訓練。

由於控制器是從較小的代理任務 (而非完整訓練) 取得獎勵信號,因此請務必為任務找出最佳代理任務。

Agent Platform Neural Architecture Search 費用

Agent Platform Neural Architecture Search 的費用計算方式如下:search-cost = num-trials-to-converge * avg-proxy-task-cost。假設代理任務運算時間約為完整訓練時間的 1/30,且收斂所需的試驗次數約為 2000 次,則搜尋成本約為 67 * full-training-cost。

由於 Agent Platform Neural Architecture Search 的費用較高,建議您花時間調整 Proxy 工作,並在首次搜尋時使用較小的搜尋空間。

Agent Platform Neural Architecture Search 兩個階段之間的資料集分割

假設您已有基準訓練的 training-data 和 validation-data,建議您在 NAS Agent Platform 神經架構搜尋的兩個階段中,採用下列資料集分割方式:

  • 第 1 階段搜尋訓練:約 90% 的訓練資料
  • 第 1 階段 - 搜尋驗證:約 10% 的訓練資料

  • Stage2-full-training 訓練:100% 訓練資料

  • 第 2 階段完整訓練驗證:100% 驗證資料

stage2-full-training 資料分割與一般訓練相同。不過,stage1-search 會使用訓練資料分割進行驗證。在階段 1 和階段 2 使用不同的驗證資料,有助於偵測因資料集分割而產生的模型搜尋偏誤。請務必先將訓練資料充分隨機排序,再進一步分區,並確保最終 10% 的訓練資料分割與原始驗證資料有類似的分佈。

資料量少或不平衡

如果訓練資料有限,或資料集高度不平衡 (某些類別非常罕見),則不建議使用架構搜尋。如果因為資料不足,您已在基準訓練中大量使用擴增,則不建議使用模型搜尋。

在這種情況下,您可能只需要執行擴增搜尋,搜尋最佳擴增政策,而非搜尋最佳架構。

搜尋空間設計

  • 架構搜尋不應與擴增搜尋或超參數搜尋 (例如學習率或最佳化工具設定) 混用。架構搜尋的目標是比較模型 A 和模型 B 的成效,前提是兩者只有架構上的差異。因此,增強和超參數設定應保持不變。

  • 架構搜尋完成後,可以將擴增搜尋做為不同階段執行。

  • Agent Platform Neural Architecture Search 的搜尋空間大小可達 10^20。但如果搜尋空間較大,可以將搜尋空間分割為互斥的部分。舉例來說,您可以先搜尋編碼器,再搜尋解碼器或頭部。如果仍想對所有選項進行聯合搜尋,可以根據先前找到的最佳個別選項,建立較小的搜尋空間。

  • (選用) 設計搜尋空間時,您可以將模型縮放與區塊設計分開。應先使用縮減模型進行區塊設計搜尋。這可大幅降低 Proxy 任務執行階段的成本。接著,您可以另外搜尋擴充模型。詳情請參閱 Examples of scaled down models。

縮短訓練和搜尋時間

執行 Agent Platform Neural Architecture Search 前,請務必最佳化基準模型的訓練時間。長期下來可節省成本。以下是最佳化訓練的部分選項:

  • 盡可能提高資料載入速度:
    • 請確認資料所在的 bucket 與工作位於相同區域。
    • 如果使用 TensorFlow,請參閱 Best practice summary。您也可以嘗試使用 TFRecord 格式處理資料。
    • 如果使用 PyTorch,請按照指南操作,有效率地訓練 PyTorch。
  • 使用分散式訓練,充分運用多個加速器或多部機器。
  • 使用混合精確度訓練,可大幅加快訓練速度並減少記憶體用量。如要瞭解 TensorFlow 混合精度訓練,請參閱 Mixed Precision。
  • 部分加速器 (例如 A100) 通常更具成本效益。
  • 調整批次大小,確保 GPU 使用率達到最高。下圖顯示 GPU 使用率偏低 (50%)。GPU 使用率 增加批次大小有助於提高 GPU 使用率。不過,請謹慎增加批次大小,因為這可能會增加搜尋期間的記憶體不足錯誤。
  • 如果某些架構區塊與搜尋空間無關,您可以嘗試為這些區塊載入預先訓練的檢查點,加快訓練速度。預先訓練的檢查點在搜尋空間中應相同,且不應引入偏誤。舉例來說,如果搜尋空間僅適用於解碼器,編碼器就能使用預先訓練的檢查點。

每項搜尋試驗的 GPU 數量

減少每次試驗使用的 GPU 數量,即可縮短啟動時間。舉例來說,2 個 GPU 需要 5 分鐘才能啟動,8 個 GPU 則需要 20 分鐘。每次試驗使用 2 個 GPU,執行 Agent Platform 類神經架構搜尋工作 Proxy 任務,效率會更高。

搜尋的總試驗數量和並行試驗數量

總試驗設定

搜尋並選取最佳代理任務後,即可開始完整搜尋。我們無法事先得知需要多少次試驗才能收斂。收斂時的試驗次數可能因搜尋空間大小而異,但通常約為 2,000 次。

建議將 --max_nas_trial 設為極高值 (約 5,000 至 10,000),如果搜尋圖顯示收斂,則提早取消搜尋工作。您也可以使用 search_resume 指令,繼續執行先前的搜尋工作。不過,您無法從其他搜尋繼續工作繼續搜尋。因此,您只能繼續執行原始搜尋工作一次。

並行試驗設定

stage1-search 工作會一次並行執行 --max_parallel_nas_trial 項試驗,進行批次處理。這對縮短搜尋工作的整體執行時間至關重要。您可以計算預期的搜尋天數: days-required-for-search = (trials-to-converge / max-parallel-nas-trial) * (avg-trial-duration-in-hours / 24) 注意:一開始可以先使用 3000 做為 trials-to-converge 的粗略估計值,這是很好的上限。一開始,您可以先將 2 小時做為 avg-trial-duration-in-hours 的粗略估計值,這也是每項 Proxy 工作所需時間的合理上限。建議您根據專案的加速器配額和 days-required-for-search,將 --max_parallel_nas_trial 設定為 ~20 到 50。舉例來說,如果您將 --max_parallel_nas_trial 設為 20,且每項 Proxy 工作使用兩個 NVIDIA T4 GPU,則應至少預留 40 個 NVIDIA T4 GPU 的配額。--max_parallel_nas_trial 設定不會影響整體搜尋結果,但會影響 days-required-for-search。max_parallel_nas_trial 也可以設為較小的值,例如大約 10 (20 個 GPU),但您應大致估算 days-required-for-search,並確保其在工作逾時限制內。

根據預設,stage2-full-training 工作通常會平行訓練所有試驗。通常是同時執行的前 10 項試驗。不過,如果每個 stage2-full-training 試驗使用的 GPU 數量過多 (例如每個試驗使用八個 GPU),超出您的用途,且配額不足,則可以手動批次執行 stage2 工作,例如先執行 stage2-full-training 進行五個試驗,然後再執行另一個 stage2-full-training 進行接下來的 5 個試驗。

預設工作逾時

NAS 工作的預設逾時時間為 14 天,超過這個時間後,工作就會取消。如果預期工作會執行更久,可以嘗試再恢復搜尋工作一次,延長 14 天。整體而言,搜尋工作的執行時間最長可達 28 天 (包括恢復時間)。

失敗試驗次數上限設定

失敗的測試次數上限應設為 max_nas_trial 設定值的 1/3 左右。當失敗的試驗數量達到這個上限時,工作就會取消。

在下列情況下,您應停止搜尋:

  • 搜尋曲線開始收斂 (變異數減少): NAS 搜尋。 注意:如果未使用延遲時間限制,或使用硬性延遲時間限制,但延遲時間限制寬鬆,則曲線可能不會顯示獎勵增加,但仍應顯示收斂。這是因為控制器可能在搜尋初期就已達到良好的準確率。

  • 超過 20% 的試用顯示無效獎勵 (失敗): NAS 搜尋失敗。

  • 即使經過約 500 次試驗,搜尋曲線仍未上升或收斂 (如上所示)。如果獎勵增加或變異數減少,則可繼續。