Читання під обмежені ресурси¶
Прогін справи — найдовша робота в застосунку: сотні аркушів, години. Тому питання не «як швидше», а як укластися в ту машину, що є, і не завалити її.
🔴 Головне: це НЕ задача для відеокарти¶
Заміряно профайлером на живому прогоні: карта простоює 92% часу. Понад
40% часу з'їдає одна CPU-функція всередині сегментації (skimage.filters.sato),
ще близько 20% — CPU-геометрія рушія.
Наслідки, які міняють рішення:
- на машині без карти читання працює — просто повільніше (порядок різниці: хвилини на сторінку замість десятків секунд). Це не привід відмовляти людині;
- докупити карту — найгірша з можливих порад. Швидкість дають ядра процесора й правильний розподіл роботи;
- паралельність упирається в пам'ять карти, а не в кількість ядер.
Важелі nysh read¶
| прапорець | що робить | коли |
|---|---|---|
--shard k/n |
цей процес бере кожен n-й кадр (round-robin) | є вільні ядра; запускають n процесів паралельно |
--gpu-lock <файл> |
спільний міжпроцесний лок GPU-фази | обов'язково разом із --shard на одній карті |
--no-gpu-sato |
рахувати sato на процесорі, а не на карті | разом із шардингом — див. нижче |
--seg-height <px> |
висота, до якої сегментер стискає сторінку (типово 1800) | коли інакше не влазить; коштує якістю |
--limit N / --pages 1-50 |
прочитати частину справи | розвідка перед повним прогоном |
--one-voice |
без другого рушія | швидше, але сліпіше |
Шардинг: чому саме з локом і без sato на карті¶
Round-robin, а не блоками: сторінки нерівні за вартістю (порожній зворот проти щільного формуляра), і чергування вирівнює процеси само собою.
🔴 --shard без --gpu-lock на одній карті — найпоширеніша помилка. Два
одночасні проходи сегментації не влазять у пам'ять типової ігрової карти, і
прогін не сповільнюється, а завалюється. Дай усім шардам один і той самий
файл-лок; nysh read попередить, якщо ти забув.
⚠ Виграш дає не шардинг сам собою, а шардинг разом зі знятим sato з карти. З sato на карті найдорожча фаза сторінки йде під локом — і три процеси стають у чергу замість паралельної роботи. Знімеш sato — під локом лишиться коротка фаза, а найдорожче рахуватиметься на вільних ядрах.
✅ --no-gpu-sato не міняє результат, лише спосіб розрахунку: вихід
еквівалентний, і це перевірено окремим верифікатором. Тобто це безпечна
оптимізація, а не компроміс якості — на відміну від наступної.
--seg-height: єдиний важіль, що коштує якістю¶
Менша висота дає квадратичну економію, але платиш прочитаним:
| висота | ціна |
|---|---|
| 1800 (типово) | — |
| 1440 | приблизно −4% слів |
| 1200 | приблизно −10% пошукового відгуку на довгих словах |
🔴 Саме тому воно не вмикається саме собою. Вмикай свідомо і скажи людині, що зробив: інакше згодом «прізвище не знайшлось» припишуть моделі, а не цьому прапорцю.
Скільки шардів ставити¶
Вирішує вільна пам'ять карти, а не кількість ядер. Кожен шард із двома голосами тримає близько гігабайта; щойно сумарно впираєшся у стелю, драйвер починає перекладати пам'ять через шину, і прогін завалюється.
✅ Приймач — симптом, а не секунди: після старту подивись завантаження. Пам'ять під стелею при простої процесора означає буксування — знімай шард. Здорове завантаження виглядає інакше: процесор зайнятий.
⚠ Секунди на сторінку міряти на робочій машині безглуздо. Той самий прогін за вечір може дати різницю в рази — залежно від того, що ще крутиться поруч. Порівнювати режими по часу тут не вийде; надійний тільки симптом.
Орієнтир, а не константа: щільні формуляри (сповідки, ревізії, метрики на 90+ рядків) ставити на менше шардів одразу; рідкі аркуші витримують більше. Шарди резюмуються спільно, тож зняти зайвий можна будь-коли без утрат.
Приймач повноти — диск¶
Після прогону порахуй .txt у теці виходу проти .jpg у теці справи.
nysh read робить це сам і друкує рядок «сторінок з текстом: N з M».
🔴 Є клас відмов, за якого сторінка вбиває процес: лог обривається, перелік збоїв порожній, код повернення успішний. Виміряний випадок — 14 сторінок із 18. Тільки диск.
⚠ Для часткового прогону (--limit, --pages, --shard) повнота не міряється —
ти прочитав менше навмисно, і рядок про це скаже.
🛟 Рятувальний прохід і якорі¶
Окремий механізм, про який варто знати, навіть якщо ти його не запускаєш.
Яку діру закриває. Основний рушій проходить справу швидко, далі пошук, далі оком дивляться лише сильні хіти. Нижче певного балу — шум. Між ними на велику справу набирається понад тисяча рядків, яких не подивиться ніхто — і справжня згадка сидить саме там: рушій із мовною моделлю підставляє правдоподібне слово замість написаного, тож рядок виглядає осмислено й не привертає уваги.
Чому другий рушій тут працює. Він судить кадри умовно незалежно — здогадуватись йому нічим, тому він калічить локально, зберігаючи корінь слова. Саме та властивість, щоб витягти згадку зі «сміттєвої» смуги.
Що таке якорі. Рядки на перечитування відбираються двома способами: за балом («сіра смуга» між шумом і хітами) і за якорем — коли в рядку стоїть ім'я або по батькові з відомого складу роду. Другий спосіб знаходить те, у чому саме прізвище скалічене повністю.
🔴 Якорі приходять ззовні, зі складу роду. Порожній перелік якорів проговорюється вголос, а не мовчки: рятунок «за якорем» без якорів — це рятунок, який відібрав нуль рядків, і без попередження це не відрізнити від «нема кого рятувати».
Як запустити. Через nysh read цього немає: рятунок вимагає другої моделі
й переліку якорів, тобто рішень, які ухвалює людина. Ваги обох голосів дає
nysh models get, а сам рятунок — окремий прохід по вже прочитаній справі, а
не режим першого читання.
Порядок дій на слабкій машині¶
nysh doctor --json— чи є карта взагалі, скільки місця на диску.nysh read <тека> --dry-run— план: скільки кадрів, яка модель.nysh read <тека> --limit 20— розвідка: подивитись, що виходить, перш ніж ставити на ніч.- Повний прогін. Якщо ядер кілька й карта слабка:
--shard k/n+ один спільний--gpu-lock+--no-gpu-satoна кожному. - Порахувати
.txtпроти.jpg. - Якщо не влізло навіть так —
--seg-height 1440і сказати людині, що прочитане тепер трохи гірше.
⚠ Не запускай повний прогін «щоб подивитись». Це години роботи машини, і перервати його безболісно можна, але сторінки, прочитані двічі, — ні.