ViT5 Vietnamese Summarization

Fine-tuned ViT5 model for Vietnamese text summarization.

Important Note

Tui ra trường hơn 1 năm rồi, transformer đã update lên rồi nên thư viện bị lỗi vài lớp xử lý. không có thời gian train model lại, nên muốn dùng model này với thư viện mới thì thêm phần vá thủ công này dô nhé. không thì mang tiếng model không chạy được. Giờ làm dev bận quá, hôm nào lục lại thử

import os
import sentencepiece as spm
from huggingface_hub import hf_hub_download
import torch
from transformers import AutoModelForSeq2SeqLM

model_name = "thnhan3/sft_model"

# 1. Tải trực tiếp file spiece.model từ HuggingFace Repo về máy
spm_path = hf_hub_download(repo_id=model_name, filename="spiece.model")

# 2. Tạo một Wrapper Tokenizer đơn giản bằng chính SentencePiece thuần
# (Bỏ qua hoàn toàn đoạn code lỗi của T5Tokenizer)
class CustomT5Tokenizer:
    def __init__(self, spm_file):
        self.sp = spm.SentencePieceProcessor()
        self.sp.load(spm_file)
        self.pad_token_id = 0
        self.eos_token_id = 1
        self.unk_token_id = 2

    def __call__(self, text, max_length=1280, truncation=True, return_tensors="pt"):
        ids = self.sp.encode(text)
        if truncation and len(ids) > max_length - 1:
            ids = ids[: max_length - 1]
        ids = ids + [self.eos_token_id]
        
        input_ids = torch.tensor([ids], dtype=torch.long)
        attention_mask = torch.ones_like(input_ids)
        
        class BatchEncoding(dict):
            def __init__(self, input_ids, attention_mask):
                super().__init__(input_ids=input_ids, attention_mask=attention_mask)
                self.input_ids = input_ids
                self.attention_mask = attention_mask
            def to(self, device):
                self.input_ids = self.input_ids.to(device)
                self.attention_mask = self.attention_mask.to(device)
                return self

        return BatchEncoding(input_ids, attention_mask)

    def decode(self, token_ids, skip_special_tokens=True):
        if hasattr(token_ids, "tolist"):
            token_ids = token_ids.tolist()
        if skip_special_tokens:
            token_ids = [t for t in token_ids if t not in (0, 1, 2)]
        return self.sp.decode(token_ids)

# Khởi tạo tokenizer và model
tokenizer = CustomT5Tokenizer(spm_path)
model = AutoModelForSeq2SeqLM.from_pretrained(model_name).to("cuda")

# Chạy inference
document = """
Ngày 16 tháng 11 năm 2025, Chính phủ Việt Nam công bố kế hoạch phát triển kinh tế số
trong giai đoạn 2025-2030. Kế hoạch tập trung vào 3 trọng tâm chính: phát triển hạ tầng
số, đào tạo nguồn nhân lực công nghệ cao, và thúc đẩy chuyển đổi số doanh nghiệp.
Mục tiêu đặt ra là đến năm 2030, kinh tế số chiếm 30% GDP và tạo ra 2 triệu việc làm mới.
"""

inputs = tokenizer(
    document,
    max_length=1280,
    truncation=True,
    return_tensors="pt"
).to("cuda")

outputs = model.generate(
    input_ids=inputs.input_ids,
    attention_mask=inputs.attention_mask,
    max_new_tokens=256,
    num_beams=4,
    length_penalty=1.0,
    early_stopping=True,
    no_repeat_ngram_size=3
)

summary = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(summary)

Model Description

This model is a fine-tuned version of ViT5 on Vietnamese summarization dataset. Unified extractive/abstractive summaries from Vietnamese documents.

Base Model: VietAI/vit5-base
Task: Abstractive Text Summarization
Language: Vietnamese

Training Configuration

Usage

Installation

pip install transformers torch

Basic Usage

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

model_name = "thnhan3/sft_model"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSeq2SeqLM.from_pretrained(model_name).to("cuda")

document = """
Ngày 16 tháng 11 năm 2025, Chính phủ Việt Nam công bố kế hoạch phát triển kinh tế số 
trong giai đoạn 2025-2030. Kế hoạch tập trung vào 3 trọng tâm chính: phát triển hạ tầng 
số, đào tạo nguồn nhân lực công nghệ cao, và thúc đẩy chuyển đổi số doanh nghiệp. 
Mục tiêu đặt ra là đến năm 2030, kinh tế số chiếm 30% GDP và tạo ra 2 triệu việc làm mới.
"""

inputs = tokenizer(
    document,
    max_length=1280,
    truncation=True,
    return_tensors="pt"
).to("cuda")

outputs = model.generate(
    inputs.input_ids,
    max_new_tokens=256,
    num_beams=4,
    length_penalty=1.0,
    early_stopping=True,
    no_repeat_ngram_size=3
)

summary = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(summary)

Batch Processing

import torch

documents = [
    "Văn bản 1...",
    "Văn bản 2...",
    "Văn bản 3...",
]

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)

inputs = tokenizer(
    documents,
    max_length=1280,
    truncation=True,
    padding=True,
    return_tensors="pt"
).to(device)

outputs = model.generate(
    inputs.input_ids,
    attention_mask=inputs.attention_mask,
    max_new_tokens=256,
    num_beams=4,
    length_penalty=1.0,
    early_stopping=True,
    no_repeat_ngram_size=3
)

summaries = tokenizer.batch_decode(outputs, skip_special_tokens=True)
for i, summary in enumerate(summaries):
    print(f"Summary {i+1}: {summary}")

Optimized Inference with FP16

import torch

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device).half()

with torch.inference_mode():
    inputs = tokenizer(
        document,
        max_length=1280,
        truncation=True,
        return_tensors="pt"
    ).to(device)
    
    with torch.amp.autocast('cuda'):
        outputs = model.generate(
            inputs.input_ids,
            max_new_tokens=256,
            num_beams=4,
            length_penalty=1.0,
            early_stopping=True,
            no_repeat_ngram_size=3
        )
    
    summary = tokenizer.decode(outputs[0], skip_special_tokens=True)

Generation Parameters

Recommended parameters for best quality:

  • max_new_tokens: 256 (matches training configuration)
  • num_beams: 4 (beam search for better quality)
  • length_penalty: 1.0 (neutral length preference)
  • early_stopping: True (stop when EOS token generated)
  • no_repeat_ngram_size: 3 (avoid repetitive phrases)

You can adjust these parameters based on your needs:

  • Increase num_beams (5-8) for potentially better quality but slower generation
  • Decrease num_beams (2-3) for faster generation with slight quality trade-off
  • Adjust length_penalty (0.8-1.2) to control summary length

Model Performance

Evaluated on test set of 8Opt/vietnamese-summarization-dataset-0001:

comming soon

Limitations

  • Maximum input length: 1280 tokens. Longer documents will be truncated.
  • Trained on Vietnamese news/formal text.

Citation

If you use this model, please cite:

@misc{vit5-vietnamese-summarization,
  author = {Tran Huu Nhan},
  title = {ViT5 Vietnamese Summarization},
  year = {2025},
  publisher = {Hugging Face},
  howpublished = {\url{https://huggingface.co/thnhan3/sft_model}}
}

License

MIT

Acknowledgments

Downloads last month
33
Safetensors
Model size
0.2B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for thnhan3/sft_model

Base model

VietAI/vit5-base
Finetuned
(108)
this model

Dataset used to train thnhan3/sft_model