2025/9/26の研究ログ
時間がやばい
どこまでやらないといけない?
コードの中身を理解するのはマスト
できれば動くようにしたい
今問題なのは集約の部分で,なぜかクライアントIDが正常に渡されていないこと
あと最後のサマリーできちんと計算したlossが表示できていない
ひとまず集約部分を解決する
サマリーの方は,おそらくlossだのを管理していないせいだと思われるが...
エラーが多く,完全に任せるのは危険な感じがする
待ち時間を有効活用できていれば問題ないが,今はそうではない
こちらが本質的な問題か?
単純作業をやってもいいし,短時間に集中して考えるのも良い
VScodeから通知が飛ぶようにしたい
音かSlackか?
相変わらずメモリーエラーが出る
出てもそのまま実行しているように見える
普通にlossは出てるし
リファクタリングしてもらった
code: tree
flower/
├── server/
│ ├── server_app.py # 20行 (was 200+)
│ ├── evaluator.py # ServerEvaluator
│ └── factory.py # Factory functions
├── client/
│ ├── client_app.py # 80行 (was 300+)
│ ├── training_manager.py # TrainingManager
│ └── evaluation_manager.py # EvaluationManager
├── confs/
│ └── pretrained.yaml
└── common/
├── batch_utils.py # Batch processing utilities
└── config_manager.py # Configuration management
コードレビュー中
現状,各クライアントでlossは出ている
サーバでも出ている
CrossAttnは確か結合した特徴量を戻す段階で詰まっていた
今手元にない...?
参考になりそうな実装を探す
特徴量
これは他の手法も検討したあとに考えたい
メモリについて
psを導入
psのコマンド
ps auxでみると,ゾンビプロセスが大量にある
多分workerが死んだ際に異常終了したせいで残り続けてる
こいつらがメモリを食ってるかも
一度除去したい
worker自体が異常終了する原因の排除と別に,例外処理も実装した方が良さそう
どこに書けばいいのかよく分からないな
あれかも. Clientは確かマルチプロセスで動かしていて,子プロセスで異常終了したのがちゃんと伝わってなさそう
うわー,どこに書けばいいんだ?
怪しいログ
やはりマルチプロセスのやり方がまずい
どこで宣言してたか覚えてない
一時ファイルを格納する場所について
dev/shmとtmpのどちらでも良さそうに見える
lsしたらdev_shmは特に何も入っていなかったが,なぜ足りないのだろう
2141413376 > 2GBくらい
code: error.log
/usr/local/lib/python3.12/multiprocessing/popen_fork.py:66: DeprecationWarning: This process (pid=1032) is multi-threaded, use of fork() may lead to deadlocks in the child.
self.pid = os.fork()
2025-09-26 06:31:48,586 WARNING services.py:2009 -- WARNING: The object store is using /tmp instead of /dev/shm because /dev/shm has only 2141413376 bytes available. This will harm performance! You may be able to free up space by deleting files in /dev/shm. If you are inside a Docker container, you can increase /dev/shm size by passing '--shm-size=2.26gb' to 'docker run' (or add it to the run_options list in a Ray cluster config). Make sure to set this to more than 30% of available RAM.
Skipping a batch that was None internally.
Dockerのmemory usageのログを取った方が良い
ラウンド1の時点で5.6GBまで増加
ラウンド2が始まると6.4GB~といった具合に増加している
ラウンドごとにメモリを無駄に消費している????
どこが悪さしているのか
おそらく訓練コードのどこかで,CPUに読み込んだデータを放置していると思われる
GPUの場合には同様のことをしていた: ほとんどコピペで作っているので,おそらく同様の問題が生じている
ラウンド1でクライアント上に作ったモデルを保持しているのは問題ない
どこかにデータを分割してそのままにしている???
そんなGPUみたいな話が起こる余地ないような...
training_stepとかでCPU環境だとだんだんメモリ消費が増えているよ,と言われたが,それ使ってないよ
今,training_stepとvalidation_stepはsed_module.pyに移動してる
フローを考えよう
run.fl.pyでrun_fl_simulation()
諸々の設定をしつつfowerのシミュレータを起動
一旦,ノード数(Client)数は2つ
flowerの仕様上,クライアントは1つしか動かないらしい
仕様を見た方が良い
Flower先駆者からアドバイス
Hugging faceからデータセットを拾える!
データ分割のクラスも大量に用意されてるので超便利
データの分割と分布について
分割: クライアントで二分するのってまずいのでは
サーバに
分布を今気にせず分割している
これがちょっとまずい
IIDになるよう調整が必要
現在のコードについて
やはりラウンドごとにどんどんメモリが増えていく
明らかにおかしい
どの段階で増えているかは分からないが,何か変数のメモリ消費が増え続けていると思う
一番怪しいのは最後の評価部分
サーバ側で行う評価で,多分ものすごい量のデータをずっと抱えてる
修正した方が良い
そうすると,クライアント自体は逐次処理でメモリ消費が控えめになるので,おそらく所望の5クライアントで行けると思う
バッテリーが怪しいので一旦止めた
これ大丈夫かな?
ctrl + zで止めたので再開しよう
fg %1
top -b -d 60 -n 30 > top_result.txt
メモリ消費の多いプロセスを記録しておこう
無事,実行できたが,評価が上手く動いていない
FL自体は多分できてる
loss自体は出ているのはなぜだろうか
どうやってlossを計算している?
lossとevalの実行する場所は分けたっけ?
結果に対する考察は後でやろうかな
モデル出力ができていないのが一番まずい
exp配下にタイムスタンプでディレクトリを作って終わっている
非常にまずい
code: res.log
Server round 10: Test loss = 0.0290
INFO : 🎯 Federated Learning Simulation Completed!
INFO : 💎 Best F1 Score Achieved: 0.0000
INFO : 📈 Total Results Collected: 2 categories
INFO : 📋 centralized_evaluate: {'round': 9, 'centralized_loss': 0.030236889361403882, 'test_loss': 0.030236889361403882, 'num_batches': 20, 'server_round': 9, 'error': "argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'Tensor'"}
INFO : 📋 federated_evaluate: {'round': 9, 'federated_evaluate_loss': 0.0, 'federated_val_loss': 0.0, 'total_examples': 5000}
INFO : ⚠️ No DCASE F1 metrics found in evaluation results
INFO : fit progress: (10, 0.029031254407018422, {'test_loss': 0.029031254407018422, 'num_batches': 20, 'server_round': 10, 'error': "argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'Tensor'"}, 17701.69745835298)
INFO : configure_evaluate: strategy sampled 2 clients (out of 2)
INFO : aggregate_evaluate: received 2 results and 0 failures
INFO : Round 10 | Client 4726115740239509612 evaluate results: loss=0.0000, num_examples=2500
INFO : Round 10 | Client 14612682902813776277 evaluate results: loss=0.0000, num_examples=2500
INFO :
INFO : Run finished 10 round(s) in 17709.79s
INFO : History (loss, distributed):
INFO : round 1: 0.0
INFO : round 2: 0.0
INFO : round 3: 0.0
INFO : round 4: 0.0
INFO : round 5: 0.0
INFO : round 6: 0.0
INFO : round 7: 0.0
INFO : round 8: 0.0
INFO : round 9: 0.0
INFO : round 10: 0.0
INFO : History (loss, centralized):
INFO : round 0: 0.24975261688232422
INFO : round 1: 0.030751927914097907
INFO : round 2: 0.03015167836099863
INFO : round 3: 0.029950265195220708
INFO : round 4: 0.02941184375435114
INFO : round 5: 0.029455048013478518
INFO : round 6: 0.02992753857281059
INFO : round 7: 0.02902658477425575
INFO : round 8: 0.028714404166676102
INFO : round 9: 0.030236889361403882
INFO : round 10: 0.029031254407018422
INFO : History (metrics, distributed, evaluate):
INFO : {'federated_val_loss': [(1, 0.0),
INFO : (2, 0.0),
INFO : (3, 0.0),
INFO : (4, 0.0),
INFO : (5, 0.0),
INFO : (6, 0.0),
INFO : (7, 0.0),
INFO : (8, 0.0),
INFO : (9, 0.0),
INFO : (10, 0.0)],
INFO : 'total_examples': [(1, 5000),
INFO : (2, 5000),
INFO : (3, 5000),
INFO : (4, 5000),
INFO : (5, 5000),
INFO : (6, 5000),
INFO : (7, 5000),
INFO : (8, 5000),
INFO : (9, 5000),
INFO : (10, 5000)]}
INFO : History (metrics, centralized):
INFO : {'error': [(0,
INFO : 'argument should be a str or an os.PathLike object where '
INFO : "__fspath__ returns a str, not 'Tensor'"),
INFO : (1,
INFO : 'argument should be a str or an os.PathLike object where '
INFO : "__fspath__ returns a str, not 'Tensor'"),
INFO : (2,
INFO : 'argument should be a str or an os.PathLike object where '
INFO : "__fspath__ returns a str, not 'Tensor'"),
INFO : (3,
INFO : 'argument should be a str or an os.PathLike object where '
INFO : "__fspath__ returns a str, not 'Tensor'"),
INFO : (4,
INFO : 'argument should be a str or an os.PathLike object where '
INFO : "__fspath__ returns a str, not 'Tensor'"),
INFO : (5,
INFO : 'argument should be a str or an os.PathLike object where '
INFO : "__fspath__ returns a str, not 'Tensor'"),
INFO : (6,
INFO : 'argument should be a str or an os.PathLike object where '
INFO : "__fspath__ returns a str, not 'Tensor'"),
INFO : (7,
INFO : 'argument should be a str or an os.PathLike object where '
INFO : "__fspath__ returns a str, not 'Tensor'"),
INFO : (8,
INFO : 'argument should be a str or an os.PathLike object where '
INFO : "__fspath__ returns a str, not 'Tensor'"),
INFO : (9,
INFO : 'argument should be a str or an os.PathLike object where '
INFO : "__fspath__ returns a str, not 'Tensor'"),
INFO : (10,
INFO : 'argument should be a str or an os.PathLike object where '
INFO : "__fspath__ returns a str, not 'Tensor'")],
INFO : 'num_batches': [(0, 20),
INFO : (1, 20),
INFO : (2, 20),
INFO : (3, 20),
INFO : (4, 20),
INFO : (5, 20),
INFO : (6, 20),
INFO : (7, 20),
INFO : (8, 20),
INFO : (9, 20),
INFO : (10, 20)],
INFO : 'server_round': [(0, 0),
INFO : (1, 1),
INFO : (2, 2),
INFO : (3, 3),
INFO : (4, 4),
INFO : (5, 5),
INFO : (6, 6),
INFO : (7, 7),
INFO : (8, 8),
INFO : (9, 9),
INFO : (10, 10)],
INFO : 'test_loss': [(0, 0.24975261688232422),
INFO : (1, 0.030751927914097907),
INFO : (2, 0.03015167836099863),
INFO : (3, 0.029950265195220708),
INFO : (4, 0.02941184375435114),
INFO : (5, 0.029455048013478518),
INFO : (6, 0.02992753857281059),
INFO : (7, 0.02902658477425575),
INFO : (8, 0.028714404166676102),
INFO : (9, 0.030236889361403882),
INFO : (10, 0.029031254407018422)]}