Перейти до основного вмісту

Усунення несправностей

Кожен запис має формат: Симптом → Причина → Вирішення. Заголовки розділів із симптомами містять точні рядки помилок — перегляньте цю сторінку (Ctrl-F), щоб знайти повідомлення, яке ви бачите. Кожен запис перевірено на відповідність поточній версії коду або відтворено на DevKit.

Якщо ви не знаєте, з чого почати, перейдіть до розділу Коли ви не знаєте, що робити: діагностика..

Встановлення та налаштування середовища

1. pyneat is not importable. Either Neat is not installed, or the venv is not activated.

Причина

Віртуальне середовище pyneat не активовано, або пакет wheel не встановлено в середовищі, в якому ви працюєте.

Виправити.

Активуйте середовище DevKit, перш ніж запускати будь-який код Python:

source ~/pyneat/bin/activate

2. Не вдалося завантажити плагін GST: undefined symbol: _ZN16simaaidispatcher14DispatcherBase14submitPrepared...

Причина

Спільні бібліотеки Neat для середовища виконання не знаходяться в шляху динамічного завантажувача, тому плагіни GStreamer не можуть розв’язати символи середовища виконання під час завантаження.

Виправити.

Перед запуском додайте каталог середовища виконання до LD_LIBRARY_PATH:

export LD_LIBRARY_PATH=/usr/lib/aarch64-linux-gnu/neat/runtime:$LD_LIBRARY_PATH

3. Відсутній архів моделі — sima-cli modelzoo ще не було запущено.

Причина

Архів моделі .tar.gz, на який посилається ваш код (або SIMA_YOLO_TAR / SIMA_RESNET50_TAR / SIMA_MODEL_TAR), не існує на диску.

Виправити.

Завантажте його з Model Zoo:

sima-cli modelzoo get yolo_v8s # or resnet_50, etc.

Створити / Збірка

4. Не вдалося знайти пакет find_package(SimaNeat CONFIG).

Причина

CMake не може знайти SimaNeatConfig.cmake (встановлено в lib/cmake/SimaNeat/). У стандартних інсталяціях DevKit він знаходиться в системному префіксі за замовчуванням; у випадках крос-компіляції для SDK, sysroot не входить до CMAKE_PREFIX_PATH.

Виправити.

Експортуйте SYSROOT і дозвольте вашому файлу CMakeLists додати його до шляху префіксів (шаблон Привіт, це чудовий шаблон Neat. робить це):

if(DEFINED ENV{SYSROOT} AND NOT "$ENV{SYSROOT}" STREQUAL "")
list(APPEND CMAKE_PREFIX_PATH "$ENV{SYSROOT}/usr/lib/aarch64-linux-gnu")
endif()
find_package(SimaNeat REQUIRED CONFIG)

Завантаження моделі та її налаштування.

5. failed to read image: <path>

Причина

OpenCV (cv2.imread / cv::imread) повернув значення null — файл не існує, недоступний для читання або не є зображенням, яке можна декодувати.

Виправити.

Перевірте шлях до файлу та переконайтеся, що файл є дійсним зображенням у форматі JPEG/PNG, перш ніж створювати вхідний тензор.

6. reason=topk must be > 0boxdecode)

Причина

Параметр ModelOptions.top_k моделі виявлення було встановлено на 0; на етапі декодування обмежувальних рамок потрібне позитивне значення.

Виправити.

Встановіть позитивне значення top_k (у навчальних матеріалах використовується значення 100):

opt.top_k = 100

(Повідомлення надходить від плагіна EV74, який відповідає за декодування даних.)

7. preproc_upsample_not_supported

Причина

Вихідне зображення має менший розмір, ніж роздільна здатність, необхідна для вхідних даних моделі, тому попередній етап обробки повинен збільшити роздільну здатність — чого не робить старіша версія програмного забезпечення для попередньої обробки EV74 (вона лише зменшує роздільну здатність).

Виправити.

Надайте вхідне зображення, розмір якого не менший, ніж розмір вхідних даних моделі (наприклад, ≥ 640×640 для YOLOv8), або оновіть neat-ev74-firmware до версії, що містить ядро збільшення роздільної здатності. (Повідомлення надходить з плагіна/прошивки попередньої обробки EV74.)

8. Низький поріг score_threshold → усунення пікових затримок під час постобробки.

Причина

Чим нижчий поріг виявлення, тим більше потенційних об’єктів залишається після застосування цього порогу, і обчислювальні витрати на не-максимальне придушення (NMS) зростають приблизно пропорційно квадрату кількості об’єктів, що пройшли фільтрацію.

Виправити.

Зменшуйте поріг лише до того рівня, який необхідний для виявлення слабких об’єктів, і встановіть максимальне значення за допомогою top_k. Див. Перегляньте виявлені області..

Запуск процесу виведення (інференсу).

9. misconfig.media_caps … Internal data stream error … reason not-negotiated (-4)

Причина

Для необроблених зображень на етапі попередньої обробки не було активовано відповідну функцію / не було вказано тип вхідних даних, тому неможливо встановити зв’язок між елементом appsrc і першим етапом обробки.

Виправити.

Вкажіть вхідне зображення та попередньо встановлений набір параметрів обробки в ModelOptions:

opt.preprocess.kind = pyneat.InputKind.Image
opt.preprocess.preset = pyneat.NormalizePreset.COCO_YOLO

10. No channel available (all candidate channel opens failed)

Причина

Диспетчер EV74 намагався запланувати ядро, яке не підтримується завантаженою прошивкою — зазвичай тому, що neat-runtime і neat-ev74-firmware не є однією й тією ж версією (не співпадають внутрішні хеші), наприклад, після часткового оновлення.

Виправити.

Встановіть відповідний набір neat-* (з однаковим хешем) разом; переконайтеся, що середовище виконання та прошивка відображають однаковий хеш. Див. Сумісність → набір, що відповідає версії.. (Повідомлення надходить від диспетчера EV74.)

11. frame=N rtsp_timeout

Причина

Відбувся тайм-аут під час отримання даних RTSP — URL-адреса вказана неправильно або потік не передає кадри.

Виправити.

Перевірте, чи доступна URL-адреса RTSP і чи відбувається активна передача потоку; перевірте тип транспортування (TCP або UDP). Див. Відтворюйте RTSP-потік..

12. CameraInput strict zero-copy requires external-buffer-mode

Причина

CameraInputOptions::allow_cpu_fallback за замовчуванням має значення «false», тому Neat вимагає повної підтримки SiMaAI/device zero-copy. Або libcamerasrc не оголошує загальну властивість external-buffer-mode, або встановлена бібліотека пам’яті не може експортувати свої виділення як DMA-буфери.

Виправити.

Забезпечте суворе дотримання принципу нульового копіювання, коли встановлено узгоджені пакети камери та пам’яті. Якщо вам необхідно працювати з пакетом камери, який не підтримує експорт DMA-BUF, явно увімкніть сумісний міст:

simaai::neat::CameraInputOptions camera;
camera.allow_cpu_fallback = true;

В адаптивному режимі керування пам’яттю SiMaAI все ще здійснюється для наступних етапів обробки CVU/MLA. Копіювання даних відбувається лише на рівні інтерфейсу камери, якщо вхідний буфер камери ще не використовується EV74.

13. misconfig.media_caps … libcamerasrc … not-negotiated (-4)

Причина

Запитані налаштування камери не відповідають жодному з режимів, які може забезпечити камера, або апаратна частина/драйвер не налаштували камеру належним чином.

Виправити.

Перевірте, чи відповідають формат, роздільна здатність і частота кадрів за межами Neat заданим параметрам:

gst-launch-1.0 -e libcamerasrc ! \  'video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1' ! \  identity eos-after=30 ! fakesink

Якщо це не вдається, спочатку усуньте проблеми з накладкою, кабелем, драйвером датчика або режимом камери. Використовуйте Modalix DevKit. Посібник з інтерфейсу камери MIPI., щоб підтвердити шлях перевірки .dtbo та libcamera. Якщо перевірка пройдена, порівняйте отримані дані з вашими CameraInputOptions.

14. На зображеннях з камери переважають зелені, фіолетові кольори або помітні інші відтінки.

Причина

Кадр обробляється з неправильним форматом пікселів або кольоровою конвертацією. Найпоширеніша помилка полягає в тому, що кадри з камери у форматі NV12 розглядаються як RGB/BGR байти. Якщо той самий відтінок з’являється до запуску Neat, ймовірно, проблема полягає в налаштуванні ISP камери або в конвеєрі libcamera.

Виправити.

Забезпечте узгодженість форматів захисних ковпачків для камер і попередньої обробки моделей:

  • запитайте рекомендований шлях до моделі camera.format = "NV12";
  • встановити preprocess.color_convert.input_format = PreprocessColorFormat::NV12;
  • уникайте використання CPU для videoconvert/videoscale у виробничій моделі;
  • запустіть короткий gst-launch-1.0 libcamerasrc ... ! videoconvert ! jpegenc лише для базового тестування, щоб визначити, чи існує відтінок, перш ніж... Neat.

15. frame=N output_timeout з навчального посібника про камеру MIPI.

Причина

Жоден із результатів не був переданий до застосунку до завершення часу очікування, встановленого в навчальному посібнику. У графі «камера – модель» це може означати, що камера не передавала кадри, не вдалося узгодити параметри, маршрут моделі все ще запускається або наступний етап, наприклад, BoxDecode, не згенерував вихідні дані.

Виправити.

Спочатку перевірте роботу в режимі, коли використовується лише камера. Потім повторіть виконання навчального посібника, збільшивши час очікування та активувавши виведення інформації на сервері.

python3 share/sima-neat/tutorials/023_run_mipi_camera_model/run_mipi_camera_model.py \  --model /path/to/model.tar.gz --frames 2 --decode none \  --pull-timeout-ms 15000 --print-backend

У виробничому ланцюгу слід використовувати libcamerasrc, neatcamerabridge, коли ввімкнено резервний режим, neatprocesscvu, neatprocessmla та appsink. Для маршрутів BoxDecode також перевірте, чи токен --decode і порогові значення відповідають архіву моделі.

16. Пропускна здатність графа низька, або втрачаються поточні кадри.

Причина

Граф піддається зворотньому тиску. Найпоширеніші причини: цикл вибірки, який не встигає обробляти дані, затримка вихідних зразків, ведення журналу для кожного кадру в критичній секції коду, політика черги, яка не відповідає джерелу даних, або пряма трансляція без чіткої політики відкидання/оновлення даних.

Виправити.

Використовуйте повторно використовуваний Run, а потім чітко визначте політику середовища виконання:

  • Використовуйте RunPreset::Realtime / pyneat.RunPreset.Realtime для обробки даних у реальному часі, коли важлива їхня актуальність.
  • Використовуйте RunPreset::Reliable / pyneat.RunPreset.Reliable для пакетної обробки або обробки окремих файлів, коли важливий кожен вхідний файл.
  • Використовуйте try_push(...), коли програма не повинна блокуватися, якщо черга заповнена.
  • Встановіть значення on_input_drop, щоб підраховувати кількість втрачених даних за stream_id, frame_id, port_name та причиною.
  • Постійно витягуйте дані. Переповнений буфер вихідних даних може уповільнити роботу всього графа.
  • Звільніть або скопіюйте дані перед тим, як виконувати подальші дії, якщо додаток може містити буфери, що зберігаються в середовищі виконання.

Для графів із кількома потоками зберігайте stream_id та frame_id і перевіряйте кількість вихідних даних для кожного потоку. Загальний показник FPS може приховувати проблеми з окремими потоками. Див. Запустіть граф → Налаштуйте пропускну здатність, не вдаючись до самообману..

17. unknown input/output name, no unambiguous default input або no unambiguous default output.

Причина

У графі є іменовані кінцеві точки, і додаток використав неправильну назву або здійснив неправильну операцію push(...) / pull(...), або використав неназвані кінцеві точки в графі, який має більше однієї можливої кінцевої точки.

Виправити.

Перевіряйте імена файлів перед відправленням або отриманням змін:

run = graph.build()
print("inputs:", run.input_names())
print("outputs:", run.output_names())

Потім використовуйте точну назву кінцевої точки:

run.push("image", [tensor])
sample = run.pull("detections", timeout_ms=2000)

Graph("name") — це діагностична мітка. Вона не створює кінцеву точку. Кінцеві точки визначаються на основі nodes.input("name") та nodes.output("name").

18. pull(...) не повертає жодних даних до закінчення встановленого часу очікування.

Причина

Жоден зразок не досяг бажаного результату до закінчення встановленого часу. Можливо, обчислення графа все ще тривають, назва вихідного файлу вказана неправильно, вхідні дані обробляються з обмеженою швидкістю, граф було закрито або сталася помилка в середовищі виконання.

Виправити.

Розділіть випадки тайм-ауту, закриття та помилки. У C++ використовуйте перевантажену версію структурованого виклику:

simaai::neat::Sample sample;
simaai::neat::PullError error;

switch (run.pull("detections", /*timeout_ms=*/1000, sample, &error)) {
case simaai::neat::PullStatus::Ok:
break;
case simaai::neat::PullStatus::Timeout:
// Keep waiting, push more input, or report timeout.
break;
case simaai::neat::PullStatus::Closed:
// End of stream.
break;
case simaai::neat::PullStatus::Error:
std::cerr << error.code << ": " << error.message << "\n";
break;
}

Також перевірте run.last_error(), назви кінцевих точок, тип/формат/розклад вхідних даних, а також чи ваш додаток безперервно отримує дані з кожної гілки вихідних даних.

19. Старі фрагменти коду не працюють через push_timeout_ms, pull_or_throw, обмеження на верхньому рівні input_max_* або boxdecode_original_*.

Причина

Цей фрагмент коду був написаний для використання зі старою версією налаштувань або з приватною/внутрішньою версією. У поточному коді застосунку слід використовувати загальнодоступні API: ModelOptions, RunOptions та Run.

Виправити.

Використовуйте поточні загальноприйняті назви:

  • Використовуйте RunOptions.queue_depth, overflow_policy та try_push(...) для обробки вхідних даних.
  • Замість використання pull_or_throw, використовуйте pull(...) або перевантажену версію PullStatus.
  • Якщо в старому фрагменті коду встановлено поля верхнього рівня input_max_*, перемістіть динамічні обмеження вхідних даних до ModelOptions.preprocess.input_max_width, input_max_height і input_max_depth, і встановлюйте їх лише тоді, коли вам дійсно потрібні межі.
  • Для відображення координат у BoxDecode надавайте перевагу попередньо обробленим метаданим. Не встановлюйте застарілі поля, що містять інформацію про початковий розмір, у нових прикладах.

Якщо на сторінці, з якої ви скопіювали текст, все ще відображається застаріле написання, вважайте, що це застаріла документація, і повідомте про помилку в документації, щоб наступний користувач не натрапив на ту саму проблему.

Взаємодія тензорів і Python.

20. … expects a TensorList; pass [tensor] instead of a single Tensor

Причина

До функції run / push / build було передано простий Tensor (або Sample); API вимагає явного списку — це зроблено навмисно, а не є помилкою.

Виправити.

Оберніть: model.run([tensor]), run.push([tensor]), graph.build([tensor]).

21. image-mode Tensor input requires explicit image format metadata

Причина

Модель, яка приймає зображення як вхідні дані, отримала тензор без вказаного формату пікселів, тому Neat не може інтерпретувати структуру байтів.

Виправити.

Створіть тензор із чітко визначеним форматом: pyneat.Tensor.from_numpy(arr, image_format=pyneat.PixelFormat.RGB).

22. byte_format tensors cannot also specify image_format

Причина

Було створено тензор, який містив як byte_format= (непрозорі байти), так і image_format= (пікселі) — ці формати взаємовиключні.

Виправити.

Оберіть один із варіантів, але не обидва.

Перехід з іншого стеку.

  • «Де мій .engine / .blob / .dlc / .hef — Neat завантажує архів моделі у форматі .tar.gz; це еквівалентний скомпільований артефакт.
  • «Як прив’язати завдання до CUDA-потоку / OpenCL-черги?» — не потрібно цього робити; замість цього відокремте виробника та споживача за допомогою асинхронних операцій push/pull і налаштуйте RunOptions.
  • «Чому пропускна здатність нижча за заявлену?» — зазвичай це пов’язано з навантаженням на хост, нестачею ресурсів у черзі, зворотним тиском на вихід або політикою відхилення, а не з самим прискорювачем. Див. Запустіть граф..

Коли ви не знаєте, що робити: діагностика.

Перш ніж намагатися вгадати, перевірте наступне.

Перевірте конвеєр / запустіть (Python і C++):

  • graph.validate()GraphReport — перевіряє відповідність схеми (графа) вбудованим контрактам перед її створенням. Перевірте її error_code.
  • graph.describe() → отриманий у результаті обчислень конвеєр, представлений у текстовому форматі (назви вузлів + ланцюжок обчислень).
  • run.input_names() / run.output_names() → назви, які приймає середовище виконання під час викликів функцій push/pull.
  • run.start_measurement() / MeasureReport → лічильники, затримка, телеметрія вхідного потоку, час роботи плагіна/периферійного пристрою та, за потреби, показники енергоспоживання.
  • run.json(...) / run.save_json(...) або C++ save_run_json(...) → виконати аналіз після того, як зразки будуть переміщені.
  • NeatError::report() → структурована інформація про помилки, що виникають під час виконання.

Зберіть пакет необхідних матеріалів.

Якщо вам потрібна допомога від іншого розробника або служби підтримки SiMa.ai, надішліть інформацію, яка дозволить іншому розробнику відтворити проблему. Включіть:

  • Інформація про версію/збірку Neat: Python pyneat.build_info() або C++ sima_neat_version(), sima_neat_platform_version() та sima_neat_abi_version();
  • назва моделі, шлях до моделі та спосіб її створення;
  • найменший робочий фрагмент коду, який відтворює помилку;
  • форма вхідних даних, тип даних, структура, формат пікселів, сімейство корисного навантаження та те, чи було створено граф за допомогою механізму надсилання з боку застосунку, чи він належить джерелу;
  • імена кінцевих точок із run.input_names() та run.output_names();
  • GraphReport JSON-дані з graph.validate() або NeatError::report();
  • експортуйте JSON з run.save_json(...) або C++ save_run_json(...) після того, як зразки пройшли через процес обробки;
  • результати вимірювань, коли проблема полягає в затримці, пропускній здатності, втраті пакетів або енергоспоживанні.

Для багатопотокових проблем також слід включати кількість вхідних даних для кожного потоку, кількість прийнятих даних, кількість вихідних даних і кількість відкинутих даних. Загальний показник FPS може приховувати проблеми в окремих потоках.

Під час збору звіту GraphReport, зберігайте поля, які пояснюють, що сталося:

  • error_code та repro_note;
  • pipeline_string;
  • bus;
  • repro_gst_launch та repro_env;
  • dot_paths та caps_dump;
  • boundaries / BoundaryFlowStats, якщо присутні датчики на межах;
  • build_adaptation для усунення проблем, пов’язаних із build(input, ...);
  • Запустіть експорт у форматі JSON для лічильників і показників, які збираються після виконання.

Увімкніть виведення налагоджувальної інформації фреймворку за допомогою SIMA_DEBUG_PROFILE — це список компонентів, розділених комами, для яких потрібно здійснювати трасування. Використовуйте all, щоб увімкнути трасування для всіх компонентів, або вкажіть конкретні компоненти:

export SIMA_DEBUG_PROFILE=all # everything
export SIMA_DEBUG_PROFILE=graph,gst,pipeline # just these areas

Відомі компоненти: pipeline, graph, gst, appsink, inputstream, tensor. За замовчуванням вимкнено (відсутній вивід налагоджувальної інформації).

Виведіть GStreamer граф, щоб візуально перевірити, де виникають проблеми з caps:

export SIMA_GST_DOT_DIR=/tmp # writes .dot graphs on build/failure; default: off

Коди помилок.

NeatErrorGraphReport::error_code / PullError::code) повідомляє про domain.reason код. У фреймворку визначено саме ці коди — увімкніть код, перегляньте повідомлення, щоб отримати більш детальну інформацію.

КодВиникає, коли
io.openНе вдалося відкрити файл або пристрій: відсутній файл, відмовлено в доступі або відсутній пристрій у системі (наприклад, ...). /dev/rpmsg*).
Помилка під час обробки JSON/конфігурації io.parse— зазвичай пов’язана з некоректним контрактом MPK або конфігурацією для певного етапу.
misconfig.pipeline_shapeГеометрія конвеєра або цілісність кінцевої назви є неправильною — наприклад, неправильна кількість вихідних вузлів, наявність циклу, відсутність кінцевого Output або дублювання назви елемента.
misconfig.capsПід час потокової передачі даних не вдалося пройти перевірку фреймворку через помилку в налаштуваннях або порушення умов контракту сусіднього вузла.
misconfig.media_capsУ середовищі виконання GStreamer не вдалося узгодити параметри між сусідніми етапами обробки медіаданих.
misconfig.input_shapeТензор вхідних даних не відповідає вимогам моделі (ранг, просторові розмірності, кількість каналів).
misconfig.runtime_abi_mismatchНесумісність ABI плагіна фреймворку/середовища виконання — зазвичай спричинена змішуванням pyneat та артефактів середовища виконання.
build.plugin_missingОбов’язково. GStreamer елемент або кодек недоступний.
build.property_invalidНазва або значення властивості елемента GStreamer є недійсними.
build.pipeline_syntaxСпеціальний GStreamer фрагмент містить синтаксичну помилку.
build.parse_launchНе вдалося більш конкретно класифікувати помилку gst_parse_launch.
runtime.pullОперацію завантаження не вдалося виконати, і немає більш конкретного коду помилки, що вказує на причину.
infra.dispatcher_unavailableНе вдалося отримати доступ до диспетчера MLA/EV74/A65 — не завантажено програмне забезпечення, відсутня ліцензія або виникла апаратна несправність. Резервне копіювання за допомогою ЦП неможливе.

Це коротка схема для усунення несправностей. Використовуйте повний каталог кодів помилок для кожного коду та назв констант C++/Python.