MXNet 혹은 Gluon으로 모형을 개발할때 반드시 맞닥뜨릴 한가지 이슈

최근 한달 동안 Gluon으로 이런 저런 모형을 개발하면서 MXNet에 대해서도 어느정도 경험을 쌓았고, 이런 저런 상황을 맞닥들이면서 이슈 해결도 해왔다.

이 도구를 사용하면서 가장 황당했던 부분은 모델링 코드를 작성한 이후 막 학습을 하기 시작했을때 Python 프로세스 자체가 죽어버리는 경험이었다. 주로 주피터 노트북에서 작업을 하기 때문에 그러한 상황시 주피터 로그 메시지를 확인하곤 하는데 아래와 같은 메시지를 떨구며 프로세스가 주로 죽어버린다.

사실 MXNet 백엔드를 사용하면서 많은 분들이 이러한 경험을 할 수 있는데, 이는 MXNet 백엔드로 모형을 개발하는 방식에 대해서 익숙하지 않아서가 원인이다.

위에서 이야기하는것 처럼 MXNET_ENGINE_TYPE 환경 변수를 NaiveEngine으로 하여 상세한 로그를 보면 이슈를 확인할 수 있고 게다가 프로세스가 절대 죽지 않는다. 따라서 모형을 개발할 당시엔 반드 시 NaiveEngine으로 진행해야 황당한 경우를 피할 수 있고 디버깅을 하기 쉬워진다. 아무것도 지정하지 않으면 GPU마다 별도의 스레드풀을 생성하는 ThreadedEnginePerDevice 모드로 동작하게 되며 갑작스런 메모리 사용량 증가 등 여러 이슈에 프로세스가 죽어버리는 현상을 일으키게 된다.

결국 MXNet백엔드로 모형을 개발하는 방식은 아래와 같다.

  1. NaiveEngine으로 설정해서 코드를 구현한다.
  2. 1에폭 정도 테스트하면서 별도의 에러가 나지 않으면  ThreadedEnginePerDevice 로 변경해 학습을 계속 진행한다.

위와 같은 과정으로 모형을 개발하면서 갑작스럽게 프로세스가 죽는 현상을 겪지 않았다. 혹자는  NaiveEngine으로 개발하고 학습하면 안되는지 생각할 수 있는데, NaiveEngine은 일종의 디버깅 모드로 동작해 상당히 느린 학습 속도를 보인다. 특히나 멀티 GPU에서 동작할때 1개의 GPU를 사용할때와 같은 마법과 같은 효과를 보여준다.

 

 

CC BY-NC 4.0 MXNet 혹은 Gluon으로 모형을 개발할때 반드시 맞닥뜨릴 한가지 이슈 by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.