Bert ベンチマークの Python サンプル#

このサンプルでは、非同期推論要求 API を使用して Bert モデルのパフォーマンスを推定する方法を示します。デモとは異なり、このサンプルには構成可能なコマンドライン引数がありません。サンプルのソースコードを変更して、さまざまなオプションを試してください。

どのように動作するか#

このサンプルでは、モデルとトークナイザーをダウンロードし、モデルを ONNX 形式にエクスポートして、そのモデルを読み取り、動的入力形状を強制するために再形成します。次に、結果のモデルをコンパイルし、データセットをダウンロードして、そのデータセットに対してベンチマークを実行します。

#!/usr/bin/env python3 
# -*- coding: utf-8 -*- 
# Copyright (C) 2022 Intel Corporation 
# SPDX-License-Identifier: Apache-2.0 

import logging as log 
from pathlib import Path 
import sys 
import tempfile 
from time import perf_counter 

import datasets 
import openvino as ov 
from openvino.runtime import get_version 
from transformers import AutoTokenizer 
from transformers.onnx import export 
from transformers.onnx.features import FeaturesManager 

def main(): 
    log.basicConfig(format='[ %(levelname)s ] %(message)s', level=log.INFO, stream=sys.stdout) 
    log.info('OpenVINO:') 
    log.info(f"{'Build ':.<39} {get_version()}") 
    model_name = 'bert-base-uncased’ 
    # Download the model 
    transformers_model = FeaturesManager.get_model_from_feature('default', model_name) _, model_onnx_config = FeaturesManager.check_supported_model_or_raise(transformers_model, feature='default') onnx_config = model_onnx_config(transformers_model.config) 
    # トークナイザーをダウンロード 
    tokenizer = AutoTokenizer.from_pretrained(model_name) 

    core = ov.Core() 

    with tempfile.TemporaryDirectory() as tmp: 
        onnx_path = Path(tmp) / f'{model_name}.onnx’ 
        # .onnx をエクスポート 
        export(tokenizer, transformers_model, onnx_config, onnx_config.default_onnx_opset, onnx_path) 
        # OpenVINO で .onnx リード 
        model = core.read_model(onnx_path) 

# 動的な入力形状を強制 
try: 
    model.reshape({model_input.any_name: ov.PartialShape([1, '?']) for model_input in model.inputs}) 
except RuntimeError: 
    log.error("Can't set dynamic shape") 
    raise 
    # スループットを最適化。複数の openvino.runtime.InferRequest インスタンスを 
    # 非同期に実行すると、最高のスループットに達することができます 
    tput = {'PERFORMANCE_HINT': 'THROUGHPUT'} 
    # CPU を置き換えてデバイスを選択 (例: MULTI:CPU(4),GPU(8))
    # AUTO デバイスでは CUMULATIVE_THROUGHPUT を PERFORMANCE_HINT として設定することが可能です 
    compiled_model = core.compile_model(model, 'CPU', tput) 
    # AsyncInferQueue は最適な数の InferRequest インスタンスを作成 
    ireqs = ov.AsyncInferQueue(compiled_model) 

    sst2 = datasets.load_dataset('glue', 'sst2') 
    sst2_sentences = sst2['validation']['sentence'] 
    # ワークアップ 
    encoded_warm_up = dict(tokenizer('Warm up sentence is here.', return_tensors='np')) 
    for _ in range(len(ireqs)): 
        ireqs.start_async(encoded_warm_up) 
    ireqs.wait_all() 
    # ベンチマーク 
    sum_seq_len = 0 
    start = perf_counter() 
    for sentence in sst2_sentences: 
        encoded = dict(tokenizer(sentence, return_tensors='np')) 
        sum_seq_len += next(iter(encoded.values())).size # get sequence length to compute average length 
        ireqs.start_async(encoded) 
    ireqs.wait_all() 
    end = perf_counter() 
    duration = end - start 
    log.info(f'Average sequence length: {sum_seq_len / len(sst2_sentences):.2f}') 
    log.info(f'Average processing time: {duration / len(sst2_sentences) * 1e3:.2f} ms') 
    log.info(f'Duration: {duration:.2f} seconds') 

if __name__ == '__main__': 
    main()

各サンプルの明示的な説明は、“OpenVINO™ ランタイムとアプリケーションの統合” ガイドの統合ステップセクションで確認できます。

実行する#

  1. openvino Python パッケージをインストールします:

    python -m pip install openvino
  2. requirements.txt からパッケージをインストールします:

    python -m pip install -r requirements.txt
  3. サンプルの実行

    python bert_benchmark.py

サンプルの出力#

このサンプルは、データセットの処理にかかる時間を出力します。

関連情報#