この記事は、The Parallel Universe Magazine 56 号に掲載されている「Efficient Natural Language Embedding Models with Intel® Extension for Transformers」の日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。
自然言語埋め込みの概要
自然言語埋め込みは、自然言語処理 (NLP) に不可欠なもので、テキストを意味情報をキャプチャーするベクトルとして表します。これらの埋め込みは計算操作に必要な数値入力を提供するため、さまざまな下流の NLP タスクにとって重要です。
数ある埋め込みモデルの中でも、BGE (BAAI General Embedding) は効率が非常に優れています。small (英語) および base (英語) バージョンは、速度と効率のバランスが良く、テキスト埋め込みの理想的な選択肢となっています。BGE はベクトル・データベースとシームレスに統合され、テキスト埋め込み以外でも、その可能性をさらに拡大しています。
この記事では、BGE small モデルの速度と精度を大幅に向上するオープンソース・ツールのトランスフォーマー向けインテル® エクステンション (英語) を利用して、埋め込みモデルのパフォーマンスを向上させる革新的なアプローチを紹介します。
INT8 静的なトレーニング後の量子化
静的なトレーニング後の量子化 (PTQ) は、追加のトレーニング段階を量子化する効果的なアプローチです。モデルの量子化パラメーター (スケール、ゼロ点など) を決定するには、代表的なデータセットを使用したキャリブレーションが必要です。bge-small-en-v1.5 (英語) に精度を考慮した自動チューニングを備えた PTQ を適用して、最適な量子化モデルを生成します。以下のコード例は、トレーニング後の量子化を活用して BGE small モデルを最適化する方法を示しています。CQADupStack (英語) データセットをキャリブレーションに使用し、MTEB (英語) STS タスクを評価ベンチマークとして使用します。完全なコードはこちらから (英語) 入手できます (ドキュメントは、readme (英語) を参照してください)。
from intel_extension_for_transformers.transformers import metrics, objectives, QuantizationConfig from intel_extension_for_transformers.transformers.trainer import NLPTrainer # Replace transformers.Trainer with NLPTrainer # trainer = transformers.Trainer(......) trainer = NLPTrainer(......) metric = metrics.Metric( name="eval_accuracy", is_relative=True, criterion=0.01 ) objective = objectives.performance q_config = QuantizationConfig( approach="PostTrainingStatic", metrics=[metric], objectives=[objective] ) model = trainer.quantize(quant_config=q_config, eval_func=mteb_sts_eval)
開始方法を次に示します。
from transformers import AutoTokenizer from intel_extension_for_transformers.transformers import AutoModel sentences_batch = ['sentence-1', 'sentence-2', 'sentence-3', 'sentence-4'] tokenizer = AutoTokenizer.from_pretrained('BAAI/bge-small-en-v1.5') encoded_input = tokenizer(sentences_batch, padding=True, truncation=True, max_length=512, return_tensors="np") engine_input = [encoded_input['input_ids'], encoded_input['token_type_ids'], encoded_input['attention_mask']] model = AutoModel.from_pretrained('./model_and_tokenizer/int8-model.onnx', use_embedding_runtime=True) sentence_embeddings = model.generate(engine_input)['last_hidden_state:0'] print("Sentence embeddings:", sentence_embeddings)
パフォーマンスの測定
MTEB STS 上で最適な量子化 BGE モデルを測定しました。すべてのモデルの精度相対損失は 1% 以内です。
埋め込みレイテンシーとして、1 ソケット、24 コア/インスタンス、シーケンス長 = 512 の 1 つのインスタンス、バッチサイズ = 1 を使用して 1 つの文をエンコードする平均ミリ秒も測定しました。