Numba는 파이썬 코드용 오픈 소스 Just-In-Time 컴파일러로, 개발자가 표준 파이썬 함수를 사용하여 CPU와 GPU 모두에서 숫자 함수를 가속화하는 데 사용할 수 있습니다.
Numba는 파이썬 코드용 오픈 소스 Just-In-Time 컴파일러로, 개발자가 표준 파이썬 함수를 사용하여 CPU와 GPU 모두에서 숫자 함수를 가속화하는 데 사용할 수 있습니다.
Numba는 실행 직전에 파이썬 바이트코드를 기계어로 변환하여 실행 속도를 개선합니다.
Numba는 데코레이터라고 하는 호출 가능한 파이썬 객체를 사용하여 CPU 및 GPU 함수를 최적화하는 데 사용할 수 있습니다. 데코레이터는 다른 함수를 입력받아 수정한 다음, 사용자에게 수정된 함수를 반환하는 함수입니다. 이러한 모듈성은 프로그래밍 시간을 줄이고 파이썬의 확장성을 높입니다.
Numba는 통계 데이터를 처리하도록 설계된 복잡한 수학 연산을 제공하는 오픈 소스 파이썬 라이브러리인 넘파이(NumPy)와도 작동합니다. 데코레이터로 호출하면 Numba는 파이썬 및/또는 넘파이 코드의 하위 집합을 환경에 자동으로 최적화된 바이트코드로 변환합니다. 그리고 오픈 소스 API 지향 라이브러리인 LLVM을 사용하여 프로그래밍 방식으로 머신 네이티브 코드를 생성합니다. Numba는 다양한 CPU 및 GPU 구성에 맞게 파이썬 코드를 신속하게 병렬화할 수 있는 여러 옵션을 제공합니다. 일부 경우에는 단 하나의 명령어로 이를 수행할 수 있습니다. 넘파이와 함께 사용하면 Numba는 다양한 배열 데이터 유형 및 레이아웃에 특화된 코드를 생성하여 성능을 최적화합니다.
파이썬은 데이터 사이언스에서 널리 사용되는 생산성이 매우 뛰어난 동적 프로그래밍 언어입니다. 깔끔하고 표현력이 뛰어난 구문, 표준 데이터 구조, 포괄적인 표준 라이브러리, 탁월한 문서, 광범위한 라이브러리 및 도구 에코시스템, 대규모 개방형 커뮤니티 덕분에 매우 인기가 높습니다. 그러나 가장 중요한 점은 파이썬과 같이 동적으로 입력되고 해석되는 언어가 제공하는 높은 생산성입니다.
그러나 파이썬의 가장 큰 장점이 가장 큰 약점이 될 수도 있습니다. 유연성과 무유형 고수준 구문으로 인해 데이터 및 연산 집약적 프로그램의 성능이 저하될 수 있습니다. 컴파일된 네이티브 코드를 실행하는 것이 해석된 동적 코드를 실행하는 것보다 몇 배는 더 빠르기 때문입니다. 이러한 이유로 인해 효율성을 우려하는 파이썬 프로그래머는 일반적으로 최내부 루프를 C로 재작성하고 파이썬에서 컴파일된 C 함수를 호출합니다. Cython처럼 이러한 최적화를 더 쉽게 만드는 것을 목표로 하는 프로젝트가 많지만, 대개는 새로운 구문을 익혀야 합니다. Cython은 성능을 크게 향상시키지만 파이썬 코드를 수작업으로 수정해야 할 수 있습니다.
Numba는 훨씬 더 간단한 Cython의 대안으로 고안되었습니다. 새로운 구문을 배우거나, 파이썬 인터프리터를 교체하거나, 별도의 컴파일 단계를 실행하거나, C/C++ 컴파일러를 설치할 필요가 없다는 것이 가장 매력적인 특징 중 하나입니다. @jit Numba 데코레이터를 파이썬 함수에 적용하기만 하면 됩니다. 따라서 런타임에 컴파일할 수 있습니다('Just-in-Time' 또는 JIT 컴파일). Numba가 코드를 동적으로 컴파일할 수 있다는 것은 파이썬의 유연성을 포기할 필요가 없다는 의미입니다. 또한 Numba가 컴파일한 파이썬 프로그램 내의 숫자 알고리즘은 컴파일된 C 또는 FORTRAN 언어로 작성된 프로그램의 속도에 근접할 수 있으며 네이티브 파이썬 인터프리터가 같은 프로시저를 실행할 때보다 최대 100배 더 빠르게 실행할 수 있습니다. 이는 생산성 높은 프로그래밍과 고성능 컴퓨팅(HPC)의 이상적 결합을 향해 나아가는 커다란 진전입니다.
Numba는 널리 사용되는 넘파이 라이브러리와 마찬가지로 배열 지향 컴퓨팅 작업을 위해 설계되었습니다. 데이터 병렬성으로 인해 배열 지향 컴퓨팅 작업은 GPU와 같은 가속기에 안성맞춤입니다. Numba는 넘파이 배열 유형을 이해하고 사용하여 GPU 또는 멀티 코어 CPU에서 실행할 수 있도록 효율적인 컴파일된 코드를 생성합니다. 필요한 프로그래밍 작업은 @vectorize 함수 데코레이터를 추가하여 런타임에 컴파일 및 벡터화된 함수 버전을 생성하도록 Numba에 지시하는 것처럼 간단할 수 있습니다. 덕분에 GPU에서 데이터 배열을 병렬로 처리할 수 있습니다.
CPU 또는 GPU용 넘파이 배열 코드를 JIT 컴파일하는 것 외에도 Numba는 NVIDIA GPU용 NVIDIA® CUDA® 프로그래밍 모델인 'CUDA Python'을 파이썬 구문으로 노출합니다. 속도를 높임으로써 파이썬의 기능은 글루 언어에서 숫자 코드를 효율적으로 실행할 수 있는 완전한 프로그래밍 환경으로 확장됩니다.
파이썬 데이터 사이언스 에코시스템의 다른 도구들과 Numba를 결합하면 GPU 컴퓨팅 경험이 혁신됩니다. Jupyter Notebook은 마크다운 텍스트, 실행 코드, 플롯 및 이미지의 그래픽 출력을 조합할 수 있는 브라우저 기반 문서 작성 환경을 제공합니다. Jupyter는 교육, 과학적 분석 문서화, 인터랙티브 프로토타이핑에 매우 널리 사용되고 있습니다.
Numba는 200개가 넘는 다양한 플랫폼 구성에서 테스트를 거쳤습니다. Intel과 AMD x86, POWER8/9, ARM CPU 기반뿐 아니라 NVIDIA GPU, AMD GPU 기반 Windows, Apple Macintosh, Linux 운영 체제에서 실행됩니다. 미리 컴파일된 바이너리는 대부분의 시스템에서 사용할 수 있습니다.
과학 컴퓨팅
지리 정보 시스템부터 복잡한 기하학적 모양의 계산에 이르기까지 배열 처리의 응용 분야가 많이 있습니다. 배열을 사용하여 통신 회사에서는 무선 네트워크의 설계를 최적화하고, 의료 분야 연구자는 내부 장기에 대한 정보가 포함된 파형을 분석합니다. 배열은 언어 처리, 천체 영상 촬영, 레이다/소나에서 외부 노이즈를 줄이는 데 사용할 수 있습니다.
파이썬과 같은 언어 덕분에 개발자는 광범위한 수학적 교육 없이도 이러한 분야의 애플리케이션을 사용할 수 있게 되었습니다. 그러나 숫자 집약적 계산에서 나타나는 파이썬의 성능 결점 때문에 일부 응용 분야에서는 처리 속도가 크게 떨어질 수 있습니다. Numba는 여러 솔루션 중 하나로, 많은 사람들에게 가장 사용하기 쉬운 솔루션으로 인식되어 있습니다. C와 같이 더 복잡한 언어를 경험하지 않은 학생과 개발자에게 특히 유용합니다.
반복형 개발은 개발자가 결과를 관찰하여 프로그램을 지속적으로 개선할 수 있기 때문에 데이터 사이언스에서 시간을 절약할 수 있는 유용한 기법입니다. 파이썬과 같은 해석형 언어는 이러한 맥락에서 특히 유용합니다. 그러나 고도로 수학적인 연산에서는 파이썬의 성능 한계 때문에 전반적인 처리 속도가 느려지고 개발자의 생산성이 제한되는 병목 현상이 발생할 수 있습니다.
Numba는 대규모 계산 및 배열에서 성능을 크게 향상하는 컴파일러 함수를 간단히 호출할 수 있는 방법을 개발자에게 제공함으로써 이 문제를 해소합니다. Numba는 배우기 쉽고, 데이터 사이언티스트가 속도를 최적화하기 위해 컴파일된 언어로 복잡하게 서브루틴을 작성하지 않아도 됩니다.
구조적으로 볼 때, CPU는 단 몇 개의 코어와 많은 캐시 메모리로 구성되어 있어 한 번에 처리할 수 있는 소프트웨어 스레드가 적습니다. 반대로 GPU는 수백 개의 코어로 구성되어 있어 수천 개의 스레드를 동시에 처리할 수 있습니다.
Numba는 CUDA 실행 모델을 따라 파이썬 코드의 제한된 하위 집합을 CUDA 커널 및 디바이스 함수로 직접 컴파일하여 CUDA GPU 프로그래밍을 지원합니다. Numba로 작성된 커널은 넘파이 배열에 직접 액세스할 수 있으며, 넘파이 배열은 CPU와 GPU 간에 자동으로 전송됩니다. 이를 통해 파이썬 개발자는 GPU 가속 컴퓨팅에 쉽게 입문할 수 있고 새로운 구문이나 언어를 배우지 않고도 점점 더 정교해지는 CUDA 코드를 적용하는 방법을 배울 수 있습니다. CUDA Python과 Numba를 사용하면, 파이썬을 통한 빠른 반복형 개발 그리고 CPU와 NVIDIA GPU 모두를 대상으로 컴파일된 언어의 속도라는 두 장점을 모두 누릴 수 있습니다.
NVIDIA P100 GPU와 Intel Xeon E5-2698 v3 CPU가 탑재된 서버를 사용한 한 테스트에서 Numba로 컴파일된 CUDA 파이썬 망델브로 코드는 순수 파이썬 버전보다 거의 1,700배 더 빠르게 실행되었습니다. CPU의 단일 스레드 파이썬 코드 대비 이러한 성능 향상은 컴파일, 병렬화, GPU 가속화 등의 여러 요인으로 인한 결과입니다. 그러나 이 테스트는 1개의 GPU 추가만으로도 가속화를 달성할 수 있음을 보여줍니다.
CUDA-X AI를 기반으로 구축된 오픈 소스 소프트웨어 라이브러리인 NVIDIA RAPIDS™ 제품군은 엔드투엔드 데이터 사이언스 및 분석 파이프라인을 전적으로 GPU에서 실행할 수 있게 해줍니다. 이 제품군은 NVIDIA CUDA 프리미티브를 사용하여 저수준 컴퓨팅 최적화를 수행하지만, 사용자 친화적인 Python 인터페이스를 통해 GPU 병렬 처리와 고대역폭 메모리 속도를 제공합니다.
RAPIDS GPU DataFrame을 사용하면 Pandas와 같은 인터페이스를 사용하여 데이터를 GPU에 로드한 다음, 절대 GPU를 떠나지 않고 이 데이터를 연결된 다양한 머신 러닝 및 그래프 분석 알고리즘에 사용할 수 있습니다. 이러한 수준의 상호 운용성은 Apache Arrow와 같은 라이브러리를 통해 구현되며, 데이터 준비부터 머신 러닝과 딥 러닝에 이르는 엔드투엔드 파이프라인을 가속화합니다.
RAPIDS는 널리 사용되는 여러 데이터 사이언스 라이브러리 간의 장치 메모리 공유를 지원합니다. 그래서 GPU에 데이터가 유지되므로, 호스트 메모리에 반복적으로 복사하느라 높은 비용을 들일 필요가 없습니다.
RAPIDS 팀은 GPU 가속 데이터 사이언스 에코시스템의 모든 컴포넌트가 원활하게 작동하도록 Apache Arrow, Numba, XGBoost, 아파치 스파크, Scikit-learn 등을 비롯한 수많은 오픈 소스 프로젝트를 개발하고 이에 기여하고 함께 긴밀하게 협력하고 있습니다.