chainer v1.16.0이 다중 스레드 환경에서 작동하지 않음

나는 자주 batchsize를 분할하고 역전파를 멀티스레드로 하고, 경사를 더한 다음 가중치 갱신을 하고 있습니다. chainer1.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_modeVariableauto 를 on/off 어느 쪽으로 할까 강제하는 것(그렇다고 생각한다)입니다만, 따로 thread 세이프로 할 필요는 없다 (라고 할까 이대로와 다른 thread로 움직이지 않는다) 그래서 global 변수를 사용하는 PR 를 만들었습니다. (추기) 그 후, 초기치를 주는 방침으로 변경했습니다.

어쩌면 학습이 끝난 모델을 복수 프로세스로 병렬로 계산해 결과를 돌려주는 것 같은 웹 서비스는 늘어서 동작 불량이 되어 있을 것(요출전)으로, 무엇보다 자신의 코드가 움직이지 않기 때문에 어떻게든 하고 싶다고 생각하면서, PR 리뷰를 기다리고 있습니다.

(추기) master에 병합되었습니다.

좋은 웹페이지 즐겨찾기