sentiment-polish-gpt2-large
This model is a fine-tuned version of sdadas/polish-gpt2-large on the polemo2-official dataset. It achieves the following results on the evaluation set:
- epoch: 10.0
- eval_accuracy: 0.9634
- eval_loss: 0.3139
- eval_runtime: 132.9089
- eval_samples_per_second: 197.428
- eval_steps_per_second: 98.714
- step: 65610
Model description
Trained from polish-gpt2-large
Intended uses & limitations
Sentiment analysis - neutral/negative/positive/ambiguous
How to use
Transformers AutoModel
from transformers import AutoModelForSequenceClassification, AutoTokenizer
import torch
device = "cuda" if torch.cuda.is_available() else "cpu"
checkpoint = "nie3e/sentiment-polish-gpt2-large"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForSequenceClassification.from_pretrained(
checkpoint
).to(device)
text = "Jak na cenę - super . Śniadanie nie do przejedzenia ."
input_ids = tokenizer(text, return_tensors="pt").to(device)
logits = model(**input_ids)["logits"].to("cpu")
percent = torch.sigmoid(logits).squeeze(dim=0)
id2class = model.config.id2label
print({id2class[i]: f"{(p*100):.2f}%" for i, p in enumerate(percent.tolist())})
{'NEUTRAL': '0.02%', 'NEGATIVE': '0.34%', 'POSITIVE': '100.00%', 'AMBIGUOUS': '0.91%'}
Transformers Pipeline
from transformers import pipeline
pipe = pipeline(
"sentiment-analysis",
"nie3e/sentiment-polish-gpt2-large"
)
result = pipe("Jak na cenę - super . Śniadanie nie do przejedzenia .")
print(result)
[{'label': 'POSITIVE', 'score': 1.0}]
vLLM >= 0.9.2
from vllm import LLM
llm = LLM(
"nie3e/sentiment-polish-gpt2-large",
task="classify",
enforce_eager=True
)
text = ["Jak na cenę - super . Śniadanie nie do przejedzenia ."]
outputs = llm.classify(text)
for output in outputs:
print(output.outputs.probs)
vLLM OpenAI serving (recommended)
docker run --gpus 1 --ipc=host -p 8000:8000 vllm/vllm-openai:v0.9.2 --model nie3e/sentiment-polish-gpt2-large
using curl:
curl -X 'POST' \
'http://127.0.0.1:8000/classify' \
-H 'Content-Type: application/json' \
-d '{
"model": "nie3e/sentiment-polish-gpt2-large",
"input": ["Przestronny hotel , jasny , z dużymi oknami .", "Położony całkiem blisko centrum ."]
}'
result:
{
"id": "classify-0da99ef301644a9fac9c895bb04589c2",
"object": "list",
"created": 1753209697,
"model": "nie3e/sentiment-polish-gpt2-large",
"data": [
{
"index": 0,
"label": "POSITIVE",
"probs": [
1.6494802745903315e-10,
7.189839001942033e-13,
1.0,
1.0139297170960737e-12
],
"num_classes": 4
},
{
"index": 1,
"label": "AMBIGUOUS",
"probs": [
1.1836132074449779e-9,
7.278887714790017e-9,
0.000006527674941025907,
0.9999934434890747
],
"num_classes": 4
}
],
"usage": {
"prompt_tokens": 17,
"total_tokens": 17,
"completion_tokens": 0,
"prompt_tokens_details": null
}
}
using python:
import requests
response = requests.post(
f"http://127.0.0.1:8000/classify",
headers={"Content-Type": "application/json"},
json={
"model": "nie3e/sentiment-polish-gpt2-large",
"input": [
"Przestronny hotel , jasny , z dużymi oknami .",
"Położony całkiem blisko centrum ."
]
}
)
print(response.json())
{'id': 'classify-9b772211b81644ad92f9e67f2b4f708a',
'object': 'list',
'created': 1753209733,
'model': 'nie3e/sentiment-polish-gpt2-large',
'data': [{'index': 0,
'label': 'POSITIVE',
'probs': [1.6494802745903314e-10,
7.189839001942033e-13,
1.0,
1.0139297170960737e-12],
'num_classes': 4},
{'index': 1,
'label': 'AMBIGUOUS',
'probs': [1.1836132074449779e-09,
7.278887714790017e-09,
6.527674941025907e-06,
0.9999934434890747],
'num_classes': 4}],
'usage': {'prompt_tokens': 17,
'total_tokens': 17,
'completion_tokens': 0,
'prompt_tokens_details': None}}
Training and evaluation data
Merged all rows from polemo2-official dataset.
Discarded rows with length > 512.
Train/test split: 80%/20%
Datacollator:
data_collator = DataCollatorWithPadding(
tokenizer=tokenizer,
padding="longest",
max_length=MAX_INPUT_LENGTH,
pad_to_multiple_of=8
)
Training procedure
GPU: 2x RTX 4060Ti 16GB
Training time: 29:16:50
Using accelerate + DeepSpeed
Training hyperparameters
The following hyperparameters were used during training:
- learning_rate: 2e-05
- train_batch_size: 1
- eval_batch_size: 1
- seed: 42
- gradient_accumulation_steps: 8
- total_train_batch_size: 16
- optimizer: Adam with betas=(0.9,0.999) and epsilon=1e-08
- lr_scheduler_type: linear
- num_epochs: 10
Evaluation
Evaluated on allegro/klej-polemo2-out test dataset.
from datasets import load_dataset
from evaluate import evaluator
data = load_dataset("allegro/klej-polemo2-out", split="test").shuffle(seed=42)
task_evaluator = evaluator("text-classification")
# fix labels
l = {
"__label__meta_zero": 0,
"__label__meta_minus_m": 1,
"__label__meta_plus_m": 2,
"__label__meta_amb": 3
}
def fix_labels(examples):
examples["target"] = l[examples["target"]]
return examples
data = data.map(fix_labels)
eval_resutls = task_evaluator.compute(
model_or_pipeline="nie3e/sentiment-polish-gpt2-large",
data=data,
label_mapping={"NEUTRAL": 0, "NEGATIVE": 1, "POSITIVE": 2, "AMBIGUOUS": 3},
input_column="sentence",
label_column="target"
)
print(eval_resutls)
{
"accuracy": 0.9858299595141701,
"total_time_in_seconds": 12.71777104900002,
"samples_per_second": 38.8432845737416,
"latency_in_seconds": 0.02574447580769235
}
Framework versions
- Transformers 4.37.2
- Pytorch 2.2.0+cu121
- Datasets 2.17.0
- Tokenizers 0.15.1
- Downloads last month
- 96
Model tree for nie3e/sentiment-polish-gpt2-large
Base model
sdadas/polish-gpt2-large