FLOPsとMACsを使用して、Deep Learningモデルの計算効率を計算する
Calculate the computational efficiency of Deep Learning models using FLOPs and MACs.
FLOPS と MACs とは何ですか?
FLOPS(浮動小数点演算数)とMACs(乗算-加算演算数)は、ディープラーニングモデルの計算複雑性を計算するために一般的に使用される指標です。これらは、与えられた計算を実行するために必要な算術演算の数を理解するための迅速かつ簡単な方法です。例えば、MobileNet や DenseNet などの異なるモデルアーキテクチャをエッジデバイスで使用する場合、MACs や FLOPs を使用してモデルのパフォーマンスを推定します。また、「推定」という言葉を使用する理由は、両方の指標が実行時間パフォーマンスモデルの実際のキャプチャではなく、概算であるためです。しかし、それらはエッジコンピューティングで非常に有用な洞察を提供できるため、エネルギー消費量や計算要件に関する情報を提供できます。
FLOPs は、浮動小数点演算の数を特に指します。これには、浮動小数点数の加算、減算、乗算、および除算演算が含まれます。これらの演算は、行列乗算、活性化、および勾配計算など、機械学習に関わる多くの数学計算で普及しています。FLOPs は、モデルまたは特定の操作内の計算コストまたは複雑性を測定するためにしばしば使用されます。これは、一般的に計算効率を測定する文脈で使用される必要がある、必要な総算術演算の推定を提供するために役立ちます。
一方、MACs は、2つの数値を乗算して結果を加算する乗算-加算演算の数のみをカウントします。この演算は、行列乗算、畳み込み、およびドット積など、多くの線形代数演算に基本的です。MACs は、畳み込みニューラルネットワーク(CNN)など、線形代数演算に重点を置いているモデルで計算複雑性のより具体的な測定値として使用されます。
ここで言及する価値があることは、FLOPs は計算効率を理解するために人々が計算する単一の要因にはならないということです。モデルの効率を推定する際には、多くの他の要因が考慮される必要があります。例えば、システムのセットアップの並列性、モデルのアーキテクチャ(例:MACs のグループ畳み込みコスト)、モデルが使用するコンピューティングプラットフォーム(例:Cudnn は、ディープニューラルネットワークの GPU アクセラレーションを持ち、フォワードや正規化などの標準操作が高度に調整されています)が挙げられます。
FLOPS と FLOPs は同じですか?
FLOPS(全て大文字)は、「秒あたりの浮動小数点演算数」の略語であり、計算速度を指し、ハードウェアの性能測定として一般的に使用されます。「FLOPS」の「S」は「秒」を表し、「P」(「あたり」として)と一緒に、レートを表すために一般的に使用されます。
一方、FLOPs(小文字の「s」は複数形を意味します)は、浮動小数点演算を指します。これは、アルゴリズムやモデルの計算複雑性を計算するために一般的に使用されます。ただし、AIの議論では、FLOPs が上記の両方の意味を持つことがあり、読者が正確な意味を特定する必要があります。また、「FLOPs」の使用を完全に廃止し、「FLOP」を代わりに使用するよう求める議論もありました。この記事では、引き続き FLOPs を使用します。
FLOPs と MACs の関係
前述のように、FLOPs と MACs の主な違いは、それらがカウントする算術演算の種類と、それらが使用される文脈にあります。GitHub の図2のコメントのように、一般的なAIコミュニティの合意は、1つの MACs がおおよそ2つの FLOPs に相当するというものです。ディープニューラルネットワークでは、乗算-加算演算は計算において重要な役割を果たすため、MACs がより重要視されます。
FLOPs を計算する方法
良いことに、FLOPs を計算するための複数のオープンソースパッケージがすでに利用可能であり、ゼロから実装する必要はありません。最も人気のあるもののいくつかには、flops-counter.pytorch や pytorch-OpCounter などがあります。また、torchstat のようなパッケージを使用すると、PyTorch に基づく一般的なネットワークアナライザがユーザーに与えられます。ただし、これらのパッケージには、サポートされているレイヤーやモデルに限界があることに注意する必要があります。したがって、カスタマイズされたネットワークレイヤーから構成されるモデルを実行している場合は、FLOPs を自分で計算する必要があるかもしれません。
ここでは、pytorch-OpCounterを使用して、事前に学習されたtorchvisionのalexnetを使用してFLOPsを計算するコード例を示します。
from torchvision.models import alexnet
from thop import profile
model = alexnet()
input = torch.randn(1, 3, 224, 224)
macs, params = profile(model, inputs=(input, ))
結論
この記事では、FLOPsとMACsの定義、それらが通常いつ使用されるか、および2つの属性の違いについて説明しました。
参考文献
- https://github.com/sovrasov/flops-counter.pytorch
- https://github.com/Lyken17/pytorch-OpCounter
- https://github.com/Swall0w/torchstat
- https://arxiv.org/pdf/1704.04861.pdf
- https://arxiv.org/abs/1608.06993
Danni Liは、Metaの現在のAIリゾーネントです。彼女は効率的なAIシステムの構築に興味を持ち、現在の研究の焦点はデバイス上のMLモデルにあります。彼女はまた、オープンソースの共同作業と、コミュニティのサポートを最大限に活用して、革新の可能性を最大化することを信じています。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles