IntelとHugging Faceがパートナーシップを結び、機械学習ハードウェアアクセラレーションを民主化する
Intel and Hugging Face partner to democratize machine learning hardware acceleration.
Hugging Faceのミッションは、優れた機械学習を民主化し、産業や社会に対するそのポジティブな影響を最大化することです。私たちはTransformerモデルの進歩だけでなく、その採用を簡素化するためにも努力しています。
本日、Intelが正式に私たちのハードウェアパートナープログラムに参加したことをお知らせいたします。Optimumオープンソースライブラリのおかげで、IntelとHugging FaceはTransformerをトレーニング、微調整、予測するための最新のハードウェアアクセラレーションを共同で開発します。
Transformerモデルはますます大きく複雑になっており、検索やチャットボットなどのレイテンシーに敏感なアプリケーションにおいて、生産上の課題を引き起こすことがあります。残念ながら、レイテンシーの最適化は機械学習(ML)の専門家にとって長年の難問でした。基盤となるフレームワークやハードウェアプラットフォームの深い知識があっても、どのツマミや機能を活用するかを見極めるために多くの試行錯誤が必要です。
- 世界最大のオープンマルチリンガル言語モデル「BLOOM」をご紹介します
- TF Servingを使用してHugging FaceでTensorFlow Visionモデルを展開する
- プライベートハブのご紹介:機械学習を活用した新しいビルド方法
Intelは、Intel Xeon Scalable CPUプラットフォームと幅広いハードウェア最適化AIソフトウェアツール、フレームワーク、ライブラリを備えた、AIの加速化に完全な基盤を提供します。そのため、Hugging FaceとIntelが力を合わせて、Intelプラットフォーム上での最高のパフォーマンス、スケーラビリティ、生産性を実現するための強力なモデル最適化ツールの開発に取り組むことは理にかなっています。
「Intel XeonハードウェアとIntel AIソフトウェアの最新のイノベーションをTransformersコミュニティにもたらすため、オープンソースの統合と統合された開発者体験を通じてHugging Faceと協力することにワクワクしています。」と、Intel副社長兼AIおよび分析のゼネラルマネージャーであるWei Li氏は述べています。
最近の数ヶ月間、IntelとHugging FaceはTransformerワークロードのスケーリングに取り組んできました。推論(パート1、パート2)の詳細なチューニングガイドとベンチマークを公開し、最新のIntel Xeon Ice Lake CPU上でDistilBERTの単桁ミリ秒レイテンシーを実現しました。トレーニングの側では、GPUよりも40%優れた価格性能を提供するHabana Gaudiアクセラレータのサポートを追加しました。
次の自然なステップは、この作業を拡大してMLコミュニティと共有することでした。それがOptimum Intelオープンソースライブラリの登場です!それをより詳しく見てみましょう。
Optimum Intelで最高のTransformerパフォーマンスを実現する
Optimumは、Hugging Faceが作成したオープンソースライブラリであり、トレーニングや推論デバイスの範囲を広げながら、Transformerのアクセラレーションを簡素化するために作成されました。組み込まれた最適化技術のおかげで、既製のスクリプトを使用したり、既存のコードに最小限の変更を加えることで、数分でワークロードを加速することができます。初心者はOptimumをそのまま使用して優れた結果を得ることができます。エキスパートは最大のパフォーマンスを得るために微調整を続けることができます。
Optimum IntelはOptimumの一部であり、Intel Neural Compressor(INC)の上に構築されています。INCは、量子化、剪定、知識蒸留などの人気のあるネットワーク圧縮技術のための複数のディープラーニングフレームワークにわたる統一されたインターフェースを提供するオープンソースライブラリです。このツールは、ユーザーが最適な量子化モデルを迅速に構築するための自動精度駆動のチューニング戦略をサポートします。
Optimum Intelを使用すると、最小の努力で最新の最適化技術をTransformerに適用することができます。完全な例を見てみましょう。
ケーススタディ:Optimum Intelを使用してDistilBERTを量子化する
この例では、分類のためにファインチューニングされたDistilBERTモデルに対してポストトレーニング量子化を実行します。量子化は、モデルパラメータのビット幅を縮小することにより、メモリと計算要件を削減するプロセスです。例えば、予測の精度がわずかに低下する代わりに、32ビット浮動小数点パラメータを8ビット整数で置き換えることができます。
私たちは既に元のモデルをファインチューニングして、靴の製品レビューを星の評価(1から5つ星まで)に基づいて分類するためのモデルを作成しました。このモデルとその量子化バージョンはHugging Faceハブで確認することができます。また、元のモデルをこのスペースでテストすることもできます。
さあ、始めましょう!すべてのコードはこのノートブックで利用できます。
いつものように、まず必要なライブラリをインストールします。量子化プロセスが正しく機能するためには、CPU専用バージョンのPyTorchを使用する必要があることに注意してください。
pip -q uninstall torch -y
pip -q install torch==1.11.0+cpu --extra-index-url https://download.pytorch.org/whl/cpu
pip -q install transformers datasets optimum[neural-compressor] evaluate --upgrade
次に、量子化中にモデルのパフォーマンスを評価するための評価データセットを準備します。元のモデルのファインチューニングに使用したデータセットから、数千のレビューとそのラベルのみを保持し、ローカルストレージに保存します。
次に、Hugging Faceハブから元のモデル、そのトークナイザー、および評価データセットをロードします。
from datasets import load_dataset
from transformers import AutoModelForSequenceClassification, AutoTokenizer
model_name = "juliensimon/distilbert-amazon-shoe-reviews"
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=5)
tokenizer = AutoTokenizer.from_pretrained(model_name)
eval_dataset = load_dataset("prashantgrao/amazon-shoe-reviews", split="test").select(range(300))
次に、評価データセット上でモデルのメトリクスを計算する評価関数を定義します。これにより、Optimum Intelライブラリは量子化前後のこれらのメトリクスを比較することができます。この目的のために、Hugging Faceの評価ライブラリは非常に便利です!
import evaluate
def eval_func(model):
task_evaluator = evaluate.evaluator("text-classification")
results = task_evaluator.compute(
model_or_pipeline=model,
tokenizer=tokenizer,
data=eval_dataset,
metric=evaluate.load("accuracy"),
label_column="labels",
label_mapping=model.config.label2id,
)
return results["accuracy"]
次に、[configuration]を使用して量子化ジョブを設定します。この構成についての詳細はNeural Compressorのドキュメントで確認できます。ここでは、許容される精度の低下率が5%のポストトレーニングダイナミック量子化を選択します。もし精度が5%を超える場合、モデルの異なる部分が量子化され、許容できる精度の低下が得られるか、ここでは10回に設定されている最大トライアル数に達するまで量子化が行われます。
from neural_compressor.config import AccuracyCriterion, PostTrainingQuantConfig, TuningCriterion
tuning_criterion = TuningCriterion(max_trials=10)
accuracy_criterion = AccuracyCriterion(tolerable_loss=0.05)
# 量子化を適用する詳細を記述した量子化構成をロードします
quantization_config = PostTrainingQuantConfig(
approach="dynamic",
accuracy_criterion=accuracy_criterion,
tuning_criterion=tuning_criterion,
)
これで、量子化ジョブを開始し、結果のモデルとその構成ファイルをローカルストレージに保存できます。
from neural_compressor.config import PostTrainingQuantConfig
from optimum.intel.neural_compressor import INCQuantizer
# 量子化されたモデルが保存されるディレクトリ
save_dir = "./model_inc"
quantizer = INCQuantizer.from_pretrained(model=model, eval_fn=eval_func)
quantizer.quantize(quantization_config=quantization_config, save_directory=save_dir)
ログによれば、Optimum Intelは38個のLinear
オペレーターと2個のEmbedding
オペレーターを量子化しました。
[INFO] |******Mixed Precision Statistics*****|
[INFO] +----------------+----------+---------+
[INFO] | Op Type | Total | INT8 |
[INFO] +----------------+----------+---------+
[INFO] | Embedding | 2 | 2 |
[INFO] | Linear | 38 | 38 |
[INFO] +----------------+----------+---------+
元のモデル(model.distilbert.transformer.layer[0]
)とその量子化バージョン(inc_model.distilbert.transformer.layer[0]
)の最初のレイヤーを比較すると、Linear
が実際にDynamicQuantizedLinear
に置き換えられ、量子化された等価物になっていることがわかります。
# 元のモデル
TransformerBlock(
(attention): MultiHeadSelfAttention(
(dropout): Dropout(p=0.1, inplace=False)
(q_lin): Linear(in_features=768, out_features=768, bias=True)
(k_lin): Linear(in_features=768, out_features=768, bias=True)
(v_lin): Linear(in_features=768, out_features=768, bias=True)
(out_lin): Linear(in_features=768, out_features=768, bias=True)
)
(sa_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
(ffn): FFN(
(dropout): Dropout(p=0.1, inplace=False)
(lin1): Linear(in_features=768, out_features=3072, bias=True)
(lin2): Linear(in_features=3072, out_features=768, bias=True)
)
(output_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
)
# 量子化されたモデル
TransformerBlock(
(attention): MultiHeadSelfAttention(
(dropout): Dropout(p=0.1, inplace=False)
(q_lin): DynamicQuantizedLinear(in_features=768, out_features=768, dtype=torch.qint8, qscheme=torch.per_channel_affine)
(k_lin): DynamicQuantizedLinear(in_features=768, out_features=768, dtype=torch.qint8, qscheme=torch.per_channel_affine)
(v_lin): DynamicQuantizedLinear(in_features=768, out_features=768, dtype=torch.qint8, qscheme=torch.per_channel_affine)
(out_lin): DynamicQuantizedLinear(in_features=768, out_features=768, dtype=torch.qint8, qscheme=torch.per_channel_affine)
)
(sa_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
(ffn): FFN(
(dropout): Dropout(p=0.1, inplace=False)
(lin1): DynamicQuantizedLinear(in_features=768, out_features=3072, dtype=torch.qint8, qscheme=torch.per_channel_affine)
(lin2): DynamicQuantizedLinear(in_features=3072, out_features=768, dtype=torch.qint8, qscheme=torch.per_channel_affine)
)
(output_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
)
非常によく、しかし精度と予測時間への影響はどのようになりますか?
各量子化ステップの前後に、Optimum Intelは現在のモデルで評価関数を実行します。量子化モデルの精度は、元のモデル(0.574)よりもやや低くなっています(0.546)。また、量子化モデルの評価ステップは、元のモデルよりも1.34倍高速であることもわかります。数行のコードでこれだけの成果は素晴らしいです!
[INFO] |**********************Tune Result Statistics**********************|
[INFO] +--------------------+----------+---------------+------------------+
[INFO] | Info Type | Baseline | Tune 1 result | Best tune result |
[INFO] +--------------------+----------+---------------+------------------+
[INFO] | Accuracy | 0.5740 | 0.5460 | 0.5460 |
[INFO] | Duration (seconds) | 13.1534 | 9.7695 | 9.7695 |
[INFO] +--------------------+----------+---------------+------------------+
結果のモデルは、Hugging Faceハブでホストされています。ローカルまたは🤗ハブでホストされた量子化モデルをロードするには、次のようにします:
from optimum.intel.neural_compressor import INCModelForSequenceClassification
inc_model = INCModelForSequenceClassification.from_pretrained(save_dir)
私たちは始まったばかりです
この例では、Optimum Intelを使用してトレーニング後にモデルを簡単に量子化する方法を紹介しましたが、これは始まりにすぎません。このライブラリは、予測結果にほとんどまたは全く影響を与えないモデルのパラメータをゼロ化または削除するプルーニングなど、他の種類の量子化もサポートしています。
最新のIntel Xeon CPUとIntel AIライブラリで、Hugging Faceユーザーに最高の効率を提供するためにIntelと協力しています。Optimum Intelにスターを付けてアップデートを受け取り、今後の多くの機能にご期待ください!
この投稿へのElla Charlaixさんのご協力に感謝いたします。
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