하나의 그래프에서 여러 스트림 실행
| 필드 | 값 |
|---|---|
| 범주 | 그래프 및 파이프라인 |
| 난이도 | 고급 |
| 예상 소요 시간 | 20-25 minutes |
| 레이블 | graph, multistream, scheduler, join |
이전 장에서는 하나의 입력을 밀어 넣고 하나의 출력을 가져왔습니다. 실제 멀티 카메라 및 병렬 분기 시스템은 더 복잡합니다. 여러 스트림이 독립적으로 진행되며, 다운스트림에서 이를 사용하기 전에 결과가 올바르게 다시 결합되어야 합니다. 이 장에서는 이를 결정적으로 수행하는 결합 기본 요소인 두 개의 명명된 입력과 하나의 명명된 출력을 가진 결합 그래프를 보여줍니다. 이 그래프는 양쪽 모두 일치하는 프레임을 생성했을 때만 번들을 출력합니다.
밀어 넣는 모든 샘플에는 stream_id와 frame_id가 포함됩니다. 결합 정책 ByFrame은 두 개의 명명된 입력(left 및 right)이 동일한 frame_id를 가진 샘플을 모두 전달할 때까지 기다린 다음 정확히 하나의 결합된 번들을 출력합니다. 마지막에는 결합 그래프를 구축하고, 두 개의 입력으로 결정적인 스트림/프레임별 워크로드를 분산시키고, 결합된 번들을 가져와 출력 개수와 각 번들에 두 개의 필드가 포함되어 있는지 확인합니다.
둘러보기
결합 그래프 구축
graphs::Combine (C++) / graphs.combine (Python)은 일반적인 공개 Graph 조각을 반환합니다. 모양 외에는 특별한 점이 없습니다. 즉, 두 개의 명명된 입력, 하나의 명명된 출력 및 결합 정책이 있습니다. 입력 이름으로 ["left", "right"]를, 출력 이름으로 "combined"를 전달하고, 프레임 ID 일치를 선택하기 위해 CombinePolicy.ByFrame을 사용합니다. describe()를 출력하면 결과 토폴로지가 표시되고, build()는 설명을 실행 가능한 핸들로 변환합니다. 그래프는 기본적으로 비동기적으로 실행되므로 각 스트림은 자체적으로 진행할 수 있습니다.
출력 큐는 제한됩니다. 전체 워크로드를 위한 충분한 큐 공간을 할당하는 대신 이 예제에서는 다음 쌍을 밀어 넣기 전에 각 결합된 번들을 가져옵니다. 프로듀서와 컨슈머가 함께 진행되므로 프레임 수가 증가함에 따라 메모리 사용량이 제한됩니다.
CombinePolicy.ByFrame은 Sample.frame_id를 기준으로 일치합니다. CombinePolicy.ByPts는 프레임이 깔끔한 프레임 인덱스를 공유하지 않을 때 프레젠테이션 타임스탬프(Sample.pts_ns)를 기준으로 일치시키는 대체 방법입니다.
simaai::neat::Graph graph = simaai::neat::graphs::Combine({"left", "right"}, "combined",
simaai::neat::CombinePolicy::ByFrame);
std::cout << graph.describe() << "\n";
const int expected = streams * frames;
simaai::neat::Run run = graph.build();