병렬 처리가 JupyterLab에서 오류가 발생했습니다.

병렬 처리를 JupyterLab에서 수행하면 오류가 발생하여 해결까지의 절차를 기록합니다.



참고 강좌



이쪽의 강좌를 참고로 하고 있습니다!

이번 오류 내용


from multiprocessing import Pool, cpu_count
import time

p = Pool(processes=cpu_count())
# sec秒間停止する関数を作成
def wait_sec(sec):
    time.sleep(sec)
    return sec ** 2

before = time.time()
results = p.map(wait_sec, [1, 5, 3])
after = time.time()
print('it took {} sec'.format(after - before))

이것을 JupyterLab에서 실행하면,
Process ForkPoolWorker-1:
Process ForkPoolWorker-2:
Process ForkPoolWorker-3:
Traceback (most recent call last):
Traceback (most recent call last):
  File "/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
    self.run()
Traceback (most recent call last):
  File "/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
    self.run()
  File "/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 99, in run
    self._target(*self._args, **self._kwargs)
  File "/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
    self.run()
  File "/opt/anaconda3/lib/python3.7/multiprocessing/pool.py", line 110, in worker
    task = get()
  File "/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 99, in run
    self._target(*self._args, **self._kwargs)
  File "/opt/anaconda3/lib/python3.7/multiprocessing/queues.py", line 354, in get
    return _ForkingPickler.loads(res)
  File "/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 99, in run
    self._target(*self._args, **self._kwargs)
  File "/opt/anaconda3/lib/python3.7/multiprocessing/pool.py", line 110, in worker
    task = get()
AttributeError: Can't get attribute 'wait_sec' on <module '__main__'>
  File "/opt/anaconda3/lib/python3.7/multiprocessing/pool.py", line 110, in worker
    task = get()
  File "/opt/anaconda3/lib/python3.7/multiprocessing/queues.py", line 354, in get
    return _ForkingPickler.loads(res)
  File "/opt/anaconda3/lib/python3.7/multiprocessing/queues.py", line 354, in get
    return _ForkingPickler.loads(res)
AttributeError: Can't get attribute 'wait_sec' on <module '__main__'>
AttributeError: Can't get attribute 'wait_sec' on <module '__main__'>

라고 하는 엄청난 양의 warning이 나오고, 30초 기다려도 실행이 끝나지 않기 때문에 조사해 보면 동결하는 것을 깨닫는다

시행착오



조사하면 메모리가 꽉 찼을 수 있습니다.
・쓰레기통을 비우기
· 데스크탑으로 정리하기
· 불필요한 앱, JupyterLab 사용하지 않는 노트북을 중지
· Mac을 다시 시작합니다 (이 작업을 수행하면 Docker가 Exit가되어 해결 방법을 찾는 데 시간이 걸렸습니다.
※해결 방법은 간단했다)

결과는 변하지 않았다



시행착오 2



원래 JupyterLab에서 병렬 처리 할 수없는 경우가있는 것 같습니다.
VScode에서 시도

잘못



if name == "main"을 사용하고 싶으면 오류가 발생했습니다.

마침내 해결!


from multiprocessing import Pool,cpu_count
import time

def wait_sec(sec):
    time.sleep(sec)
    return sec**2

if __name__ == "__main__":
    p = Pool(processes=cpu_count()-1)
    before = time.time()
    #並列処理
    results = p.map(wait_sec,[1,5,3])
    after = time.time()
    print("It took {}".format(after - before))
    p.close()
    p.join()
    print(results)

이 코드로 잘 실행할 수있었습니다!

좋은 웹페이지 즐겨찾기