さまざまなデータセットを複合的に利用するケースがあったのですが、その場合たった3つのデータセットでさえA, B, C, A+B, A+C, B+c, A+B+Cと7通りの組み合わせでトレーニング –> 検証を繰り返すことになります。ましてや今回は6つのデータセットだったので、その組み合わせたるや… ま、それは今回の話題とは直接は関係ないのですが、そんな気が遠くなるような作業中に予期せず突然malloc(): invalid next size (unsorted)が発生したときのお話しです。
環境
いつもの普通の環境です。Ubuntu Desktop 20.04 LTSのマシン上で、PyCharm上で動作させていました。推定器も特別なものではなくむしろ小さめのLSTMで、DataLoaderもさんざん使ってきたものでした。
Dataset
ただしデータセットは特殊というか、さまざまな大きさのものを作っては学習作っては学習という作業をしていました。Swap memoryを利用して100GB超になることもあれば、数GBに収まることもあるという状況でした。
発生状況
これも不思議だったのですが、さんざんさまざまな組み合わせをやったあとで、小サイズの単一データセットで学習を開始するところでmalloc(): invalid next size (unsorted)が発生しました。おかしいなと思って2つのデータセットを複合して(少しおおきなサイズで)やってみたところ、今度は発生しませんでした。
なにぶんPyTorch使用時でははじめて見た(むかしCでプログラムを組んでいたころはしょっちゅう目にしていましたが)malloc()でのエラーで、おそらく下のほうのレイヤーで発生しているのだろうというのは想像に難くなかったですが、それだけにPyTorchのプログラムが直接的に関与していない可能性もあると思われました。
発生箇所
止まっている場所は、”model=model.to(‘cuda:0’)” でした。うーむ、なかなかの難問そうです。
そもそもmalloc()ですからメモリー確保時のエラーということで、そちら側からいろいろやってみたところ…
解決方法
ファイルから読み込むデータセットはオリジナルのデータであって、学習用のデータセットはそこから多少加工してから学習器に食わせていました。その加工時に結構メモリーを消費していたのは気づいていましたが、加工後に読み込んだオリジナルのデータを消去していなかったことに気づき、試しに”del dataset_org” をしてから学習に入るようにしたところ、それ以降はmalloc()エラーが出なくなりました。
原因の推測
メモリーの消費量には依存していなかった(メモリーの枯渇系ではない)ため、原因の特定には深い解析が必要です。今回はそこまではやりませんでしたが、モデルをGPU側へ転送する際にページサイズに依存した転送の仕方をしていて、その何らかのバグを踏んでしまったのだろうかと想像しました。あくまでも個人的な推測にすぎませんが。
さいごに
というわけで何となく解決してしまいましたが、PyTorchで原因不明のmalloc()エラーが発生した際は、モデルを生成する前に、不要なデータ(使わなくなったデータセットなど)を削除してみましょう。