Python 사전 로드됨

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의 더 나은 대안일까요?

(현재 미완성)

좋은 웹페이지 즐겨찾기