python2 multiprocessing 과 tensorflow
celery로 tensorflow를 실행시켜 비동기 백그라운드로 처리하려고 생각했었다.
flask와 celery worker를 각각 실행한 다음 tensorflow의 메서드를 호출했을 때 다음과 같은 에러가 발생했다.
tensorflow/stream_executor/cuda/cuda_driver.cc:1216] failed to enqueue async memcpy from host to device: CUDA_ERROR_NOT_INITIALIZED; GPU dst: 0x130a30d900; host src: 0x205c3d500; size: 4=0x4
검색을 하니 2017년도 즈음 되는 글이 나왔는데 버그였고 고쳤다고 했다. 하지만 난 이 에러가 발생했다.
좀더 추가적으로 검색해보니 tf자체가 분산 연산을 위해서 여러 스레드와 정적 변수들을 세팅을 한다. 그래서 fork-safe 하지 못하다고 한다. 파이썬 2의 multiprocessing.Process.start() 의 경우 무조건 os.fork()를 한다고 하는데 이런 경우 포크안정성 문제가 생기고 이게 python2에서는 방법이 없다 한다.
https://github.com/tensorflow/tensorflow/issues/5448
위의 주소에서 내용을 확인할 수 있다.
실행 환경은
GTX TITAN X / python 2.7.10 / CU_DNN 5.1 / cuda 8.0.44 / tensorflow-gpu 1.2.1
이었다.
결국 tensorflow 전용 서버를 따로 하나 더 만들고 서버간의 요청을 celery를 이용하는 방식으로 변경하였다.
나중에 enginx를 붙이고 docker로 환경을 꾸미고 스케일업 다운을 할수 있는 시스템도 만들었으면 좋겠다.