멀티프로세싱 에러 질문입니다.

미해결질문
Jay Moon 프로필

안녕하세요.

실습을 하던 중 아래코드에서 AttributeError가 발생해서 질문 올립니다.

코드 :

from multiprocessing import Pool

import numpy as np

def _apply_df(args):

    df, func, kwargs = args

    return df.apply(func, **kwargs)

def apply_by_multiprocessing(df, func, **kwargs):

    # 키워드 항목 중 workers 파라메터를 꺼냄

    workers = kwargs.pop('workers')

    # 위에서 가져온 workers 수로 프로세스 풀을 정의

    pool = Pool(processes=workers)

    # 실행할 함수와 데이터프레임을 워커의 수 만큼 나눠 작업

    result = pool.map(_apply_df, [(d, func, kwargs)

            for d in np.array_split(df, workers)])

    pool.close()

    # 작업 결과를 합쳐서 반환

    return pd.concat(list(result))

이구요.

에러:

AttributeError: Can't get attribute '_apply_df' on <module '__main__' (built-in)>

위와 같은 에러가 발생하는데 5달 전에 같은 문제를 겪으신 분이 계시더라구요. 해당 답변에 colab에서는 잘 실행이 되는데 제 PC에서는 에러가 생기는데 어떻게 해야 해결될까요?

박조은 프로필
박조은 3달 전

안녕하세요.

해당 함수가 있는 파일이 제대로 로드되지 않은거 같아요.

import 를 통해 KaggleWord2VecUtility.py  파일이 로드 되어야 해당 함수를 사용하실 수 있어요.

파일 경로와 import 하는 과정이 제대로 되었는지 확인해 보세요!

Jay Moon 프로필
Jay Moon 3달 전

선생님 tutorial-part-1 에는 KaggleWord2VecUtility.py 파일 import 하는 코드가 없는데 어찌해야할까요?

위 함수 돌리고 %time clean_train_reviews = apply_by_multiprocessing(train['review'], review_to_words, workers=4)

에서 에러가 발생해요.

박조은 프로필
박조은 3달 전

안녕하세요.

어떤 강의에서의 질문인지를 몰라서 제가 파일 임포트 부분의 오류라 생각했는데 part1에서의 질문이었네요.

해당 함수를 다른 파트에서는 별도의 파일로 분리를 해서 사용하거든요.

혹시 위에 코드의 오류가 아래 코드를 실행했을 때 나는 오류인가요?

%time clean_train_reviews = apply_by_multiprocessing(\

    train['review'], review_to_words, workers=4)  

만약 그렇다면 새로운 셀을 만들고 다음코드를 그냥 실행해 보세요.

_apply_df

바로 아래 다음과 같은 결과가 나오는지도 확인을 해주세요. 

<function __main__._apply_df(args)>

오류 내용을 봤을 때 함수가 제대로 정의되지 않은것 같아요.
아래의 코드가 실행된 상태여야지 
_apply_df 를 사용할 수 있습니다.


from multiprocessing import Pool import numpy as np def _apply_df(args): df, func, kwargs = args return df.apply(func, **kwargs) def apply_by_multiprocessing(df, func, **kwargs): # 키워드 항목 중 workers 파라메터를 꺼냄 workers = kwargs.pop('workers') # 위에서 가져온 workers 수로 프로세스 풀을 정의 pool = Pool(processes=workers) # 실행할 함수와 데이터프레임을 워커의 수 만큼 나눠 작업 result = pool.map(_apply_df, [(d, func, kwargs) for d in np.array_split(df, workers)]) pool.close() # 작업 결과를 합쳐서 반환 return pd.concat(list(result))




Jay Moon 프로필
Jay Moon 3달 전

14번 라인에 말씀하신<function __main__._apply_df(args)>  가 출력되는데요.

그 아래 코드를 돌렸을 때 아나콘다 프롬프트에서

에러가 발생합니다.
박조은 프로필
박조은 3달 전

안녕하세요.

colab 에서 실행이 잘 되었는데 사용하고 계신 환경에서 실행이 안 된다면 아마도 환경문제 인거 같은데요.  

해당 코드는 멀티프로세싱을 하도록 쓰레드를 여러 개 만드는데 환경에 따라 오류가 발생하는거 같아요.

찾아보니 아래와 같은 이슈가 ipython 에 있는데 주피터 노트북은 ipython을 사용하고 있어요.

[Can't use multiprocessing module in IPython · Issue #10894 · ipython/ipython](https://github.com/ipython/ipython/issues/10894)

위에 있는 방법으로 해결을 해보시거나 Colab으로 실습을 해보시는게 좋을거 같아요.

해당 기능은 전처리시 시간이 오래 걸리기 때문에 멀티프로세싱을 통해 전처리 시간을 줄이도록 한 코드인데요.

worker의 수를 4가 아닌 1로 변경해서 해보시고 같은 오류가 발생한다면 Colab을 사용하시는 방법과 github에 있는 이슈로 해결해 보시는 방법이 있을거 같아요.

지식공유자 되기
많은 사람들에게 배움의 기회를 주고,
경제적 보상을 받아보세요.
지식공유참여
기업 교육을 위한 인프런
“인프런 비즈니스” 를 통해 모든 팀원이 인프런의 강의들을
자유롭게 학습하는 환경을 제공하세요.
인프런 비즈니스