docker / build (push) Failing after 39s
- Docker: Dockerfile (CPU), compose с FlareSolverr, настройка через DUB_* переменные, токен доступа к /predict, tools/pack_models.py, workflow Gitea Actions, docs/docker.md - Модель грузится офлайн (config.json рядом с весами); общий код вынесен в src/spans.py, сервису не нужны sklearn/matplotlib/pandas - Обучение: профили tiny2/base/large/modern, запуски в models/runs, реестр и честное сравнение на одной тестовой выборке (src/runs.py), пункт меню «Модели» - Датасет: язык и аудио-параметры дорожек, 18+ по строкам «Аудио», ручные метки по ссылкам, переиндексация сохранённого HTML, параллельная сборка, сбалансированная выборка - Тексты страниц (data/pages) больше не хранятся в git Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
45 lines
2.3 KiB
Python
45 lines
2.3 KiB
Python
"""Проверка параллельной переиндексации: те же метки, страницы и meta, что и в одном процессе.
|
|
|
|
Отдельный скрипт, потому что multiprocessing на Windows заново импортирует главный модуль:
|
|
tests/run_tests.py без `if __name__ == "__main__"` запустился бы в каждом процессе.
|
|
Печатает одну строку JSON.
|
|
"""
|
|
|
|
import json
|
|
import sys
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
sys.path[:0] = [str(ROOT), str(ROOT / "tools"), str(ROOT / "tools" / "harvest")]
|
|
import collect as col # noqa: E402
|
|
|
|
POST = ("Год выпуска: 2020\nАудио 1: Opus, 6 ch, 221 Kbps | Русский AVO (Дмитрий Пучков)\n"
|
|
"Аудио 2: AC3, 6 ch, 448 Kbps | Русский MVO (LostFilm)\n")
|
|
|
|
|
|
def run(base: Path, name: str, workers: int) -> dict:
|
|
d = base / name
|
|
(d / "raw" / "nnm").mkdir(parents=True)
|
|
(d / "labels.csv").write_text("", encoding="utf-8")
|
|
for i in range(50):
|
|
(d / "raw" / "nnm" / f"{9000 + i}.json").write_text(json.dumps(
|
|
{"id": str(9000 + i), "source": "nnm", "ok": True, "title": f"Фильм {i} (2020) BDRip", "post": POST},
|
|
ensure_ascii=False), encoding="utf-8")
|
|
(d / "raw" / "nnm" / f"{9000 + i}.html").write_text(
|
|
f"<html><body><h1>Фильм {i}</h1><div>{POST.replace(chr(10), '<br>')}</div></body></html>", encoding="utf-8")
|
|
col.RAW, col.PAGES, col.LABELS = d / "raw", d / "pages", d / "labels.csv"
|
|
col.POSTONLY, col.META, col.MANUAL = d / "po.txt", d / "meta.csv", d / "m.txt"
|
|
return col.cmd_build(rewrite=True, runner=col.Runner(workers=workers))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
base = Path(tempfile.mkdtemp())
|
|
a, b = run(base, "serial", 1), run(base, "par", 2)
|
|
same = (
|
|
(base / "serial" / "labels.csv").read_bytes() == (base / "par" / "labels.csv").read_bytes()
|
|
and (base / "serial" / "meta.csv").read_bytes() == (base / "par" / "meta.csv").read_bytes()
|
|
and sorted(p.name for p in (base / "serial" / "pages").glob("*.txt"))
|
|
== sorted(p.name for p in (base / "par" / "pages").glob("*.txt")))
|
|
print("RESULT " + json.dumps({"same": same, "pages": b["pages"], "labeled": [a["labeled"], b["labeled"]]}))
|