데이터과학 삼학년

[Tensorflow] tf.model prediction을 외부에서 child 프로세스로 만들어 멀티 프로세싱 적용이 어려운 이유 본문

Machine Learning

[Tensorflow] tf.model prediction을 외부에서 child 프로세스로 만들어 멀티 프로세싱 적용이 어려운 이유

Dan-k 2021. 12. 15. 19:37
반응형

Tensorflow에서 구성한 model을 prediction을 multiprocessing 단계에 포함하고 싶다면.

 

예를 들어, tf 모델을 해석하기위해 LIME을 이용했다고 하자.

LIME은 local surrogate로 각 row에 대한 모델의 결과를 해석하려면,

결국 row별로 lime에 태우는 방법밖에 없다.

(lime 내에서 batch 기능 없는 것으로 확인)

 

즉, for문을 돌려야한다는 소리인데...

이럴 경우 데이터가 많아지면, 수행속도가 선형적으로 증가하게 된다.

 

이를 회피하기위해 multiprocessing을 씌웠더니...무한 hang이 걸리네?.,,,

 

def multiprocessing_dnn_lime(data):
    attributed_features = []
    data = data.reset_index(drop=True)

    explanation = explainer.explain_instance(
        data_row=pd.DataFrame(data.iloc[0:1, :], columns=features_name_lst).values[0],
        predict_fn=predict_fn,
        num_features=len(features_name_lst),
        num_samples=30
    )

    xai_top1 = explanation.as_list()[0][0]
    tmp_lst = xai_top1.split(' ')
    if len(tmp_lst) > 3:
        temp = tmp_lst[2]
    else:
        temp = tmp_lst[0]

    dnn_attributed_features.append(temp)

    reason_temp = pd.DataFrame(dnn_attributed_features, columns=['dnn_attributed_features'])
    final_df = pd.concat([data, reason_temp], axis=1)

    return final_df
    
pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
with pool:
    pool.map(multiprocessing_dnn_lime, split_data_list)

 

원인은...

tensorflow 모델 자체에서 prediction시 multi threading을 만들기 때문에 해당 작업이 끝나기 전에 child process를 만들면 lock and hang이 걸리는 것

 

흠...그럼 tensorflow 모델의 prediction 메서드를 살펴볼까?

predict(
    x, batch_size=None, verbose=0, steps=None, callbacks=None, max_queue_size=10,
    workers=1, use_multiprocessing=False
)

predict 시 workers를 입력해 줄수 있고, 최대 process 수를 선택해줄 수 있다

 

 

728x90
반응형
LIST
Comments