文章へ移動
ShemolSedna 連合推論・連邦学習コントローラ最適化-v1.1
云原生 / KubeEdge

Sedna 連合推論・連邦学習コントローラ最適化-v1.1

連邦学習でカスタムリソースを編集して設定を変える(kubectl edit FederatedLearningJob **)とき、更新ロジックは pod が連合推論のカスタムリソースの Deployment のようにパラメータを直接更新できない(この issueとこのブログを参照)。だから pod を全部消すしかなかった(個別の pod を取れないから)し、新しい設定で作り直す。連合推論コントローラでは、deployment 作成時に名前が固定なので、

go
Deployment, err := c.deploymentsLister.Deployments(service.Namespace).Get(workerName)

で特定の deployment を取ってパラメータを変えて更新できる。しかし今の pod 名の末尾には 5 文字のランダムがあり、名前で pod を取れない。しかもコントローラ側の命名は効いていないと分かった(次のコード)

go
"WORKER_NAME": "aggworker-" + utilrand.String(5)

この行は実際には効いておらず、名前は kubernetes が自動で付けている。

原因は pkg/globalmanager/runtime/worker.go の injectWorkerParam で pod.ObjectMeta.Name に代入していないこと。こうすべきだと思う。

go
pod.ObjectMeta.Name = workerParam.Env["WORKER_NAME"]

そうすれば "WORKER_NAME" を変えて pod 名を決められる。名前が決まり、カスタムリソースのどの worker のフィールドを変えたかが分かれば、その pod だけ消して設定を更新し、個別の pod を作れる。全部消さなくていい。

その後、唐明先生が、推論タスクと違って連邦学習のような訓練タスクは kubernetes の Job に相当する、と言った。Job は一度きりのタスクなので、変更を禁じて、パラメータを変えたいなら消して再デプロイすればいい。それも筋が通っていると思う。それに pod 自体が更新をサポートしていないので、このやり方は kubernetes の意図に少し反している気もする…なので次の最適化はリソースへのアクセス制限だ。まだ資料を集めている…

オープンソースの夏のやり方に比べると小さな変更なので v1.1。次は v1 と発想が違うので v2 になる。だからこれも PR には出さない。