Релиз целиком: вход по ссылке, агрегат студий/типов/18+, малая int8-модель
- src/fetch.py: загрузка по URL (allowlist трекеров, защита от SSRF, cp1251)
- src/release.py: агрегат релиза, студии из заголовка раздачи (ПМ (LostFilm))
- predict --url, POST /predict {"url"}; ответ расширен, tracks сохранён
- export_onnx --quantize: tiny2 int8 29 МБ, parity 99.2-100%
- тесты (52 ok), docs/plan.md, docs; target/ убран из git
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
This commit is contained in:
1 parent
98e4031037
commit
8cbd800ec7
2473 files changed
+424
-6060
No files matched your search
+24
-1
@@ -24,7 +24,9 @@ python -m src.service --model models/best --port 8000
|
||||
API:
|
||||
|
||||
* `GET /health` → `{"status": "ok", "model": "...", "device": "...", "classes": [...]}`
|
||||
* `POST /predict` — ровно одно из полей:
|
||||
* `POST /predict` — ровно одно из полей (`url` принимает опциональный `cookie`;
|
||||
ответ для `html`/`url` — агрегат релиза, см. docs/inference.md):
|
||||
* `{"url": "https://rutracker.org/forum/viewtopic.php?t=…"}` → страница загружается сервисом;
|
||||
* `{"text": "Перевод: Дублированный | MovieDalen"}` → одна дорожка;
|
||||
* `{"html": "<html>…вся страница…"}` → все дорожки релиза.
|
||||
|
||||
@@ -105,6 +107,22 @@ $b = [Text.Encoding]::UTF8.GetBytes((@{ text = "Перевод: Дублиров
|
||||
Ответ сервис отдаёт с `charset=utf-8`, поэтому кириллица в ответе
|
||||
корректно декодируется и в PS 5.1.
|
||||
|
||||
### grabber (PHP)
|
||||
|
||||
kinozal требует авторизации, поэтому grabber скачивает страницу сам
|
||||
(`KinozalClient`) и отправляет сервису готовый HTML:
|
||||
|
||||
```php
|
||||
$ch = curl_init('http://dub-ai:8000/predict');
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10,
|
||||
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
|
||||
CURLOPT_POSTFIELDS => json_encode(['html' => $html], JSON_UNESCAPED_UNICODE),
|
||||
]);
|
||||
$release = json_decode(curl_exec($ch), true);
|
||||
// $release['studios'], $release['translation_types'], $release['is_18plus']
|
||||
```
|
||||
|
||||
## Путь Б: ONNX без Python
|
||||
|
||||
Экспорт (из корня проекта, после обучения):
|
||||
@@ -113,6 +131,11 @@ $b = [Text.Encoding]::UTF8.GetBytes((@{ text = "Перевод: Дублиров
|
||||
python -m src.export_onnx # -> models/best-onnx/ + reports/onnx_parity.md
|
||||
```
|
||||
|
||||
Для встраивания — малая модель: `python -m src.export_onnx --model models/tiny2
|
||||
--quantize` кладёт в `models/tiny2-onnx/` ещё и `model.int8.onnx` (29 МБ вместо
|
||||
~440 МБ у base; parity с PyTorch: тип 99.8%, спан 99.2%, 18+ 100% —
|
||||
`reports/onnx_parity_tiny2_int8.md`).
|
||||
|
||||
Состав `models/best-onnx/`: `model.onnx` (входы `input_ids`,
|
||||
`attention_mask`, `token_type_ids` int64 [B, seq]; выходы `type_logits`
|
||||
[B, 14], `bio_logits` [B, seq, 3], `age_logits` [B, 2]), `tokenizer.json`
|
||||
|
||||
Reference in new issue
Block a user