ngocdang83 commited on
Commit
4402d35
·
verified ·
1 Parent(s): 8bb1da6

bench: add fair cloud profiling controls

Browse files
HachimiMT_Benchmark_Profile.ipynb CHANGED
@@ -13,14 +13,19 @@
13
  "- Colab: cell chọn file sẽ mở upload nếu bạn chưa set `INPUT_PATH`.\n",
14
  "- Kaggle: thêm file `.txt` bằng **Add Input** hoặc đặt file trong `/kaggle/working`, rồi chạy cell chọn file.\n",
15
  "\n",
16
- "Dòng cần xem nằm gần cuối output cell benchmark:\n",
17
- "\n",
18
- "```text\n",
19
- "BENCH_PROFILE ... chunk_s=... ct2_infer_s=... decode_s=... tokenize_wait_s=...\n",
20
- "BENCH_DONE ...\n",
21
- "```"
22
- ]
23
- },
 
 
 
 
 
24
  {
25
  "cell_type": "code",
26
  "execution_count": null,
@@ -116,69 +121,278 @@
116
  " print(f\"{idx}. {path} ({path.stat().st_size:,} bytes)\")\n",
117
  " return candidates[0]\n",
118
  "\n",
119
- "input_path = resolve_input_path()\n",
120
- "print(\"INPUT_FILE=\", input_path)\n",
121
- "print(\"size_bytes=\", input_path.stat().st_size)"
122
- ]
123
- },
124
- {
125
- "cell_type": "code",
126
- "execution_count": null,
127
- "metadata": {},
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
128
  "outputs": [],
129
  "source": [
130
- "# 3. Chạy benchmark và in BENCH_PROFILE\n",
131
- "import os\n",
132
- "import subprocess\n",
133
- "import sys\n",
134
- "from pathlib import Path\n",
135
- "\n",
136
- "MODEL = \"HachimiMT-60\" # HachimiMT-60, HachimiMT-30, MoxhiMT-60, MoxhiMT-30, HirashibaMT-Medium, HirashibaMT-Tiny\n",
137
- "BEAM = 2 # 1 nhanh hơn, 2 thường cân bằng hơn\n",
138
- "CHUNK_MODE = \"sentence\" # sentence hoặc paragraph\n",
139
- "NORMALIZE = \"auto\" # auto, t2s, none\n",
140
- "PROGRESS_SECONDS = 30\n",
141
- "\n",
142
- "bench_script = Path(\"hachimimt/src/benchmark_file.py\")\n",
143
- "if not bench_script.exists():\n",
144
- " raise FileNotFoundError(f\"Không thấy benchmark script: {bench_script}\")\n",
145
- "if not Path(input_path).exists():\n",
146
- " raise FileNotFoundError(f\"Input file không tồn tại: {input_path}\")\n",
147
- "\n",
148
- "cmd = [\n",
149
- " sys.executable,\n",
150
- " str(bench_script),\n",
151
- " str(input_path),\n",
152
- " \"--model\", MODEL,\n",
153
- " \"--backend\", \"ct2\",\n",
154
- " \"--beam\", str(BEAM),\n",
155
- " \"--chunk-mode\", CHUNK_MODE,\n",
156
- " \"--normalize\", NORMALIZE,\n",
157
- " \"--progress-seconds\", str(PROGRESS_SECONDS),\n",
158
- "]\n",
159
- "\n",
160
- "print(\"RUN:\", \" \".join(cmd))\n",
161
- "print(\"\\n--- benchmark output ---\")\n",
162
- "lines = []\n",
163
- "process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, bufsize=1)\n",
164
- "assert process.stdout is not None\n",
165
- "for line in process.stdout:\n",
166
- " print(line, end=\"\")\n",
167
- " lines.append(line.rstrip(\"\\n\"))\n",
168
- "returncode = process.wait()\n",
169
- "if returncode != 0:\n",
170
- " raise subprocess.CalledProcessError(returncode, cmd)\n",
171
- "\n",
172
- "profile_lines = [line for line in lines if line.startswith(\"BENCH_PROFILE\")]\n",
173
- "done_lines = [line for line in lines if line.startswith(\"BENCH_DONE\")]\n",
174
- "print(\"\\n--- parsed summary ---\")\n",
175
- "print(profile_lines[-1] if profile_lines else \"Không thấy BENCH_PROFILE. Hãy chắc notebook đã tải zip mới từ Space.\")\n",
176
- "print(done_lines[-1] if done_lines else \"Không thấy BENCH_DONE.\")"
177
- ]
178
- },
179
- {
180
- "cell_type": "markdown",
181
- "metadata": {},
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
182
  "source": [
183
  "## Đọc kết quả\n",
184
  "\n",
@@ -186,9 +400,13 @@
186
  "- `chunk_s`: thời gian chia chunk và đếm token.\n",
187
  "- `decode_s`: thời gian decode output.\n",
188
  "- `tokenize_wait_s`: thời gian GPU phải chờ tokenization. Nếu cao trên Colab/Kaggle, CPU đang nghẽn.\n",
189
- "- `BENCH_DONE chars_s`: tốc độ chữ Hán/giây tính trên thời gian dịch."
190
- ]
191
- }
 
 
 
 
192
  ],
193
  "metadata": {
194
  "kernelspec": {
@@ -203,4 +421,4 @@
203
  },
204
  "nbformat": 4,
205
  "nbformat_minor": 5
206
- }
 
13
  "- Colab: cell chọn file sẽ mở upload nếu bạn chưa set `INPUT_PATH`.\n",
14
  "- Kaggle: thêm file `.txt` bằng **Add Input** hoặc đặt file trong `/kaggle/working`, rồi chạy cell chọn file.\n",
15
  "\n",
16
+ "Dòng cần xem nằm gần cuối output cell benchmark:\n",
17
+ "\n",
18
+ "```text\n",
19
+ "BENCH_RUNTIME ... ct2_cuda_devices=...\n",
20
+ "BENCH_PACKAGES ... ctranslate2=... sentencepiece=... torch=...\n",
21
+ "BENCH_ENV ... HACHIMIMT_GPU_INDICES=... HACHIMIMT_CT2_WINDOW_MULTIPLIER=...\n",
22
+ "BENCH_PROFILE ... chunk_s=... ct2_infer_s=... decode_s=... tokenize_wait_s=...\n",
23
+ "BENCH_DONE ...\n",
24
+ "```\n",
25
+ "\n",
26
+ "Để so Kaggle với Colab công bằng, bật `USE_SINGLE_GPU_FOR_FAIR_TEST=True`; notebook sẽ tự dùng window `16` cho lần fair test nếu bạn không override `WINDOW_MULTIPLIER`."
27
+ ]
28
+ },
29
  {
30
  "cell_type": "code",
31
  "execution_count": null,
 
121
  " print(f\"{idx}. {path} ({path.stat().st_size:,} bytes)\")\n",
122
  " return candidates[0]\n",
123
  "\n",
124
+ "input_path = resolve_input_path()\n",
125
+ "print(\"INPUT_FILE=\", input_path)\n",
126
+ "print(\"size_bytes=\", input_path.stat().st_size)"
127
+ ]
128
+ },
129
+ {
130
+ "cell_type": "code",
131
+ "execution_count": null,
132
+ "metadata": {},
133
+ "outputs": [],
134
+ "source": [
135
+ "# 3. Cấu hình benchmark\n",
136
+ "# Đổi các biến ở đây rồi chạy lại cell benchmark bên dưới.\n",
137
+ "import os\n",
138
+ "\n",
139
+ "MODEL = \"HachimiMT-60\" # HachimiMT-60, HachimiMT-30, MoxhiMT-60, MoxhiMT-30, HirashibaMT-Medium, HirashibaMT-Tiny\n",
140
+ "BEAM = 2 # 1 nhanh hơn, 2 thường cân bằng hơn\n",
141
+ "CHUNK_MODE = \"sentence\" # sentence hoặc paragraph\n",
142
+ "NORMALIZE = \"auto\" # auto, t2s, none\n",
143
+ "PROGRESS_SECONDS = 30\n",
144
+ "\n",
145
+ "# Bật để so Kaggle x1 T4 công bằng với Colab x1 T4.\n",
146
+ "# Tắt để Kaggle tự dùng toàn bộ GPU được cấp, ví dụ T4 x2.\n",
147
+ "USE_SINGLE_GPU_FOR_FAIR_TEST = False\n",
148
+ "FAIR_GPU_INDICES = \"0\"\n",
149
+ "\n",
150
+ "# Các giá trị này sẽ truyền vào subprocess benchmark trước khi app import CT2.\n",
151
+ "# Để \"\" nếu muốn dùng auto/default của app.\n",
152
+ "BATCH_SIZE = \"96\"\n",
153
+ "WINDOW_MULTIPLIER = \"\" # \"\" = app default; điền 4/8/16 khi muốn ép tay\n",
154
+ "FAIR_WINDOW_MULTIPLIER = \"16\"\n",
155
+ "CT2_BATCH_TYPE = \"tokens\"\n",
156
+ "INTER_THREADS = \"1\"\n",
157
+ "TOKENIZE_WORKERS = \"\" # Colab 2 vCPU có thể thử \"2\"; để trống = auto\n",
158
+ "TOKENIZE_JOB_SIZE = \"\"\n",
159
+ "CT2_THREADS = \"\"\n",
160
+ "\n",
161
+ "TRACKED_ENV_KEYS = [\n",
162
+ " \"CUDA_VISIBLE_DEVICES\",\n",
163
+ " \"HACHIMIMT_GPU_INDICES\",\n",
164
+ " \"HACHIMIMT_AUTO_ALL_GPUS\",\n",
165
+ " \"HACHIMIMT_BATCH_SIZE\",\n",
166
+ " \"HACHIMIMT_THREADS\",\n",
167
+ " \"HACHIMIMT_TOKENIZE_WORKERS\",\n",
168
+ " \"HACHIMIMT_TOKENIZE_JOB_SIZE\",\n",
169
+ " \"HACHIMIMT_CT2_BATCH_TYPE\",\n",
170
+ " \"HACHIMIMT_CT2_WINDOW_MULTIPLIER\",\n",
171
+ " \"HACHIMIMT_INTER_THREADS\",\n",
172
+ "]\n",
173
+ "\n",
174
+ "\n",
175
+ "def _set_or_unset(env, key, value):\n",
176
+ " value = str(value).strip()\n",
177
+ " if value:\n",
178
+ " env[key] = value\n",
179
+ " else:\n",
180
+ " env.pop(key, None)\n",
181
+ "\n",
182
+ "\n",
183
+ "def build_benchmark_env(\n",
184
+ " *,\n",
185
+ " use_single_gpu=USE_SINGLE_GPU_FOR_FAIR_TEST,\n",
186
+ " gpu_indices=FAIR_GPU_INDICES,\n",
187
+ " batch_size=BATCH_SIZE,\n",
188
+ " window_multiplier=WINDOW_MULTIPLIER,\n",
189
+ " fair_window_multiplier=FAIR_WINDOW_MULTIPLIER,\n",
190
+ " ct2_batch_type=CT2_BATCH_TYPE,\n",
191
+ " inter_threads=INTER_THREADS,\n",
192
+ " tokenize_workers=TOKENIZE_WORKERS,\n",
193
+ " tokenize_job_size=TOKENIZE_JOB_SIZE,\n",
194
+ " ct2_threads=CT2_THREADS,\n",
195
+ "):\n",
196
+ " env = os.environ.copy()\n",
197
+ " if use_single_gpu:\n",
198
+ " env[\"HACHIMIMT_GPU_INDICES\"] = str(gpu_indices).strip() or \"0\"\n",
199
+ " env[\"HACHIMIMT_AUTO_ALL_GPUS\"] = \"0\"\n",
200
+ " if not str(window_multiplier).strip():\n",
201
+ " window_multiplier = fair_window_multiplier\n",
202
+ " else:\n",
203
+ " env.pop(\"HACHIMIMT_GPU_INDICES\", None)\n",
204
+ " env.pop(\"HACHIMIMT_AUTO_ALL_GPUS\", None)\n",
205
+ "\n",
206
+ " _set_or_unset(env, \"HACHIMIMT_BATCH_SIZE\", batch_size)\n",
207
+ " _set_or_unset(env, \"HACHIMIMT_CT2_WINDOW_MULTIPLIER\", window_multiplier)\n",
208
+ " _set_or_unset(env, \"HACHIMIMT_CT2_BATCH_TYPE\", ct2_batch_type)\n",
209
+ " _set_or_unset(env, \"HACHIMIMT_INTER_THREADS\", inter_threads)\n",
210
+ " _set_or_unset(env, \"HACHIMIMT_TOKENIZE_WORKERS\", tokenize_workers)\n",
211
+ " _set_or_unset(env, \"HACHIMIMT_TOKENIZE_JOB_SIZE\", tokenize_job_size)\n",
212
+ " _set_or_unset(env, \"HACHIMIMT_THREADS\", ct2_threads)\n",
213
+ " return env\n",
214
+ "\n",
215
+ "\n",
216
+ "preview_env = build_benchmark_env()\n",
217
+ "print(\"Benchmark config:\")\n",
218
+ "print(\"MODEL=\", MODEL, \"BEAM=\", BEAM, \"CHUNK_MODE=\", CHUNK_MODE, \"NORMALIZE=\", NORMALIZE)\n",
219
+ "for key in TRACKED_ENV_KEYS:\n",
220
+ " if key in preview_env:\n",
221
+ " print(f\"{key}={preview_env[key]}\")\n",
222
+ "print(\"single_gpu_fair_test=\", USE_SINGLE_GPU_FOR_FAIR_TEST)"
223
+ ]
224
+ },
225
+ {
226
+ "cell_type": "code",
227
+ "execution_count": null,
228
+ "metadata": {},
229
  "outputs": [],
230
  "source": [
231
+ "# 4. Chạy benchmark và in BENCH_PROFILE\n",
232
+ "import os\n",
233
+ "import subprocess\n",
234
+ "import sys\n",
235
+ "from pathlib import Path\n",
236
+ "\n",
237
+ "bench_script = Path(\"hachimimt/src/benchmark_file.py\")\n",
238
+ "if not bench_script.exists():\n",
239
+ " raise FileNotFoundError(f\"Không thấy benchmark script: {bench_script}\")\n",
240
+ "if not Path(input_path).exists():\n",
241
+ " raise FileNotFoundError(f\"Input file không tồn tại: {input_path}\")\n",
242
+ "\n",
243
+ "\n",
244
+ "def parse_kv_line(line):\n",
245
+ " data = {}\n",
246
+ " for part in line.split()[1:]:\n",
247
+ " if \"=\" in part:\n",
248
+ " key, value = part.split(\"=\", 1)\n",
249
+ " data[key] = value\n",
250
+ " return data\n",
251
+ "\n",
252
+ "\n",
253
+ "def run_benchmark_once(\n",
254
+ " *,\n",
255
+ " label=\"single\",\n",
256
+ " model=MODEL,\n",
257
+ " beam=BEAM,\n",
258
+ " chunk_mode=CHUNK_MODE,\n",
259
+ " normalize=NORMALIZE,\n",
260
+ " progress_seconds=PROGRESS_SECONDS,\n",
261
+ " use_single_gpu=USE_SINGLE_GPU_FOR_FAIR_TEST,\n",
262
+ " gpu_indices=FAIR_GPU_INDICES,\n",
263
+ " batch_size=BATCH_SIZE,\n",
264
+ " window_multiplier=WINDOW_MULTIPLIER,\n",
265
+ "):\n",
266
+ " env = build_benchmark_env(\n",
267
+ " use_single_gpu=use_single_gpu,\n",
268
+ " gpu_indices=gpu_indices,\n",
269
+ " batch_size=batch_size,\n",
270
+ " window_multiplier=window_multiplier,\n",
271
+ " )\n",
272
+ " cmd = [\n",
273
+ " sys.executable,\n",
274
+ " str(bench_script),\n",
275
+ " str(input_path),\n",
276
+ " \"--model\", model,\n",
277
+ " \"--backend\", \"ct2\",\n",
278
+ " \"--beam\", str(beam),\n",
279
+ " \"--chunk-mode\", chunk_mode,\n",
280
+ " \"--normalize\", normalize,\n",
281
+ " \"--progress-seconds\", str(progress_seconds),\n",
282
+ " ]\n",
283
+ "\n",
284
+ " print(f\"RUN_LABEL={label}\")\n",
285
+ " print(\"RUN:\", \" \".join(cmd))\n",
286
+ " print(\"ENV:\", {key: env.get(key) for key in TRACKED_ENV_KEYS if env.get(key) is not None})\n",
287
+ " print(\"\\n--- benchmark output ---\")\n",
288
+ " lines = []\n",
289
+ " process = subprocess.Popen(\n",
290
+ " cmd,\n",
291
+ " stdout=subprocess.PIPE,\n",
292
+ " stderr=subprocess.STDOUT,\n",
293
+ " text=True,\n",
294
+ " bufsize=1,\n",
295
+ " env=env,\n",
296
+ " )\n",
297
+ " assert process.stdout is not None\n",
298
+ " for line in process.stdout:\n",
299
+ " print(line, end=\"\")\n",
300
+ " lines.append(line.rstrip(\"\\n\"))\n",
301
+ " returncode = process.wait()\n",
302
+ " if returncode != 0:\n",
303
+ " raise subprocess.CalledProcessError(returncode, cmd)\n",
304
+ "\n",
305
+ " profile_lines = [line for line in lines if line.startswith(\"BENCH_PROFILE\")]\n",
306
+ " done_lines = [line for line in lines if line.startswith(\"BENCH_DONE\")]\n",
307
+ " runtime_lines = [line for line in lines if line.startswith(\"BENCH_RUNTIME\")]\n",
308
+ " package_lines = [line for line in lines if line.startswith(\"BENCH_PACKAGES\")]\n",
309
+ " env_lines = [line for line in lines if line.startswith(\"BENCH_ENV\")]\n",
310
+ " summary = {\n",
311
+ " \"label\": label,\n",
312
+ " \"profile_line\": profile_lines[-1] if profile_lines else \"\",\n",
313
+ " \"done_line\": done_lines[-1] if done_lines else \"\",\n",
314
+ " \"runtime_line\": runtime_lines[-1] if runtime_lines else \"\",\n",
315
+ " \"package_line\": package_lines[-1] if package_lines else \"\",\n",
316
+ " \"env_line\": env_lines[-1] if env_lines else \"\",\n",
317
+ " \"profile\": parse_kv_line(profile_lines[-1]) if profile_lines else {},\n",
318
+ " \"done\": parse_kv_line(done_lines[-1]) if done_lines else {},\n",
319
+ " }\n",
320
+ " print(\"\\n--- parsed summary ---\")\n",
321
+ " print(summary[\"runtime_line\"] or \"Không thấy BENCH_RUNTIME. Hãy chắc notebook đã tải zip mới từ Space.\")\n",
322
+ " print(summary[\"package_line\"] or \"Không thấy BENCH_PACKAGES.\")\n",
323
+ " print(summary[\"env_line\"] or \"Không thấy BENCH_ENV.\")\n",
324
+ " print(summary[\"profile_line\"] or \"Không thấy BENCH_PROFILE.\")\n",
325
+ " print(summary[\"done_line\"] or \"Không thấy BENCH_DONE.\")\n",
326
+ " return summary\n",
327
+ "\n",
328
+ "\n",
329
+ "last_summary = run_benchmark_once()"
330
+ ]
331
+ },
332
+ {
333
+ "cell_type": "code",
334
+ "execution_count": null,
335
+ "metadata": {},
336
+ "outputs": [],
337
+ "source": [
338
+ "# 5. Sweep nhanh batch/window/beam (tắt mặc định)\n",
339
+ "# Bật RUN_SWEEP=True khi muốn tìm cấu hình tốt nhất trên runtime hiện tại.\n",
340
+ "RUN_SWEEP = False\n",
341
+ "SWEEP_SINGLE_GPU = True # True: fair x1 T4; False: Kaggle dùng hết GPU\n",
342
+ "SWEEP_BEAMS = [1, 2]\n",
343
+ "SWEEP_BATCHES = [64, 96]\n",
344
+ "SWEEP_WINDOWS = [4, 8, 16]\n",
345
+ "SWEEP_PROGRESS_SECONDS = 999999\n",
346
+ "\n",
347
+ "def _float_or_none(value):\n",
348
+ " try:\n",
349
+ " return float(value)\n",
350
+ " except Exception:\n",
351
+ " return None\n",
352
+ "\n",
353
+ "\n",
354
+ "if RUN_SWEEP:\n",
355
+ " sweep_rows = []\n",
356
+ " for beam in SWEEP_BEAMS:\n",
357
+ " for batch in SWEEP_BATCHES:\n",
358
+ " for window in SWEEP_WINDOWS:\n",
359
+ " label = f\"beam{beam}-batch{batch}-window{window}-{'1gpu' if SWEEP_SINGLE_GPU else 'allgpu'}\"\n",
360
+ " summary = run_benchmark_once(\n",
361
+ " label=label,\n",
362
+ " beam=beam,\n",
363
+ " batch_size=str(batch),\n",
364
+ " window_multiplier=str(window),\n",
365
+ " use_single_gpu=SWEEP_SINGLE_GPU,\n",
366
+ " progress_seconds=SWEEP_PROGRESS_SECONDS,\n",
367
+ " )\n",
368
+ " done = summary[\"done\"]\n",
369
+ " profile = summary[\"profile\"]\n",
370
+ " sweep_rows.append({\n",
371
+ " \"label\": label,\n",
372
+ " \"beam\": beam,\n",
373
+ " \"batch\": batch,\n",
374
+ " \"window\": window,\n",
375
+ " \"chunks_s\": _float_or_none(done.get(\"chunks_s\")),\n",
376
+ " \"chars_s\": _float_or_none(done.get(\"chars_s\")),\n",
377
+ " \"translate_s\": _float_or_none(done.get(\"translate_s\")),\n",
378
+ " \"ct2_infer_s\": _float_or_none(profile.get(\"ct2_infer_s\")),\n",
379
+ " \"decode_s\": _float_or_none(profile.get(\"decode_s\")),\n",
380
+ " })\n",
381
+ "\n",
382
+ " sweep_rows = sorted(sweep_rows, key=lambda row: row[\"chars_s\"] or 0, reverse=True)\n",
383
+ " print(\"\\n--- sweep summary (best first) ---\")\n",
384
+ " for row in sweep_rows:\n",
385
+ " print(\n",
386
+ " f\"{row['label']} chars_s={row['chars_s']} chunks_s={row['chunks_s']} \"\n",
387
+ " f\"translate_s={row['translate_s']} ct2_infer_s={row['ct2_infer_s']} decode_s={row['decode_s']}\"\n",
388
+ " )\n",
389
+ "else:\n",
390
+ " print(\"RUN_SWEEP=False. Đổi thành True để chạy sweep batch/window/beam.\")"
391
+ ]
392
+ },
393
+ {
394
+ "cell_type": "markdown",
395
+ "metadata": {},
396
  "source": [
397
  "## Đọc kết quả\n",
398
  "\n",
 
400
  "- `chunk_s`: thời gian chia chunk và đếm token.\n",
401
  "- `decode_s`: thời gian decode output.\n",
402
  "- `tokenize_wait_s`: thời gian GPU phải chờ tokenization. Nếu cao trên Colab/Kaggle, CPU đang nghẽn.\n",
403
+ "- `BENCH_RUNTIME`: Python/platform số GPU CT2 nhìn thấy.\n",
404
+ "- `BENCH_PACKAGES`: version package quan trọng; khác version CT2/SentencePiece có thể làm lệch tốc độ.\n",
405
+ "- `BENCH_ENV`: cấu hình hiệu năng thật được truyền vào subprocess benchmark.\n",
406
+ "- `BENCH_DONE chars_s`: tốc độ chữ Hán/giây tính trên thời gian dịch.\n",
407
+ "- Fair test Kaggle vs Colab: đặt `USE_SINGLE_GPU_FOR_FAIR_TEST=True`, `FAIR_GPU_INDICES=\"0\"`; nếu `WINDOW_MULTIPLIER=\"\"`, notebook tự dùng `FAIR_WINDOW_MULTIPLIER=\"16\"`."
408
+ ]
409
+ }
410
  ],
411
  "metadata": {
412
  "kernelspec": {
 
421
  },
422
  "nbformat": 4,
423
  "nbformat_minor": 5
424
+ }
hachimimt-local.zip CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:9c6bbd4c77e606287b84fbcfbe99d6a47288cb7135f1fe650af8c6fdc0f2cc0f
3
- size 102609
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ccf2a1d7a24a9226c257f5fe5c45b68a2bfd7a38333f6e75dcc537dbf2feb102
3
+ size 105893
src/benchmark_file.py CHANGED
@@ -3,6 +3,9 @@
3
  from __future__ import annotations
4
 
5
  import argparse
 
 
 
6
  import time
7
  from pathlib import Path
8
 
@@ -17,6 +20,69 @@ from text_preprocess import (
17
  from translator import Backend, HachimiTranslator
18
 
19
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  def parse_args() -> argparse.Namespace:
21
  parser = argparse.ArgumentParser(description=__doc__)
22
  parser.add_argument("path", type=Path, help="Input .txt file")
@@ -36,6 +102,7 @@ def main() -> None:
36
  profile = detect_hardware_profile()
37
  print(f"BENCH_START file={args.path}", flush=True)
38
  print(f"PROFILE {profile.summary}", flush=True)
 
39
 
40
  read_start = time.perf_counter()
41
  text = read_text_file(args.path)
 
3
  from __future__ import annotations
4
 
5
  import argparse
6
+ import importlib.metadata
7
+ import os
8
+ import platform
9
  import time
10
  from pathlib import Path
11
 
 
20
  from translator import Backend, HachimiTranslator
21
 
22
 
23
+ TRACKED_ENV_KEYS = (
24
+ "CUDA_VISIBLE_DEVICES",
25
+ "HACHIMIMT_GPU_INDICES",
26
+ "HACHIMIMT_AUTO_ALL_GPUS",
27
+ "HACHIMIMT_BATCH_SIZE",
28
+ "HACHIMIMT_THREADS",
29
+ "HACHIMIMT_TOKENIZE_WORKERS",
30
+ "HACHIMIMT_TOKENIZE_JOB_SIZE",
31
+ "HACHIMIMT_CT2_BATCH_TYPE",
32
+ "HACHIMIMT_CT2_WINDOW_MULTIPLIER",
33
+ "HACHIMIMT_INTER_THREADS",
34
+ "HACHIMIMT_COMPUTE_TYPE",
35
+ )
36
+
37
+
38
+ TRACKED_PACKAGES = (
39
+ "ctranslate2",
40
+ "sentencepiece",
41
+ "tokenizers",
42
+ "huggingface_hub",
43
+ "torch",
44
+ "transformers",
45
+ "gradio",
46
+ )
47
+
48
+
49
+ def _safe_field(value: object) -> str:
50
+ text = str(value)
51
+ return text.replace("\\", "/").replace(" ", "_").replace("\n", "_")
52
+
53
+
54
+ def _package_version(name: str) -> str:
55
+ try:
56
+ return importlib.metadata.version(name)
57
+ except importlib.metadata.PackageNotFoundError:
58
+ return "missing"
59
+
60
+
61
+ def _ct2_cuda_device_count() -> int | str:
62
+ try:
63
+ import ctranslate2
64
+
65
+ return ctranslate2.get_cuda_device_count()
66
+ except Exception as exc:
67
+ return f"error:{type(exc).__name__}"
68
+
69
+
70
+ def _print_runtime_context() -> None:
71
+ runtime_parts = [
72
+ f"python={_safe_field(platform.python_version())}",
73
+ f"platform={_safe_field(platform.platform())}",
74
+ f"processor={_safe_field(platform.processor() or 'unknown')}",
75
+ f"ct2_cuda_devices={_ct2_cuda_device_count()}",
76
+ ]
77
+ print("BENCH_RUNTIME " + " ".join(runtime_parts), flush=True)
78
+
79
+ package_parts = [f"{name}={_safe_field(_package_version(name))}" for name in TRACKED_PACKAGES]
80
+ print("BENCH_PACKAGES " + " ".join(package_parts), flush=True)
81
+
82
+ env_parts = [f"{key}={_safe_field(os.environ.get(key, '<unset>'))}" for key in TRACKED_ENV_KEYS]
83
+ print("BENCH_ENV " + " ".join(env_parts), flush=True)
84
+
85
+
86
  def parse_args() -> argparse.Namespace:
87
  parser = argparse.ArgumentParser(description=__doc__)
88
  parser.add_argument("path", type=Path, help="Input .txt file")
 
102
  profile = detect_hardware_profile()
103
  print(f"BENCH_START file={args.path}", flush=True)
104
  print(f"PROFILE {profile.summary}", flush=True)
105
+ _print_runtime_context()
106
 
107
  read_start = time.perf_counter()
108
  text = read_text_file(args.path)