본문으로 건너뛰기

실행 / 추론

SiMa.ai Neat을 처음 사용하신다면, 예측을 수행하는 가장 간단한 방법은 다음과 같습니다. 모델을 로드한 다음 실행합니다.

  1. 컴파일된 모델 아카이브(.tar.gz)를 Model을 사용하여 로드합니다.
  2. model.run(inputs, timeout_ms)를 호출하여 동기적으로 추론을 실행하고 출력 텐서를 반환받습니다.

이것이 단일 모델에 대한 전체 워크플로우입니다. 하나의 모델만으로는 충분하지 않은 경우, 여러 단계를 연결하거나, 비동기 push / pull을 사용하여 프로듀서와 컨슈머를 분리하거나, 큐를 제어할 수 있는 Graph를 사용합니다.

예제에서 가정하는 사항​

이 페이지의 코드 조각을 전체 애플리케이션이 아닌 템플릿으로 사용하십시오. 실행 가능한 애플리케이션에는 다음이 필요합니다.

  • 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런타임을 재사용하고 push/pull, close, drain 및 측정 기능을 제공합니다.
여러 스트림 또는 최대 처리량 조정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});

재사용 가능한 실행 환경 구축​

프로듀서와 컨슈머를 분리하고, 큐 관리를 제어하거나, I/O와 컴퓨팅을 동시에 처리하려는 경우 재사용 가능한 Run을 사용합니다. 큐 관리 및 삭제 동작을 조정하려면 RunOptions와 함께 push(...) / pull(...)을 사용합니다.

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을 반환합니다.번들, 스트림 ID, 프레임 ID 또는 메타데이터에 사용합니다.
Run::pull(...)std::optional<Sample>Sample 또는 NoneNone은 타임아웃 전에 샘플이 도착하지 않았거나 출력이 닫혔음을 의미합니다.
Run::pull_tensors(...)TensorList텐서 목록텐서 페이로드만 필요한 경우 사용합니다.
Run::pull_samples(...)SampleSample부재가 예외적인 경우이며 엄격한 샘플 출력이 필요한 경우 사용합니다.

개념 학습​

  • 모델: 모델 아카이브 로드 및 모델 기반 그래프 조각.
  • 그래프: 어셈블리, 검증 및 실행/빌드 진입점.
  • 그래프 실행: 런타임 옵션, 푸시/풀 루프, 다중 스트림 처리량 및 측정.
  • 노드: 원자적 단계, 미리 빌드된 그룹 및 그래프 경계 노드.
  • 텐서 및 샘플: 페이로드 대 메타데이터 엔벨로프.

튜토리얼​