파비의 매일매일 공부기록

파이썬 동시성 프로그래밍 - #11 GPU 사용하기 본문

Study/Python

파이썬 동시성 프로그래밍 - #11 GPU 사용하기

fabichoi 2021. 8. 18. 23:30

이번장은 파이썬 프로그램의 성능 향상을 위해 GPU를 활용하는 방법에 대해 알아본다. GPU가 무엇이고 파이썬 프로그램에서 어떻게 활용해 이점을 얻는지 알아본다.

 

GPU 소개 : 일반적으로 고성능 게이밍 시장에 초점이 맞춰있다. 보통은 게임을 위해 좋은(=비싼) 그래픽 카드를 구비한다. 비디오 게임은 3D 객체를 랜더링 할 때 분당 수백만 번의 연산이 필요하다. 게임상의 장면들은 간단한 3D 객체부터 수천 개의 복잡한 모델까지 다양한 형태로 이뤄져 있음. 각 프레임에서는 비교적 정확한 위치, 크기, 회전 및 정상적으로 렌더링 되기 위한 다양한 요소들이 결정됨. 비교적 간단한 모델이라도 수백 혹은 수천 개의 vertex가 존재. 이런 객체를 업데이트하면서 나타내려면 행렬을 변환하고 회전함으로써 각 정점을 곱해야 함. 해당 연산에 많은 계산이 필요

 

왜 GPU를 사용하는가? : 초당 수많은 행렬 연산 같은 작업은 일반적인 CPU에게는 너무 과도함. 그래서 수백만의 연산을 담당할 독립적인 많은 코어가 있는 하드웨어가 나오게 되었는데 그게 GPU다. SIMD 아키텍처를 따른다.

- 데이터 사이언스 : 축적해온 수많은 데이터를 처리하고 모델에 적용하고자 거대한 연산 능력은 갖춘 조직과 학문에 필요한 인재.

 = 머신 러닝 : 지도/비지도 학습으로 분류. 최적의 결과를 내고자 가능한 한 많은 학습 데이터를 살펴봄. 데이터를 중심으로 알고리즘이 실행되면서 이후의 데이터 경향을 예측하고자 학습 후 남은 데이터를 사용.

 = 분류 : 카테고리별로 요소를 개별적으로 분류. 이미 분류된 샘플 데이터 세트 자체를 학습하는 과정. 샘플 데이터로부터 학습된 사항을 기반으로 해당하는 카테고리로 요소를 분류

 = 클러스터 분석 : 동일한 특성을 지닌 클러스터로 각 데이터 세트가 그룹화하는 것을 말함. 

 = 데이터 마이닝 : 수많은 데이터 세트에서 필요한 정보를 추출하는 방법을 말함. 

 

CUDA : NVIDIA사에서 개발된 병렬 컴퓨팅 플랫폼 및 API. GPU에서 제공하는 강력한 병렬화를 일반적인 프로그래밍 형태로 간단하게 활용할 수 있도록 디자인됨.

- 엔비디아 그래픽 카드 없이 CUDA로 작업하기 : NVIDIA 하드웨어를 구매하거나 AWS 등의 클라우드를 이용하면 됨. 저자의 추천은 GPU를 구매하는 것. 클라우드 작업 시 그래픽 카드 값보다 오히려 더 많이 지출됨.

 

PyCUDA : 파이썬 개발자에게 CUDA 병렬 컴퓨팅을 활용하도록 구성된 라이브러리.

- 특징 : 객체 정리는 객체가 올려져 있는 시간을 조정해 문제없이 코드가 작성되고 이후의 실행에 충돌되지 않게 함. 대부분의 API 사용 가능. 자동으로 파이썬 예외 처리된 모든 에러를 반환하므로 에러 확인 코드를 작성할 필요 없음. 성능을 높이기 위한 C++ 라이브러리.

- 커널 : 그래픽 프로그래밍 및 언어에 사용되는 개념. 커널 함수는 CPU 코드에서 호출되는 GPU 함수의 일종. 이론적으로 파이썬 프로그램은 CPU보다 위에서 실행되며 GPU 작업을 커널 함수의 형태로 봄.

- GPU 배열 : GPU로 작업하는 복잡한 부분을 줄여주고 대신에 numpy.ndarry와 비슷하게 작업할 수 있게 해 줌.

 

Numba : 연속적 분석의 한 형태. 높은 병렬성을 바탕으로 한 강력한 성능의 인터프리터 언어.

- Numba의 특징 : 다양한 코드 생성. CPU 및 GPU에 네이티브 코드 생성. 파이썬 과학 소프트웨어와 통합 등의 특징이

있음.

 = LLVM : 모듈형, 재사용 컴파일러, 툴체인 기술로 구성한 프로젝트 모니커. 컴파일 기술에 관심이 많은 사람들의 이목을 끌게 되자 기존 쉘은 더 이상 사용 불가. 최적화 로우 레벨 및 중간 코드, 바이너리를 생성하는 데 초점 맞춤. C++로 주로 작성되었으며 Ada, Fortran, Python, Ruby 등의 언어와 프로젝트를 바탕으로 함.

 = JIT : Just-In-Time 컴파일러. 작성된 파이썬 코드의 인터프리터 오버헤드를 제거해 프로그램의 속도를 높임. 인터프리팅된 코드의 오버헤드를 제거하면 C, C++ 같은 컴파일 언어의 성능과 거의 동일해짐. Numba는 JIT을 채택. C 언어의 성능 관점에서 코드 성능을 완전히 높여주지는 않고 단지 도와줄 뿐.

 = AOT : 함수가 온디스크 바이너리 객체로 컴파일되어 독립적으로 분산 실행. C, C++, Fortran이 채택하는 기술. 인터프리팅된 코드가 필요 없으며 컴퓨터는 바이너리 코드를 컴파일하고 동시에 실행하는 게 아닌 이미 구성된 바이너리 코드를 실행하는 작업만 수행.

 

Accelerate : 엔비디아의 GPU와 인텔 CPU의 성능을 활용하게 해주는 패키지. 아나콘다의 애드온 패키지.

- cuBLAS, cuFFT, cuSPARSE, cuRAND, CUDA sorting 같은 CUDA 라이브러리를 통합.

- 인텔의 Math Kernel Library를 사용해 Numpy, Scipy, scikit-learn, NumExpr에서 속도가 향상된 선형대수 작업을 가능하게 함.

- NumPy의 빌트인 UFuncs의 속도 향상 변형 형태

- NumPy에서 고속 푸리에 변환(FFT)의 속도를 높임.

 

Theano: NumPy의 ndarray 같은 다차원 배열을 작업하는 데 적합하고 좋은 성능을 냄. 일반적으로 CPU 상의 C언어를 몇 배 능가하는 성능을 제공하고자 GPU를 사용.

 

PyOpenCL : 개방형 컴퓨터 언어 OpenCL은 CUDA 기반의 GPU에서 동작하는 이기종 컴퓨터 로우 레벨 API. PyOpenCL은 CPU, GPU, DSP, FPGA 같은 다양항 플랫폼을 활용해 파이썬 앱을 작성하게 하는 API 구현 형태.

 

이번장은 좀 생소한 내용들이 많이 나온듯.

내가 GPU를 가지고 작업을 할 일이 얼마나 있을지는 모르겠지만.. ㅎㅎㅎ

반응형
Comments