daisukeの技術ブログ

AI、機械学習、最適化、Pythonなどについて、技術調査、技術書の理解した内容、ソフトウェア/ツール作成について書いていきます

量子化:論文 Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference を読む(1)

今回からAIの量子化について、学んでいこうと思います。具体的には、量子化することによる推論の高速化について調べていきたいと思います。

最近のChatGPTなどに代表される「大規模言語モデル(LLM)」の動向としても、量子化が注目されてきています。

量子化によって、一定の精度劣化はありますが、モデルを小さくしたり、推論速度を改善したりできることから、エッジデバイスで推論する際に、よく使われています。

最近、スマホにLLMを搭載したというニュースが出てました。

AIの量子化では、大きく分けて、PTQ(Post Training Quantization)と呼ばれる「学習後の量子化」と、QAT(Quantization Aware Training)と呼ばれる「学習中の量子化」があります。

PTQは、既に学習が完了したモデルに対して、量子化したモデルに変換する手法で、QATより量子化の精度劣化は大きいものになりますが、手軽に量子化を試せるため、よく使われています。

一方、QATは、学習中に量子化モデルを作成する仕組みを使用するため、精度劣化は最低限に抑えることが出来ますが、学習してみないと、その精度劣化を確認できないため、PTQより手間がかかります。

現在、PyTorchやTensorFlowで実装されているQATは、Googleが2017年12月にarXivに登録した論文の「Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference」がベースになっていると思います。

まずは、量子化の基本から学び、この論文でQATの理論を学んでいこうと思います。

ある程度理解できたら、PyTorchの量子化学習を試してみて、この論文との違いや、特徴などを見ていきたいと思います。

参考サイト

arxiv.org

www.docswell.com

metrica-tech.hatenablog.jp

qiita.com

はじめに

「AIモデルの量子化」の記事一覧です。良かったら参考にしてください。

AIモデルの量子化の記事一覧

エンジニアグループのランキングに参加中です。

気楽にポチッとよろしくお願いいたします🙇

それではやっていきます!

AIの量子化の基本

まずは、量子化した場合のメリットである計算が高速化される理由について説明します。

推論時の量子化による高速化

AIの学習は、通常はFloat32(4byte浮動小数点数)で計算され、推論も同じ型で計算されます。

一方、例えば、8bit量子化では、int8かuint8の1byte整数が計算に使われます。ざっくり言うと、Float32の1/4のサイズになるため、ARMのCPUのSIMDを使用した場合に、デバイスの1命令で4倍の計算ができることになり、Float32よりも高速に計算することができます。

SIMDは、Single Instruction Multiple Dataの略で、1つの命令で複数のデータに対して同じ処理を実行できます。SIMDについては、以下のページが詳しかったです。

qiita.com

Float32のデータを1byte整数に変換して、AIの推論を行う(計算する)ことで、Float32で推論する場合に比べて、高速に推論することができるわけです。

量子化による精度劣化

量子化すると計算を速く実行することができますが、もとの4byteの浮動小数点数(Float32)が保持していた情報を1byte整数に変換するので、一部の情報が欠落してしまいます。これが量子化学習の精度劣化の原因です。

この量子化による精度劣化について、もう少し詳しく見ていきます。

例えば、画像を入力とした推論を行うとします(画像分類、物体検出、セグメンテーションなど)。カラー画像の場合は1ピクセルにつきRGBの各色が256階調の3byteのデータになります。横300ピクセル、縦300ピクセルの画像の場合、300*300*3=270,000byte(27万バイト) のデータになります。これを正規化という処理を行い、1byteのデータを、0から1ぐらいのFloat32データに変換して(27万バイト×4=108万バイト)、AIモデルに入力して推論することになります。

量子化して推論する場合は、この0から1ぐらいのFloat32のデータを、1byteの整数に全て変換します。どうやるのかというと、1byteの整数は、-128から127まで表現できるので、Float32のデータを、この-128から127の256通りのどれかの数字に割り当てます(下図のイメージ)。

Float32を1byte整数に変換する方法は、一般的に、非対称変換と、対称変換があります。

非対称変換と対称変換
非対称変換と対称変換

非対称変換の場合、量子化したい対象を無駄なく量子化空間で表現できます。一方、対称変換の場合は、正と負を同じ範囲で量子化するため、変換の計算は簡単になりますが、非対称変換に比べて、表現力が下がってしまいます。

「Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference」では、非対称変換が使用されています。

推論の計算が終わったら、整数をもとのFloat32に戻す必要があります。しかし、1byteのデータを正確にFloat32に戻すことはできません。1byteのデータは256通りのデータしか表現できません。Float32に戻したときも256通りのデータにしか復元できません。これが量子化による精度劣化の理由になります。

この精度劣化を抑える工夫がいろいろ提案されています。「Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference」でも、いくつかの工夫が入っています。

では、具体的に論文の内容を読んでいきます。

Abstract

以下は、すべてChatGPTに丸投げ翻訳です(笑)

知能型モバイルデバイスの人気の高まりと、深層学習ベースのモデルの膨大な計算コストにより、効率的かつ正確な端末内推論スキームが求められています。私たちは、整数のみの算術を使用して推論を実行する量子化スキームを提案しています。これは、一般的に利用可能な整数のみのハードウェア上で浮動小数点推論よりも効率的に実装できます。また、量子化後もエンドツーエンドのモデル精度を保持するトレーニング手法も共同設計しています。その結果、提案された量子化スキームは、精度と端末内待ち時間とのトレードオフを改善します。これらの改善は、ランタイム効率で知られるMobileNetsでさえも有意であり、ImageNet分類と人気のあるCPU上でのCOCO検出で示されています。

なるほど、「整数のみの算術を使用して推論を実行する量子化スキーム」が重要ですね。具体的な実装としては、TensorFlow Liteのことを指していると思います。

「量子化後もエンドツーエンドのモデル精度を保持するトレーニング手法」がQATのことですね。

では、次にいきます。

1. Introduction

2章と3章が理論なので、それまでは、流し読みしていきます。長いので、いくつかに分けて見ていきます。

現在の最先端の畳み込みニューラルネットワーク(CNN)は、モバイルデバイスでの使用には適していません。AlexNet [20]の登場以来、近代的なCNNは主に分類/検出精度によって評価されてきました。したがって、ネットワークアーキテクチャはモデルの複雑さや計算効率に関係なく進化してきました。一方で、スマートフォン、AR/VRデバイス(HoloLens、Daydream)、およびドローンなどのモバイルプラットフォームでのCNNの成功した展開には、デバイス上のメモリの制限に合わせて小さなモデルサイズが必要であり、ユーザーエンゲージメントを維持するために低遅延が必要です。これにより、CNNのモデルサイズと推論時間を最小限の精度損失で減らす研究分野が急速に発展しています。この分野のアプローチは、おおよそ2つのカテゴリに分かれます。最初のカテゴリは、MobileNet [10]、SqueezeNet [16]、ShuffleNet [32]、およびDenseNet [11]などのような、計算/メモリ効率の高い操作を利用する新しいネットワークアーキテクチャを設計します。二番目のカテゴリは、CNNの重みおよび/または活性化を32ビット浮動小数点からより低いビット深度の表現に量子化します。Ternary weight networks(TWN [22])、Binary Neural Networks(BNN [14])、XNOR-net [27]などのアプローチがこの方法論を採用しており、これが私たちの調査の焦点です。現在の量子化アプローチは、精度と遅延のトレードオフを考慮する際に、2つの点で不十分であることがあります。

推論の高速化には、2つのアプローチがあり、1つは「計算/メモリ効率の高い操作を利用するアーキテクチャを設計する」ことで、もう1つが「重みおよび活性化を32ビット浮動小数点から低いビット表現に量子化する」ことで、この論文は後者のアプローチです。

まず第一に、これまでのアプローチは適切なベースラインアーキテクチャで評価されていませんでした。最も一般的なベースラインアーキテクチャであるAlexNet [20]、VGG [28]、GoogleNet [29] はすべて、わずかな精度向上を引き出すために意図的に過剰パラメータ化されています。したがって、これらのアーキテクチャの圧縮を容易に行うことができ、これらのアーキテクチャでの量子化実験は、最良の場合でも概念実証にとどまります。代わりに、より意味のある課題は、既に遅延と精度のトレードオフが効率的であるモデルアーキテクチャ、例えばMobileNetsなどのモデルを量子化することです。

なかなか辛辣ですね(笑)。

これまでの研究は、「ゆるゆるアーキテクチャを対象にしていたのだから、モデルの圧縮は簡単で、意味ない」と。自分たち(Google)の効率化されたモデル「MobileNets」を量子化してベンチマークせよ、と言っています。

第二に、多くの量子化アプローチは、実際のハードウェア上で検証可能な効率改善を提供していません。重みのみを量子化するアプローチ([2, 4, 8, 33])は、主にデバイス上のストレージに関心があり、計算効率にはあまり関心がありません。注目すべき例外は、バイナリ、三値、ビットシフトネットワーク[14, 22, 27]です。これらの後者のアプローチでは、0または2の累乗である重みを使用して、乗算をビットシフトで実装できるようにしています。しかし、ビットシフトはカスタムハードウェアで効率的である場合がありますが、正しく使用されると(つまりパイプライン化されると)、加算単体よりも高価ではありません。さらに、乗算はオペランドが広い場合にのみ高価であり、重みと活性化が両方とも量子化された後にビットの深さが減少すると、乗算を避ける必要性が低下します。特に、これらのアプローチでは、約束されたタイミングの改善を検証するためのデバイス上の計測をほとんど提供しません。よりランタイムフレンドリーなアプローチは、重みと活性化の両方を1ビットの表現に量子化します[14, 27, 34]。これらのアプローチでは、乗算と加算の両方を効率的なビットシフトおよびビットカウント操作で実装できます。ただし、1ビットの量子化はしばしば大幅な性能低下を引き起こし、モデル表現に過度に厳しい場合があります。

FPGAやカスタムASICを使うことを想定したものが多く、検証環境を提供していないと言っています。過度な低ビット化は著しい精度劣化を引き起こすと言ってます。

この論文では、モバイルハードウェア上でのMobileNetsの遅延と精度のトレードオフを改善することで、上記の問題に取り組みます。具体的な貢献は次のとおりです:

重みと活性化を8ビットの整数として量子化し、パラメータ(バイアスベクトル)を32ビットの整数として量子化する量子化スキーム(セクション2.1)を提供します。

Qualcomm Hexagonなどの整数演算のみをサポートするハードウェアで効率的に実装可能な量子化推論フレームワーク(セクション2.2、2.3)を提供し、ARM NEONでの効率的で正確な実装を説明します(付録B)

実際のモデルでの量子化からの精度損失を最小限に抑えるために、量子化推論と共同設計された量子化トレーニングフレームワーク(セクション3)を提供します

・MobileNetsに基づく効率的な分類および検出システムにフレームワークを適用し、一流のARM CPUでのベンチマーク結果(セクション4)を提供します。これにより、ImageNet分類[3]、COCOオブジェクト検出[23]、およびその他のタスクで、最先端のMobileNetアーキテクチャの遅延と精度のトレードオフにおける著しい改善が示されます。

この論文の概要のようなセクションです。量子化スキーム(理論)を提供し、量子化推論フレームワーク(TensorFlow Lite)を提供し、量子化トレーニングフレームワーク(TensorFlowで提供するQATのこと)すると言っています。

私たちの研究は、[7] からインスピレーションを得ています。この先行研究では、低精度の固定小数点演算を利用してCNNのトレーニング速度を加速させています。また、[31] からもインスピレーションを得ています。この先行研究では、8ビットの固定小数点演算を使用してx86 CPU上での推論を高速化しています。私たちの量子化スキームは、代わりにモバイルCPU上での推論速度と精度のトレードオフを改善することに焦点を当てています。

以上が1章でした。

今回はここまでにします!次回は2章を読んでいきます。

最後までお読みいただき、ありがとうございました。