실행 / 추론
SiMa.ai Neat을 처음 사용하신다면, 예측을 수행하는 가장 간단한 방법은 다음과 같습니다. 모델을 로드한 다음 실행합니다.
- 컴파일된 모델 아카이브(
.tar.gz)를Model을 사용하여 로드합니다. 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>) | TensorList | model.run([tensor])는 텐서 목록을 반환합니다. | 일반 텐서/이미지 입력에 사용합니다. |
Model::run(Sample) | Sample | model.run([sample])는 Sample을 반환합니다. | 샘플 메타데이터 또는 번들이 필요한 경우 사용합니다. |
Graph::run(TensorList) 또는 Graph::run(std::vector<cv::Mat>) | TensorList | graph.run([tensor])는 텐서 목록을 반환합니다. | 단일 실행 그래프 요청/응답입니다. |
Graph::run(Sample) | Sample | graph.run([sample])는 Sample을 반환합니다. | 샘플 기반 그래프 입력에 사용합니다. |
Run::run(TensorList) 또는 Run::run(std::vector<cv::Mat>) | TensorList | run.run([tensor])는 텐서 목록을 반환합니다. | 활성 Run에서 재사용 가능한 요청/응답입니다. |
Run::run(Sample) | Sample | run.run([sample])는 Sample을 반환합니다. | 번들, 스트림 ID, 프레임 ID 또는 메타데이터에 사용합니다. |
Run::pull(...) | std::optional<Sample> | Sample 또는 None | None은 타임아웃 전에 샘플이 도착하지 않았거나 출력이 닫혔음을 의미합니다. |
Run::pull_tensors(...) | TensorList | 텐서 목록 | 텐서 페이로드만 필요한 경우 사용합니다. |
Run::pull_samples(...) | Sample | Sample | 부재가 예외적인 경우이며 엄격한 샘플 출력이 필요한 경우 사용합니다. |
개념 학습
- 모델: 모델 아카이브 로드 및 모델 기반 그래프 조각.
- 그래프: 어셈블리, 검증 및 실행/빌드 진입점.
- 그래프 실행: 런타임 옵션, 푸시/풀 루프, 다중 스트림 처리량 및 측정.
- 노드: 원자적 단계, 미리 빌드된 그룹 및 그래프 경계 노드.
- 텐서 및 샘플: 페이로드 대 메타데이터 엔벨로프.