Views
No views yet
pip install einops transformers huggingface_hub1import os, sys, json, torch
2from huggingface_hub import hf_hub_download
3from transformers import AutoTokenizer
4
5repo_id = "AlgoDriveAI/Sanskrit_Akkadian_LLM"
6
7tokenizer = AutoTokenizer.from_pretrained(repo_id)
8modeling_path = hf_hub_download(repo_id=repo_id, filename="modeling_dense_llm.py")
9config_path = hf_hub_download(repo_id=repo_id, filename="config.json")
10weights_path = hf_hub_download(repo_id=repo_id, filename="pytorch_model.bin")
11
12sys.path.insert(0, os.path.dirname(modeling_path))
13from modeling_dense_llm import DenseLLM
14
15with open(config_path) as f:
16 config = json.load(f)
17
18device = "cuda" if torch.cuda.is_available() else "cpu"
19dtype = torch.float16 if device == "cuda" else torch.float32
20
21model = DenseLLM(
22 vocab_size=config["vocab_size"],
23 d_model=config["d_model"],
24 n_layers=config["n_layers"],
25 n_heads=config["n_heads"],
26 n_kv_heads=config["n_kv_heads"],
27 ff_hidden_mult=config["ff_hidden_mult"],
28 qk_norm=config["qk_norm"],
29 parallel_residual=config["parallel_residual"],
30 max_seq_len=config["max_seq_len"],
31).to(device=device, dtype=dtype)
32
33model.load_state_dict(torch.load(weights_path, map_location="cpu"), strict=True)
34model.eval()
35
36# Generate
37prompt = "Translate to English: "
38input_ids = tokenizer(prompt, return_tensors="pt")["input_ids"].to(device)
39
40with torch.inference_mode():
41 output_ids = model.generate(
42 input_ids,
43 max_new_tokens=200,
44 temperature=0.55,
45 top_k=35,
46 top_p=0.88,
47 eos_token_id=tokenizer.eos_token_id,
48 )
49
50print(tokenizer.decode(output_ids[0], skip_special_tokens=True))1import os, sys, json, torch, threading
2import gradio as gr
3from huggingface_hub import hf_hub_download
4from transformers import AutoTokenizer
5
6# ── Load model once at startup ──────────────────────────────────────────────
7
8repo_id = "AlgoDriveAI/Sanskrit_Akkadian_LLM"
9
10print("Loading tokenizer...")
11tokenizer = AutoTokenizer.from_pretrained(repo_id)
12
13print("Downloading model files...")
14modeling_path = hf_hub_download(repo_id=repo_id, filename="modeling_dense_llm.py")
15config_path = hf_hub_download(repo_id=repo_id, filename="config.json")
16weights_path = hf_hub_download(repo_id=repo_id, filename="pytorch_model.bin")
17
18sys.path.insert(0, os.path.dirname(modeling_path))
19from modeling_dense_llm import DenseLLM
20
21with open(config_path) as f:
22 config = json.load(f)
23
24device = "cuda" if torch.cuda.is_available() else "cpu"
25dtype = torch.float16 if device == "cuda" else torch.float32
26
27print(f"Loading model on {device} ({dtype})...")
28model = DenseLLM(
29 vocab_size=config["vocab_size"],
30 d_model=config["d_model"],
31 n_layers=config["n_layers"],
32 n_heads=config["n_heads"],
33 n_kv_heads=config["n_kv_heads"],
34 ff_hidden_mult=config["ff_hidden_mult"],
35 qk_norm=config["qk_norm"],
36 parallel_residual=config["parallel_residual"],
37 max_seq_len=config["max_seq_len"],
38).to(device=device, dtype=dtype)
39
40model.load_state_dict(torch.load(weights_path, map_location="cpu"), strict=True)
41model.eval()
42print("Model ready!\n")
43
44
45# ── Token-by-token streaming generator ──────────────────────────────────────
46
47@torch.inference_mode()
48def stream_generate(
49 prompt: str,
50 max_new_tokens: int = 200,
51 temperature: float = 0.55,
52 top_k: int = 35,
53 top_p: float = 0.88,
54):
55 """Yield one token at a time so Gradio can stream the output."""
56 input_ids = tokenizer(prompt, return_tensors="pt")["input_ids"].to(device)
57 generated = input_ids.clone()
58
59 for _ in range(max_new_tokens):
60 logits = model(generated) # (B, seq_len, vocab)
61 next_logits = logits[:, -1, :].float() # last position, fp32 for stability
62
63 # temperature
64 if temperature > 0:
65 next_logits = next_logits / temperature
66
67 # top-k
68 if top_k > 0:
69 topk_vals, _ = torch.topk(next_logits, top_k)
70 next_logits[next_logits < topk_vals[:, -1:]] = float("-inf")
71
72 # top-p (nucleus)
73 if top_p < 1.0:
74 sorted_logits, sorted_idx = torch.sort(next_logits, descending=True)
75 cumulative = torch.cumsum(torch.softmax(sorted_logits, dim=-1), dim=-1)
76 mask = cumulative - torch.softmax(sorted_logits, dim=-1) >= top_p
77 sorted_logits[mask] = float("-inf")
78 next_logits = sorted_logits.scatter(1, sorted_idx, sorted_logits)
79
80 probs = torch.softmax(next_logits, dim=-1)
81 next_token = torch.multinomial(probs, num_samples=1)
82
83 if next_token.item() == tokenizer.eos_token_id:
84 break
85
86 generated = torch.cat([generated, next_token], dim=-1)
87
88 # Trim KV context if we're getting close to max_seq_len
89 if generated.shape[1] > config["max_seq_len"]:
90 generated = generated[:, -config["max_seq_len"]:]
91
92 # Decode only the NEW tokens (skip the prompt echo)
93 decoded = tokenizer.decode(
94 generated[0, input_ids.shape[1]:], skip_special_tokens=True
95 )
96 yield decoded
97
98
99# ── Gradio interface ────────────────────────────────────────────────────────
100
101def respond(prompt, max_tokens, temperature, top_k, top_p):
102 """Streaming wrapper for Gradio."""
103 if not prompt.strip():
104 yield ""
105 return
106 for partial in stream_generate(prompt, max_tokens, temperature, top_k, top_p):
107 yield partial
108
109
110with gr.Blocks(
111 title="Sanskrit / Akkadian LLM",
112 theme=gr.themes.Soft(),
113) as demo:
114 gr.Markdown("# Sanskrit / Akkadian LLM\n*AlgoDriveAI — DenseLLM architecture*")
115
116 with gr.Row():
117 with gr.Column(scale=3):
118 prompt_box = gr.Textbox(
119 label="Prompt",
120 placeholder="e.g. Translate to English: ...",
121 lines=3,
122 )
123 output_box = gr.Textbox(
124 label="Output (streaming)",
125 lines=12,
126 interactive=False,
127 )
128 generate_btn = gr.Button("Generate", variant="primary")
129
130 with gr.Column(scale=1):
131 max_tokens = gr.Slider(
132 16, 512, value=200, step=1, label="Max new tokens"
133 )
134 temperature = gr.Slider(
135 0.0, 2.0, value=0.55, step=0.05, label="Temperature"
136 )
137 top_k = gr.Slider(0, 100, value=35, step=1, label="Top-K")
138 top_p = gr.Slider(0.0, 1.0, value=0.88, step=0.01, label="Top-P")
139
140 generate_btn.click(
141 fn=respond,
142 inputs=[prompt_box, max_tokens, temperature, top_k, top_p],
143 outputs=output_box,
144 )
145 # Also trigger on Enter in the prompt box
146 prompt_box.submit(
147 fn=respond,
148 inputs=[prompt_box, max_tokens, temperature, top_k, top_p],
149 outputs=output_box,
150 )
151
152demo.queue()
153demo.launch(server_name="0.0.0.0", server_port=7860, share=False)| Component | Details |
|---|---|
| Type | Custom Dense Transformer (DenseLLM) |
| Parameters | ~444M |
| Context Length | 2048 tokens |
| Attention | Grouped-Query Attention (GQA) |
| Positional Encoding | RoPE |
| Activation | SwiGLU |
| Normalization | RMSNorm |
| Hyperparameter | Value |
|---|---|
| d_model | 1024 |
| n_layers | 16 |
| n_heads | 16 |
| n_kv_heads | 2 |
| ff_mult | 4.0 |
| vocab_size | 200,064 |
Translate to English: [text]Give Akkadian transliteration and meaning: [text]Translate to Sanskrit: [text]1@misc{algodrive2025sanskrit_akkadian,
2 author = {AlgoDriveAI, Christopher Smith},
3 title = {Sanskrit & Akkadian Dense LLM},
4 year = {2025},
5 publisher = {Hugging Face},
6 url = {https://huggingface.co/AlgoDriveAI/Sanskrit_Akkadian_LLM}
7}