반응형
문제 상황 발생
- 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 은 무엇인가?
- 그렇다면 FBGEMM 혹은 QNNPACK은 무엇인가?
- 관련링크 : https://pytorch.org/docs/stable/quantization.html
- 설명에 나와 있다시피, 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 속도 확인 의 사진을 아래에 붙여 둠.
- 인텔 홈페이지에 가서 제품명을 쳐서 검색해도 알 수 있다.
- 관련링크 : https://ark.intel.com/content/www/us/en/ark.html
- 아래 그림은 i7-7500U 를 검색했을때 나오는 일부이다.
그래서 어떻게 해결했냐고?
- 좀 더 좋은 CPU가 달린 Node에 Pod를 배치했다.
- 오래된 CPU가 있는 장비에는 다른 Pod들을 배치하면 되니깐. ㅎㅎ
반응형