Knowledge Map
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로 환경을 꾸미고 스케일업 다운을 할수 있는 시스템도 만들었으면 좋겠다.
'PYTHON' 카테고리의 다른 글
python2으로 json 파일 생성하기 (0) | 2018.06.18 |
---|---|
celery 관련 (0) | 2018.06.11 |
import _macosx 에서의 runtimeError (0) | 2018.06.01 |
create_db using sqlalchemy (0) | 2018.05.09 |
SQLAlchemy session transaction delete 문제 (0) | 2018.04.12 |