多重工作站 (實驗功能)

回報問題 查看來源 夜間 7.2 7.1 7.0 6.5 6.4

本頁說明多工工作站,以及如何編寫與多工相容的 以及特定限制的解決方法

多重工作站可讓 Bazel 使用單一工作站處理多項要求 上傳資料集之後,您可以運用 AutoML 自動完成部分資料準備工作以多執行緒工作站來說,Bazel 可以使用較少的資源 也能達到相同或更好的成效。舉例來說 而 Bazel 可以有四個多工工作站 接著就能平行處理要求,適用對象 Java 和 Scala 等語言,因此節省 JVM 暖機時間和 JIT 編譯時間 而且通常允許在叢集的所有工作站之間共用快取 相同類型

總覽

Bazel 伺服器和工作站程序之間有兩個層。某些 可同時執行處理程序的記憶法,WorkerProxy 工作站集區WorkerProxy 會將要求轉送至 worker 程序 工作站會隨著 request_id,依序處理要求 並傳送回應至 WorkerMultiplexerWorkerMultiplexer 收到回應後,會剖析 request_id,然後轉送回應 返回正確的 WorkerProxy。就像使用多工處理工作站一樣 這個工具不能只使用標準式/外部通訊 stderr 用於使用者可見的輸出內容 (請見下方說明)。

每個工作站都有一個金鑰。Bazel 會使用金鑰的雜湊程式碼 (由環境組成 變數、執行根目錄和記憶法) 以判斷 WorkerMultiplexer即可使用。WorkerProxy 會與相同的 WorkerMultiplexer 的雜湊碼相同。因此, 單一 Bazel 中的環境變數和執行根目錄都相同 則每個不重複的記憶法只能有一個 WorkerMultiplexer 和 1 工作站流程。工作站總數,包括一般工作站和 WorkerProxy仍受限於 --worker_max_instances

編寫多工相容規則

規則的工作站程序應採用多執行緒,以善用 支援多工處理Protobuf 可讓規則集剖析單一要求,即使 但串流中可能會有多個要求每當 工作站程序會剖析串流中的要求,而其應在 或建立新的討論串因為不同的執行緒可以完成並寫入 工作站程序必須確保已寫入回應 完全一致 (訊息不會重疊)。回應必須包含 處理要求的 request_id

處理多工輸出

相較於處理輸出內容, 適用於單人工作任何傳送到 stderr 的資料都會放入單一記錄檔 所有同類型的 WorkerProxy 共用 在並行要求之間隨機交錯重新導向 stdout 時 至 stderr 是個好主意,請勿在 output WorkResponse 的欄位,因為可向使用者顯示毀損的輸出內容。 如果工具只傳送使用者導向的輸出內容至 stdoutstderr,您會 必須先變更該行為,才能啟用多工工作站。

啟用 Multix 工作站

系統不會預設啟用多重工作站。規則集可以開啟多工處理功能 呼叫工作站中的 supports-multiplex-workers 標記 動作的 execution_requirements (就像 supports-workers 標記一樣) 可啟用一般工作站)。如同使用一般工作站 策略必須在規則集層級指定 (例如 --strategy=[some_mnemonic]=worker),或一般於策略層級 (適用於 例如 --dynamic_local_strategy=worker,standalone)。 ,且 supports-multiplex-workers 的優先順序高於 supports-workers (如果兩者都設定)。您可將多工工作站 傳遞 --noworker_multiplex

建議在可能的情況下使用多工工作站,以減少記憶體 壓力提升效能。不過,Multix 工作站目前 相容於動態執行 並實作 Multix 沙箱嘗試執行非沙箱機制的多重圖像 具有動態執行的工作站會在不發出通知的情況下使用沙箱機制 單一複雜工作站

多重沙箱

您可藉由在 工作站實作。雖然可以透過 會在各自的沙箱中執行每個工作站程序,多 x 工作站會共用 處理多個平行要求之間的工作目錄若要允許: 多工工作站的沙箱作業,工作站必須支援讀取和 寫入每個要求中指定的子目錄,而非 複製到工作目錄

如要支援多工沙箱機制,工作站必須使用 sandbox_dir 欄位 ,並把該資料當做所有讀取和寫入檔案的前置字串。WorkRequest 雖然 argumentsinputs 欄位不受沙箱限制 要求,實際輸入內容與 sandbox_dir 相對應。工作站必須 翻譯 argumentsinputs 中的檔案路徑,以讀取這項內容 經過修改的路徑,且必須寫入所有相對於 sandbox_dir 的輸出內容。 包括「.」等路徑,以及指定檔案中路徑 (例如 "argfile" 引數)。

一旦 worker 支援多工沙箱,規則集便可宣告 支援,方法是將 supports-multiplex-sandboxing 新增至 動作的 execution_requirements。Bazel 接著會使用多重沙箱機制 如果有 --experimental_worker_multiplex_sandboxing 標記,或 工作站是透過動態執行功能使用

採用沙箱機制的 Multix 工作站的工作站檔案仍與 工作站程序的工作目錄。因此,如果檔案 兩者皆用於執行工作站和輸入,您必須同時指定 標記檔案引數及 toolsexecutablerunfiles