AI/Nvidia Jetson

Jetson에서 onnxruntime 사용 시 pthread_setaffinity_np failed 에러 해결하기

검정비니 2024. 12. 18. 14:30
728x90
반응형

Nvidia 젯슨 플랫폼은 엔비디아에서 만든 엣지 디바이스 플랫폼으로 GPU를 엣지 디바이스에서도 사용하기 위한 프로젝트들을 위한 고성능 엣지 디바이스 플랫폼이다.

 

최근 Jetson 기기에서 onnxruntime을 사용해서 모델을 포팅하려던 중 다음과 같은 에러를 마주하게 되었다:

2024-12-17 08:24:58.694297027 [E:onnxruntime:Default, env.cc:251 ThreadMain] pthread_setaffinity_np failed for thread: 531, index: 6, mask: {7, 39, }, error code: 22 error msg: Invalid argument. Specify the number of threads explicitly so the affinity is not set.
2024-12-17 08:24:58.698247687 [E:onnxruntime:Default, env.cc:251 ThreadMain] pthread_setaffinity_np failed for thread: 532, index: 7, mask: {8, 40, }, error code: 22 error msg: Invalid argument. Specify the number of threads explicitly so the affinity is not set.

 

해당 에러는 보통 CPU 코어보다 많은 워커 스레드가 할당되면서 onnxruntime 내부에서 코어와 스레드 간의 매칭이 실패하게 되면서 발생하는 에러이다.

보통은 아래와 같이 세션 옵션에서 가용 스레드 수를 제한함으로써 문제를 해결하곤 한다:

session_options = ort.SessionOptions()
session_options.intra_op_num_threads = 1
session_options.inter_op_num_threads = 1
sess = ort.InferenceSession(cpu_model_path, session_options)

 

그런데 젯슨에서는 위와 같이 세션 옵션을 주면 오히려 알수 없는 C++ 에러가 발생하면서 프로세스가 죽어버리는 것을 확인하였다.

문제가 뭘까 고민하던 중, 사용 중이던 젯슨의 가용 CPU 코어 8개 중 2개가 off 상태인 것을 확인하였다.

아무래도 엣지 디바이스인 만큼 저전력이나 전력 효율성 등을 위해 젯슨에서는 기본적으로 일부 코어를 off 상태로 만들어 놓는다. 이 문제 해결을 위해 jtop을 통해서 전력모드를 MAXN으로 변경하였고, 위의 세션 옵션 없이 코드를 실행하였더니 정상적으로 동작하는 것을 확인하였다.

 

반응형