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)の専門家にとって長年の難問でした。基盤となるフレームワークやハードウェアプラットフォームの深い知識があっても、どのツマミや機能を活用するかを見極めるために多くの試行錯誤が必要です。

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!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

AI研究

「NVIDIAのAIが地球を気候変動から救う」

ベルリンサミットの基調講演で、NVIDIAの創設者兼CEOのJensen Huang氏は、AIとデジタルツイン技術が気候研究のイノベーション...

データサイエンス

「画像のためのモダンなセマンティック検索」

「数年前の「あの一枚の写真」を見つけたいんですね場面に関するいくつかの具体的な情報を覚えているんですが、Apple Photos...

データサイエンス

リトリーバル・オーグメンテッド・ジェネレーションにおける関連性の課題にどのように対処するか

パート1では、非最適な埋め込みモデル、効率の悪いチャンキング戦略、およびメタデータフィルタリングの不足により、LLMから...

データサイエンス

「StackOverflowが生成型AIに対応する方法」

OverflowAIは、強力な生成AIループによってプロセスを効率化することで、コンテンツ作成を革命化します

データサイエンス

「PandasAIを用いたデータ分析における生成型AIの活用」

「生成モデルを適用することで、PandasAIは人間のようなクエリを理解し、応答することができ、複雑なデータの操作を実行し、...

AIニュース

Googleの機能や製品をラボで試してください

Google の大胆で責任ある実験を最初に見て、それらの背後にいるチームにフィードバックを共有しましょう