PyTorch
【PyTorch】「CUDA error: device-side assert triggered」 解決の手引き
· ☕ 4 min read
はじめに PyTorchにて, “RuntimeError: CUDA error: device-side assert triggered"というエラーに出くわすことがある ネットに転がってるモデルで発生すると特に厄介である (自分が作った沼ではないので…) またMAEでのマスク処理のような, テクニカルな処理を行う場合などにも頻発 再現性が取れず, 出力されるエラー内容も二転三転. 一定 ...

PyTorch 高速化
· ☕ 1 min read
https://qiita.com/sugulu_Ogawa_ISID/items/62f5f7adee083d96a587#31-ampautomatic-mixed-precision機能について ...

Automatic Mixed Precision
· ☕ 1 min read
float16とfloat32を混ぜて(Mixed)計算することで, GPUのMEM使用率を抑えることができる 計算スピードも幾分速くなるらしい 略してamp https://qiita.com/Sosuke115/items/40265e6aaf2e414e2fea https://tawara.hatenablog.com/entry/2021/05/31/220936 ...

torch.view
· ☕ 1 min read
同じ順序でメモリ上に展開されてないとダメだから注意 1 2 3 4 >>> torch.t(x).view(-1, 2) Traceback (most recent call last): File "<stdin>", line 1, in <module> RuntimeError: invalid argument 2: view size is not compatible with input tensor's size and stride (at least one dimension spans across two contiguous subspaces). Call .contiguous() before .view(). at /Users/soumith/code/builder/wheel/pytorch-src/aten/src/TH/generic/THTensor.cpp:237 1 2 3 4 5 6 x = torch.Tensor([[[ 1., 5., 9.], [ 2., 6., 10.], [ 3., 7., 11.], [ 4., 8., 12.]]]) x = x.unsqueeze(0) print(x.transpose(-1,-2).view(1,-1,2)) ↑ これだとメモリ上に展開されてないからダメ 1 2 3 x = torch.Tensor([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) x = x.unsqueeze(0).transpose(-1,-2) print(x.transpose(-1,-2).view(1,-1,2)) ↑こっちだとOK ...

torchのテンソル積
· ☕ 1 min read
三次元 $\times $三次元の行列 1つ目をバッチサイズとして, バッチ単位で行列積 torch.bmm 4次元 $\times $3次元の行列 (j×1×n×m) と (kxm×p)の積は(j,k,n,p)となる バッチなど、行列以外の次元は、ブロードキャストされる。そのため、行列以外の次元はブロードキャストできるものでなければならない。例えば、tensor1が(j×1×n× ...


torch.bmm
· ☕ 1 min read
バッチサイズ単位で行列積 @も同様 https://pytorch.org/docs/stable/generated/torch.bmm.html#torch.bmm ...

PyTorchとメモリ
· ☕ 1 min read
必要なメモリ量 必要メモリ量(byte) = (ニューロンの数 × Batch Size + パラメータ数) × 2 (data & grad) × 4(byte) https://nori-life-log.com/nnの学習で必要なgpuメモリを算出する 重みを固定(freeze) 1 2 3 # freeze all layers for param in model.parameters(): param.requires_grad = False ...

einsum
· ☕ 1 min read
アインシュタインの縮約記法 テンソル積を書くと大量の $\Sigma$が出てきてうざい なので, $\Sigma$を省略しよう, というのが事の始まり $\sum_{j} a_{i,j}b_{j,k}$ なら ij,jk → ik プログラム的に考えれば, 単純にfor を外しただけ 例えば ドット積 z[i,j](https://scrapbox.io/yuwd/i%2Cj) += x[i,j](https://scrapbox.io/yuwd/i%2Cj) * y[i,j](https://scrapbox.io/yuwd/i%2Cj) np.einsum("ij,ij->ij", x, y) 内積 z[j,k](https://scrapbox.io/yuwd/j%2Ck) += x[j,i](https://scrapbox.io/yuwd/j%2Ci) * y[i,k](https://scrapbox.io/yuwd/i%2Ck) np.einsum("ji,ik->jk", x, y) 軸の入れ替えなどでも使える y = torch.einsum('nchw->nhwc', y).detach().cpu() 実際は遅いからやめたほうが良さそう ...

world_size
· ☕ 1 min read
world_size プロセス数 rank どのプロセスなのかを指定 ...

重みの初期化
· ☕ 1 min read
nn.init.hogehoge() で初期化できる 例 nn.init.xavier_uniform_(ln.weight) # Xavierの初期値 PyTorchの場合, デフォルトはHe ...