[pytorch] ディープラーニングに必要な計算能力の推定: フロップとモデルパラメータ

必要な計算量はチップのフロップにあります (GPU の計算能力を指します)。

ニューラル ネットワーク推論に必要な計算能力を決定するには、次の要素を考慮する必要があります。

ネットワーク構造: ニューラル ネットワーク構造の複雑さは、コンピューティング能力の需要に直接影響します。一般に、深い畳み込みネットワークには、より多くのコンピューティング能力が必要です。

入力データのサイズとデータ型: 入力データのサイズとデータ型は、ニューラル ネットワークの各層の計算量とストレージ要件に直接影響します。たとえば、入力データは大きな画像やビデオであり、より多くのメモリと計算能力を必要とします。

バッチ サイズ: バッチ サイズは、毎回処理されるサンプルの数を決定し、計算能力要件にも影響します。一般に、バッチ サイズが大きくなるほど、より多くの計算能力が必要になります。

ネットワーク構造の浮動小数点演算 (FLOP) を計算する: 既存のツールまたはコード ライブラリ (TensorFlow Profiler や PyTorch Profiler など) を使用して、ネットワーク構造の FLOP を計算できます。

thop (pytorch-OpCounter) は、PyTorch モデルの FLOP とパラメーターの数をカウントするための Python ライブラリです。thop では、計算は FLOPS (1 秒あたりの浮動小数点演算) ではなく FLOP (浮動小数点演算) です。

FLOP は FLOPS に変換されて、必要な計算能力が決定されます。
変換方法は、FLOP を 1 秒あたりに実行できる浮動小数点演算の数で割ります (FLOP / FLOPS = 秒)。この秒数は、モデルに必要な最小計算時間を表します。たとえば、モデルに 1000 FLOP があり、コンピューターの処理能力が 10 FLOPS である場合、必要な最小計算時間は 100 秒 (1000 / 10 = 100) です。

パラメータの量はメモリ サイズの選択に対応します

PyTorch モデルのパラメータ量と GPU メモリの間には一定の関係があります。モデルパラメータが増えるほど、必要なメモリも大きくなります。これは、モデルのパラメーターをビデオ メモリに保存する必要があり、計算プロセスには中間結果の保存と計算も含まれるため、モデルの操作をサポートするには十分なビデオ メモリが必要になるためです。
ビデオ メモリのサイズによってモデルの最大バッチ サイズが制限されるため、展開する場合はチップのビデオ メモリを考慮する必要があります。モデルのバッチ サイズがビデオ メモリのサイズを超える場合、データのバッチ全体を同時にビデオ メモリに読み込むことができず、バッチで処理する必要があるため、モデル推論の時間が増加します。そのため、導入時にはチップのメモリサイズに合わせたモデルとバッチサイズを選択する必要があります。

モデルのパラメーター サイズが 100M、最大推論バッチサイズが 32 であることがわかっているとします。次に、適切な推論チップ メモリ サイズを選択する必要があります。以下は簡単な計算プロセスです。
まず、最大推論バッチサイズの下でモデルに必要なメモリ サイズを計算する必要があります。モデルの入力データサイズを[h, w]、各要素のデータ型をfloat32とすると、モデルの各バッチの入力データサイズは[h, w, 32](32はバッチサイズ)、占有メモリサイズはh * w * 32 * 4(4はfloat32のバイトサイズ、つまり4バイト)となり、同様に出力データサイズも[h, w, 32]、占有メモリサイズもhとなります。 * w * 32 * 4 したがって、最大推論バッチサイズでモデルに必要なメモリ サイズは次のようになります。

显存大小 = 输入数据大小 + 输出数据大小 + 模型参数大小
显存大小 = h * w * 32 * 4 + h * w * 32 * 4 + 100M * 4

モデルのすべてのパラメーターは float32 型であると想定されているため、モデル パラメーターのサイズは 100M * 4 であることに注意してください。モデル パラメーターの型が float32 でない場合は、それに応じて計算を調整する必要があります。
ビデオ メモリの使用率を 80% に達したいと仮定すると、最終的に選択されるビデオ メモリ サイズは次のようになります。

显存大小 = (h * w * 32 * 4 + h * w * 32 * 4 + 100M * 4) / 0.8

次に、計算結果に基づいて適切な推論チップのメモリ サイズを選択する必要があります。NVIDIA グラフィックス カードを例にとると、NVIDIA グラフィックス カードのビデオ メモリには、8GB、16GB、32GB などのさまざまな仕様があります。推論チップのメモリサイズとして、計算結果に最も近いメモリ仕様を選択できます。
計算結果が 3000MB であると仮定すると、推論チップのメモリ サイズとして 8GB のメモリ仕様を選択できます。8 GB グラフィックス カードで実際に利用可能なビデオ メモリは約 7500 MB であり、最大推論バッチサイズの下でモデルのビデオ メモリ要件を満たすことができ、モデルが正常に実行できることを保証する一定のマージンがまだあるためです。16 GB または 32 GB のビデオ メモリ仕様を選択すると、ビデオ メモリ要件をより適切に満たすことができますが、ビデオ メモリの無駄が発生し、ハードウェア コストが増加します。

一般一个参数是值一个float,也就是4个字节
1kb=1024字节

一般的な Nvidia グラフィックス カードの FLOPS とメモリ仕様

NVIDIA GeForce GTX 1080 Ti
FLOPS: 11.34 TFLOPS
显存: 11 GB GDDR5X

NVIDIA GeForce RTX 2080 Ti
FLOPS: 14.2 TFLOPS
显存: 11 GB GDDR6

NVIDIA Tesla V100
FLOPS: 7.5-15.7 TFLOPS (取决于精度)
显存: 16 GB HBM2

NVIDIA Tesla P100
FLOPS: 4.7-9.3 TFLOPS (取决于精度)
显存: 16 GB HBM2

NVIDIA Tesla T4
FLOPS: 8.1 TFLOPS
显存: 16 GB GDDR6

NVIDIA Quadro RTX 6000
FLOPS: 16.3 TFLOPS
显存: 24 GB GDDR6

pytorch でのフロップとメモリの計算方法

ライブラリをインストールします。

pip install thop

実行コード:

# -- coding: utf-8 --
import torch
import torchvision
from thop import profile

# Model
print('==> Building model..')
model = torchvision.models.alexnet(pretrained=False)

dummy_input = torch.randn(1, 3, 224, 224)
flops, params = profile(model, (dummy_input,))
print('flops: ', flops, 'params: ', params)
print('flops: %.2f M, params: %.2f M' % (flops / 1000000.0, params / 1000000.0))

出力結果:

flops:  714206912.0 params:  61100840.0
flops: 714.21 M, params: 61.10 M

注:
FLOPS (1 秒あたりの浮動小数点演算) は、1 秒あたりに実行できる浮動小数点演算の数を表すために使用されるコンピューターのパフォーマンス単位です。通常、特に科学計算、人工知能、ビッグデータ処理などの分野で、コンピューターの処理速度とパフォーマンスを測定するために使用されます。FLOPS の単位は 1 秒あたりの浮動小数点演算の回数で、一般的に使用される接頭辞は k (千)、M (百万)、G (十億)、T (兆) などです。

したがって、バッチが 1 の場合、224*224 3 チャネル入力の計算量は 714206912.0flops となります。

おすすめ

転載: blog.csdn.net/hh1357102/article/details/129705313