[q] npu 가속 지원 연산자 목록

안녕하세요. 보다에이아이 최희준입니다.
Discourse 채널로는 처음 인사드립니다.

다름이 아니오라, NPU 가속 지원 연산자 목록에서 지원하지 않는 연산자는 어떤식으로 연산이 진행되는지 문의드립니다.

예를 들어, ONNX에서 지원하는 Pool 연산자 중 GlobalAveragePool은 NPU 가속 연산자 중에는 없는 것으로 확인됩니다. 이 때, 연산이 어떻게 이루어지는지 궁금합니다. (NPU가 가능한 연산을 진행하고, 지원하지 않는 연산자는 CPU로 넘기는지 여부)

지원하지 않는 연산자 전까지 Node를 쪼개어 ONNX와 NPU 각각 Output을 확인할 수 있지만, 정확하게 어떠한 동작이 이루어지는지 문의드립니다.

감사합니다.

넵 희준님 안녕하세요!

NPU 가속 지원자 연산자 목록에 없는 연산자는 CPU에서 동작하게 됩니다. 따라서 CPU에서 동작하는 연산자가 모델의 중간에 있는 경우는 추가 IO 발생으로 전체 모델 수행 시간이 많이 증가할 수도 있습니다.

감사합니다.

답변 감사합니다.

그렇다면, ONNX를 일부 연산 직전까지 제한해서 새롭게 export한 후, ONNX 파일을 각각

  1. CPU RUN (전체 연산 모두 CPU에서 동작)
  2. NPU RUN (NPU에서 대다수 동작, 지원하지 않는 연산자 일부 연산자 CPU에서 동작)

한다면, 동일한 output이 나와야할 것 같은데 다른 결과가 나와서 새롭게 문의를 드리게 될 것 같습니다.

저는 비전에서 활용할 수 있는 딥러닝 모델을 활용하고 있고, 동일하게 pre-processing한 이미지를
onnx로 한 번, npu로 한 번 run하여 테스트한 결과, 동일한 shape으로 output이 나오고 있지만,
내부를 이루는 tensor 값이 서로 크게 상이한 상황입니다. (NMS 등의 post-processing 이전입니다.)

일부 연산이 CPU에서 수행됐다면 조금은 느려지더라도 문제 없이 동일한 구조의 tensor를 기대할 수 있을거라 생각했는데, 그렇지 않아 의아한 상황입니다.

확인이 필요하셔서 onnx 파일까지 업로드해야한다면 JIRA로 채널을 변경해서 재문의드리도록 하겠습니다!

감사합니다.

넵 동일한 onnx 파일 (int8 quantized model)이라면 이론적으로는 CPU, GPU, NPU 어디서 inference를 수행하든 같은 결과가 나와야 합니다. 말씀하신 것을 보면 최종적인 결과값은 같게 나오는 것 같습니다. 다만 중간 과정에서의 tensor output 값은 다를 수가 있습니다. 관련해서는 아래 FAQ 내용을 참고해주시면 감사하겠습니다.

  • Numerical Semantics(이하 NS)이란 용어로 설명할 수 있다. NS란 알고리즘의 수학적 의미(Semantics)를 뜻한다. 예를 들어 “TensorRT는 NS를 유지하는 조건 하에 최대한 최적화한다.” 라는 식으로 사용된다. Nvidia TensorRT Userguide에서도 이 현상을 설명하기 위해 사용한다.
  • NS가 달라지는 대표적인 예로 FMA에서 accumulate순서가 있다. Partial sum이 유한한 bit수를 갖는다면 accumulate순서에 따라 FMA연산 결과가 달라지는 경우가 수학적으로 생길 수밖에 없다. 다만 이 값이 딥러닝 알고리즘이 행하고자 했던 바와 의미를 해치지 않는 수준 내에서 값의 차이를 만들때는 bit-exactly matching은 되지 않지만 NS는 유지된다고 표현한다.
  • Torch와 ONNXruntime의 결과를 비교하는 경우에 이 현상이 나타날 수 있다. ONNXruntime은 compile을 하지는 않지만 Torch 구현에 속도를 빠르게 하기 위한 여러 linear algebra 알고리즘 및 최적화 방법들이 들어가 있다. 이 때문에 Torch도 NS를 유지할 뿐 항상 동일한 FMA accumulation 연산순서를 보장하지는 않는다

답변 감사합니다.

추가적으로 문의가 생기면 새롭게 글 남기도록 하겠습니다. :slight_smile:

1 Like