--- license: cc-by-nc-4.0 language: - en - vi tags: - translation - machine-translation - english-to-vietnamese - onnx - seq2seq - bart pipeline_tag: translation widget: - text: "Machine translation is useful for multilingual applications." example_title: "EN → VI" --- # AnViMt **AnViMt** — **An**=English **Vi**=Vietnamese **Mt**=Machine Translation — dịch **EN → VI** cho văn bản thường + kỹ thuật/hệ thống/lập trình/hội thoại. Export sang **ONNX** để chạy chỉ với `onnxruntime + sentencepiece + numpy` (không cần `torch/transformers`). ## Architecture **Base:** `transformers.BartForConditionalGeneration` train từ đầu, không phải pretrained BART. - `vocab_size=32000` (SentencePiece BPE, `byte_fallback=True`) - `d_model=512` | `encoder_layers=6` | `decoder_layers=6` - `encoder_ffn_dim=2048` | `decoder_ffn_dim=2048` - `encoder_attention_heads=8` | `decoder_attention_heads=8` - `max_position_embeddings=256` | `dropout 0.1` - `tie_word_embeddings=True` | `is_encoder_decoder=True` - `pad_token_id=0` (``) | `unk_token_id=1` (``) | `bos_token_id=2` (``) | `eos_token_id=3` (``) | `decoder_start_token_id=2` - **Params:** ~60.79M ``` EN text ↓ spm.model [2] + BPE ids + [3] (pad 0, bos 2, eos 3, max 256) ↓ encoder_model.onnx (input_ids, attention_mask → encoder_hidden_states [batch, seq, 512]) ↓ decoder_model.onnx / decoder_with_past_model.onnx (decoder_input_ids [2] + encoder_hidden_states + encoder_attention_mask + past_key_values → logits) ↓ autoregressive greedy (argmax) đến eos 3 ↓ sp.decode → VI text ``` ## Files Export bằng `optimum` `task=seq2seq-lm` `opset=14`: ``` AnViMt/ ├── encoder_model.onnx # 136M ├── decoder_model.onnx # 223M ├── decoder_with_past_model.onnx # KV cache (tùy chọn, tăng tốc) ├── spm.model # 752K, vocab 32000 └── spm.vocab ``` Runtime tối thiểu chỉ cần `encoder_model.onnx` + `decoder_model.onnx` + `spm.model`. `decoder_with_past_model.onnx` dùng khi muốn KV-cache. Không cần: `config.json`, `pytorch_model.bin`, `safetensors`, `torch`, `transformers`. ## Installation ```bash pip install onnxruntime sentencepiece numpy # Termux: apt install python3-onnxruntime python3-sentencepiece python3-numpy ``` ## Quick Start ``` project/ ├── main.py ├── encoder_model.onnx ├── decoder_model.onnx └── spm.model # (decoder_with_past_model.onnx nếu có) ``` `main.py` thực tế (đã test, xử lý đúng BOS/EOS/pad): ```python import numpy as np, onnxruntime as ort, sentencepiece as spm sp = spm.SentencePieceProcessor(); sp.load("spm.model") enc = ort.InferenceSession("encoder_model.onnx", providers=["CPUExecutionProvider"]) dec = ort.InferenceSession("decoder_model.onnx", providers=["CPUExecutionProvider"]) BOS, EOS, PAD = 2, 3, 0 def translate(text, max_len=256): ids = [BOS] + sp.encode(text, out_type=int)[:254] + [EOS] input_ids = np.array([ids], dtype=np.int64) attn = np.ones_like(input_ids) enc_hs = enc.run(None, {"input_ids": input_ids, "attention_mask": attn})[0] gen = [BOS] for _ in range(max_len): dec_ids = np.array([gen], dtype=np.int64) logits = dec.run(None, {"input_ids": dec_ids, "encoder_hidden_states": enc_hs, "encoder_attention_mask": attn})[0] nxt = int(np.argmax(logits[0, -1])) gen.append(nxt) if nxt == EOS: break out = [x for x in gen[1:] if x not in (BOS, EOS, PAD)] if EOS in out: out = out[:out.index(EOS)] return sp.decode(out) ``` ## Training Data Pretrain 1.13M EN-VI (PhoMT + TED + TECH) → finetune 200k TECH → finetune 27k v3 (hội thoại + kỹ thuật). Tokenizer BPE 32k train trên 400k pairs reservoir sampled, `nmt_nfkc`, `split_digits`, `byte_fallback`. ## Limitations EN → VI only. Câu >254 BPE tokens bị cắt. Thuật ngữ mới có thể giữ nguyên EN. ## License CC BY-NC 4.0 — non-commercial. Author: Phitran21