본문 바로가기

공부/컴퓨터

[PyTorch] x86 CPU에서 양자화(Quantization) 관련 실행시 에러가 나는 경우 - Didn't find engine for operation quantized::conv_prepack NoQEngine

문제 상황 발생

  • Kubernetes에서 AI 엔진을 돌리는데, GPU로 사용할때는 문제가 없었는데...
  • CPU를 사용하도록 해서 동작시키니 동작하지 않는 문제가 발생

에러 메세지

  • 아래와 비슷한 문제가 발생하면서 동작하지 않는 문제가 있었다.
  • Didn't find engine for operation quantized::conv_prepack NoQEngine
  • conv_prepack뿐만 아니라, linear_prepack 라는 에러가 발생하기도 한다.
  • 알고 봤더니, CPU를 사용할 때는 Quantization 과정에서 문제가 발생한것이었다.

분석하기

소스에서 에러 메세지 찾기

  • 해당 에러를 출력하는 코드를 찾아보면 아래와 같다.
  • 관련링크 : qconv_prepack.cpp

  • 위 그림에서 코드의 제일 윗부분부터 확인해 보면
    • _run(...) 함수를 실행 시킬때,
    • USE_FBGEMM 값이 정의되어 있으면, FBGEMM 엔진을 사용해서 처리하고,
    • USE_PYTORCH_QNNPACK 값이 정의되어 있으면, QNNPACK 엔진을 이용해서 처리 한다.
    • 둘다 값이 없다면 TORCH_CHECK에 의해서 conv2d_prepack를 실행시킬 엔진을 찾을 수 없다면서 에러를 낸다.
  • 즉, 두 값 중에 하나라도 누가 정의를 했으면 잘 동작할텐데, 그 어느것도 설정이 되지 않아서 문제가 된것이다.

FBGEMM 혹은 QNNPACK 은 무엇인가?

  • 설명에 나와 있다시피, Quantization을 지원하는 두개의 backend가 있는데, x86용으로는 FBGEMM, arm용으로는 QNPACK이 있다고 한다.
  • 나는 x86용에서 테스트를 했으므로 backend 로는 자동으로 FBGEMM이 사용되었어야 하는데 #ifdef USE_FBGEMM 부분이 제대로 동작하지 않아, TORCH_CHECK 부분에서 에러가 발생한 것이었다.

그렇다면 내 환경에서는 왜 FBGEMM이 사용되지 않았을까?

  • FBGEMM 의 홈페이지에 찾아가 보자.
  • 관련링크 : https://github.com/pytorch/FBGEMM
  • FBGEMM은 페이스북에서 만든 행렬처리용 라이브러리다.그리고 Caffe2 와 PyTorch의 양자화 연산에 사용된다고 적혀 있다.

  • 그 아래의 내용을 보면 FBGEMM의 디펜던시에 대해서 설명하고 있는데, gcc5+avx2를 instruction set을 지원해야 한다고 한다. 또한 CPU instruction set을 확인할때는 cpuinfo 정보를 활용하여 runtime에 확인한다고 한다.

  • 즉, PyTorch에서 양자화 관련 기능을 사용할때 x86에서는 FBGEMM 라이브러리를 사용하지만, 그 라이브러리도 CPU 상태 정보를 볼 수 있는 cpuinfo 를 활용해서 avx2가 지원하는 경우에만 동작하도록 되어 있다는 뜻이다.
  • 사실 해당 내용은 PyTorch 홈페이지의 QUANTIZATION 관련 설명에도 avx2 관련 내용이 이미 나와 있는데, 빙빙 둘러 온 것이다.
  • 관련링크 : https://pytorch.org/docs/stable/quantization.html

그렇다면 avx2가 지원되는 CPU는 어떻게 확인하면 될까?

  • 사실 요즘 Intel CPU는 모두 지원한다고 보면 된다.
  • AVX를 지원하는 Intel CPU들은, 샌디브릿지, 아이비브릿지이며
  • AVX2를 지원하는 Intel CPU들은, 하스웰, 브로드웰, 스카이레이크, 카비레이크 다.
  • 하지만 위의 패밀리 이름으로는 꼭 믿을게 못되는게, 같은 패밀리라도 CPU에 따라서 지원되고 안되고 하더라.
  • 리눅스에서는 cat /proc/cpuinfo를 쳐 보면 CPU 관련 정보가 주루룩 나오는곳에 avx 관련이 있는지 볼 수 있다.
  • 옛날글 [Vultr] VPS Instance Type 별 CPU 속도 확인 의 사진을 아래에 붙여 둠.

그래서 어떻게 해결했냐고?

  • 좀 더 좋은 CPU가 달린 Node에 Pod를 배치했다.
  • 오래된 CPU가 있는 장비에는 다른 Pod들을 배치하면 되니깐. ㅎㅎ