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
Safetensors
Model size
0.8B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for nie3e/sentiment-polish-gpt2-large

Finetuned
(1)
this model

Dataset used to train nie3e/sentiment-polish-gpt2-large

Evaluation results