2025/10/1の研究ログ
各段階で簡単な動作確認を実施
処理の流れを把握: 未達
トレースを走らせ,途中まで取得し,渡せば正確に応答してくれそう
python -m trace -t ./flower/run_fl.py > trace.log
トレースだとログが長大になるのでダメ
Geminiにlogging/pdb/Cprofileを提案された cProfile > uv run python -m cProfile -o profile.out .venv/bin/flwr run
uv run python -m cProfile -o profile.out ./flower/run_fl.pyはダメ
run_fl.pyの中身が出鱈目なため
可視化する >gprof2dot -f pstats profile.out | dot -Tpng -o output.png
uv add graphvizではなくsudo apt-get install -y graphviz
前者だとpython環境の問題でdotを呼べない
表示される名称が具体的なファイルや関数でないため理解できない
何か工夫が必要? < 一旦諦める
cProfileとpstatsで実行時間が見れる
code: log
ncalls tottime percall cumtime percall filename:lineno(function)
1233/1 0.010 0.000 15081.100 15081.100 {built-in method builtins.exec}
1 0.000 0.000 15081.100 15081.100 flwr:1(<module>)
1 0.000 0.000 15080.326 15080.326 main.py:317(__call__)
1 0.000 0.000 15080.323 15080.323 core.py:1159(__call__)
1 0.000 0.000 15080.323 15080.323 core.py:719(main)
1 0.000 0.000 15080.323 15080.323 core.py:165(_main)
1 0.000 0.000 15080.323 15080.323 core.py:1663(invoke)
2 0.000 0.000 15080.322 7540.161 core.py:1432(invoke)
2 0.000 0.000 15080.322 7540.161 core.py:737(invoke)
2 0.000 0.000 15080.322 7540.161 main.py:694(wrapper)
1 0.000 0.000 15080.322 15080.322 run.py:54(run)
2 0.000 0.000 15080.320 7540.160 subprocess.py:506(run)
2 0.000 0.000 15080.319 7540.160 subprocess.py:1165(communicate)
1 0.000 0.000 15080.319 15080.319 run.py:202(_run_without_control_api)
4 0.000 0.000 15080.318 3770.080 subprocess.py:1259(wait)
4 0.000 0.000 15080.318 3770.079 subprocess.py:2021(_wait)
2 0.000 0.000 15080.318 7540.159 subprocess.py:2008(_try_wait)
2 15080.318 7540.159 15080.318 7540.159 {built-in method posix.waitpid}
loggingで処理順 + メモリ消費を確認しよう
一応,LLMに作ってもらった流れはある < loggingを見た方が早そう
🗓️ 開始時(run_fl.py)
FL実行開始とタイムスタンプログ
初期・最終メモリ使用量
🖥️ サーバー初期化(server_app.py)
サーバー設定読み込み → グローバルモデル初期化 → ストラテジー作成の各段階
各段階でのメモリ使用量
👥 クライアント初期化(client_app.py)
設定読み込み → データ分割 → クライアントインスタンス作成の各段階
クライアント別のメモリ使用量追跡
🔄 各ラウンドでの処理(fed_avg.py)
fit集約: クライアント学習結果の受信・集約・メモリ使用量
evaluate集約: クライアント評価結果の受信・集約
中央評価: サーバー側での集中評価・DCASE指標計算
💪 クライアント学習(training_manager.py)
ローカル学習の開始→エポック進行→完了
学習前後のメモリ使用量差分
📊 クライアント評価(evaluation_manager.py)
ローカル評価の開始→バッチ処理→完了
評価前後のメモリ使用量差分
🎯 サーバー評価(evaluator.py)
中央評価の各段階(モデル設定→評価実行→指標計算→ログ)
評価プロセスでのメモリ使用量
🏁 最終サマリー(fed_avg.py)
FL完了時の総合結果・最終メモリ状態・ベストF1スコア
run_fl.py(FL開始)
→ server_app(サーバー起動・グローバルモデル初期化)
→ client_app(クライアント起動・データローダー準備)
→ 【各ラウンド】
├ training_manager(各クライアントでローカル学習)
├ fed_avg.aggregate_fit(サーバーでパラメータ集約)
├ evaluation_manager(各クライアントでローカル評価)
├ fed_avg.aggregate_evaluate(サーバーで評価結果集約)
└ evaluator(サーバーで中央評価・精度計算)
→ fed_avg.log_final_summary(モデル保存・最終サマリー)
メモリ消費を効率化: 1.5h 途中から並行可 未達
uv run python -m memray run .venv/bin/flwr run
下画像のように,各関数を追跡し,メモリ確保量などを可視化する
上コマンドは一番ふつうのオプション
tree表示など色々ある
https://gyazo.com/12cdf75717b03b4ce3218745e5aa8689
終わりまで実行していないのもあるが,これだけだとよく分からない
ツールの使い方をもう少し調べないといけないかも
ツールの方が面倒なため,一旦loggingに頼る
memrayのようなprofile系を使える方が良いが,今回は時間がないので他の解決法を模索する
ログ出力を修正
おそらく僕の方が勘違いしている?
code: log
INFO : initial parameters (loss, other metrics): 0.25121774315834045, {'test_loss': 0.25121774315834045, 'num_batches': 20, 'server_round': 0, 'event_macro_f1': 0.0, 'event_micro_f1': 0.0, 'segment_macro_f1': nan, 'segment_micro_f1': nan, 'num_predictions': 495}
INFO :
INFO : configure_fit: strategy sampled 2 clients (out of 2)
上記のINFOはこちらで用意したloggingではなく,flowerのevaluationの出力?
解決される見込みがないので,一旦放置
現在の問題は精度評価に集約される
集約後の精度評価と最後のサマリーがログに保存されない > wandbのoutput.logにあるので大丈夫 精度評価が動作していない??
先にモデル保存を改良する > 精度評価の単独実行を実現
一度通しで実行し,モデル保存が改良されたか確認しよう
ついでにログ出力も見る
さらにローカルのエポック数とグローバルのラウンド数の変更が反映されているかも確認する
メモリ消費が激しくないかどうかも見る
code: res.log
NFO : aggregate_evaluate: received 2 results and 0 failures
INFO :
INFO : Run finished 1 round(s) in 1720.77s
INFO : History (loss, distributed):
INFO : round 1: 0.0
INFO : History (loss, centralized):
INFO : round 0: 0.25121774315834045
INFO : round 1: 0.030726640783250332
INFO : History (metrics, distributed, evaluate):
INFO : History (metrics, centralized):
lossは出ているが,f1スコアは0となっている
モデル保存はされてない
スコアが出ていないからモデルが保存されない?
モデル保存機能を修正
現状の認識を整理
なぜモデルが保存されない?
精度の条件を満たしていないから < 精度0だと保存されない
なぜF1-scoreは0になる?
評価時に必要なデータを持っていない
データ量を制限した影響 < メモリが足りないから
モデルが弱すぎる
F1スコアが0になるのは学習回数があまりにも少ないため? < メモリが足りないから
実装に問題はないかも
精度評価の実装がおかしい
上記を除く
ロスは下がっているので学習はしているはず
精度が0なのはラベル取得など何らかの問題があるのでは?
なぜメモリが足りない?
メモリを無駄に使っている
ラウンドが回る度にメモリ消費が増える
評価結果をリストに保持などの実装が問題?
サマリに使う評価結果など,一時ファイルとしてcsvなどに出力する形が良い
メモリ上限が低い > 12GBに拡張したので解決が見込まれる
解決策を考える
現在,検証中 実行完了も,上手くいっていない
モデルを保存 > 個別コードで検証 < テスト用コードを書いてもらう
目的: 精度評価の検証時間を大幅に削減 > 事前学習済みckptダウンロードで良い
テストの結果は良好 < 生成されたテストのため不十分な可能性がある
メモリ及び評価データの上限を拡大
精度評価を改善
元コード(train_centlized,sed_trainer_pretrained)を参考に,コードを修正
精度評価のみ回すコードを作成し,現在作成中のモデルを読み込んで検証 dcase2024レポジトリから学習済みのモデルをダウンロードし,利用
修正したが上手くいかない > テスト用コードを書いて別個に解決を図る
主要なエラーはdataloaderで起こっているみたい < output.logにきちんと書いてあった
だいぶ時間がかかっている
なぜだ?
placeholder_batch_... など)が、正解データ(ground truth)のファイルIDと一致しないためです 。これは、評価用データローダーがファイル名を正しく渡せていない可能性を示唆しています。
と言われた部分は改善されていそうなのだが
元のコードをまとめて与えてみる
ダメだった
会話が長すぎて調子が悪いのかも.新しいチャットに切り替える
初手で転んだ
もう自分で読んで実装した方が早いのでは??
評価の実装自体はほぼコピペでいいと思うのに,なぜこんなに苦しんでいるのか?
精度評価のコードがきちんと動けば,原因の切り分けが進む
それこそ学習回数の不足など
メモリ消費を効率化 < 精度評価の実装を修正中のため,その後考え直す
ラウンドごと,つまりFLの集約処理を行う度にメモリ消費が増える印象がある < 確認が難しい
上記の通り,リストに無限に保存する実装があるか < fed_avg.pyのCustumFedAvgのself.resultsが怪しい
result.jsonなどに出力して管理する構成を考える
wokerプロセスがゾンビ化しているか 問題なし
実行完了後に最初の3GBから5GBに増加している
一時ファイルが追加されてそのままになっている?
いずれにせよボトルネックの発見が必要...? > memrayかlogging
LLMを使っていろんな修正をするとき,待ち時間はどう使えばいいのか?
いっそ固定値で確認すればいいのでは?
5分に一回だけ修正する
それなら最初からClaude codeを導入して,全自動でやらせた方がいいんじゃ...