Усунення несправностей
Кожен запис має формат: Симптом → Причина → Вирішення. Заголовки розділів із симптомами містять точні рядки помилок — перегляньте цю сторінку (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 > 0 (з boxdecode)
Параметр 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(); GraphReportJSON-дані з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
Коди помилок.
NeatError (і GraphReport::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.