Python 사전 로드됨
4518 단어 pythonprogrammingopensource
Python 사전 로드됨
저장소: https://github.com/albertz/python-preloaded
문제:
PyTorch 또는 TensorFlow와 같은 큰 라이브러리를 로드하는 것을 포함하여 CPython의 시작 시간이 너무 느립니다. 느린 파일 시스템의 경우 이러한 가져오기를 포함하여 시작 시간이 10-20초인 것을 보았습니다.
매우 간단한 아이디어:
큰 라이브러리를 가져온 직후 CPython의 상태를 유지하고 필요할 때 즉시 사용할 수 있도록 합니다. 상태를 로드할 때 임의의 Python 스크립트를 계속 실행할 수 있습니다( runpy 사용 가능).
설치
pip install preloaded
방법 1: 포크 서버
CPython을 시작하고 라이브러리를 가져옵니다. 그런 다음 프로세스를 포크 서버로 계속 실행합니다. 새 인스턴스가 필요할 때마다 포크( os.fork
)를 만들고 reptyr 과 유사한 논리를 적용합니다. 일부 기술 세부 정보는 here입니다.
이 솔루션은 Unix에서 매우 이식성이 뛰어납니다. 지금까지 Linux와 MacOSX에서 테스트했지만 대부분의 다른 Unix에서도 실행될 것입니다.
예시
시작 스크립트를 생성합니다python-tf.bin
.
$ py-preloaded-bundle-fork-server.py tensorflow -o python-tf.bin
이 시작 스크립트는 python
자체에 대한 드롭인 교체로 간주됩니다.
테스트를 위해 demo-import-tensorflow.py
가 있으며 다음 내용만 있습니다.
import tensorflow as tf
print("TF:", tf.__version__)
이제 직접 실행하고 시간을 측정하십시오.
$ time python3 demo-import-tensorflow.py
TF: 2.3.0
________________________________________________________
Executed in 8.31 secs fish external
usr time 3.39 secs 278.00 micros 3.39 secs
sys time 0.67 secs 83.00 micros 0.67 secs
이것은 느린 파일 시스템, 특히 NFS에 있습니다. 이것은 이미 파일이 캐시된 후입니다(방금 전에 동일한 명령을 실행했습니다). 그렇지 않으면 시작 시간이 14초 이상입니다.
시작 스크립트가 아직 실행되지 않았으므로 첫 번째 시작도 마찬가지로 느립니다.
$ time ./python-tf.bin demo-import-tensorflow.py
Existing socket but can not connect: [Errno 111] Connection refused
Import module: tensorflow
TF: 2.3.0
________________________________________________________
Executed in 8.35 secs fish external
usr time 3.19 secs 768.00 micros 3.19 secs
sys time 0.72 secs 228.00 micros 0.72 secs
이제 백그라운드에서 실행 중입니다. demo-import-tensorflow.py
로 고정된 것은 아니지만 이제 다른 스크립트도 실행할 수 있습니다. 그러나 동일한 스크립트로 데모를 계속합니다.
$ time ./python-tf.bin demo-import-tensorflow.py
Existing socket, connected
Open new PTY
Send PTY fd to server
Wait for server to be ready
Entering PTY proxy loop
TF: 2.3.0
________________________________________________________
Executed in 261.56 millis fish external
usr time 64.24 millis 542.00 micros 63.70 millis
sys time 33.59 millis 163.00 micros 33.43 millis
보시다시피 이제 시작 시간이 매우 빨라졌습니다. 이는 파일이 더 이상 캐시되지 않는 나중에 실행될 때도 마찬가지로 빠릅니다.
시작 스크립트 환경을 대화식으로 테스트합니다.
$ ./python-tf.bin -m IPython
방법 2: 프로세스 풀
우리는 항상 백그라운드에서 CPython + 미리 로드된 라이브러리의 일부 풀(예: N=10 인스턴스)을 유지하고 새 인스턴스가 필요하면 풀에서 하나를 선택하기만 하면 됩니다.
이것은 포크 서버와 많은 로직을 공유합니다. 주요 차이점은 기본적으로 subprocess.Popen
대신 os.fork
를 사용한다는 것입니다.
(현재 시행되지 않음)
방법 3: 디스크의 프로그램 체크포인트
일부 체크포인트 도구( CRIU )를 사용하여 라이브러리를 가져온 직후 CPython의 상태를 저장하십시오. 그런 다음 나중에 이 체크포인트를 로드할 수 있습니다(매우 빠름).
CRIU는 현재 덤프/복구를 위해 루트 액세스가 필요합니다. 그러나 https://github.com/checkpoint-restore/criu/pull/1930에서 루트가 아닌 옵션을 지원하기 위한 작업이 진행 중입니다.
아니면 DMTCP이 CRIU의 더 나은 대안일까요?
(현재 미완성)
Reference
이 문제에 관하여(Python 사전 로드됨), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/albertzeyer/python-preloaded-4ef0
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
pip install preloaded
$ py-preloaded-bundle-fork-server.py tensorflow -o python-tf.bin
import tensorflow as tf
print("TF:", tf.__version__)
$ time python3 demo-import-tensorflow.py
TF: 2.3.0
________________________________________________________
Executed in 8.31 secs fish external
usr time 3.39 secs 278.00 micros 3.39 secs
sys time 0.67 secs 83.00 micros 0.67 secs
$ time ./python-tf.bin demo-import-tensorflow.py
Existing socket but can not connect: [Errno 111] Connection refused
Import module: tensorflow
TF: 2.3.0
________________________________________________________
Executed in 8.35 secs fish external
usr time 3.19 secs 768.00 micros 3.19 secs
sys time 0.72 secs 228.00 micros 0.72 secs
$ time ./python-tf.bin demo-import-tensorflow.py
Existing socket, connected
Open new PTY
Send PTY fd to server
Wait for server to be ready
Entering PTY proxy loop
TF: 2.3.0
________________________________________________________
Executed in 261.56 millis fish external
usr time 64.24 millis 542.00 micros 63.70 millis
sys time 33.59 millis 163.00 micros 33.43 millis
$ ./python-tf.bin -m IPython
Reference
이 문제에 관하여(Python 사전 로드됨), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/albertzeyer/python-preloaded-4ef0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)