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

Запуск / здійснення обчислень

Якщо ви вперше використовуєте SiMa.ai Neat, найшвидший спосіб отримати прогноз – це два кроки: завантажте модель, а потім запустіть її.

  1. Завантажте скомпільований архів моделі (.tar.gz) за допомогою Model.
  2. Викличте model.run(inputs, timeout_ms), щоб виконати обчислення синхронно та отримати тензори результатів.

Ось повний процес для однієї моделі. Використовуйте Graph, коли однієї моделі недостатньо: об’єднуйте етапи, відокремлюйте виробників і споживачів за допомогою асинхронних операцій push / pull або керуйте чергами.

Які припущення лежать в основі наведених прикладів?

Використовуйте фрагменти коду на цій сторінці як окремі елементи, а не як цілісний застосунок. Для запуску застосунку також потрібно:

  • скомпільований артефакт моделі, створений за допомогою Model Compiler, скопійований на пристрій, на якому працює Neat;
  • Python: import pyneat;
  • C++: #include "neat.h";
  • Збірки C++: find_package(SimaNeat REQUIRED CONFIG) та SimaNeat::sima_neat;
  • зображення або тензор, який відповідає специфікаціям моделі.

Замініть приклади шляхів, наприклад resnet_50_model.tar.gz, на шлях до вашого артефакту моделі. Технічні характеристики є своєрідним контрактом; перевірте їх, перш ніж використовувати реальні вхідні дані.

Оберіть шлях до середовища виконання.

Використовуйте найменшу площу, яка підходить для виконання роботи. Не встановлюйте жодних платних пунктів пропуску.

Якщо вам потрібно...ВикористовуйтеЧому?
Запустіть один скомпільований зразок моделі один раз.Model.run(...)Найшвидше тестування за допомогою диму для перевірки артефакту, вхідних і вихідних даних.
Створіть модель із вузлами застосунків.GraphВказує межу та робить топологію видимою.
Виконайте один запит/отримайте одну відповідь для графа.Graph.run(...)Одноразове виконання графа без керування тривалим процесом.
Підтримуйте актуальність графа для великої кількості вхідних даних.graph.build(...)RunПовторно використовує середовище виконання та надає доступ до функцій надсилання/отримання, закриття, очищення та вимірювання.
Налаштуйте декілька потоків або оптимізуйте максимальну пропускну здатність.RunOptions, try_push(...), MeasureReportПолітика черги та лічильники показують, що саме відбувалося під час навантаження.

Інструкції щодо налаштування, архіви моделей і контекст команд можна знайти в Навчальні матеріали – переліку попередніх перевірок.

Запустіть модель безпосередньо.

Завантажте модель і викличте run(...). Вона виконується синхронно. Відсутній Graph, відсутній Run, відсутній цикл середовища виконання.

simaai::neat::Model model("resnet_50_model.tar.gz");

cv::Mat frame = /* your OpenCV BGR frame */;
simaai::neat::Tensor input = simaai::neat::Tensor::from_cv_mat(
frame,
simaai::neat::ImageSpec::PixelFormat::BGR,
simaai::neat::TensorMemory::CPU);

simaai::neat::TensorList outputs = model.run(
simaai::neat::TensorList{input},
/*timeout_ms=*/1000);

// outputs[0] holds the first result; read its bytes with outputs[0].map_read().

У Python передайте список або кортеж вхідних даних. model.run([tensor]) означає «один вхідний тензор для моделі», а не «додати розмірність пакета».

Щоб переглянути повну, робочу версію, див. Запустіть свою першу модель..

Створіть граф, коли вам потрібно більше.

Graph об’єднує один або кілька етапів моделі разом із вашими власними вузлами в потік, який виконується в Run. Використовуйте його, коли вам потрібно:

  • об’єднуйте кілька моделей або етапи попередньої/пост-обробки;
  • розділіть виробників і споживачів за допомогою асинхронного механізму push / pull; або
  • керуйте чергами, обробляйте переповнення та збирайте статистичні дані за допомогою RunOptions.

Виконайте алгоритм для графа один раз.

Для виконання запитів/отримання відповідей використовуйте Graph.run(...).

simaai::neat::Model model("resnet_50_model.tar.gz");

simaai::neat::Graph graph("classifier");
graph.add(simaai::neat::nodes::Input("image"));
graph.add(model);
graph.add(simaai::neat::nodes::Output("classes"));

cv::Mat frame = /* your frame (RGB/BGR as configured) */;
auto out = graph.run(std::vector<cv::Mat>{frame});

Створіть багаторазовий сценарій виконання.

Використовуйте повторно використовуваний Run, коли потрібно відокремити виробників і споживачів, контролювати чергу або виконувати операції вводу-виводу та обчислення паралельно. Використовуйте push(...) / pull(...) разом із RunOptions, щоб налаштувати чергу та поведінку при відхиленні.

simaai::neat::Model model("resnet_50_model.tar.gz");

simaai::neat::Graph graph("classifier");
graph.add(simaai::neat::nodes::Input("image"));
graph.add(model);
graph.add(simaai::neat::nodes::Output("classes"));

cv::Mat frame = /* your frame */;

auto run = graph.build();
run.push("image", std::vector<cv::Mat>{frame});
auto out = run.pull("classes", /*timeout_ms=*/1000);

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

C++ і Python повертають фігури.

Інтерфейси API узгоджені, але Python використовує явні списки або кортежі, щоб розрізняти один вхідний порт від кількох вхідних портів. Одиночний Tensor або Sample навмисно відхиляється.

ОпераціяПовернення в C++Повернення в PythonПримітки
Model::run(TensorList) або Model::run(std::vector<cv::Mat>).TensorListmodel.run([tensor]) повертає список тензорів.Використовуйте для звичайного введення тензорів/зображень.
Model::run(Sample)Samplemodel.run([sample]) повертає Sample.Використовуйте, коли вам потрібні зразки метаданих або набори даних.
Graph::run(TensorList) або Graph::run(std::vector<cv::Mat>)TensorListgraph.run([tensor]) повертає список тензорів.Одноразовий запит/відповідь для графа.
Graph::run(Sample)Samplegraph.run([sample]) повертає Sample.Використовуйте для введення даних графа, що базуються на зразках.
Run::run(TensorList) або Run::run(std::vector<cv::Mat>).TensorListrun.run([tensor]) повертає список тензорів.Можливість повторного використання запитів/відповідей під час активної сесії Run.
Run::run(Sample)Samplerun.run([sample]) повертає Sample.Використовуйте для пакетів, ідентифікаторів потоків, ідентифікаторів кадрів або метаданих.
Run::pull(...)std::optional<Sample>Sample або NoneNone означає, що жоден зразок не було отримано до закінчення встановленого часу або вихідний потік закрито.
Run::pull_tensors(...)TensorListСписок тензорів.Використовуйте, коли вам потрібні лише дані у форматі тензора.
Run::pull_samples(...)SampleSampleВикористовуйте, коли відсутність даних є винятком, і вам потрібен чіткий, стандартизований вивід.

Ознайомтеся з основними поняттями.

  • Модель: завантаження архіву моделі та фрагментів графа, керованих моделлю.
  • Граф: збірка, перевірка та точка входу для запуску/створення.
  • Запустіть граф.: параметри середовища виконання, цикли типу «push/pull», багатопотокова пропускна здатність і вимірювання.
  • Вузол: атомарні етапи, попередньо створені групи та граничні вузли графа.
  • Тензор і зразок.: корисне навантаження проти метаданих.

Навчальні матеріали