병렬 처리가 JupyterLab에서 오류가 발생했습니다.
3506 단어 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)
이 코드로 잘 실행할 수있었습니다!
Reference
이 문제에 관하여(병렬 처리가 JupyterLab에서 오류가 발생했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kkkjhk/items/5109e900efc3590e5ad8
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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))
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__'>
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)
Reference
이 문제에 관하여(병렬 처리가 JupyterLab에서 오류가 발생했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kkkjhk/items/5109e900efc3590e5ad8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)