とりあえずおはようございます。こんにちは。こんばんは。
ホリマイです。札幌では梅か桜がまだ咲いています。満開は過ぎましたが。(過去にも書きましたが私は梅と桜の区別がつきません)
今回はネタがありません。なので技術のことを。
GW皆さんは何をされてましたでしょうか?私は所属している剣道会ではレクレーションに参加したり。日帰り温泉に行って仕事を忘れてのんびりしてましたが…合間でDeepLearningの学習を実行してました。私は設定するだけなので何も仕事はしていません。いくつかやりたかったパターンで学習を回すと同時に結果についてはほぼほぼ自動でグラフまで出力するスクリプトを組んで実行してました。
詳細はあまり話せることでもないのですが、今回はGPUを2台使うという荒業を試してみました。GPUで学習を行う場合。モデルそのものと学習時に使用するミニバッチデータをGPUに保持する必要があります。なので、GPUメモリを足りない場合、わざわざミニバッチサイズを小さくする必要が出てきます。(画像サイズが小さければ2とか3とか。)ミニバッチを大きくしすぎると弊害も出ますが、小さすぎると学習がいつまでたっても終わらなかったりもします。最近のGPUでは48Gとか使えたりもしますしそもそもローカルでGPUを使うということはない方もいらっしゃるかもしれませんが。それはそれ。これはこれで。生暖かく見ていただければと思います。
PytorchでGPUを使う場合、通常以下のように記載します
model = model.cuda()
2台以上のGPUを用いて学習させるときは以下のように記載します
model = model.cuda()
model = torch.nn.DataParallel(model) # make parallel
torch.backends.cudnn.benchmark = True
WordPressだとインデントがうまくできないので実際はこんな感じで書きます。
これだけでGPUを複数枚使用することが可能となります。
学習についてはコードを新たに書き換える必要は必ずしもありませんが、モデルを保存する際には以下のように変更します
変更前)
torch.save(model.state_dict(), os.path.join(log_dir, model_file))
変更後)
torch.save(model.module.state_dict(), os.path.join(log_dir, model_file))
これはGPUを複数枚使うためにmoduleを指定する必要があるためです。実際の読み込みではGPUの枚数は関係ない…というかたいていの場合1枚またはCPUで実行することになるのでmoduleを指定する部分は邪魔になります。なので保存するときにmoduleを記載して保存してあげることでCPU環境や他GPU環境での読み込みも可能となります。
…やってしまった。変更しないで保存してしまった…というおっちょこちょいな某北海道在住のお笑い芸人もどき…つまり私のことですが…のためにリカバリー策は一応あります。
GPUを用いた学習ではある程度のハードの知識も必要ではありますが久々に思い出させられた休日でした。