在聯邦學習實現修改自訂資源更改配置(kubectl edit FederatedLearningJob **)的時候,更新邏輯是 pod 沒辦法像修改聯合推理自訂資源的 deployment 那樣直接更新配置參數(可以看這個 issue和這個部落格),所以只能把 pod 全部刪掉了(因為沒辦法獲取到單獨的 pod),利用新的配置再建立 pod。在聯合推理控制器的做法中,因為建立 deployment 時,名字是固定的,所以可以通過
Deployment, err := c.deploymentsLister.Deployments(service.Namespace).Get(workerName)來獲取特定的 deployment 直接修改參數並更新。但是目前生成 pod 取名後面有 5 個隨機字元,沒有辦法做到通過名字來獲取 pod,而且我還發現,在控制器中對 pod 的取名方法是沒有起作用的(以下程式碼)
"WORKER_NAME": "aggworker-" + utilrand.String(5)這行程式碼其實沒起作用,所以其實是 kubernetes 給 pod 自動起的名字。
然後尋找原因,原因是在 pkg/globalmanager/runtime/worker.go 中的 injectWorkerParam 函數中缺少對 pod.ObjectMeta.Name 變數的賦值,我覺得應該這樣賦值
pod.ObjectMeta.Name = workerParam.Env["WORKER_NAME"]然後就可以通過修改 "WORKER_NAME" 來確定 pod 的名字,確定了 pod 的名字,再確定是修改了自訂資源具體哪個 worker 下的欄位就可以刪除單獨的 pod 更新配置,建立出單獨的 pod 了,而不用像之前一樣全都刪掉。
之後唐明老師提到,區別於推理任務,對於聯邦學習這種訓練任務,其實就相當於 kubernetes 中 Job 的概念。因為 Job 本身就是一次性的任務,所以不如直接禁止修改,如果想要修改參數直接刪掉任務重新部署,我覺得說的也很有道理。因此,再加上我認為 pod 本身就不支援更新,用這樣的方式其實感覺是有點違背 kubernetes 意圖的…所以其實下一個優化目標就是限制對資源的訪問,這個還在蒐集資料…
這個相比開源之夏的辦法是一些微小的改動所以是 v1.1,接下來因為和 v1 思路不同所以會是 v2。所以這個也不會提 PR。