2025/8/29の研究ログ
from DCASEのベースラインを動かす_ログ
2025/8/29の研究ログ
昨日のやり残しを試す
Github Copilotと昨日やりとりをしていたらしい
trainer.callbacksからModelCheckpointインスタンスを直接探し、best_model_pathを取得する方法に変更すると安全です。
code: fix.py
# ModelCheckpointのインスタンスからbest_model_pathを取得
best_path = None
for cb in trainer.callbacks:
if isinstance(cb, ModelCheckpoint):
best_path = cb.best_model_path
break
print(f"best model: {best_path}")
x epoch数を1に変更し,一旦検証する
あと5分くらいすれば終わりそう
終わったが同様のエラー > 下部に移動
以前から考えている計算速度向上の施策について
メモリがかなり余っているようだから,バッチ数を増やす方向性で良さそう
nvidia-smiで見ると,以下のようになっている
code: mem
+-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce RTX 4070 On | 00000000:2B:00.0 Off | N/A |
| 30% 53C P2 43W / 200W | 605MiB / 12282MiB | 38% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| 0 N/A N/A 2185 G /usr/lib/xorg/Xorg 85MiB |
| 0 N/A N/A 2393 G /usr/bin/gnome-shell 8MiB |
| 0 N/A N/A 482118 G /usr/bin/gnome-control-center 12MiB |
| 0 N/A N/A 519601 C ...k/dcase2024/.venv/bin/python3 454MiB |
+-----------------------------------------------------------------------------------------+
12GiBほど容量があって,そのうち38%しか使っていないらしい
x 二倍にしても大丈夫そう
今のバッチサイズはbatch_size: [12, 6, 6, 12, 24]
左から順に#batch size: [maestro, synth, strong, weak, unlabel]
効果的な数値はどれくらいだろうか?
段階的に増やして検証する
検証用のスクリプトを書いた方が良いか?
別にそこまで大変ではないな
ひとまず手動で増やそう
[24, 12, 12, 24, 48]から検証 > 809MiBに増加
まだ余裕がありそう
x 4倍にする > [48, 24, 24, 48, 96]
大丈夫っぽい?
1epochで21分以上かかった
x 余裕があるなら > [96, 48, 48, 96, 192]
578MiBより増えていないような
どこかボトルネックになっていそう
SafeDataLoader()について
num_workersを4に設定
batch_sizeを64にするか
一度目の利用ではエラー
またもobj_metricがself.logされていないせいでエラー
もう一度動かす
6312MiB使用されている
今度はobj_metricが存在しない場所で呼ばれたのでエラー
しかしvalidation自体には突入していることが分かった
printを修正して動かす
どうなるかな
2分くらいで終わったかも
validationまで動いたが,TypeError: object of type 'NoneType' has no len()で止まった
validation_datalodaerでもcollate.pyを呼ぶか?
code: dataloader.py
def train_dataloader(self):
self.train_loader = torch.utils.data.DataLoader(
self.train_data,
batch_sampler=self.train_sampler,
num_workers=self.num_workers,
)
return self.train_loader
def val_dataloader(self):
self.val_loader = torch.utils.data.DataLoader(
self.valid_data,
batch_size=self.hparams"training""batch_size_val",
num_workers=self.num_workers,
shuffle=False,
drop_last=False,
)
return self.val_loader
def test_dataloader(self):
self.test_loader = torch.utils.data.DataLoader(
self.test_data,
batch_size=self.hparams"training""batch_size_val",
num_workers=self.num_workers,
shuffle=False,
drop_last=False,
)
return self.test_loader
code: Safedataloader.py
import torch
from torch.utils.data.dataloader import DataLoader, default_collate
class _NoneSafeIterator:
"""
DataLoaderから返されるNoneバッチを内部でスキップするイテレータのラッパー。
"""
def __init__(self, dataloader_iter):
self.dataloader_iter = dataloader_iter
def __iter__(self):
return self
def __next__(self):
while True:
# 元のイテレータから次のバッチを取得
batch = next(self.dataloader_iter)
# バッチがNoneでなければ、それを返す
if batch is not None:
return batch
# バッチがNoneなら、ループを続けて次の有効なバッチを探す
print("Skipping a batch that was None internally.")
class SafeCollate:
"""
データセットから返される None 値をフィルタリングする collate_fn。
フィルタリング後にバッチが空になった場合は None を返す。
"""
def __call__(self, batch):
batch = b for b in batch if b is not None
if not batch:
# バッチが空ならNoneを返す(このNoneは_NoneSafeIteratorで捕捉される)
return None
return default_collate(batch)
class SafeDataLoader(DataLoader):
"""
Noneを返す可能性があるバッチを自動的にスキップするDataLoader。
PyTorch Lightningなどのフレームワークで安全に使用できる。
"""
def __init__(self, *args, **kwargs):
# ユーザーがcollate_fnを指定していない場合のみ、SafeCollateを設定
if 'collate_fn' not in kwargs:
kwargs'collate_fn' = SafeCollate()
super().__init__(*args, **kwargs)
def __iter__(self):
# DataLoaderのデフォルトのイテレータを取得
dataloader_iter = super().__iter__()
# Noneをスキップする機能を持つラッパーで包んで返す
return _NoneSafeIterator(dataloader_iter)
watch nvidia-smiで監視中
cf. https://note.nkmk.me/nvidia-smi-monitoring-gpu/
timeで大まかな時間も計るかな
エラーについて改めて考える
x tensorboardの方はきちんと実行できた
見ると,確かにval/obj_metricなどは記録されていないことがわかる
300epochほど実行した時の記録を見ても何も残っていない
確実に何か問題が生じている
x val関係がきちんと動いているか検証する
以下を行った
validation_stepと~~~endの先頭にdebug用のprint文を設置
validation_interval: 1とした
n_epochsは1
実行完了待ち
実行が完了したが,予期せぬエラー
code: error
RuntimeError: Early stopping conditioned on metric val/obj_metric which is not available. Pass in or modify your EarlyStopping callback to use any of the following: train/student/loss_strong, train/student/loss_weak, train/step, train/student/tot_self_loss, train/weight, train/student/tot_supervised, train/student/weak_self_sup_loss, train/student/strong_self_sup_loss, train/lr
val_objmetricが記録されていないらしい
x もう一度検証する
n_epochsを2にするかな
earlyの方も2にした
よく見たらvalidation_step内のprintがpritnになっていたので,これのせいっぽい
直した
DEBUGをいくつか付け足した
train_pretrained.pyの中でバッチをprint
sed...でdebug用printを追加
collate.pyをsed...に直接書いて直したら,きちんと評価まで進んだっぽい
x 今度はメモリが足りないと言われる
code: mem lack
torch.OutOfMemoryError: CUDA out of memory. Tried to allocate 278.00 MiB. GPU 0 has a total capacity of 11.59 GiB of which 261.38 MiB is free. Including non-PyTorch memory, this process has 11.24 GiB memory in use. Of the allocated memory 10.98 GiB is allocated by PyTorch, and 42.26 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation. See documentation for Memory Management (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables)
上記のバッチ数を最初に戻したら解決した
! KeyError: 'Y0cH_NlhhMAs_30.000_40.000'
audio_id: desed_audio_durations[audio_id]
推論結果のaudio_idとdurationsのaudio_idが一致していない?
僕の予想では,おそらくデータが食い違っているせいだと思われる
無理やりキーの部分を消したりなんだりしているせいでは?
? データが欠けているにも関わらず読み込もうとするのはなぜ?
install用のcsvをそのまま使っているのでは?
! csvからmissing_fileを除外して呼ぶとか,そういった工夫の方が良さそう
データのインストールが終わった
やっとmissing_fileが揃った
Slackに参加した方が良いのかな?