本頁說明多工工作站,以及如何編寫與多工相容的 以及特定限制的解決方法
多重工作站可讓 Bazel 使用單一工作站處理多項要求 上傳資料集之後,您可以運用 AutoML 自動完成部分資料準備工作以多執行緒工作站來說,Bazel 可以使用較少的資源 也能達到相同或更好的成效。舉例來說 而 Bazel 可以有四個多工工作站 接著就能平行處理要求,適用對象 Java 和 Scala 等語言,因此節省 JVM 暖機時間和 JIT 編譯時間 而且通常允許在叢集的所有工作站之間共用快取 相同類型
總覽
Bazel 伺服器和工作站程序之間有兩個層。某些
可同時執行處理程序的記憶法,WorkerProxy
工作站集區WorkerProxy
會將要求轉送至 worker 程序
工作站會隨著 request_id
,依序處理要求
並傳送回應至 WorkerMultiplexer
。WorkerMultiplexer
收到回應後,會剖析 request_id
,然後轉送回應
返回正確的 WorkerProxy
。就像使用多工處理工作站一樣
這個工具不能只使用標準式/外部通訊
stderr
用於使用者可見的輸出內容 (請見下方說明)。
每個工作站都有一個金鑰。Bazel 會使用金鑰的雜湊程式碼 (由環境組成
變數、執行根目錄和記憶法) 以判斷
WorkerMultiplexer
即可使用。WorkerProxy
會與相同的
WorkerMultiplexer
的雜湊碼相同。因此,
單一 Bazel 中的環境變數和執行根目錄都相同
則每個不重複的記憶法只能有一個 WorkerMultiplexer
和 1
工作站流程。工作站總數,包括一般工作站和
WorkerProxy
仍受限於 --worker_max_instances
。
編寫多工相容規則
規則的工作站程序應採用多執行緒,以善用
支援多工處理Protobuf 可讓規則集剖析單一要求,即使
但串流中可能會有多個要求每當
工作站程序會剖析串流中的要求,而其應在
或建立新的討論串因為不同的執行緒可以完成並寫入
工作站程序必須確保已寫入回應
完全一致 (訊息不會重疊)。回應必須包含
處理要求的 request_id
。
處理多工輸出
相較於處理輸出內容,
適用於單人工作任何傳送到 stderr
的資料都會放入單一記錄檔
所有同類型的 WorkerProxy
共用
在並行要求之間隨機交錯重新導向 stdout
時
至 stderr
是個好主意,請勿在 output
WorkResponse
的欄位,因為可向使用者顯示毀損的輸出內容。
如果工具只傳送使用者導向的輸出內容至 stdout
或 stderr
,您會
必須先變更該行為,才能啟用多工工作站。
啟用 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
雖然 arguments
和 inputs
欄位不受沙箱限制
要求,實際輸入內容則與 sandbox_dir
相關。工作站必須
翻譯 arguments
和 inputs
中的檔案路徑,以讀取這項內容
經過修改的路徑,且必須寫入所有相對於 sandbox_dir
的輸出內容。
包括「.」等路徑,以及指定檔案中路徑
(例如 "argfile" 引數)。
一旦 worker 支援多工沙箱,規則集便可宣告
支援,方法是將 supports-multiplex-sandboxing
新增至
動作的 execution_requirements
。Bazel 接著會使用多重沙箱機制
如果有 --experimental_worker_multiplex_sandboxing
標記,或
工作站是透過動態執行功能使用
採用沙箱機制的 Multix 工作站的工作站檔案仍與
工作站程序的工作目錄。因此,如果檔案
兩者皆用於執行工作站和輸入,您必須同時指定
標記檔案引數及 tools
、executable
或
runfiles
。