PyTorch
CPU と CUDA の使い分け
データの前処理は CPU で,学習は CUDA で処理するようにするのがいい.細切れになったデータの処理は CPU のほうが CUDA よりも体感 5 倍くらい早い.その一方で,学習では CUDA のほうが CPU よりも 10 倍くらい早い.
問題はデバイスの指定方法をどうするのかということである.PyTorch でデバイスを指定する方法はたくさんあるが,デフォルトでは CPU が使用される.これは理にかなっていて,というのも CUDA を使った処理はその時点でデータが学習用に整理されているため,CUDA を指定する必要のある部分は思ったよりも少ない.したがって,CUDA を使う必要のある部分だけ .to(DEVICE)
として指定するのがもっとも記述量が少なくなると思う.
参考にしたチュートリアル:
以下のような警告メッセージが表示された場合の対処について.
UserWarning: Support for mismatched key_padding_mask and attn_mask is deprecated. Use same type for both instead.
warnings.warn(
要するに同じ型になっていないので統一すればいい.自分の場合は torch.nn.Transformer.generate_square_subsequent_mask()
を使っていたのだが,これがデフォルトで dtype=torch.float32
らしい.一方で,別の自前で用意していたマスクでは dtype=torch.bool
としていた.ここで問題が発生していたようだ.torch.nn.Transformer.generate_square_subsequent_mask()
の引数で dtype
を指定してやると警告が出なくなった.
データセットの扱い方
自前でデータセットを用意する際は,torch.utils.data
の Dataset
や IterableDataset
を継承するクラスを用意するといい.データセットの時点では Tensor 形式で取得できる必要はない.プリミティブなデータ形式で大丈夫である.
データセットを呼び出す際は torch.utils.data
の DataLoader
を用いる.引数の collate_fn
がデータセットのデータを Tensor 形式に変換する関数で,これは自前で用意する必要がある.