🚀 ロベルタベースの感情分類ONNXモデル
このモデルは、https://huggingface.co/SamLowe/roberta-base-go_emotions のONNXバージョンです。感情分類タスクに特化したモデルで、高速な推論と高精度な分類を実現します。
🚀 クイックスタート
このモデルには、完全精度のONNXバージョンと量子化(INT8)のONNXバージョンがあります。それぞれの特徴とメトリクスを以下に説明します。
✨ 主な機能
完全精度ONNXバージョン
onnx/model.onnx
は完全精度のONNXバージョンです。
- 元のTransformersモデルと同じ精度/メトリクスを持ちます。
- 同じモデルサイズ(499MB)です。
- 通常のTransformersよりも推論が高速で、特に小さなバッチサイズで顕著です。
- 8コアの11世代i7 CPUでONNXRuntimeを使用し、バッチサイズ1の場合、約2倍から3倍の高速化が確認されました。
メトリクス
各ラベルのスコアを0.5の固定閾値で二値予測に変換した場合:
指標 |
値 |
正解率 |
0.474 |
適合率 |
0.575 |
再現率 |
0.396 |
F1値 |
0.450 |
F1スコアや他の指標を最大化するためにラベル固有の閾値を選択することで改善できる可能性については、SamLowe/roberta-base-go_emotionsのモデルカードを参照してください。
量子化(INT8)ONNXバージョン
onnx/model_quantized.onnx
はint8量子化バージョンです。
- 完全精度モデルの約4分の1のサイズ(125MB)です。
- ほぼ同等の精度を維持しています。
- 上記の完全精度ONNXモデルと通常のTransformersモデルの両方よりも推論が高速です。
- 8コアの11世代i7 CPUでONNXRuntimeを使用し、バッチサイズ1の場合、上記の完全精度モデルより約2倍の高速化が確認されました。
- これにより、上記のCPUでバッチサイズ1の場合、完全精度の通常のTransformersモデルより約5倍の高速化が実現されます。
量子化(INT8)モデルのメトリクス
各ラベルのスコアを0.5の固定閾値で二値予測に変換した場合:
指標 |
値 |
正解率 |
0.475 |
適合率 |
0.582 |
再現率 |
0.398 |
F1値 |
0.447 |
メトリクスは完全精度のメトリクスとほぼ同じであることに注意してください。F1スコアや他の指標を最大化するためにラベル固有の閾値を選択することで改善できる可能性については、SamLowe/roberta-base-go_emotionsのモデルカードを参照してください。
💻 使用例
基本的な使用法
OptimumライブラリのONNXクラスを使用する場合
sentences = ["ONNX is seriously fast for small batches. Impressive"]
from transformers import AutoTokenizer, pipeline
from optimum.onnxruntime import ORTModelForSequenceClassification
model_id = "SamLowe/roberta-base-go_emotions-onnx"
file_name = "onnx/model_quantized.onnx"
model = ORTModelForSequenceClassification.from_pretrained(model_id, file_name=file_name)
tokenizer = AutoTokenizer.from_pretrained(model_id)
onnx_classifier = pipeline(
task="text-classification",
model=model,
tokenizer=tokenizer,
top_k=None,
function_to_apply="sigmoid",
)
model_outputs = onnx_classifier(sentences)
print(model_outputs)
ONNXRuntimeを使用する場合
from tokenizers import Tokenizer
import onnxruntime as ort
from os import cpu_count
import numpy as np
sentences = ["hello world"]
labels = ['admiration', 'amusement', 'anger', 'annoyance', 'approval', 'caring', 'confusion', 'curiosity', 'desire', 'disappointment', 'disapproval', 'disgust', 'embarrassment', 'excitement', 'fear', 'gratitude', 'grief', 'joy', 'love', 'nervousness', 'optimism', 'pride', 'realization', 'relief', 'remorse', 'sadness', 'surprise', 'neutral']
tokenizer = Tokenizer.from_pretrained("SamLowe/roberta-base-go_emotions")
params = {**tokenizer.padding, "length": None}
tokenizer.enable_padding(**params)
tokens_obj = tokenizer.encode_batch(sentences)
def load_onnx_model(model_filepath):
_options = ort.SessionOptions()
_options.inter_op_num_threads, _options.intra_op_num_threads = cpu_count(), cpu_count()
_providers = ["CPUExecutionProvider"]
return ort.InferenceSession(path_or_bytes=model_filepath, sess_options=_options, providers=_providers)
model = load_onnx_model("path_to_model_dot_onnx_or_model_quantized_dot_onnx")
output_names = [model.get_outputs()[0].name]
input_feed_dict = {
"input_ids": [t.ids for t in tokens_obj],
"attention_mask": [t.attention_mask for t in tokens_obj]
}
logits = model.run(output_names=output_names, input_feed=input_feed_dict)[0]
def sigmoid(x):
return 1.0 / (1.0 + np.exp(-x))
model_outputs = sigmoid(logits)
for probas in model_outputs:
top_result_index = np.argmax(probas)
print(labels[top_result_index], "with score:", probas[top_result_index])
高度な使用法
このモデルの使用方法、精度、パフォーマンスに関する詳細なノートブックは近日公開予定です。
📄 ライセンス
このモデルはMITライセンスの下で提供されています。