chainer v1.16.0이 다중 스레드 환경에서 작동하지 않음
AttributeError: '_thread._local' object has no attribute 'default_backprop'
역전파 때뿐만 아니라, 경우에 따라서는 forward에서도 에러가 나옵니다.
import chainer
import numpy
import concurrent.futures
def calc_sigmoid(i):
value = numpy.array(i, dtype=numpy.float32)
return chainer.functions.sigmoid(value)
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
values = list(executor.map(calc_sigmoid, range(4)))
print(values)
# AttributeError: '_thread._local' object has no attribute 'default_backprop'
에러 내용적으로 1.16에서 추가된
backprop_mode
에 관계가 있을 것 같았습니다.no_backprop_mode and force_backprop_mode are added. In no_backprop_mode context, Variables with volatile=’auto’ behave like non-volatile variables. And, in force_backprop_mode context, they behave like volatile variables. (#1521)
안에서
threading.local()
가 사용되고 있었기 때문에 이 부분을 global로 하면 생각대로 동작했습니다.print(values)
# [<variable at 0x1123329e8>, <variable at 0x112332c88>, <variable at 0x112332ef0>, <variable at 0x11234f160>]
backprop_mode
는 Variable
의 auto
를 on/off 어느 쪽으로 할까 강제하는 것(그렇다고 생각한다)입니다만, 따로 thread 세이프로 할 필요는 없다 (라고 할까 이대로와 다른 thread로 움직이지 않는다) 그래서 global 변수를 사용하는 PR 를 만들었습니다. (추기) 그 후, 초기치를 주는 방침으로 변경했습니다.어쩌면 학습이 끝난 모델을 복수 프로세스로 병렬로 계산해 결과를 돌려주는 것 같은 웹 서비스는 늘어서 동작 불량이 되어 있을 것(요출전)으로, 무엇보다 자신의 코드가 움직이지 않기 때문에 어떻게든 하고 싶다고 생각하면서, PR 리뷰를 기다리고 있습니다.
(추기) master에 병합되었습니다.
Reference
이 문제에 관하여(chainer v1.16.0이 다중 스레드 환경에서 작동하지 않음), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Hiroshiba/items/1ab9fb9cea7ab8402f08텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)