ViuAI commited on
Commit
ede2a37
Β·
verified Β·
1 Parent(s): 2ef0cf4

Upload inference.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. inference.py +128 -0
inference.py ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ==============================================================================
2
+ # πŸš€ ViuTranslate β€” Interactive Translation CLI
3
+ # ==============================================================================
4
+ # Run: python inference.py
5
+ # Type any sentence in English or Hindi to get real-time neural translation.
6
+ # ==============================================================================
7
+
8
+ import os
9
+ import sys
10
+ import torch
11
+ from tokenizers import Tokenizer
12
+ from huggingface_hub import hf_hub_download
13
+
14
+ # UTF-8 encoding
15
+ if hasattr(sys.stdout, "reconfigure"):
16
+ sys.stdout.reconfigure(encoding="utf-8", errors="replace")
17
+
18
+ cur_dir = os.path.dirname(os.path.abspath(__file__)) if "__file__" in locals() else os.getcwd()
19
+ if cur_dir not in sys.path:
20
+ sys.path.insert(0, cur_dir)
21
+
22
+ from model import ViuAI
23
+ from config import ViuAIConfig
24
+
25
+ REPO_ID = "ViuAI/ViuTranslate"
26
+ EOT_ID = 64002
27
+
28
+ def load_model():
29
+ print("=" * 75)
30
+ print(f"πŸš€ Initializing ViuTranslate-500M from {REPO_ID}...")
31
+ print("=" * 75)
32
+
33
+ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
34
+ print(f"β€’ Hardware Device: {device.type.upper()}")
35
+
36
+ # Checkpoint candidates
37
+ ckpt_candidates = [
38
+ "viutranslate_final.pt",
39
+ "checkpoints/viutranslate_final.pt",
40
+ os.path.join(cur_dir, "viutranslate_final.pt")
41
+ ]
42
+ ckpt_path = None
43
+ for c in ckpt_candidates:
44
+ if os.path.exists(c):
45
+ ckpt_path = c
46
+ break
47
+
48
+ if ckpt_path is None:
49
+ print(f"πŸ“₯ Downloading viutranslate_final.pt from {REPO_ID}...")
50
+ ckpt_path = hf_hub_download(repo_id=REPO_ID, filename="viutranslate_final.pt")
51
+
52
+ tok_candidates = [
53
+ "tokenizer.json",
54
+ os.path.join(cur_dir, "tokenizer.json")
55
+ ]
56
+ tok_path = None
57
+ for tc in tok_candidates:
58
+ if os.path.exists(tc):
59
+ tok_path = tc
60
+ break
61
+
62
+ if tok_path is None:
63
+ print(f"πŸ“₯ Downloading tokenizer.json from {REPO_ID}...")
64
+ tok_path = hf_hub_download(repo_id=REPO_ID, filename="tokenizer.json")
65
+
66
+ tokenizer = Tokenizer.from_file(tok_path)
67
+
68
+ cfg = ViuAIConfig(vocab_size=64003, context_length=2048)
69
+ model = ViuAI(cfg).to(device)
70
+
71
+ state = torch.load(ckpt_path, map_location=device, weights_only=False)
72
+ weights = state.get("model_state_dict", state)
73
+ model.load_state_dict(weights, strict=False)
74
+ model.eval()
75
+
76
+ print("βœ… ViuTranslate Engine loaded and ready for inference!\n")
77
+ return model, tokenizer, device
78
+
79
+ @torch.no_grad()
80
+ def translate(model, tokenizer, device, text: str, mode: str = "direct") -> str:
81
+ text = text.strip()
82
+ if mode == "direct":
83
+ prompt = f"<|user|>\n{text}<|endofturn|>\n<|assistant|>\n"
84
+ elif mode == "to_hi":
85
+ prompt = f"<|user|>\nTranslate to Hindi: '{text}'<|endofturn|>\n<|assistant|>\n"
86
+ elif mode == "to_en":
87
+ prompt = f"<|user|>\nTranslate to English: '{text}'<|endofturn|>\n<|assistant|>\n"
88
+ else:
89
+ prompt = f"<|user|>\n{text}<|endofturn|>\n<|assistant|>\n"
90
+
91
+ input_ids = torch.tensor([tokenizer.encode(prompt).ids], dtype=torch.long, device=device)
92
+ prompt_len = input_ids.shape[1]
93
+
94
+ out = model.generate(
95
+ input_ids,
96
+ max_new_tokens=150,
97
+ temperature=0.2,
98
+ top_p=0.9,
99
+ repetition_penalty=1.15,
100
+ eos_token_id=EOT_ID
101
+ )
102
+ gen_tokens = out[0][prompt_len:].tolist()
103
+ if EOT_ID in gen_tokens:
104
+ gen_tokens = gen_tokens[:gen_tokens.index(EOT_ID)]
105
+
106
+ return tokenizer.decode(gen_tokens).strip()
107
+
108
+ def interactive_loop():
109
+ model, tokenizer, device = load_model()
110
+ print("πŸ’‘ Enter text to translate (Google Translate style). Type 'exit' or 'quit' to stop.\n")
111
+
112
+ while True:
113
+ try:
114
+ inp = input("πŸ“ [Input]: ").strip()
115
+ if not inp:
116
+ continue
117
+ if inp.lower() in ["exit", "quit", "q"]:
118
+ print("πŸ‘‹ Exiting ViuTranslate.")
119
+ break
120
+
121
+ out = translate(model, tokenizer, device, inp, mode="direct")
122
+ print(f"🌐 [ViuTranslate]: {out}\n")
123
+ except (KeyboardInterrupt, EOFError):
124
+ print("\nπŸ‘‹ Exiting ViuTranslate.")
125
+ break
126
+
127
+ if __name__ == "__main__":
128
+ interactive_loop()