--- license: cc-by-nc-sa-4.0 language: - id - gor tags: - mbart - translation - gorontalo - indonesian - bahasa-daerah - low-resource - seq2seq - nmt - hulontalo datasets: - custom metrics: - loss model-index: - name: tuwili results: - task: type: translation name: Machine Translation metrics: - name: Eval Loss type: loss value: 0.6733 pipeline_tag: translation library_name: transformers base_model: facebook/mbart-large-50-many-to-many-mmt widget: - text: "Terjemahkan kata atau kalimat berikut dari bahasa Indonesia ke bahasa Gorontalo. Selamat pagi" example_title: "Indonesia โ†’ Gorontalo" - text: "Terjemahkan kata atau kalimat berikut dari bahasa Gorontalo ke bahasa Indonesia. kumando" example_title: "Gorontalo โ†’ Indonesia" - text: "Terjemahkan kata atau kalimat berikut dari bahasa Indonesia ke bahasa Gorontalo. Terima kasih" example_title: "Terima kasih" - text: "Terjemahkan kata atau kalimat berikut dari bahasa Indonesia ke bahasa Gorontalo. Saya makan nasi" example_title: "Kalimat sederhana" --- # ๐ŸŒบ Tuwili โ€” Model Penerjemah Indonesia โ†” Gorontalo
**Model AI pertama untuk menerjemahkan antara Bahasa Indonesia dan Bahasa Gorontalo (Hulontalo)** [![License: CC BY-NC-SA 4.0](https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-nc-sa/4.0/) [![Model: mBART-50](https://img.shields.io/badge/Base-mBART--50-blue.svg)](https://huggingface.co/facebook/mbart-large-50-many-to-many-mmt) [![Dataset: 309K](https://img.shields.io/badge/Dataset-309.788%20instruksi-green.svg)](#dataset)
--- ## ๐Ÿ“– Tentang Tuwili **Tuwili** adalah model Neural Machine Translation (NMT) yang di-fine-tune dari [mBART-50](https://huggingface.co/facebook/mbart-large-50-many-to-many-mmt) untuk menerjemahkan secara **dua arah (bidirectional)** antara: - ๐Ÿ‡ฎ๐Ÿ‡ฉ **Bahasa Indonesia** โ†’ **Bahasa Gorontalo** (Hulontalo) - ๐Ÿ๏ธ **Bahasa Gorontalo** (Hulontalo) โ†’ **Bahasa Indonesia** Bahasa Gorontalo adalah bahasa daerah yang digunakan oleh masyarakat di Provinsi Gorontalo, Sulawesi, Indonesia. Sebagai bahasa dengan sumber daya rendah (*low-resource language*), model ini bertujuan membantu pelestarian dan digitalisasi bahasa Gorontalo melalui teknologi AI. --- ## ๐Ÿš€ Cara Menggunakan ### Instalasi ```bash pip install transformers sentencepiece protobuf torch gradio ``` ### Quick Start (Python) ```python from transformers import MBartForConditionalGeneration, MBart50TokenizerFast # Muat model model_name = "datanikah9/tuwili" tokenizer = MBart50TokenizerFast.from_pretrained(model_name) model = MBartForConditionalGeneration.from_pretrained(model_name) tokenizer.src_lang = "id_ID" def translate(text, direction="id2gor"): """ Terjemahkan teks. direction: "id2gor" (Indonesia โ†’ Gorontalo) atau "gor2id" (sebaliknya) """ if direction == "id2gor": prompt = f"Terjemahkan kata atau kalimat berikut dari bahasa Indonesia ke bahasa Gorontalo. {text}" else: prompt = f"Terjemahkan kata atau kalimat berikut dari bahasa Gorontalo ke bahasa Indonesia. {text}" inputs = tokenizer(prompt, return_tensors="pt", max_length=128, truncation=True) generated = model.generate( **inputs, max_length=64, num_beams=5, forced_bos_token_id=tokenizer.lang_code_to_id["id_ID"], ) return tokenizer.decode(generated[0], skip_special_tokens=True) # Contoh penggunaan print(translate("Selamat pagi", direction="id2gor")) print(translate("kumando", direction="gor2id")) print(translate("Saya makan nasi", direction="id2gor")) ``` ### Batch Translation ```python def translate_batch(texts, direction="id2gor", batch_size=16): results = [] for i in range(0, len(texts), batch_size): batch = texts[i:i+batch_size] if direction == "id2gor": prompts = [f"Terjemahkan kata atau kalimat berikut dari bahasa Indonesia ke bahasa Gorontalo. {t}" for t in batch] else: prompts = [f"Terjemahkan kata atau kalimat berikut dari bahasa Gorontalo ke bahasa Indonesia. {t}" for t in batch] inputs = tokenizer(prompts, return_tensors="pt", max_length=128, truncation=True, padding=True) generated = model.generate(**inputs, max_length=64, num_beams=5, forced_bos_token_id=tokenizer.lang_code_to_id["id_ID"]) results.extend(tokenizer.batch_decode(generated, skip_special_tokens=True)) return results # Terjemahkan banyak kata sekaligus words = ["Rumah", "Air", "Terima kasih", "Selamat malam"] translations = translate_batch(words) ``` ### ๐ŸŽจ Demo Interaktif dengan Gradio Jalankan aplikasi web lokal untuk mencoba model secara interaktif: ```python import gradio as gr import torch from transformers import MBartForConditionalGeneration, MBart50TokenizerFast # Muat model print("โณ Memuat model Tuwili...") model_name = "datanikah9/tuwili" tokenizer = MBart50TokenizerFast.from_pretrained(model_name) model = MBartForConditionalGeneration.from_pretrained( model_name, torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32 ) device = "cuda" if torch.cuda.is_available() else "cpu" model = model.to(device) model.eval() tokenizer.src_lang = "id_ID" print("โœ… Model siap!") def terjemahkan(teks, arah): if not teks.strip(): return "โš ๏ธ Masukkan teks terlebih dahulu." if arah == "๐Ÿ‡ฎ๐Ÿ‡ฉ Indonesia โ†’ Gorontalo": prompt = f"Terjemahkan kata atau kalimat berikut dari bahasa Indonesia ke bahasa Gorontalo. {teks}" else: prompt = f"Terjemahkan kata atau kalimat berikut dari bahasa Gorontalo ke bahasa Indonesia. {teks}" inputs = tokenizer(prompt, return_tensors="pt", max_length=128, truncation=True).to(device) with torch.no_grad(): generated = model.generate( **inputs, max_length=64, num_beams=5, forced_bos_token_id=tokenizer.lang_code_to_id["id_ID"], ) return tokenizer.decode(generated[0], skip_special_tokens=True) # Bangun antarmuka Gradio demo = gr.Interface( fn=terjemahkan, inputs=[ gr.Textbox( label="Teks", placeholder="Ketik kata atau kalimat di sini...", lines=3, ), gr.Radio( choices=["๐Ÿ‡ฎ๐Ÿ‡ฉ Indonesia โ†’ Gorontalo", "๐Ÿ๏ธ Gorontalo โ†’ Indonesia"], value="๐Ÿ‡ฎ๐Ÿ‡ฉ Indonesia โ†’ Gorontalo", label="Arah Terjemahan", ), ], outputs=gr.Textbox(label="Hasil Terjemahan", lines=3), title="๐ŸŒบ Tuwili โ€” Penerjemah Indonesia โ†” Gorontalo", description="Model AI untuk menerjemahkan antara Bahasa Indonesia dan Bahasa Gorontalo (Hulontalo).", examples=[ ["Selamat pagi", "๐Ÿ‡ฎ๐Ÿ‡ฉ Indonesia โ†’ Gorontalo"], ["Terima kasih", "๐Ÿ‡ฎ๐Ÿ‡ฉ Indonesia โ†’ Gorontalo"], ["Saya makan nasi", "๐Ÿ‡ฎ๐Ÿ‡ฉ Indonesia โ†’ Gorontalo"], ["kumando", "๐Ÿ๏ธ Gorontalo โ†’ Indonesia"], ["bele", "๐Ÿ๏ธ Gorontalo โ†’ Indonesia"], ], theme=gr.themes.Soft(), flagging_mode="never", ) demo.launch(share=True) # share=True untuk mendapatkan link publik ``` Setelah dijalankan, buka browser di `http://localhost:7860` atau gunakan link publik yang ditampilkan di terminal. > **Tip:** Di Google Colab, tambahkan `demo.launch(share=True, debug=True)` agar bisa diakses dari luar. --- ## ๐Ÿ“Š Detail Training ### Konfigurasi Model | Parameter | Nilai | | :--- | :--- | | Base Model | `facebook/mbart-large-50-many-to-many-mmt` | | Arsitektur | MBartForConditionalGeneration (Encoder-Decoder Transformer) | | Total Parameter | **611 Juta** | | Encoder/Decoder Layers | 12 / 12 | | Attention Heads | 16 | | Hidden Size (d_model) | 1024 | | FFN Dim | 4096 | | Vocab Size | 250.054 | | Format Weights | SafeTensors | ### Hyperparameters Training | Parameter | Nilai | | :--- | :--- | | Epochs | 3 | | Batch Size | 8 (per device) | | Gradient Accumulation | 4 steps | | **Effective Batch Size** | **32** | | Learning Rate | 5e-5 | | LR Scheduler | Cosine | | Warmup Steps | 500 | | Weight Decay | 0.01 | | Max Source Length | 128 tokens | | Max Target Length | 64 tokens | | Precision | FP16 (Mixed Precision) | | Gradient Checkpointing | โœ… (saat training) | | Optimizer | AdamW | ### Hasil Training | Metrik | Nilai | | :--- | :--- | | Total Training Steps | 27.591 | | Train Loss (awal) | 25.52 | | Train Loss (akhir) | 1.54 | | **Penurunan Loss** | **94%** | | **Best Eval Loss** | **0.6733** | | Total FLOPs | 2.39 ร— 10ยนโท | ### Kurva Konvergensi Training menunjukkan konvergensi yang baik: - Loss turun drastis pada 500 step pertama (dari 25.5 ke ~4.5) - Stabil konvergen di sekitar step 20.000+ - Eval loss stabil di ~0.673 pada 3 evaluasi terakhir โ†’ **tidak ada tanda overfitting** --- ## ๐Ÿ“ Dataset {#dataset} Model ini dilatih menggunakan **309.788 instruksi fine-tuning** dua arah (bidirectional) dalam format Alpaca: ### Komposisi Dataset | Sumber | Jumlah Entri | Deskripsi | | :--- | :--- | :--- | | Kamus Gorontalo-Indonesia (bidirectional) | 102.782 | Kosa kata dan frasa asli bahasa Gorontalo | | KBBI v6.1.0 โ€” Mapped | 24.628 | Kata KBBI yang ditemukan padanan Gorontalo-nya | | KBBI v6.1.0 โ€” Loanwords (Serapan) | 182.378 | Istilah teknis/akademik yang dipertahankan sebagai kata serapan | | **Total** | **309.788** | | ### Format Data (Alpaca) ```json { "instruction": "Terjemahkan kata atau kalimat berikut dari bahasa Indonesia ke bahasa Gorontalo.", "input": "bergotong royong", "output": "mohuyula" } ``` Setiap entri memiliki pasangan terbalik (Indonesiaโ†’Gorontalo dan Gorontaloโ†’Indonesia) untuk memastikan kemampuan terjemahan dua arah. --- ## โš ๏ธ Batasan & Catatan 1. **Bahasa Gorontalo bukan bahasa resmi di mBART-50** โ€” Model menggunakan language code `id_ID` sebagai proxy karena mBART-50 tidak memiliki language code khusus untuk bahasa Gorontalo. Ini berarti model belajar "menerjemahkan" melalui mekanisme instruksi, bukan melalui language token yang sebenarnya. 2. **Kualitas terjemahan bervariasi** โ€” Performa terbaik pada kata/frasa pendek yang ada di dataset training. Kalimat panjang atau kompleks mungkin kurang akurat. 3. **Kata serapan dominan** โ€” Sebagian besar entri KBBI (~59%) adalah kata serapan yang dipertahankan bentuk aslinya. Ini berguna untuk cakupan kosakata tetapi bukan terjemahan "asli" Gorontalo. 4. **Hardware training** โ€” Dilatih di Google Colab dengan Tesla T4 (15 GB VRAM) menggunakan gradient checkpointing dan mixed precision (FP16). --- ## ๐Ÿท๏ธ Informasi Teknis - **Framework**: PyTorch + Hugging Face Transformers v5.13.1 - **Tokenizer**: MBart50TokenizerFast (SentencePiece-based) - **Format**: SafeTensors (lebih aman dan cepat dari PyTorch .bin) - **Ukuran Model**: ~2.44 GB - **Kompatibilitas**: Transformers โ‰ฅ 4.30.0 --- ## ๐Ÿ“œ Lisensi Model ini dirilis di bawah lisensi [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/). - โœ… Boleh digunakan untuk riset dan edukasi - โœ… Boleh dimodifikasi dan didistribusikan ulang (dengan atribusi) - โŒ Tidak boleh digunakan untuk tujuan komersial tanpa izin - โš ๏ธ Data KBBI adalah milik Badan Pengembangan dan Pembinaan Bahasa, Kemdikbudristek RI --- ## ๐Ÿ™ Ucapan Terima Kasih - [Facebook/Meta AI](https://huggingface.co/facebook/mbart-large-50-many-to-many-mmt) untuk model mBART-50 - [Badan Bahasa Kemdikbudristek](https://kbbi.kemdikbud.go.id/) untuk data KBBI v6.1.0 - Komunitas bahasa Gorontalo untuk dataset kosa kata dasar --- ## ๐Ÿ“ง Kontak Jika ada pertanyaan atau masukan, silakan buka [Issue](https://huggingface.co/datanikah9/tuwili/discussions) di halaman model ini.