TensorRT’s programming model

Published:

TensorRT’s programming model

TensorRT 는 크게 두가지 단계로 동작한다.

  • Build Phase
    • Model definition 을 TensorRT에 제공하고 타겟 GPU에 이를 최적화하는 단계이다.
  • Runtime Phase
    • 최적화된 모델을 Inference 하는 단계이다.

Build Phase

Build phase에서 가장 상위단계의 인터페이스는 Builder이다. Builder는 모델 최적화와 Engine을 만드는것을 담당한다.

Engine은 아래 세가지 단계를 통해 만들어진다.

  • network definition 만들기
    • NetworkDeifinition interface(C++, Python)를 이용하여 모델 정보를 만든다. ONNX format 으로 넘어온 모델을 parser를 이용하여 파싱하여 모델을 불러올 수도 있고, 레이어를 한층한층 만들 수도 있다.
  • builder configuration 정하기
    • BuilderConfig interface (C++, Python) 를 이용하여 어떻게 모델을 최적할 것인지를 정한다. 여러 옵션이 있으나 메모리와 런타임 속도와는 반비례하니, 잘 선택해야한다.
  • builder를 호출하여 engine 을 만들기
    • builder는 dead computation을 없애거나 여러 operation 들을 최적화하여 GPU에 가장 적합하게 해준다.
    • precision 등을 낮출 수도 있다.
    • builder는 engine을 serialized form으로 만드는데 이를 plan이라 부른다. plan은 바로 deserialized 될 수도 있고, 디스크에 저장도 가능한다.

유의사항

  • 만들어진 Engine은 만들어질 때 당시의 TensorRT 버전과 GPU에 특정지어진다.
  • TensorRT 의 네트워크 정의는 deep-copy가 이뤄지지 않기 때문에 build phase가 끝날 때 release 해줘야한다
  • builder를 돌릴 때는 다른 GPU사용하는것을 비추한다.

Runtime Phase

가장 상위단계의 인터페이스는 Runtime (C++, Python) 이다.

Runtime phase는 아래 순서로 이루어져있다.

  • Deserialize a plan to create an engine
    • Engine interface (C++, Python) 는 최적화된 모델을 의미한다. 이를 이용하여 input, output등의 정보를 알수가 있다.
  • Create an execution context from the engine
    • ExecutionContext interface (C++, Python) 는 engine에서 만들어진다. 이를 이용하여 inference를 발생 시킬 수가 있다.
    • input 과 output buffer를 셋업해주어야 한다. (CPU, GPU 둘다 가능)

그 다음은 아래 단계가 반복적으로 동작한다.

  • Populate input buffers for inference
    • 한번 buffer가 셋업이 되면 inference는 synchronously 하게 또는 asynchronously하게 발생 될 수 있다.
  • Call enqueue() or execute() on the execution context to run inference