Project-Chronos 0.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. chronos/__init__.py +16 -0
  2. chronos/_backend_legacy.py +64 -0
  3. chronos/app.py +122 -0
  4. chronos/backend/__init__.py +40 -0
  5. chronos/backend/dispatcher.py +347 -0
  6. chronos/backend/ext/__init__.py +2 -0
  7. chronos/backend/ext/opencl.py +22 -0
  8. chronos/cli.py +62 -0
  9. chronos/data/__init__.py +0 -0
  10. chronos/data/flexible_dataset.py +309 -0
  11. chronos/deps.py +72 -0
  12. chronos/eval/__init__.py +2 -0
  13. chronos/eval/benchmark.py +159 -0
  14. chronos/eval/io_profiler.py +232 -0
  15. chronos/io/__init__.py +13 -0
  16. chronos/io/async_prefetcher.py +220 -0
  17. chronos/io/cluster_layout.py +317 -0
  18. chronos/io/expert_store.py +559 -0
  19. chronos/io/io_simulator.py +40 -0
  20. chronos/io/storage.py +237 -0
  21. chronos/mlx/__init__.py +32 -0
  22. chronos/mlx/attention.py +230 -0
  23. chronos/mlx/expert_store.py +155 -0
  24. chronos/mlx/inference.py +159 -0
  25. chronos/mlx/model.py +181 -0
  26. chronos/mlx/moe.py +102 -0
  27. chronos/model/__init__.py +6 -0
  28. chronos/model/config.py +54 -0
  29. chronos/model/hf_io.py +149 -0
  30. chronos/model/hybrid_attention.py +237 -0
  31. chronos/model/lookahead_router.py +55 -0
  32. chronos/model/model_chronos.py +271 -0
  33. chronos/model/moe_chronos.py +189 -0
  34. chronos/model/temporal_loss.py +124 -0
  35. chronos/router/__init__.py +12 -0
  36. chronos/router/expert_predictor.py +163 -0
  37. chronos/router/intent_classifier.py +193 -0
  38. chronos/router/prefill_scheduler.py +248 -0
  39. chronos/runtime/__init__.py +2 -0
  40. chronos/runtime/cache_manager.py +117 -0
  41. chronos/runtime/inference_engine.py +295 -0
  42. chronos/runtime/metrics.py +75 -0
  43. chronos/serving/__init__.py +13 -0
  44. chronos/serving/vllm_adapter.py +85 -0
  45. chronos/trainer/__init__.py +6 -0
  46. chronos/trainer/chronos_trainer.py +151 -0
  47. chronos/trainer/distill_trainer.py +193 -0
  48. chronos/trainer/dpo_trainer.py +190 -0
  49. chronos/trainer/grpo_trainer.py +288 -0
  50. chronos/trainer/loss_mixin.py +165 -0
  51. chronos/trainer/optim_utils.py +101 -0
  52. chronos/trainer/orpo_trainer.py +189 -0
  53. chronos/trainer/reward.py +130 -0
  54. chronos/trainer/sft_trainer.py +189 -0
  55. chronos/tuning/__init__.py +1 -0
  56. chronos/tuning/_base_tuner.py +284 -0
  57. chronos/tuning/chronos_auto_tuner.py +203 -0
  58. project_chronos-0.1.1.dist-info/METADATA +670 -0
  59. project_chronos-0.1.1.dist-info/RECORD +83 -0
  60. project_chronos-0.1.1.dist-info/WHEEL +5 -0
  61. project_chronos-0.1.1.dist-info/entry_points.txt +7 -0
  62. project_chronos-0.1.1.dist-info/licenses/LICENSE +177 -0
  63. project_chronos-0.1.1.dist-info/top_level.txt +8 -0
  64. train_chronos.py +133 -0
  65. train_chronos_distill.py +95 -0
  66. train_chronos_dpo.py +82 -0
  67. train_chronos_grpo.py +88 -0
  68. train_chronos_orpo.py +81 -0
  69. train_chronos_sft.py +85 -0
  70. ui/__init__.py +3 -0
  71. ui/estimator.py +204 -0
  72. ui/gradio_compat.py +72 -0
  73. ui/i18n.py +540 -0
  74. ui/presets.py +194 -0
  75. ui/tabs/__init__.py +3 -0
  76. ui/tabs/autotune_tab.py +210 -0
  77. ui/tabs/benchmark_tab.py +196 -0
  78. ui/tabs/config_tab.py +318 -0
  79. ui/tabs/data_tab.py +148 -0
  80. ui/tabs/inference_tab.py +496 -0
  81. ui/tabs/iomon_tab.py +37 -0
  82. ui/tabs/pipeline_tab.py +134 -0
  83. ui/tabs/train_tab.py +1688 -0
ui/i18n.py ADDED
@@ -0,0 +1,540 @@
1
+ """
2
+ ui/i18n.py — Chronos Web UI i18n (zh-Hans, zh-Hant, en, ja)
3
+ Mirrors the pattern from Auto_Fine_Tuning/ui/i18n.py
4
+ """
5
+ from __future__ import annotations
6
+ from typing import Dict
7
+ from ui.gradio_compat import gr
8
+
9
+ LANGUAGE_CHOICES = [
10
+ ("简体中文", "zh-Hans"),
11
+ ("繁體中文", "zh-Hant"),
12
+ ("English", "en"),
13
+ ("日本語", "ja"),
14
+ ]
15
+ DEFAULT_LANGUAGE = "en"
16
+
17
+ _current_lang = DEFAULT_LANGUAGE
18
+ _translatable_components: list = []
19
+
20
+ TRANSLATIONS: Dict[str, Dict[str, str]] = {
21
+ "zh-Hans": {
22
+ "app.title": "Project Chronos — 端侧 MoE 推理工作台",
23
+ "app.subtitle": "前瞻性路由 · 混合注意力 · 异步预取 · 全流程训练",
24
+ "tab.config": "⚙️ 配置",
25
+ "tab.train": "🏋️ 训练",
26
+ "tab.inference":"💬 推理",
27
+ "tab.benchmark":"📊 基准测试",
28
+ "tab.autotune": "🔬 自动调参",
29
+ "tab.designer": "🧬 架构设计器",
30
+ "tab.iomon": "📡 IO 监控",
31
+ "tab.pipeline": "🧪 六阶段流水线",
32
+ "tab.data": "📊 数据检查",
33
+ "designer.title": "实时参数量与内存估算",
34
+ "designer.total": "总参数量",
35
+ "designer.active": "激活参数量 (每 token)",
36
+ "designer.vram": "VRAM 估算",
37
+ "designer.ssd": "SSD 估算",
38
+ "designer.kv": "KV 缓存估算",
39
+ "designer.tps": "估算 tokens/sec",
40
+ "iomon.title": "实时 IO 与缓存指标",
41
+ "iomon.refresh": "刷新",
42
+ "pipeline.title": "Pretrain → SFT → DPO → ORPO → GRPO → Distill",
43
+ "pipeline.run": "运行此阶段",
44
+ "config.arch": "模型架构",
45
+ "config.loss": "损失系数",
46
+ "config.hw": "硬件预算",
47
+ "config.train": "训练参数",
48
+ "config.hidden_size": "隐藏层维度",
49
+ "config.num_layers": "层数",
50
+ "config.num_experts": "专家数",
51
+ "config.experts_per_tok":"每 Token 激活专家数",
52
+ "config.shared_experts": "共享专家数",
53
+ "config.lookahead": "前瞻步数",
54
+ "config.kv_latent": "KV 潜在维度 (MLA)",
55
+ "config.sliding_window": "滑动窗口大小",
56
+ "config.lambda_balance": "λ1 负载均衡",
57
+ "config.lambda_temporal":"λ2 时间局部性",
58
+ "config.vram_budget": "VRAM 预算 (GB)",
59
+ "config.pinned_frac": "最大锁页内存比例",
60
+ "config.hybrid_attn": "混合注意力 (MLA + SlidingWindow)",
61
+ "config.lr": "学习率",
62
+ "config.batch_size": "批大小",
63
+ "config.accum": "梯度累积步数",
64
+ "config.max_seq_len": "最大序列长度",
65
+ "config.epochs": "训练轮数",
66
+ "config.save_interval": "保存间隔 (步)",
67
+ "config.data_path": "数据集路径 (.jsonl)",
68
+ "config.save_dir": "保存目录",
69
+ "train.mode": "训练模式",
70
+ "train.backend": "训练后端",
71
+ "train.start": "▶ 开始训练",
72
+ "train.stop": "⏹ 停止",
73
+ "train.clear_log": "🗑 清空日志",
74
+ "train.status": "状态",
75
+ "train.log": "训练日志",
76
+ "train.chart": "损失曲线 & 吞吐量",
77
+ "train.step": "步数",
78
+ "train.loss": "总损失",
79
+ "train.ce_loss": "CE 损失",
80
+ "train.aux_loss": "辅助损失",
81
+ "train.tps": "步/秒",
82
+ "train.dataset_upload": "拖入数据集文件 (.jsonl)",
83
+ "infer.model_path": "模型路径",
84
+ "infer.backend": "推理后端",
85
+ "infer.prompt": "输入 Prompt",
86
+ "infer.max_tokens": "最大生成 Token 数",
87
+ "infer.temperature": "温度",
88
+ "infer.generate": "▶ 生成",
89
+ "infer.output": "生成结果",
90
+ "infer.tps": "生成速度 (tokens/s)",
91
+ "bench.run": "▶ 运行对比测试",
92
+ "bench.results": "对比结果",
93
+ "bench.log": "测试日志",
94
+ "autotune.n_trials": "试验次数",
95
+ "autotune.probe_steps": "探针步数",
96
+ "autotune.start": "▶ 开始自动调参",
97
+ "autotune.stop": "⏹ 停止",
98
+ "autotune.log": "调参日志",
99
+ "autotune.best": "最优参数",
100
+ # ── M8d: M6/M7/M8 widget labels ─────────────────────────────
101
+ "config.preset": "预设模板",
102
+ "config.load_preset": "📥 载入预设",
103
+ "config.reset_minimind": "↻ 重置为 MiniMind-MoE",
104
+ "config.cfg_path": "配置文件路径 (.json)",
105
+ "config.save_cfg": "💾 保存配置到文件",
106
+ "config.load_cfg": "📂 从文件载入配置",
107
+ "config.num_attn_heads": "注意力头数",
108
+ "config.num_kv_heads": "KV 头数",
109
+ "config.rope_dim": "RoPE 维度",
110
+ "config.moe_inter": "MoE 中间层维度 (0 = 自动: ⌈H·π/64⌉·64)",
111
+ "config.vocab_size": "词表大小",
112
+ "config.dtype": "精度",
113
+ "config.tie_emb": "权重绑定",
114
+ "config.lambda_la": "λ 前瞻监督",
115
+ "config.lambda_anchor": "λ 路由锚点",
116
+ "config.storage_format": "存储格式",
117
+ "config.weight_decay": "权重衰减",
118
+ "train.init_weight": "初始化权重 (.pth) — 留空则按当前 save_dir 自动接前一阶段;手动填写路径才覆盖",
119
+ "train.max_steps": "最大步数 (0 = 按 epochs 决定)",
120
+ "train.val_ratio": "验证集比例",
121
+ "train.weight_decay": "权重衰减",
122
+ "train.sample_prompt": "实时评测 Prompt",
123
+ "train.sample_output": "实时采样输出 (每次保存检查点更新)",
124
+ "pipeline.save_dir": "保存目录 (共享)",
125
+ "pipeline.steps": "每阶段步数 (共享)",
126
+ "pipeline.data_path": "数据路径",
127
+ "pipeline.teacher_path": "教师权重",
128
+ "pipeline.status": "状态",
129
+ "pipeline.clear_log": "🗑 清空日志",
130
+ "autotune.data_path": "数据路径 (.jsonl)",
131
+ "autotune.tip": "**勾选要搜索的超参数:**",
132
+ "autotune.clear_log": "清空日志文件",
133
+ "autotune.apply_best": "应用最优参数 → 配置",
134
+ "autotune.status": "状态",
135
+ "data.title": "📊 数据检查器",
136
+ "data.path": "数据集路径 (.jsonl)",
137
+ "data.scan": "▶ 扫描",
138
+ "data.summary": "数据集概要",
139
+ "data.preview": "样本预览",
140
+ "data.length_hist": "Token 长度分布",
141
+ },
142
+ "zh-Hant": {
143
+ "app.title": "Project Chronos — 端側 MoE 推理工作台",
144
+ "app.subtitle": "前瞻性路由 · 混合注意力 · 非同步預取 · 全流程訓練",
145
+ "tab.config": "⚙️ 設定",
146
+ "tab.train": "🏋️ 訓練",
147
+ "tab.inference":"💬 推理",
148
+ "tab.benchmark":"📊 基準測試",
149
+ "tab.autotune": "🔬 自動調參",
150
+ "tab.designer": "🧬 架構設計器",
151
+ "tab.iomon": "📡 IO 監控",
152
+ "tab.pipeline": "🧪 六階段流水線",
153
+ "tab.data": "📊 資料檢查",
154
+ "designer.title": "即時參數量與記憶體估算",
155
+ "designer.total": "總參數量",
156
+ "designer.active": "啟用參數量 (每 token)",
157
+ "designer.vram": "VRAM 估算",
158
+ "designer.ssd": "SSD 估算",
159
+ "designer.kv": "KV 快取估算",
160
+ "designer.tps": "估算 tokens/sec",
161
+ "iomon.title": "即時 IO 與快取指標",
162
+ "iomon.refresh": "重新整理",
163
+ "pipeline.title": "Pretrain → SFT → DPO → ORPO → GRPO → Distill",
164
+ "pipeline.run": "執行此階段",
165
+ "config.arch": "模型架構",
166
+ "config.loss": "損失係數",
167
+ "config.hw": "硬體預算",
168
+ "config.train": "訓練參數",
169
+ "config.hidden_size": "隱藏層維度",
170
+ "config.num_layers": "層數",
171
+ "config.num_experts": "專家數",
172
+ "config.experts_per_tok":"每 Token 激活專家數",
173
+ "config.shared_experts": "共享專家數",
174
+ "config.lookahead": "前瞻步數",
175
+ "config.kv_latent": "KV 潛在維度 (MLA)",
176
+ "config.sliding_window": "滑動視窗大小",
177
+ "config.lambda_balance": "λ1 負載均衡",
178
+ "config.lambda_temporal":"λ2 時間局部性",
179
+ "config.vram_budget": "VRAM 預算 (GB)",
180
+ "config.pinned_frac": "最大鎖頁記憶體比例",
181
+ "config.hybrid_attn": "混合注意力 (MLA + SlidingWindow)",
182
+ "config.lr": "學習率",
183
+ "config.batch_size": "批次大小",
184
+ "config.accum": "梯度累積步數",
185
+ "config.max_seq_len": "最大序列長度",
186
+ "config.epochs": "訓練輪數",
187
+ "config.save_interval": "儲存間隔 (步)",
188
+ "config.data_path": "資料集路徑 (.jsonl)",
189
+ "config.save_dir": "儲存目錄",
190
+ "train.mode": "訓練模式",
191
+ "train.backend": "訓練後端",
192
+ "train.start": "▶ 開始訓練",
193
+ "train.stop": "⏹ 停止",
194
+ "train.clear_log": "🗑 清空日誌",
195
+ "train.status": "狀態",
196
+ "train.log": "訓練日誌",
197
+ "train.chart": "損失曲線 & 吞吐量",
198
+ "train.step": "步數",
199
+ "train.loss": "總損失",
200
+ "train.ce_loss": "CE 損失",
201
+ "train.aux_loss": "輔助損失",
202
+ "train.tps": "步/秒",
203
+ "train.dataset_upload": "拖入資料集檔案 (.jsonl)",
204
+ "infer.model_path": "模型路徑",
205
+ "infer.backend": "推理後端",
206
+ "infer.prompt": "輸入 Prompt",
207
+ "infer.max_tokens": "最大生成 Token 數",
208
+ "infer.temperature": "溫度",
209
+ "infer.generate": "▶ 生成",
210
+ "infer.output": "生成結果",
211
+ "infer.tps": "生成速度 (tokens/s)",
212
+ "bench.run": "▶ 執行對比測試",
213
+ "bench.results": "對比結果",
214
+ "bench.log": "測試日誌",
215
+ "autotune.n_trials": "試驗次數",
216
+ "autotune.probe_steps": "探針步數",
217
+ "autotune.start": "▶ 開始自動調參",
218
+ "autotune.stop": "⏹ 停止",
219
+ "autotune.log": "調參日誌",
220
+ "autotune.best": "最優參數",
221
+ # ── M8d ───────────────────────────────────────────────────
222
+ "config.preset": "預設範本",
223
+ "config.load_preset": "📥 載入預設",
224
+ "config.reset_minimind": "↻ 重置為 MiniMind-MoE",
225
+ "config.cfg_path": "配置檔案路徑 (.json)",
226
+ "config.save_cfg": "💾 儲存配置到檔案",
227
+ "config.load_cfg": "📂 從檔案載入配置",
228
+ "config.num_attn_heads": "注意力頭數",
229
+ "config.num_kv_heads": "KV 頭數",
230
+ "config.rope_dim": "RoPE 維度",
231
+ "config.moe_inter": "MoE 中間層維度 (0 = 自動: ⌈H·π/64⌉·64)",
232
+ "config.vocab_size": "詞彙表大小",
233
+ "config.dtype": "精度",
234
+ "config.tie_emb": "權重綁定",
235
+ "config.lambda_la": "λ 前瞻監督",
236
+ "config.lambda_anchor": "λ 路由錨點",
237
+ "config.storage_format": "儲存格式",
238
+ "config.weight_decay": "權重衰減",
239
+ "train.init_weight": "初始化權重 (.pth) — 留空則按目前 save_dir 自動接前一階段;手動填寫路徑才覆蓋",
240
+ "train.max_steps": "最大步數 (0 = 依 epochs 決定)",
241
+ "train.val_ratio": "驗證集比例",
242
+ "train.weight_decay": "權重衰減",
243
+ "train.sample_prompt": "即時評測 Prompt",
244
+ "train.sample_output": "即時取樣輸出 (每次儲存檢查點更新)",
245
+ "pipeline.save_dir": "儲存目錄 (共用)",
246
+ "pipeline.steps": "每階段步數 (共用)",
247
+ "pipeline.data_path": "資料路徑",
248
+ "pipeline.teacher_path": "教師權重",
249
+ "pipeline.status": "狀態",
250
+ "pipeline.clear_log": "🗑 清空日誌",
251
+ "autotune.data_path": "資料路徑 (.jsonl)",
252
+ "autotune.tip": "**勾選要搜尋的超參數:**",
253
+ "autotune.clear_log": "清空日誌檔案",
254
+ "autotune.apply_best": "套用最優參數 → 配置",
255
+ "autotune.status": "狀態",
256
+ "data.title": "📊 資料檢查器",
257
+ "data.path": "資料集路徑 (.jsonl)",
258
+ "data.scan": "▶ 掃描",
259
+ "data.summary": "資料集概要",
260
+ "data.preview": "樣本預覽",
261
+ "data.length_hist": "Token 長度分布",
262
+ },
263
+ "en": {
264
+ "app.title": "Project Chronos — On-Device MoE Inference Workbench",
265
+ "app.subtitle": "Lookahead Routing · Hybrid Attention · Async Prefetch · Full Training Loop",
266
+ "tab.config": "⚙️ Config",
267
+ "tab.train": "🏋️ Train",
268
+ "tab.inference":"💬 Inference",
269
+ "tab.benchmark":"📊 Benchmark",
270
+ "tab.autotune": "🔬 Auto Tune",
271
+ "tab.designer": "🧬 Architecture Designer",
272
+ "tab.iomon": "📡 IO Monitor",
273
+ "tab.pipeline": "🧪 6-Stage Pipeline",
274
+ "tab.data": "📊 Data Inspector",
275
+ "designer.title": "Live Parameter & Memory Estimator",
276
+ "designer.total": "Total Parameters",
277
+ "designer.active": "Active Parameters (per token)",
278
+ "designer.vram": "VRAM Estimate",
279
+ "designer.ssd": "SSD Estimate",
280
+ "designer.kv": "KV Cache Estimate",
281
+ "designer.tps": "Estimated tokens/sec",
282
+ "iomon.title": "Live IO & Cache Metrics",
283
+ "iomon.refresh": "Refresh",
284
+ "pipeline.title": "Pretrain → SFT → DPO → ORPO → GRPO → Distill",
285
+ "pipeline.run": "Run this stage",
286
+ "config.arch": "Model Architecture",
287
+ "config.loss": "Loss Coefficients",
288
+ "config.hw": "Hardware Budget",
289
+ "config.train": "Training Parameters",
290
+ "config.hidden_size": "Hidden Size",
291
+ "config.num_layers": "Num Layers",
292
+ "config.num_experts": "Num Experts",
293
+ "config.experts_per_tok":"Experts / Token",
294
+ "config.shared_experts": "Shared Experts",
295
+ "config.lookahead": "Lookahead Steps",
296
+ "config.kv_latent": "KV Latent Dim (MLA)",
297
+ "config.sliding_window": "Sliding Window Size",
298
+ "config.lambda_balance": "λ1 Balance Loss",
299
+ "config.lambda_temporal":"λ2 Temporal Loss",
300
+ "config.vram_budget": "VRAM Budget (GB)",
301
+ "config.pinned_frac": "Max Pinned RAM Fraction",
302
+ "config.hybrid_attn": "Hybrid Attention (MLA + SlidingWindow)",
303
+ "config.lr": "Learning Rate",
304
+ "config.batch_size": "Batch Size",
305
+ "config.accum": "Grad Accumulation Steps",
306
+ "config.max_seq_len": "Max Seq Length",
307
+ "config.epochs": "Epochs",
308
+ "config.save_interval": "Save Interval (steps)",
309
+ "config.data_path": "Dataset Path (.jsonl)",
310
+ "config.save_dir": "Save Directory",
311
+ "train.mode": "Training Mode",
312
+ "train.backend": "Training Backend",
313
+ "train.start": "▶ Start Training",
314
+ "train.stop": "⏹ Stop",
315
+ "train.clear_log": "🗑 Clear Log",
316
+ "train.status": "Status",
317
+ "train.log": "Training Log",
318
+ "train.chart": "Loss Curves & Throughput",
319
+ "train.step": "Step",
320
+ "train.loss": "Total Loss",
321
+ "train.ce_loss": "CE Loss",
322
+ "train.aux_loss": "Aux Loss",
323
+ "train.tps": "Steps/s",
324
+ "train.dataset_upload": "Drop Dataset File (.jsonl)",
325
+ "infer.model_path": "Model Path",
326
+ "infer.backend": "Inference Backend",
327
+ "infer.prompt": "Input Prompt",
328
+ "infer.max_tokens": "Max New Tokens",
329
+ "infer.temperature": "Temperature",
330
+ "infer.generate": "▶ Generate",
331
+ "infer.output": "Generated Output",
332
+ "infer.tps": "Speed (tokens/s)",
333
+ "bench.run": "▶ Run Comparison",
334
+ "bench.results": "Comparison Results",
335
+ "bench.log": "Benchmark Log",
336
+ "autotune.n_trials": "Num Trials",
337
+ "autotune.probe_steps": "Probe Steps",
338
+ "autotune.start": "▶ Start Auto Tune",
339
+ "autotune.stop": "⏹ Stop",
340
+ "autotune.log": "Tuning Log",
341
+ "autotune.best": "Best Params",
342
+ # ── M8d ───────────────────────────────────────────────────
343
+ "config.preset": "Preset",
344
+ "config.load_preset": "📥 Load Preset",
345
+ "config.reset_minimind": "↻ Reset to MiniMind-MoE",
346
+ "config.cfg_path": "Config file path (.json)",
347
+ "config.save_cfg": "💾 Save Config to File",
348
+ "config.load_cfg": "📂 Load Config from File",
349
+ "config.num_attn_heads": "num_attention_heads",
350
+ "config.num_kv_heads": "num_key_value_heads",
351
+ "config.rope_dim": "rope_dim",
352
+ "config.moe_inter": "moe_intermediate_size (0 = auto: ⌈H·π/64⌉·64)",
353
+ "config.vocab_size": "vocab_size",
354
+ "config.dtype": "dtype",
355
+ "config.tie_emb": "tie_word_embeddings",
356
+ "config.lambda_la": "λ lookahead",
357
+ "config.lambda_anchor": "λ router-anchor",
358
+ "config.storage_format": "storage_format",
359
+ "config.weight_decay": "weight_decay",
360
+ "train.init_weight": "init_weight (.pth) — leave blank to auto-load the previous stage from save_dir; paste a path only to override",
361
+ "train.max_steps": "max_steps (0 = use epochs)",
362
+ "train.val_ratio": "val_ratio (held out)",
363
+ "train.weight_decay": "weight_decay",
364
+ "train.sample_prompt": "Live eval prompt",
365
+ "train.sample_output": "Live sample (updated each save interval)",
366
+ "pipeline.save_dir": "save_dir (shared)",
367
+ "pipeline.steps": "steps (per stage, shared)",
368
+ "pipeline.data_path": "data_path",
369
+ "pipeline.teacher_path": "teacher_path",
370
+ "pipeline.status": "status",
371
+ "pipeline.clear_log": "🗑 Clear log",
372
+ "autotune.data_path": "data_path (.jsonl)",
373
+ "autotune.tip": "**Tick which hyperparameters to search:**",
374
+ "autotune.clear_log": "Clear log file",
375
+ "autotune.apply_best": "Apply Best → Config",
376
+ "autotune.status": "Status",
377
+ "data.title": "📊 Data Inspector",
378
+ "data.path": "Dataset path (.jsonl)",
379
+ "data.scan": "▶ Scan",
380
+ "data.summary": "Dataset summary",
381
+ "data.preview": "Sample preview",
382
+ "data.length_hist": "Token length histogram",
383
+ },
384
+ "ja": {
385
+ "app.title": "Project Chronos — オンデバイス MoE 推論ワークベンチ",
386
+ "app.subtitle": "先読みルーティング · ハイブリッドアテンション · 非同期プリフェッチ · 全訓練ループ",
387
+ "tab.config": "⚙️ 設定",
388
+ "tab.train": "🏋️ 訓練",
389
+ "tab.inference":"💬 推論",
390
+ "tab.benchmark":"📊 ベンチマーク",
391
+ "tab.autotune": "🔬 自動チューニング",
392
+ "tab.designer": "🧬 アーキテクチャ設計",
393
+ "tab.iomon": "📡 IO モニタ",
394
+ "tab.pipeline": "🧪 6 ステージ パイプライン",
395
+ "tab.data": "📊 データ検査",
396
+ "designer.title": "リアルタイム パラメータ・メモリ推定",
397
+ "designer.total": "総パラメータ数",
398
+ "designer.active": "アクティブ パラメータ (トークン毎)",
399
+ "designer.vram": "VRAM 推定",
400
+ "designer.ssd": "SSD 推定",
401
+ "designer.kv": "KV キャッシュ推定",
402
+ "designer.tps": "推定 tokens/sec",
403
+ "iomon.title": "リアルタイム IO・キャッシュ指標",
404
+ "iomon.refresh": "更新",
405
+ "pipeline.title": "Pretrain → SFT → DPO → ORPO → GRPO → Distill",
406
+ "pipeline.run": "このステージを実行",
407
+ "config.arch": "モデルアーキテクチャ",
408
+ "config.loss": "損失係数",
409
+ "config.hw": "ハードウェア予算",
410
+ "config.train": "訓練パラメータ",
411
+ "config.hidden_size": "隠れ層次元",
412
+ "config.num_layers": "層数",
413
+ "config.num_experts": "エキスパート数",
414
+ "config.experts_per_tok":"トークンあたりエキスパート数",
415
+ "config.shared_experts": "共有エキスパート数",
416
+ "config.lookahead": "先読みステップ数",
417
+ "config.kv_latent": "KV 潜在次元 (MLA)",
418
+ "config.sliding_window": "スライディングウィンドウサイズ",
419
+ "config.lambda_balance": "λ1 負荷均衡",
420
+ "config.lambda_temporal":"λ2 時間局所性",
421
+ "config.vram_budget": "VRAM 予算 (GB)",
422
+ "config.pinned_frac": "最大ピンメモリ割合",
423
+ "config.hybrid_attn": "ハイブリッドアテンション (MLA + SlidingWindow)",
424
+ "config.lr": "学習率",
425
+ "config.batch_size": "バッチサイズ",
426
+ "config.accum": "勾配累積ステップ",
427
+ "config.max_seq_len": "最大シーケンス長",
428
+ "config.epochs": "エポック数",
429
+ "config.save_interval": "保存間隔 (ステップ)",
430
+ "config.data_path": "データセットパス (.jsonl)",
431
+ "config.save_dir": "保存ディレクトリ",
432
+ "train.mode": "訓練モード",
433
+ "train.backend": "訓練バックエンド",
434
+ "train.start": "▶ 訓練開始",
435
+ "train.stop": "⏹ 停止",
436
+ "train.clear_log": "🗑 ログ消去",
437
+ "train.status": "ステータス",
438
+ "train.log": "訓練ログ",
439
+ "train.chart": "損失曲線 & スループット",
440
+ "train.step": "ステップ",
441
+ "train.loss": "総損失",
442
+ "train.ce_loss": "CE 損失",
443
+ "train.aux_loss": "補助損失",
444
+ "train.tps": "ステップ/秒",
445
+ "train.dataset_upload": "データセットファイルをドロップ (.jsonl)",
446
+ "infer.model_path": "モデルパス",
447
+ "infer.backend": "推論バックエンド",
448
+ "infer.prompt": "入力プロンプト",
449
+ "infer.max_tokens": "最大生成トークン数",
450
+ "infer.temperature": "温度",
451
+ "infer.generate": "▶ 生成",
452
+ "infer.output": "生成結果",
453
+ "infer.tps": "生成速度 (tokens/s)",
454
+ "bench.run": "▶ 比較テスト実行",
455
+ "bench.results": "比較結果",
456
+ "bench.log": "ベンチマークログ",
457
+ "autotune.n_trials": "試行回数",
458
+ "autotune.probe_steps": "プローブステップ数",
459
+ "autotune.start": "▶ 自動チューニング開始",
460
+ "autotune.stop": "⏹ 停止",
461
+ "autotune.log": "チューニングログ",
462
+ "autotune.best": "最適パラメータ",
463
+ # ── M8d ───────────────────────────────────────────────────
464
+ "config.preset": "プリセット",
465
+ "config.load_preset": "📥 プリセット読込",
466
+ "config.reset_minimind": "↻ MiniMind-MoE にリセット",
467
+ "config.cfg_path": "設定ファイルパス (.json)",
468
+ "config.save_cfg": "💾 設定をファイルに保存",
469
+ "config.load_cfg": "📂 ファイルから設定を読込",
470
+ "config.num_attn_heads": "アテンションヘッド数",
471
+ "config.num_kv_heads": "KV ヘッド数",
472
+ "config.rope_dim": "RoPE 次元",
473
+ "config.moe_inter": "MoE 中間層次元 (0 = 自動: ⌈H·π/64⌉·64)",
474
+ "config.vocab_size": "語彙サイズ",
475
+ "config.dtype": "精度",
476
+ "config.tie_emb": "重み共有",
477
+ "config.lambda_la": "λ 先読み監督",
478
+ "config.lambda_anchor": "λ ルータアンカー",
479
+ "config.storage_format": "保存形式",
480
+ "config.weight_decay": "重み減衰",
481
+ "train.init_weight": "初期重み (.pth) — 空欄なら save_dir から前段を自動読込。上書きしたい場合だけパスを指定",
482
+ "train.max_steps": "最大ステップ数 (0 = epochs に従う)",
483
+ "train.val_ratio": "検証セット比率",
484
+ "train.weight_decay": "重み減衰",
485
+ "train.sample_prompt": "ライブ評価 Prompt",
486
+ "train.sample_output": "ライブサンプル出力 (保存間隔ごとに更新)",
487
+ "pipeline.save_dir": "保存ディレクトリ (共有)",
488
+ "pipeline.steps": "ステージごとのステップ数 (共有)",
489
+ "pipeline.data_path": "データパス",
490
+ "pipeline.teacher_path": "教師重み",
491
+ "pipeline.status": "ステータス",
492
+ "pipeline.clear_log": "🗑 ログ消去",
493
+ "autotune.data_path": "データパス (.jsonl)",
494
+ "autotune.tip": "**探索する超パラメータを選択:**",
495
+ "autotune.clear_log": "ログファイル消去",
496
+ "autotune.apply_best": "最適パラメータを設定に適用",
497
+ "autotune.status": "ステータス",
498
+ "data.title": "📊 データ検査ツール",
499
+ "data.path": "データセットパス (.jsonl)",
500
+ "data.scan": "▶ スキャン",
501
+ "data.summary": "データセット概要",
502
+ "data.preview": "サンプルプレビュー",
503
+ "data.length_hist": "トークン長分布",
504
+ },
505
+ }
506
+
507
+
508
+ def set_current_lang(lang: str):
509
+ global _current_lang
510
+ _current_lang = lang
511
+
512
+
513
+ def get_current_lang() -> str:
514
+ return _current_lang
515
+
516
+
517
+ def t(key: str, lang: str = None) -> str:
518
+ l = lang or _current_lang
519
+ return TRANSLATIONS.get(l, TRANSLATIONS["en"]).get(key, key)
520
+
521
+
522
+ def register_translatable(component, label_key: str):
523
+ _translatable_components.append((component, label_key))
524
+
525
+
526
+ def build_language_update(lang: str):
527
+ set_current_lang(lang)
528
+ updates = []
529
+ for comp, key in _translatable_components:
530
+ text = t(key, lang)
531
+ # gr.Button uses `value`; gr.Tab and most others use `label`
532
+ if isinstance(comp, gr.Button):
533
+ updates.append(gr.update(value=text))
534
+ else:
535
+ updates.append(gr.update(label=text))
536
+ return updates
537
+
538
+
539
+ def get_registered_components():
540
+ return [c for c, _ in _translatable_components]