본문 바로가기

Computer Science/NVIDIA

1-1 Fundamentals of Accelerated Computing with CUDA Python

안녕하세요. 진또배기입니다.

먼저 Fundamentals of Accelerated Computing with CUDA Python를 시작하기 앞서, NVIDIA에서 CUDA 파이썬의 컴퓨팅 가속화를 위한 배경에 대해 알아보겠습니다,

1. 배경

  • Python은 매우 간단하고, 응용 모듈이 많아서, 많이 선호되지만, 속도가 중요한 프로그램에서는 항상 문제가 됩니다.(Python 코드의 속도 튜닝의 끝은 다른 언어로 다시 개발하는 것이라고 할 만큼, Python은 느리다.)
  • Python에만 존재하는 응용 패키지들이 많아, Python 언어를 유지하면서 속도 튜닝이 필요한 경우가 많습니다.
  • Python이 느린 이유는 많지만, 아래의 이유가 치명적입니다.
    1) 인터프리터 언어 : 코드를 한줄 씩 읽고, 해석하는 식으로 동작
    2) 동적 타이핑 : Python은 형식을 지정해주지 않아, 코드 실행 중에 Type 지정이 필요

2. Numba

Numba는 수치 중심의 파이썬 기능을 가속화하기 위한 간단한 인터페이스를 제공하는 저스트 인 타임(just-in-time) 파이썬 기능 컴파일러입니다.

특히 NumPy 어레이에서 이미 계산적으로 무거운 작업을 수행하는 개발자들에게 매우 매력적인 옵션입니다. 이 교육의 중점은 Numba를 사용하여 파이썬 애플리케이션을 GPU 가속화하는 데 필요한 기본적인 기술입니다.

 

3. Numba에서의 용어 설명

  • function compiler
    Numba는 전체 응용 프로그램이 아니라 함수의 일부가 아닌 파이썬 함수를 컴파일합니다. Numba는 파이썬 인터프리터를 대체하는 것이 아니라 함수를 (보통) 더 빠른 함수로 바꿀 수 있는 또 다른 파이썬 모듈입니다.
  • type-specializing
    Numba는 사용 중인 특정 데이터 유형에 특화된 구현을 생성하여 함수의 속도를 높입니다. Python 함수는 일반적인 데이터 유형에서 동작하도록 설계되어 매우 유연하지만 속도도 매우 느립니다. 실제로는 인수 유형이 적은 함수만 호출하므로 Numba는 각 유형 집합에 대해 빠른 구현을 생성할 것입니다.
  • just-in-time
    Numba는 함수가 처음 호출될 때 함수를 변환합니다. 이를 통해 컴파일러는 우리 어떤 인수 유형을 사용할지 확실히 알 수 있습니다. 이를 통해 Numba는 주피터 노트북에서 대화형으로 기존 응용 프로그램처럼 쉽게 사용할 수 있습니다.
  • numerically-focused
    현재 Numba는 int, float, complex와 같은 수치 데이터 유형에 초점을 맞추고 있습니다. 매우 제한적인 문자열 처리 지원이 가능하고 GPU에서 많은 문자열 사용 사례가 잘 작동하지 않을 것입니다. Numba에서 최상의 결과를 얻기 위해 NumPy 어레이를 사용할 것입니다.

 

실습 시작!

1. Complie for the CPU

from numba import jit
import math

# This is the function decorator syntax and is equivalent to `hypot = jit(hypot)`.
# The Numba compiler is just a function you can call whenever you want!
@jit
def hypot(x, y):
    # Implementation from https://en.wikipedia.org/wiki/Hypot
    x = abs(x);
    y = abs(y);
    t = min(x, y);
    x = max(x, y);
    t = t / x;
    return x * math.sqrt(1+t*t)

Numba 컴파일러는 일반적으로 파이썬 함수에 함수 데코레이터를 적용해서 가능합니다. 데코레이터는 매우 간단한 구문을 사용해서 그들이 꾸미는 파이썬 함수를 변환하는 함수 수식어입니다. 여기서는 Numba의 CPU 컴파일 데코레이터 @jit:를 사용하겠습니다

** Hypot 은 직각삼각형의 빗변 의 길이를 계산하기 위해 정의된 수학 함수입니다 . 이는 컴퓨터에서 수행되는 제한된 정밀도 계산으로 인해 발생하는 오류를 방지하도록 설계되었습니다. 두 제곱 의 합에 대한 제곱근 함수를 사용하여 삼각형의 빗변의 길이를 계산하는 것이 가능 하지만, hypot은 매우 크거나 매우 작은 숫자를 제곱할 때 발생하는 문제를 방지합니다.

 

 Numba는 함수의 원래 파이썬 구현을 .py_func 속성에 저장하기 때문에 원래 파이썬 코드를 호출하여 동일한 답을 얻을 수 있습니다.

 

2. 성능측정

Numba의 새로운 코드의 성능을 측정하는 것입니다. 실제로 속도를 높인 것이 있는지 알아봅시다. 주피터 노트북에서 성능을 알아보는 가장 쉬운 방법은 %timeit함수를 사용하는 것입니다. 먼저 원래 파이썬의 속도를 측정해 보겠습니다

( %timeit 함수 실행 시간의 정확한 추정치를 얻기 위해 문장을 여러 번 실행합니다. 또한 기본적으로 최적의 시간을 반환하므로 무작위 배경 이벤트가 측정에 영향을 미칠 확률을 줄이는 데 유용합니다.)

666ns

 

189ns

 

126ns

파이썬의 내장된 기능은 Numba보다 훨씬 빠릅니다. 이것은 Numba 가 각 함수 호출에 파이썬 자체의 함수 호출 오버헤드보다 더 큰 오버헤드를 도입하기 때문입니다.

3. Numba 동작 원리

 1) .inspect_types(): 이 메서드를 사용해 소스 코드의 주석이 달린 버전을 인쇄할 수 있다.

Numba의 Type name은 NumPy Type name을 반영하는 경향이 있으므로 Python Float는 Float64(다른 언어에서는 "이중 정밀도"라고도 함)입니다. CUDA 장치에서 float32와 float64 연산의 성능이 매우 다를 수 있기 때문에 데이터 유형을 살펴보는 것이 GPU 코드에서 중요할 수 있습니다. 알고리즘이 float32를 사용하여 올바른 결과를 얻을 수 있다면 아마도 해당 데이터 유형을 사용해야 할 것입니다. 왜냐하면 float64로 캐스팅하면 GPU 유형에 따라 함수의 속도가 급격히 느려질 수 있기 때문입니다.

2) Object and nopython 모드

Numba가 모든 파이썬 코드를 컴파일할 수는 없습니다. 일부 함수는 Numba-translation이 없고, 일부 파이썬 종류는 효율적으로 컴파일할 수 없습니다. 예를 들어, Numba는 Dict를 지원하지 않습니다.
여기서는 Numba가 아직 컴파일 방법을 모르는 파이썬 코드를 컴파일해 보겠습니다.

@jit
def cannot_compile(x):
    return x['key']

cannot_compile(dict(key='value'))

의외로 위의 셀이 아무런 문제 없이 실행되었습니다.

왜냐하면 기본적으로 Numba는 Object 모드라고 불리는 유형 특화가 되지 않는 모드로 되돌아갈 것이기 때문입니다. Object 모드는 다른 Numba 기능을 가능하게 하기 위해 존재하지만, 많은 경우 유형 추론에 실패하면 Numba가 알려주기를 원합니다. nopython 인수를 장식자에게 전달함으로써 nopython 모드(다른 컴파일 모드)를 강제할 수 있습니다

 

이제는 nopython 인수를 장식자에게 전달함으로써 nopython 모드(다른 컴파일 모드)를 강제해 봅시다.

@jit(nopython=True)
def cannot_compile(x):
    return x['key']

cannot_compile(dict(key='value'))

위와 같이 오류가 표시됩니다.

오류메시지 - argument 0: cannot determine Numba type of <class 'dict'>
nopython 모드를 사용하는 것은 최고의 성능으로 이어지기 때문에 jit 를 사용하는 권장 및 최상의 연습 방법입니다.

Numba는 jit(nopython=True)의 별칭인 또 다른 데코레이터 njit를 제공합니다:

Numba가 지원하는 Python에 대한 자세한 설명은 https://numba.pydata.org/numba-doc/dev/reference/pysupported.html를 참조하시기 바랍니다.

 

'Computer Science > NVIDIA' 카테고리의 다른 글

GPU Architecture  (0) 2023.12.21
GPU란 무엇인가  (0) 2023.12.17
2-1 Fundamentals of Accelerated Computing with CUDA Python  (0) 2023.12.16
1-2 Fundamentals of Accelerated Computing with CUDA Python  (0) 2023.12.16
CUDA란 무엇인가  (0) 2023.12.14