병렬 처리를위한 6 개의 Python 라이브러리

Python은 편리함과 프로그래머 친 화성이 길지만 가장 빠른 프로그래밍 언어는 아닙니다. 속도 제한 중 일부는 기본 구현 인 cPython이 단일 스레드이기 때문입니다. 즉, cPython은 한 번에 하나 이상의 하드웨어 스레드를 사용하지 않습니다.

그리고 threadingPython에 내장 된 모듈을 사용하여 속도를 높일 수 있지만 병렬성이 아닌 동시성threading 만 제공합니다 . CPU에 의존하지 않는 여러 작업을 실행하는 데 유용하지만 각각 전체 CPU가 필요한 여러 작업의 속도를 높이는 데는 아무 일도하지 않습니다. 

Python에는 여러 CPU에서 Python 워크로드를 실행하는 기본 방법이 포함되어 있습니다. 이 multiprocessing모듈은 각각 별도의 코어에있는 Python 인터프리터의 여러 복사본을 회전하고 코어간에 작업을 분할하기위한 기본 요소를 제공합니다. 그러나 때로는  multiprocessing 충분하지 않습니다.

때로는 작업을 여러 코어 뿐만 아니라 여러 시스템 에 분산 해야하는 경우도 있습니다 . 여기에 6 개의 Python 라이브러리와 프레임 워크가 포함됩니다. 아래의 6 개 Python 툴킷은 모두 기존 Python 애플리케이션을 사용하여 작업을 여러 코어, 여러 머신 또는 둘 모두에 분산 할 수 있도록합니다.

레이

University of California, Berkeley의 연구원 팀에 의해 개발 된 Ray는 여러 분산 기계 학습 라이브러리를 뒷받침합니다. 하지만 Ray는 원래 사용 사례 였더라도 기계 학습 작업에만 국한되지 않습니다. 모든 Python 작업은 Ray를 사용하여 시스템간에 분할 및 배포 할 수 있습니다.

Ray의 구문은 최소한이므로 기존 앱을 병렬화하기 위해 광범위하게 재 작업 할 필요가 없습니다. @ray.remote장식은 여러 개의 CPU 또는 GPU를 사용하는 방법에 대해 선택적으로 지정된 매개 변수와 더불어, 레이 클러스터에서 사용 가능한 노드에서 해당 기능을 배포합니다. 각 분산 함수의 결과는 Python 객체로 반환되므로 관리 및 저장이 쉽고 노드 간 또는 노드 내에서 복사되는 양이 최소로 유지됩니다. 이 마지막 기능은 예를 들어 NumPy 배열을 다룰 때 유용합니다.

Ray에는 자체 내장 클러스터 관리자도 포함되어있어 필요에 따라 로컬 하드웨어 또는 인기있는 클라우드 컴퓨팅 플랫폼에서 노드를 자동으로 스핀 업할 수 있습니다.

관련 비디오 : multiprocessingPython을 사용 하여 속도 향상

Dask

외부에서 Dask는 Ray와 매우 흡사합니다. 또한 자체 작업 스케줄링 시스템, NumPy와 같은 Python 데이터 프레임 워크에 대한 인식, 한 시스템에서 여러 시스템으로 확장 할 수있는 기능을 갖춘 Python의 분산 병렬 컴퓨팅을위한 라이브러리입니다.

Dask는 두 가지 기본 방식으로 작동합니다. 첫 번째는 병렬화 된 데이터 구조를 사용하는 것입니다. 기본적으로 Dask의 자체 버전의 NumPy 배열, 목록 또는 Pandas DataFrames입니다. 해당 구성의 Dask 버전을 기본값으로 바꾸면 Dask가 클러스터 전체에 실행을 자동으로 분산합니다. 이는 일반적으로 가져 오기의 이름을 변경하는 것 이상을 포함하지만 때로는 완전히 작동하기 위해 다시 작성해야 할 수도 있습니다.

두 번째 방법은 함수 데코레이터를 포함한 Dask의 저수준 병렬화 메커니즘을 통해 노드간에 작업을 분할하고 결과를 동기식 ( "즉시"모드) 또는 비동기식 ( "지연")으로 반환하는 것입니다. 두 모드 모두 필요에 따라 혼합 할 수 있습니다.

Dask와 Ray의 주요 차이점 중 하나는 스케줄링 메커니즘입니다. Dask는 클러스터의 모든 작업을 처리하는 중앙 집중식 스케줄러를 사용합니다. Ray는 분산되어 있습니다. 즉, 각 시스템은 자체 스케줄러를 실행하므로 예약 된 작업과 관련된 모든 문제는 전체 클러스터가 아닌 개별 시스템 수준에서 처리됩니다.

Dask는 또한 "배우"라는 고급 및 아직 실험적인 기능을 제공합니다. 액터는 다른 Dask 노드의 작업을 가리키는 개체입니다. 이렇게하면 많은 로컬 상태가 필요한 작업이 제자리에서 실행되고 다른 노드에서 원격으로 호출 될 수 있으므로 작업의 상태를 복제 할 필요가 없습니다. Ray는보다 정교한 작업 분배를 지원하는 Dask의 배우 모델과 같은 것이 없습니다.

Dispy

Dispy를 사용하면 병렬 실행을 위해 전체 Python 프로그램 또는 개별 함수를 머신 클러스터에 배포 할 수 있습니다. 네트워크 통신을위한 플랫폼 네이티브 메커니즘을 사용하여 작업을 빠르고 효율적으로 유지하므로 Linux, MacOS 및 Windows 시스템이 동등하게 잘 작동합니다.

Dispy 구문은 multiprocessing 명시 적으로 클러스터 multiprocessing를 생성하고 (프로세스 풀을 생성 할 수있는 위치 ) 클러스터에 작업을 제출 한 다음 결과를 검색 한다는 점에서 다소 유사 합니다. Dispy와 함께 작동하도록 작업을 수정하려면 약간 더 많은 작업이 필요할 수 있지만 이러한 작업이 발송되고 반환되는 방식을 정확하게 제어 할 수도 있습니다. 예를 들어, 임시 또는 부분적으로 완료된 결과를 반환하고, 작업 배포 프로세스의 일부로 파일을 전송하고, 데이터를 전송할 때 SSL 암호화를 사용할 수 있습니다.

판다 랄 · 렐

Pandaral·lel은 이름에서 알 수 있듯이 여러 노드에서 Pandas 작업을 병렬화하는 방법입니다. 단점은 Pandaral·lel  이 Pandas 에서만 작동한다는 것 입니다. 하지만 Pandas를 사용하고 있고 단일 컴퓨터의 여러 코어에서 Pandas 작업을 가속화하는 방법 만 있으면 Pandaral·lel이 작업에 집중합니다.

Pandaral·lel은 Windows에서 실행되지만 Linux 용 Windows 하위 시스템에서 시작된 Python 세션에서만 실행됩니다. MacOS 및 Linux 사용자는 Pandaral·lel을있는 그대로 실행할 수 있습니다. 

Ipyparallel

Ipyparallel은 특히 클러스터 전체에서 Jupyter 노트북 코드의 실행을 병렬화하기 위해 집중적으로 집중된 또 다른 다중 처리 및 작업 배포 시스템입니다. 이미 Jupyter에서 작업중인 프로젝트와 팀은 Ipyparallel을 즉시 사용할 수 있습니다.

Ipyparallel은 코드 병렬화에 대한 다양한 접근 방식을 지원합니다. 간단히 map말해서 모든 함수를 시퀀스에 적용하고 사용 가능한 노드에서 작업을 균등하게 분할하는. 더 복잡한 작업의 경우 항상 원격 또는 병렬로 실행되도록 특정 기능을 장식 할 수 있습니다.

Jupyter 노트북은 노트북 환경에서만 가능한 작업에 대해 "마법 명령"을 지원합니다. Ipyparallel은 자체적으로 몇 가지 마법 명령을 추가합니다. 예를 들어 Python 문 앞에 접두사를 붙여 %px자동으로 병렬화 할 수 있습니다.

Joblib

Joblib에는 두 가지 주요 목표가 있습니다. 작업을 병렬로 실행하고 아무것도 변경되지 않은 경우 결과를 다시 계산하지 않습니다. 이러한 효율성 덕분에 Joblib는 재현 가능한 결과가 성실한 과학 컴퓨팅에 적합합니다. Joblib의 문서는 모든 기능을 사용하는 방법에 대한 많은 예제를 제공합니다.

작업 병렬화를위한 Joblib 구문은 충분히 간단합니다. 이는 프로세서간에 작업을 분할하거나 결과를 캐시하는 데 사용할 수있는 데코레이터에 해당합니다. 병렬 작업은 스레드 또는 프로세스를 사용할 수 있습니다.

Joblib에는 컴퓨팅 작업에 의해 생성 된 Python 객체에 대한 투명한 디스크 캐시가 포함되어 있습니다. 이 캐시는 위에서 언급 한 것처럼 Joblib가 반복되는 작업을 방지하는 데 도움이 될뿐만 아니라 장기 실행 작업을 일시 중지 및 재개하거나 충돌 후 작업이 중단 된 위치를 선택하는 데에도 사용할 수 있습니다. 캐시는 또한 NumPy 어레이와 같은 대형 개체에 대해 지능적으로 최적화됩니다. 를 사용하여 동일한 시스템의 프로세스간에 데이터 영역을 메모리 내에서 공유 할 수 있습니다 numpy.memmap.

Joblib가 제공하지 않는 한 가지는 여러 개별 컴퓨터에 작업을 배포하는 방법입니다. 이론적으로는 Joblib의 파이프 라인을 사용하여이를 수행 할 수 있지만 기본적으로 지원하는 다른 프레임 워크를 사용하는 것이 더 쉬울 것입니다. 

Python에 대해 자세히 알아보기

  • 파이썬이란 무엇입니까? 강력하고 직관적 인 프로그래밍
  • PyPy는 무엇입니까? 고통없는 더 빠른 Python
  • Cython은 무엇입니까? C 속도의 Python
  • Cython 튜토리얼 : 파이썬 속도를 높이는 방법
  • Python을 현명하게 설치하는 방법
  • Python 3.8의 가장 새로운 기능
  • Poetry로 더 나은 Python 프로젝트 관리
  • Virtualenv 및 Venv : Python 가상 환경 설명
  • Python virtualenv 및 venv해야 할 일과하지 말아야 할 일
  • Python 스레딩 및 하위 프로세스 설명
  • Python 디버거를 사용하는 방법
  • timeit을 사용하여 Python 코드를 프로파일 링하는 방법
  • cProfile을 사용하여 Python 코드를 프로파일 링하는 방법
  • Python에서 비동기 시작하기
  • Python에서 asyncio를 사용하는 방법
  • Python을 JavaScript로 변환하는 방법 (그리고 다시)
  • Python 2 EOL : Python 2의 끝에서 살아남는 방법
  • 모든 프로그래밍 요구를위한 12 개의 Python
  • 모든 Python 개발자를위한 24 개의 Python 라이브러리
  • 놓쳤을 수도있는 7 가지 멋진 Python IDE
  • Python의 3 가지 주요 단점 및 솔루션
  • 13 개의 Python 웹 프레임 워크 비교
  • 버그를 제거하는 4 가지 Python 테스트 프레임 워크
  • 놓치고 싶지 않은 6 가지 새로운 Python 기능
  • 기계 학습 마스터를위한 5 가지 Python 배포
  • 자연어 처리를위한 8 가지 훌륭한 Python 라이브러리