비동기 방식과 동기 방식의 타이밍 모델
Graph와 Run은 작업을 실행하는 두 가지 방법을 제공합니다.
- 단일 실행:
Graph.run(input, ...)은 입력을 전달하고 한 번의 호출로 출력을 기다립니다. 입력이 없는Graph.run()은 EOS(End of Stream)에 도달할 때까지 소스에서 소유한 그래프를 실행합니다. - 재사용 가능한 실행:
Graph.build(...)는 활성 상태의Run을 반환합니다. 애플리케이션은 입력을 전달하고, 출력을 가져오고, 입력을 닫고, 데이터를 비우고, 측정하고, 실행을 중지합니다.
두 모드 모두 동일한 Graph 계획과 동일한 하드웨어를 사용합니다. 차이점은 루프를 누가 소유하느냐입니다.
단일 실행 모드
하나의 입력이 있고 가장 짧은 올바른 경로를 원할 때 단일 실행 모드를 사용합니다.
simaai::neat::Graph graph("classifier");
graph.add(simaai::neat::nodes::Input("image"));
graph.add(model);
graph.add(simaai::neat::nodes::Output("classes"));
simaai::neat::TensorList out = graph.run(
simaai::neat::TensorList{image_tensor});
소스가 소유한 그래프의 경우, 입력 없이 Graph.run()을 호출합니다.
simaai::neat::Graph graph("file_job");
graph.add(source_fragment);
graph.add(model);
graph.add(sink_fragment);
graph.run(); // Blocks until EOS or error.
다음과 같은 경우에 원샷 모드를 사용하세요.
- 간단한 테스트;
- 짧은 검증 실행;
- 완료될 때까지 실행되어야 하는 소스에서 관리하는 작업;
- 장기간 유지되는 런타임 핸들을 관리하지 않아야 하는 코드.
재사용 가능한 실행 모드
애플리케이션이 루프를 관리하는 경우 Graph.build(...)를 사용하세요.
auto run = graph.build();
while (have_more_inputs()) {
run.push("image", simaai::neat::TensorList{next_tensor()});
if (auto out = run.pull("classes", /*timeout_ms=*/0)) {
consume(*out);
}
}
run.close_input();
while (auto out = run.pull("classes", /*timeout_ms=*/1000)) {
consume(*out);
}
run.close();
다음과 같은 경우 재사용 모드를 사용하세요.
- 실시간 비디오, RTSP 또는 카메라 입력;
- 애플리케이션이 속도를 제어하는 스트림 처리;
- 다중 입력 또는 다중 출력 그래프;
- 처리량 테스트;
- 측정, 내보내기, 비우기 및 중지 제어.