File size: 5,411 Bytes
05d7726
 
 
 
 
 
f4579dc
05d7726
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e4454c6
7546e11
774b4e7
 
 
 
f4579dc
 
9f2db71
4fea72b
05d7726
 
 
 
7546e11
526ed08
05d7726
e982f01
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
eecf412
526ed08
eecf412
 
 
 
 
 
526ed08
05d7726
 
 
 
 
 
 
 
 
 
eecf412
05d7726
 
 
 
 
 
 
 
 
526ed08
05d7726
eecf412
05d7726
eecf412
05d7726
 
 
 
 
 
 
 
 
eecf412
05d7726
 
eecf412
05d7726
 
eecf412
05d7726
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
526ed08
 
 
 
 
 
 
 
 
e982f01
526ed08
05d7726
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
774b4e7
 
05d7726
e4454c6
05d7726
7546e11
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
---
datasets:
- go_emotions
language:
- en
library_name: transformers
inference: false
model-index:
- name: text-classification-goemotions
  results:
  - task:
      name: Text Classification
      type: text-classification
    dataset:
      name: go_emotions
      type: multilabel_classification
      config: simplified
      split: test
      args: simplified
    metrics:
    - name: F1
      type: f1
      value: 0.482
license: apache-2.0
tags:
- emotions
- multi-class-classification
- multi-label-classification
- onnx
- int8
- emotion
- ONNXRuntime
---

# Text Classification GoEmotions

This a ONNX quantized model and is fined-tuned version of [MiniLMv2-L6-H384](https://huggingface.co/nreimers/MiniLMv2-L6-H384-distilled-from-RoBERTa-Large) on the on the [go_emotions](https://huggingface.co/datasets/go_emotions) dataset using [tasinho/text-classification-goemotions](https://huggingface.co/tasinhoque/text-classification-goemotions) as teacher model.
The original model can be found [here](https://huggingface.co/minuva/MiniLMv2-goemotions-v2)

# Optimum

## Installation

Install from source: 
```bash
python -m pip install optimum[onnxruntime]@git+https://github.com/huggingface/optimum.git
```


## Run the Model
```py
from optimum.onnxruntime import ORTModelForSequenceClassification
from transformers import AutoTokenizer, pipeline

model = ORTModelForSequenceClassification.from_pretrained('minuva/MiniLMv2-goemotions-v2-onnx', provider="CPUExecutionProvider")
tokenizer = AutoTokenizer.from_pretrained('minuva/MiniLMv2-goemotions-v2-onnx', use_fast=True, model_max_length=256, truncation=True, padding='max_length')

pipe = pipeline(task='text-classification', model=model, tokenizer=tokenizer, )
texts = ["that's wrong", "can you please answer me?"]
pipe(texts)
# [{'label': 'anger', 'score': 0.9727636575698853},
# {'label': 'love', 'score': 0.9874765276908875}]
```
# ONNX Runtime only

A lighter solution for deployment


## Installation
```bash
pip install tokenizers
pip install onnxruntime
git clone https://huggingface.co/minuva/MiniLMv2-goemotions-v2-onnx
```

## Run the Model

```py
import os
import numpy as np
import json

from tokenizers import Tokenizer
from onnxruntime import InferenceSession


model_name = "minuva/MiniLMv2-goemotions-v2-onnx"

tokenizer = Tokenizer.from_pretrained(model_name)
tokenizer.enable_padding(
    pad_token="<pad>",
    pad_id=1,
)
tokenizer.enable_truncation(max_length=256)
batch_size = 16

texts = ["I am angry", "I feel in love"]
outputs = []
model = InferenceSession("MiniLMv2-goemotions-v2-onnx/model_optimized_quantized.onnx", providers=['CUDAExecutionProvider'])

with open(os.path.join("MiniLMv2-goemotions-v2-onnx", "config.json"), "r") as f:
            config = json.load(f)

output_names = [output.name for output in model.get_outputs()]
input_names = [input.name for input in model.get_inputs()]

for subtexts in np.array_split(np.array(texts), len(texts) // batch_size + 1):
            encodings = tokenizer.encode_batch(list(subtexts))
            inputs = {
                "input_ids": np.vstack(
                    [encoding.ids for encoding in encodings],
                ),
                "attention_mask": np.vstack(
                    [encoding.attention_mask for encoding in encodings],
                ),
                "token_type_ids": np.vstack(
                    [encoding.type_ids for encoding in encodings],
                ),
            }

            for input_name in input_names:
                if input_name not in inputs:
                    raise ValueError(f"Input name {input_name} not found in inputs")

            inputs = {input_name: inputs[input_name] for input_name in input_names}
            output = np.squeeze(
                np.stack(
                    model.run(output_names=output_names, input_feed=inputs)
                ),
                axis=0,
            )
            outputs.append(output)

outputs = np.concatenate(outputs, axis=0)
scores = 1 / (1 + np.exp(-outputs))
results = []
for item in scores:
    labels = []
    scores = []
    for idx, s in enumerate(item):
        labels.append(config["id2label"][str(idx)])
        scores.append(float(s))
    results.append({"labels": labels, "scores": scores})


res = []

for result in results:
    joined = list(zip(result['labels'], result['scores']))
    max_score = max(joined, key=lambda x: x[1])    
    res.append(max_score)

res

# [('anger', 0.9745745062828064), ('love', 0.9884329438209534)]
```
# Training hyperparameters

The following hyperparameters were used during training:
- learning_rate: 6e-05
- train_batch_size: 64
- eval_batch_size: 64
- seed: 42
- optimizer: Adam with betas=(0.9,0.999) and epsilon=1e-08
- lr_scheduler_type: linear


# Metrics (comparison with teacher model)

| Teacher (params)    |   Student (params)     | Set         | Score (teacher)    |    Score (student)      |
|--------------------|-------------|----------|--------| --------|
| tasinhoque/text-classification-goemotions (355M) |      MiniLMv2-goemotions-v2-onnx (30M)   | Validation  | 0.514252 | 0.4780 |
| tasinhoque/text-classification-goemotions (335M) |      MiniLMv2-goemotions-v2-onnx  (30M)  | Test  | 0.501937 |  0.482 |

# Deployment

Check out our [fast-nlp-text-emotion repository](https://github.com/minuva/fast-nlp-text-emotion) for a FastAPI based server to easily deploy this model on CPU devices.