2025/10/6の研究ログ
from SED-FLの実装 ログ
2025/10/6の研究ログ
どこまでやったか覚えてない > 2025/10/3の研究ログ
やること
client_appとserver_appの中身を考える
client_app
train/eval共通: lossやmetricsの扱いをどうするか
train_pretrained.pyのsingle_runを呼べば解決?
modelのパラメータは元々送信する機能があるのでOK
server_app
model保存の仕組みが競合しないか確認が必要そう
fed_avgのevalの方法を確認し,sedtask4に合わせる
wandbは友人の実装そのままで良い
_store_resultも良い
_update_best_accはどうしよう
現在の混沌としたコードはf1スコアを,flowerはaccを使っている
accの代わりにobj_metricを使うのはどう?
code: monitor.py
ModelCheckpoint(
logger.log_dir,
monitor="val/obj_metric",
save_top_k=1,
mode="max",
save_last=True,
),
obj_metricは各指標の合計値
monitorなどがそのまま組み込めればそれで良い
どう実現する?
sedtask4の評価をどう組み込むか
flowerの方を参考にしよう 友人の実装も参考にする
code: strategy.py
strategy = CustomFedAvg(
run_config=context.run_config,
use_wandb=bool(context.run_config"use-wandb"),
fraction_fit=fraction_fit,
fraction_evaluate=fraction_eval,
initial_parameters=parameters,
on_fit_config_fn=on_fit_config,
evaluate_fn=gen_evaluate_fn(testloader, device=server_device),
evaluate_metrics_aggregation_fn=weighted_average,
)
code: get_evaluete_fn.py
def gen_evaluate_fn(
testloader: DataLoader,
device: torch.device,
) -> Callable:
"""Generate the function for centralized evaluation."""
def evaluate(server_round: int, parameters_ndarrays: NDArrays, config: UserConfig) -> Tuplefloat, object:
"""Evaluate global model on centralized test set."""
net = MiniCNN()
set_weights(net, parameters_ndarrays)
net.to(device)
loss, accuracy = CNNTask.test(net, testloader, device=device)
return loss, {"centralized_accuracy": accuracy}
return evaluate
evaluateについて
を見た感じでは,実装の仕方がいまいち分からない
flower公式の実装だと,fed_avg内のevaluateには触れてない
tutorialにカスタマイズもあったが,微妙に触れてない >
抽象的なクラスになっていてどう触れればいいか分からないのもある
https://docs.python.org/ja/3.13/library/abc.html
綺麗に実装できるのかな?
友人の実装では触れており,独自のevaluateを実装して渡している
CustomFedAvgの実装は以下の通り
eval
元のfed_avgのevaluateを継承
accを更新
保存してログを出す
結果のloss,metricsを返す
code: flower_eval.py
def evaluate(self, server_round: int, parameters: Parameters) -> Optional[tuple[float, dictstr, Scalar]]:
"""Run centralized evaluation if callback was passed to strategy init."""
loss, metrics = super().evaluate(server_round, parameters) # type: ignore
# Save model if new best central accuracy is found
self._update_best_acc(server_round, float(metrics"centralized_accuracy"), parameters)
# Store and log
self.store_results_and_log(
server_round=server_round,
tag="centralized_evaluate",
results_dict={"centralized_loss": loss, **metrics},
)
return loss, metrics
aggregate
元のaggregate_evalueteを継承
やはり保存してログを出し,loss,metricsを返す
code: flower_aggregate.py
def aggregate_evaluate(
self, server_round: int, results: List[tupleClientProxy, EvaluateRes], failures: list[Union[tupleClientProxy, EvaluateRes, BaseException]]
) -> tuple[Optionalfloat, dictstr, Scalar]:
"""Aggregate results from federated evaluation."""
loss, metrics = super().aggregate_evaluate(server_round, results, failures)
# Store and log
self.store_results_and_log(
server_round=server_round,
tag="federated_evaluate",
results_dict={"federated_evaluate_loss": loss, **metrics},
)
return loss, metrics
問題はplのため実装が大分異なりそうなこと
継承部分に別の実装を渡せば良い
友人の実装とのギャップを埋めよう
Github Copilotに聞いたら実装してくれた. 下記は簡易版
code: pl.py
def gen_lightning_evaluate_fn(testloader: DataLoader):
def evaluate(server_round, parameters_ndarrays, config):
model = LitAutoEncoder()
# パラメータをLightningモデルにロード
model.load_state_dict(param_dict, strict=False)
# Lightning Trainerで評価実行
trainer = pl.Trainer(enable_progress_bar=False, logger=False)
results = trainer.test(model, testloader)
return test_loss, {"centralized_accuracy": accuracy}
eval側でもmodelを定義して,加重平均を取ったパラメータを受け取って評価すれば良いらしい
モデルの定義で色々渡す必要がある
調整しないならクライアントとサーバで共通のtrain_pretrainedを使って,サーバだけevalで実行すればいい?
調整した方が良さそうには見えるが,いかんせん複雑でいじりたくない
lossとaccは直す必要がありそう?
連合学習でなぜ二種類の評価を実行するか
dataloadをflower仕様にする
sedtask4のデータローダをどう変えればいいのか
仕様をまとめる
連合学習はflowerのtutorialと友人の実装を参照
Pytorch lightning(pl)はdcase2024ベースラインを参照
ファイル構造は2025/10/3の研究ログ
metricsはobj_metcrisを採用: torch.tensor(weak_student_f1_macro.item() + synth_metric + maestro_metric)
毎回prepare_run()とsingle_run()を実行
client
train
eval
evalのフラグをTrueに
server
CustomFedAvg内でplのevalを実行
仕様書を作る
音響イベント検出(SED)をFlowerを用いて連合学習を行うリポジトリ仕様書
SED-FL 実装仕様書
全体的なアーキテクチャは、DCASE2024のベースラインシステムを参考に構築
1. フレームワーク
連合学習: Flower
深層学習: PyTorch Lightning
参考実装:
Flowerと+Pytorch Lightning 公式チュートリアル
DCASE2024ベースライン
友人による先行実装
2. ディレクトリ構成
code: _
.
├── flower/ # メイン
│ ├── client/
│ │ └── client_app.py # クライアント側の学習・評価処理
│ ├── common/ # DCASEベースラインに基づく共通コンポーネント
│ │ ├── desed_task/
│ │ ├── local/
│ │ │ ├── data_loader.py # FL用にデータ分割機能を追記
│ │ │ └── sed_trainer_pretrained.py
│ │ ├── confs/
│ │ │ └── pretrained.yaml
│ │ └── train_pretrained.py # クライアント・サーバで共通利用
│ └── server/
│ ├── strategy/
│ │ └── fed_avg.py # FedAvg戦略のカスタム実装
│ └── server_app.py # サーバ側の集約・評価処理
│
└── sample/ # 参考にする実装例
├── dcase/ # DCASE公式のベースライン
├── friends_flower/ # 友人による先行実装
└── pl-flower/ # Pytorch Lightning x Flower の公式サンプル
3. 主要コンポーネント
4.1. Client (client_app.py)
役割: 各クライアント(データ保有者)のローカル環境でモデルを学習/評価
処理フロー:
1. サーバからグローバルモデルのパラメータを受信
2. train_pretrained.pyのprepare_run()とsingle_run()を呼び出し、ローカルデータでモデルの学習(trainer.fit())と評価(trainer.test())を実行
3. 学習後のモデルパラメータをサーバに送信
モデル: Mean-TeacherモデルのStudentモデルの重みを学習・更新し、サーバに集約対象として送信。Teacherモデルはローカルでの学習安定化のために参照するが、集約はしない
4.2. Server (server_app.py, strategy/fed_avg.py)
役割: 各クライアントから送られてきたモデルのパラメータを集約し、グローバルモデルを更新。また、統合されたモデルの性能評価も実行
モデル集約:
Federated Averaging (FedAvg) アルゴリズムを基本とし、CustomFedAvgを使用
クライアントから送られてきたStudentモデルのパラメータを重み付き平均により集約
中央集権的評価 (Centralized Evaluation):
サーバが保持する別途の検証データでグローバルモデルの汎化性能を評価
評価処理はCustomFedAvg内で実装され、Pytorch Lightningの評価ループ(trainer.test())を呼び出す
evaluate_fnをカスタマイズし、gen_lightning_evaluate_fnのような関数を生成して、評価プロセス
4.3. 評価プロセス
以下の2種類の評価を実行
1. 連合評価:
各クライアントがローカルの検証データで評価した結果(lossやmetrics)を、サーバが集約(aggregate_evaluate)
2. 中央集権的評価:
サーバが重み集約後のグローバルモデルをテストデータで評価(evaluate)
5. 評価指標
主要指標: obj_metric を採用。これは、複数のF1スコア(weak_student_f1_macro, synth_metric, maestro_metric)を合計したもの
監視対象: モデルの保存や早期停止の判断には、val/obj_metricを監視。モードは"max"とし、最も高いobj_metricを記録したモデルを最良モデルとして保存
6. その他
wandb: 実験管理ツールとしてWeights & Biases (wandb) を利用