Читання на чужій машині: подробиці¶
Довідка до скіла run-case-remote. Порядок заходу — у самому скілі; тут те,
що потрібне, коли треба розібратися в темпі, ціні, транспорті, партії чи збої.
Що впирає машину¶
Сегментацію (геометрія рядків, нарізка) рахує процесор, розпізнавання — карта.
- Один голос Писаря: більшу частину сторінки рахує процесор, і причина везти справу кудись — більше ядер.
- PP-голос (Дяк-Літописець, Скриба PPv3): вузьке місце — карта. Розпізнавання на сторінку йде в рази довше за сегментацію, карти завантажені повністю, процесор наполовину. Додаткові шарди тут не допоможуть, допомагає лише менше моделей: кирилиці два голоси, Скриба — окремим прогоном там, де латинка.
- Від карти потрібні тензорні ядра (Писар іде у fp16,
-p pysar_fp16=auto) і пам'ять, яка обмежує, скільки процесів улізе поруч.
Темп і пам'ять передбачувані наперед:
- час сторінки = стала (~0.5–1 с, мережа сегментації) + рядки × ціна рядка; тип документа впливає лише через щільність письма;
- пам'ять — n шардів по ~1.3–1.9 ГБ плюс один пік сегментації на карту (~0.1 ГБ + 0.5 ГБ × Мп входу, вхід = 1800² × ширина/висота кадру). Її задає пропорція кадру, а не тип документа, роздільність чи рядки;
- вільні ядра бере машина сама: процеси-сегментатори ріжуть сторінки
наперед (
-p segmenters=auto, типово;off— вимкнути); - OOM на піку сторінку не губить: стадія чи сторінка повторюється, у лозі
шарда —
[htr-oom]. Флот після цього стискається лише тимчасово.
Сховище R2 (за бажанням, один раз)¶
Без сховища кадри їдуть з дому прямо на машину, і кожна переоренда везе їх з дому вдруге, а чекпоінти приходять додому раз на 5 хв. Зі сховищем (Cloudflare R2) кадри заливаються один раз, чекпоінти лягають туди кожні 2 хв, і нова машина підхоплює роботу з них сама, навіть коли комп'ютер людини вимкнено. Ключі сховища на орендовану машину не потрапляють: вона отримує лише підписані посилання.
Людина в кабінеті Cloudflare (безплатний рівень R2 — 10 ГБ, вихідний трафік не тарифікується): R2 → Create bucket; R2 → Manage R2 API Tokens → токен з дозволом Object Read & Write на цей бакет; «Account ID» видно праворуч.
nysh cloud rent storage --account <Account ID> --bucket <бакет> # ключ і секрет — прихованим запитом
nysh cloud rent storage # що налаштовано
nysh cloud rent storage --check # перевірити збережене
Команда перевіряє, що бакет видно, токен пише й підписане посилання
відкривається. Далі nysh cloud go (--transport auto) везе кадри через
сховище сам; рядок плану транспорт: r2. Кадри в бакеті прибирає правило
життєвого циклу (Object lifecycle rules → видаляти через 30 днів).
Транспорт і повільний канал¶
--transport: auto (сховище, якщо налаштоване, інакше сама машина), box —
завжди на машину, store — лише сховищем.
Без сховища кадри їдуть на вже орендовану машину, і весь цей час вона
тарифікується, не читаючи. Кошторис показує рядок «доставка N ГБ при ~X МБ/с —
~Y оренди без читання (~$Z)». Понад чверть оренди захід не стартує (вердикт
slow_uplink, код 13), а наглядач, що вже заміряв канал, спиняється замість
перебирати машини. Вихід обирає людина: сховище R2, менша порція (скільки ГБ
вкладається — у тексті вердикту) або згода --accept-slow-delivery. Згода не
знімає стелі годин: доставка й читання разом мусять влізти в --max-hours.
Якщо вимкнути комп'ютер:
- до того, як дані доїхали: машина чекає їх пів години, далі — поки
доставка подає ознаки життя (15 хв тиші), і гасне сама. Це до ~45 хв оренди
без жодної прочитаної сторінки;
- після: машина дочитає й погасне сама, але забір, звірка, cases build і
text index відбудуться лише тоді, коли повторний nysh cloud go тієї ж
справи підхопить захід.
Вибір машини¶
- Ціль темпу (
-p target_pph=, типово 5 000 стор/год на еталонній сторінці; на густішому письмі знижується сама). Машина з прогнозом нижче цілі не береться; якщо таких немає, наглядач чекає до години й завершуєmarket_empty. Машина нижче цілі, що закінчить усю роботу раніше, ніж скінчилось би чекання, береться одразу (quicker_than_waiting). - Бокс, що не тримає обіцяного темпу, гаситься й замінюється лише тоді, коли пересадка коротша за дочитування.
- Ціна машини — година × час плюс трафік (обсяг кадрів × тариф хоста за вхідний трафік). На догоні везуться лише справи з непрочитаними сторінками.
--pace fast|cheap:fast(типово) бере лише машину, що дає ціль темпу;cheap— найдешевший захід у межах стелі тисячі сторінок і годин. Рішення людини.--min-pph N— підлога темпу дляcheap.--machine <machine_id>— саме ця машина (порівняння на тому самому залізі, перевірений хост). Ціль темпу на неї не діє; зайнята —market_emptyодразу.--datacenter-only— лише машини датацентрів: менше обривів, але ринок у десятки разів менший. Старий пакет оренди (gpuhire < 0.6.3) фільтра не знає — захід відмовляє й проситьnysh update.--max-rents N— невдалих оренд на захід (типово 3); коли хости не пускають по SSH — 6–8.
-p ключ |
що |
|---|---|
shards=N |
стеля флоту, а не розмір: число процесів бокс підбирає сам |
seg_max_mpx= |
стеля входу сегментатора, Мп (типово 8; 0 — без стелі) |
pysar_fp16=off |
вимкнути fp16 розпізнавання (типово auto) |
Черга справ на одній машині¶
- Коди виходу й вердикт — про ЗАХІД, а не про справу.
- Верхні
run_id,out_dir,case_dirна черзі порожні навмисно. Правда — уcases[]іrun_ids[]. - Справа, що випала, лежить у
dropped[](case,why); у виводі — «поїде N з M справ».cases[]+dropped[]мусять дати всі названі справи. - Прочитана справа випадає з черги. Не повторювати з
--rerun, щоб «полагодити» це: перечитаєте прочитане за гроші. - Зайнята справа (її веде інший захід) теж випадає;
refused, код 2 — лише коли зайняті всі. --thinведе одну справу й на кількох відмовляє до оренди.nysh cloud stopзгортає всю чергу.
Партія на кількох машинах (--boxes)¶
- Справи діляться на N черг за обсягом роботи (сторінки × щільність), кожна черга — своя машина й свій наглядач, усі стартують одразу.
- Вилка,
--budgetі стеля автозапуску — одні на всю партію.--budgetділиться так, що кожна черга дістає щонайменше свій прогноз; менше за суму прогнозів — відмова з сумою, якої бракує. - Одна машина на ~10–15 тис. сторінок (3–4 години роботи). Черга, якій прогнозують понад дві третини стелі годин, — відмова з порадою взяти більше машин.
- Стан —
nysh cloud state --batch <id>, згорнути —nysh cloud stop --batch <id>; id — уbatch_id, черги — уqueues[]. - Код 11
partial_start— стартували не всі черги; пущені НЕ гасити, причини — уqueues[].why. --scriptі--withу команді діють на всю партію; без них письмо визначається для кожної справи. Тож кирилицю й латинку, названі явно, пускати окремими командами.
Перечитати іншою моделлю¶
--model <ваги|latin>: результат у теку з тегом моделі, розмітка рядків
першого прогону їде на машину, і сторінка коштує лише розпізнавання (удвічі
дешевше). Розмітка береться лише тоді, коли знята з цих самих кадрів —
Нишпорка перевіряє це сама й каже вголос.
Друковане видання (--print)¶
Друк рукописний рушій не бере: на газеті він склеює рядки сусідніх колонок (CER 11–17 % на колонці проти < 1 % у рушія друку). Друк читає PaddleOCR-VL, і лише на орендованій машині.
nysh cloud go --print "<тека видання>" --vydannia KOLSELO_PYR --city Пирятин --dry-run
nysh cloud go --print "<тека видання>" --vydannia KOLSELO_PYR --city Пирятин --confirm # після «так»
nysh print status KOLSELO_PYR # роки, прочитане, яких номерів немає
nysh print pack KOLSELO_PYR # повні роки → пакети VYD/<код>/<рік>
nysh print publish KOLSELO_PYR # віддає людина
- Тека видання —
<Назва>/<РІК>/<номер>/або<Назва>/<номер>/, на будь-якій глибині. Номер:3 (770) 1936-01-06,2 1934-02-26,1 (1918-10-24), здвоєний12-13 (779-780) …,Додаток … 1935-08-12. - Одне видання — один захід. Тека міста з кількома газетами — відмова з командою для кожної; дві теки одного номера — відмова до оренди.
- Код видання підтверджує людина: він іде в ключ
VYD/<код>/<рік>назавжди. Місто в коді обов'язкове — районні газети з однаковою назвою виходили в десятках міст. - Номер їде як
<код>_<дата>_<номер>(додаток —…_dod);--case-keyз--print— відмова. - Уже залиті кадри повторно не їдуть (
--reuse-key, лише коли там рівно цей архів). - Номери лягають у
data/derived/print/issues/; після забору наглядач кличеnysh print assemble, і рокиvyd_<код>_<рік>одразу в пошуку (nysh text grep … --case VYD/<КОД>). - Пакується лише повний рік; неповний дочитує та сама команда
cloud go --print. --thin,--model,--with,--scriptз--printне йдуть.
Своя машина: подробиці¶
- Скільки процесів, вирішує виміряне залізо: машина може показувати більше
ядер, ніж ваша частка.
--shards Nприймає лише менше фізичного. - Файли понад ~32 МБ їдуть системним
scp; без нього захід скаже про відкат і поїде повільно. Десятки гігабайтів — сховище:
nysh cloud hosts storage <сегмент> --endpoint <адреса>
# ключі — тільки в середовищі: NYSHPORKA_S3_KEY / NYSHPORKA_S3_SECRET
verifyзводить три знаменники — кадри в теці, число з мети прогону, тексти на диску — і звіряє покадрово. Карантин — не прочитані сторінки.
Коли щось пішло не так¶
| що видно | що це насправді |
|---|---|
| PDF-справа прочитана по 3–9 рядків на сторінку | кадри з PDF лежать боком. Захід відкладає прочитане з них у _bokom/, розгортає кадри наново й дочитує ці сторінки |
| прогін «успішний», а сторінок менше | код повернення повноти не доводить: лог буває обірваний при порожньому переліку збоїв і нульовому коді |
| привезено менше, ніж читалось | звірка покадрова: однакове число текстів ще не означає ті самі сторінки |
| «повністю», а на диску не все | карантин переживає перезапуск; go на догоні відкладає його вбік і читає хвіст одним процесом |
| пошук по декоду дає нуль без помилки | голоси склались в одну теку; вони мусять лежати сестринськими теками <прогін>-<тег> |
| машина «не відповідає» одразу після старту | щойно піднятий бокс кілька хвилин не приймає з'єднань — це не привід брати другий |
| заливка йде годинами | немає scp у PATH або справа на десятки гігабайтів — сховище |
go каже «у теку вже пише інший захід» |
та сама справа іншим письмом чи моделлю: два прогони в одну теку перетирають тексти |
| кроп показує не той аркуш | у меті шлях орендованого боксу; забір вписує теку оригінальних кадрів — перевір, що прогін забирав саме він |
| зі сховища приїхала частина | чекпоінти — не доказ повноти: недочитане лежить на машині, і наглядач дотягує його до гасіння |
| темп удвічі нижчий за кошторис | справи замалі для флоту (40–100 сторінок на 16 шардів). Темп машини міряти на справі від 500 сторінок |
| перечитування «надто швидке» | --model поверх прочитаної справи бере сегментацію першого прогону: це темп розпізнавання, не повний |
go каже «тека ще качається» |
запобіжник: останній кадр записано нещодавно. --allow-partial — лише коли кадри звірено поштучно з джерелом |
| бокс кілька хвилин «вантажиться» | на хості немає образу — тягне його 2–7 хв або не дотягує; наглядач кидає хост, що 6 хв не зрушив. Після cloud stop — nysh cloud rent status ще раз за кілька хвилин |
Чого тут немає навмисно¶
- Оренди без стелі.
--budgetі--max-hoursлише звужують чи розширюють бюджет і строк, прибрати їх не можна. - Дозволу, який агент дає собі сам. Стеля автозапуску й
--confirm— межа між дрібною витратою, яку людина дозволила наперед, і рішенням про гроші. - Другого догону. Хвіст доганяється один раз; другий означає, що сторінки не читаються взагалі.