Spaces:
gijl
/
Sleeping

gijl commited on
Commit
24aa902
ยท
verified ยท
1 Parent(s): 5e9f267

Rename start.sh to app.py

Browse files
Files changed (2) hide show
  1. app.py +231 -0
  2. start.sh +0 -20
app.py ADDED
@@ -0,0 +1,231 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import time
3
+ import math
4
+ import jax
5
+ import jax.numpy as jnp
6
+ import flax.linen as nn
7
+ import orbax.checkpoint as ocp
8
+ from transformers import AutoTokenizer
9
+ from huggingface_hub import snapshot_download
10
+
11
+ # โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
12
+ # 1. ุฅุนุฏุงุฏุงุช ุงู„ู†ู…ูˆุฐุฌ ูˆุงู„ู…ุชุบูŠุฑุงุช
13
+ # โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
14
+ REPO_ID = "AutoCode-Ai/HTDN-Model"
15
+ TOKENIZER_NAME = "bert-base-multilingual-cased"
16
+
17
+ D_MODEL = 1024
18
+ D_U = 512
19
+ D_V = 512
20
+ HIDDEN_REACT = 3072
21
+ N_ATTRACTORS = 22_000
22
+ NUM_HEADS = 8
23
+ NUM_LAYERS = 4
24
+ MAX_LEN = 64
25
+ COMPUTE_DTYPE = jnp.float16
26
+
27
+ # โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
28
+ # 2. ู…ุนู…ุงุฑูŠุฉ HTDN ุงู„ุฏู‚ูŠู‚ุฉ ุงู„ู…ุทุงุจู‚ุฉ ู„ู„ุฃูˆุฒุงู†
29
+ # โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
30
+ def rope_frequencies(d_head: int, base: float = 10000.0) -> jnp.ndarray:
31
+ inv_freq = 1.0 / (base ** (jnp.arange(0, d_head, 2, dtype=jnp.float32) / d_head))
32
+ return inv_freq
33
+
34
+ def apply_rope(x: jnp.ndarray, positions: jnp.ndarray, inv_freq: jnp.ndarray) -> jnp.ndarray:
35
+ freqs = jnp.einsum("l,d->ld", positions.astype(jnp.float32), inv_freq)
36
+ cos = jnp.cos(freqs)[None, None, :, :]
37
+ sin = jnp.sin(freqs)[None, None, :, :]
38
+ x1, x2 = jnp.split(x.astype(jnp.float32), 2, axis=-1)
39
+ return jnp.concatenate([x1 * cos - x2 * sin, x2 * cos + x1 * sin], axis=-1).astype(x.dtype)
40
+
41
+ def _linear_recurrence_combine(l, r):
42
+ a_l, b_l = l
43
+ a_r, b_r = r
44
+ return a_l * a_r, a_r * b_l + b_r
45
+
46
+ class DynamicsLayer(nn.Module):
47
+ d_u: int
48
+ d_v: int
49
+ n_attractors: int
50
+ num_heads: int
51
+
52
+ @nn.compact
53
+ def __call__(self, x: jnp.ndarray, steps: int) -> jnp.ndarray:
54
+ u = nn.Dense(self.d_u, dtype=COMPUTE_DTYPE)(x)
55
+ v = nn.Dense(self.d_v, dtype=COMPUTE_DTYPE)(x)
56
+
57
+ log_Du = self.param("log_Du", nn.initializers.normal(stddev=0.01), (self.num_heads,))
58
+ log_Dv = self.param("log_Dv", nn.initializers.normal(stddev=0.01), (self.num_heads,))
59
+ Du = nn.softplus(log_Du).mean()
60
+ Dv = nn.softplus(log_Dv).mean()
61
+
62
+ attr_u = nn.Dense(self.n_attractors, dtype=COMPUTE_DTYPE)(u)
63
+ attr_v = nn.Dense(self.n_attractors, dtype=COMPUTE_DTYPE)(v)
64
+ back_u = nn.Dense(self.d_u, dtype=COMPUTE_DTYPE)(attr_u)
65
+ back_v = nn.Dense(self.d_v, dtype=COMPUTE_DTYPE)(attr_v)
66
+
67
+ SAFE_BOUND = 30.0
68
+ u0 = jnp.clip(u.astype(jnp.float32), -SAFE_BOUND, SAFE_BOUND)
69
+ v0 = jnp.clip(v.astype(jnp.float32), -SAFE_BOUND, SAFE_BOUND)
70
+ back_u = jnp.clip(back_u.astype(jnp.float32), -SAFE_BOUND, SAFE_BOUND)
71
+ back_v = jnp.clip(back_v.astype(jnp.float32), -SAFE_BOUND, SAFE_BOUND)
72
+
73
+ dt = 0.1 / max(1, steps)
74
+ a_u = jnp.clip(1.0 - dt * Du.astype(jnp.float32), -0.99, 1.0)
75
+ a_v = jnp.clip(1.0 - dt * Dv.astype(jnp.float32), -0.99, 1.0)
76
+ b_u = dt * back_u
77
+ b_v = dt * back_v
78
+
79
+ A_u_seq = jnp.broadcast_to(a_u, (steps,) + u0.shape)
80
+ B_u_seq = jnp.broadcast_to(b_u, (steps,) + u0.shape)
81
+ A_v_seq = jnp.broadcast_to(a_v, (steps,) + v0.shape)
82
+ B_v_seq = jnp.broadcast_to(b_v, (steps,) + v0.shape)
83
+
84
+ cumA_u, cumB_u = jax.lax.associative_scan(_linear_recurrence_combine, (A_u_seq, B_u_seq), axis=0)
85
+ cumA_v, cumB_v = jax.lax.associative_scan(_linear_recurrence_combine, (A_v_seq, B_v_seq), axis=0)
86
+
87
+ u_final = jnp.clip(cumA_u[-1] * u0 + cumB_u[-1], -SAFE_BOUND, SAFE_BOUND)
88
+ v_final = jnp.clip(cumA_v[-1] * v0 + cumB_v[-1], -SAFE_BOUND, SAFE_BOUND)
89
+
90
+ return jnp.concatenate([u_final, v_final], axis=-1).astype(COMPUTE_DTYPE)
91
+
92
+ class CausalSelfAttention(nn.Module):
93
+ num_heads: int
94
+ d_model: int
95
+
96
+ @nn.compact
97
+ def __call__(self, x: jnp.ndarray) -> jnp.ndarray:
98
+ B, L, D = x.shape
99
+ d_head = self.d_model // self.num_heads
100
+ Q = nn.Dense(self.d_model, dtype=COMPUTE_DTYPE)(x).reshape(B, L, self.num_heads, d_head).transpose(0, 2, 1, 3)
101
+ K = nn.Dense(self.d_model, dtype=COMPUTE_DTYPE)(x).reshape(B, L, self.num_heads, d_head).transpose(0, 2, 1, 3)
102
+ V = nn.Dense(self.d_model, dtype=COMPUTE_DTYPE)(x).reshape(B, L, self.num_heads, d_head).transpose(0, 2, 1, 3)
103
+
104
+ inv_freq = rope_frequencies(d_head)
105
+ positions = jnp.arange(L)
106
+ Q = apply_rope(Q, positions, inv_freq)
107
+ K = apply_rope(K, positions, inv_freq)
108
+
109
+ scores = jnp.matmul(Q, K.transpose(0, 1, 3, 2)) / math.sqrt(d_head)
110
+ idx = jnp.arange(L)
111
+ causal_mask = jnp.where(idx[:, None] >= idx[None, :], 0.0, -1e9)
112
+ scores = scores + causal_mask[None, None, :, :]
113
+ attn = nn.softmax(scores, axis=-1)
114
+ out = jnp.matmul(attn, V).transpose(0, 2, 1, 3).reshape(B, L, self.d_model)
115
+
116
+ return nn.Dense(self.d_model, dtype=COMPUTE_DTYPE)(out)
117
+
118
+ class SwiGLUFFN(nn.Module):
119
+ d_model: int
120
+ hidden_dim: int
121
+
122
+ @nn.compact
123
+ def __call__(self, x: jnp.ndarray) -> jnp.ndarray:
124
+ swiglu_hidden = max(1, int(self.hidden_dim * 2 / 3))
125
+ gate = nn.Dense(swiglu_hidden, dtype=COMPUTE_DTYPE)(x)
126
+ up = nn.Dense(swiglu_hidden, dtype=COMPUTE_DTYPE)(x)
127
+ return nn.Dense(self.d_model, dtype=COMPUTE_DTYPE)(nn.swish(gate) * up)
128
+
129
+ class HTDNBlock(nn.Module):
130
+ d_model: int
131
+ d_u: int
132
+ d_v: int
133
+ hidden_react: int
134
+ n_attractors: int
135
+ num_heads: int
136
+
137
+ @nn.compact
138
+ def __call__(self, x: jnp.ndarray, steps: int) -> jnp.ndarray:
139
+ x = x + DynamicsLayer(self.d_u, self.d_v, self.n_attractors, self.num_heads)(nn.RMSNorm(dtype=COMPUTE_DTYPE)(x), steps)
140
+ x = x + CausalSelfAttention(self.num_heads, self.d_model)(nn.RMSNorm(dtype=COMPUTE_DTYPE)(x))
141
+ x = x + SwiGLUFFN(self.d_model, self.hidden_react)(nn.RMSNorm(dtype=COMPUTE_DTYPE)(x))
142
+ return x
143
+
144
+ class HTDNModel(nn.Module):
145
+ vocab_size: int
146
+ d_model: int
147
+ d_u: int
148
+ d_v: int
149
+ hidden_react: int
150
+ n_attractors: int
151
+ num_heads: int
152
+ num_layers: int
153
+ max_len: int
154
+
155
+ @nn.compact
156
+ def __call__(self, input_ids: jnp.ndarray, steps: int) -> jnp.ndarray:
157
+ embed = nn.Embed(self.vocab_size, self.d_model, dtype=COMPUTE_DTYPE)
158
+ x = embed(input_ids)
159
+ for _ in range(self.num_layers):
160
+ x = HTDNBlock(self.d_model, self.d_u, self.d_v, self.hidden_react, self.n_attractors, self.num_heads)(x, steps)
161
+ x = nn.RMSNorm(dtype=COMPUTE_DTYPE)(x)
162
+ logits = jnp.matmul(x.astype(jnp.float32), embed.embedding.astype(jnp.float32).T)
163
+ return logits
164
+
165
+ # โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
166
+ # 3. ุงู„ุชุญู…ูŠู„ ุงู„ุขู…ู† ูˆุงู„ุฃุณุชุฏู„ุงู„
167
+ # โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
168
+ print("โณ ุฌุงุฑูŠ ุชู†ุฒูŠู„ ุฃูˆุฒุงู† ุงู„ู…ุณุชูˆุฏุน ู…ู† Hugging Face Hub...")
169
+ repo_path = snapshot_download(repo_id=REPO_ID)
170
+
171
+ print("โณ ุฌุงุฑูŠ ุฅุนุฏุงุฏ ุงู„ุชูˆูƒู†ุงูŠุฒุฑ ูˆุงู„ู‡ูŠูƒู„ ุงู„ุจุฑู…ุฌูŠ...")
172
+ tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_NAME)
173
+ PAD_ID = tokenizer.pad_token_id if tokenizer.pad_token_id is not None else 0
174
+
175
+ model = HTDNModel(
176
+ vocab_size=tokenizer.vocab_size,
177
+ d_model=D_MODEL,
178
+ d_u=D_U,
179
+ d_v=D_V,
180
+ hidden_react=HIDDEN_REACT,
181
+ n_attractors=N_ATTRACTORS,
182
+ num_heads=NUM_HEADS,
183
+ num_layers=NUM_LAYERS,
184
+ max_len=MAX_LEN
185
+ )
186
+
187
+ rng_key = jax.random.PRNGKey(0)
188
+ dummy_input = jnp.zeros((1, MAX_LEN), dtype=jnp.int32)
189
+ params_template = model.init(rng_key, dummy_input, steps=24)["params"]
190
+
191
+ print("โณ ุฌุงุฑูŠ ุงุณุชุนุงุฏุฉ ุฃูˆุฒุงู† Orbax ู…ู† ุงู„ู…ุณุงุฑ ุงู„ู…ุญู„ูŠ...")
192
+ checkpointer = ocp.StandardCheckpointer()
193
+ restored_params = checkpointer.restore(repo_path, target=params_template)
194
+ print("โœ… ุชู… ุงุณุชุนุงุฏุฉ ุฃูˆุฒุงู† ุงู„ู†ู…ูˆุฐุฌ ุจู†ุฌุงุญ!")
195
+
196
+ def generate_text(prompt: str, max_new_tokens: int = 25):
197
+ ids = tokenizer(prompt, add_special_tokens=True, return_tensors="np")["input_ids"][0].tolist()
198
+ ids = ids[:MAX_LEN]
199
+
200
+ print(f"\n๐Ÿ“ ุงู„ู†ุต ุงู„ู…ุฏุฎู„: {prompt}")
201
+ print("๐Ÿค– ุงู„ุชูˆู„ูŠุฏ: ", end="", flush=True)
202
+
203
+ for _ in range(max_new_tokens):
204
+ if len(ids) >= MAX_LEN:
205
+ break
206
+ cur_len = len(ids)
207
+ padded = ids + [PAD_ID] * (MAX_LEN - cur_len)
208
+ input_arr = jnp.array(padded, dtype=jnp.int32)[None, :]
209
+
210
+ logits = model.apply({"params": restored_params}, input_arr, steps=24)
211
+ next_id = int(jnp.argmax(logits[0, cur_len - 1]))
212
+
213
+ if next_id == PAD_ID:
214
+ break
215
+ ids.append(next_id)
216
+
217
+ token_str = tokenizer.decode([next_id], skip_special_tokens=True)
218
+ if token_str.startswith("##"):
219
+ print(token_str[2:], end="", flush=True)
220
+ else:
221
+ print(" " + token_str, end="", flush=True)
222
+ time.sleep(0.03)
223
+ print("\n" + "โ”€" * 50)
224
+
225
+ if __name__ == "__main__":
226
+ prompts = [
227
+ "ุชุนุชุจุฑ ู…ุนู…ุงุฑูŠุฉ ุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ",
228
+ "ุชุทูˆูŠุฑ ุงู„ู†ู…ุงุฐุฌ ุจุงุณุชุฎุฏุงู… ุจุงูŠุซูˆู†"
229
+ ]
230
+ for p in prompts:
231
+ generate_text(p)
start.sh DELETED
@@ -1,20 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -e
3
-
4
- echo "๐Ÿš€ Starting llama.cpp server on port 7860..."
5
- /app/llama-server \
6
- -m /app/gemma-4-31B-it-Q4_0.gguf \
7
- --mmproj /app/mmproj-BF16.gguf \
8
- --host 0.0.0.0 \
9
- --port 7860 \
10
- -t 2 \
11
- --cache-type-k q8_0 \
12
- --cache-type-v iq4_nl \
13
- -c 56800 \
14
- -n 38912 &
15
-
16
- echo "๐ŸŒ Starting Chat UI on port 3000..."
17
- node /app/server.js &
18
-
19
- # Wait for both
20
- wait