Перейти до змісту

Читання на чужій машині: подробиці

Довідка до скіла 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 — межа між дрібною витратою, яку людина дозволила наперед, і рішенням про гроші.
  • Другого догону. Хвіст доганяється один раз; другий означає, що сторінки не читаються взагалі.