1. Deep Learning Primitive란?
프로그래머가 사용할 수 있는 가장 작은 실행 단위이다. 하지만, Triton에서 사용된 의미는 특정 연산의 단위로 해석하는게 적절한듯 하다. 예를 들어, 순방향 컨볼루션 계산, 역방향 lstm 계산 등이 있을 수 있다.
primitive와 함수의 가장 큰 차이는 primitive가 상태(state)를 저장함에 있다. 2가지 상태가 존재하는데 불변(immutable)하는 상태의 경우 계산의 용이성을 위해서 tensor shape등을 저장한다. 이러한 불변 상태를 반복적으로 사용해서 계산 시간을 줄일 수 있다.
Primitive 상태의 가변부의 경우 scratchpad라고 부르고, 계산시에 필요한 값들을 임시로 저장하는 메모리 버퍼로 사용한다. Scratchpad는 primitive 객체에 속할수도 있고 실행시간 매개변수로 사용할 수 도 있다.
출처 1. https://www.ml-science.com/primitive
출처 2. https://oneapi-src.github.io/oneDNN/v1.3/dev_guide_basic_concepts.html
2. PyPy
파이썬은 인터프리터 언어기 때문에 C, C++같은 컴파일러 언어에 비해 속도가 느리다.
이러한 속도의 한계를 극복하고자 성능이 중요한 작업을 C로 완성하고 C 코드를 파이썬으로 랩핑하는 방식을 사용해왔다. 또한, 파이썬에 런타임 형식 정보를 섞어 C로 컴파일할 수 있게 만드는 Cython 프로젝트도 존재한다.
- PyPy는 기존의 파이썬 인터프리터 CPython을 대체.
- Cpython은 python → 바이트코드 → VM 인터프리트
- 반면 PyPy는 JIT(Just-In-Time) 컴파일로 python → Machine Native 어셈블리어
- PyPy는 파이썬 언어 지원 + pip + venv등 다양한 툴과 호환 가능.
3. tl.constexpr
constexpr
: 코드를 사용해야 하는 경우 컴파일 시간에 반환 값을 계산할 수 있는 함수입니다.
tl.constexpr
는 Triton에서 상수를 정의하는 데 사용되는 함수입니다. 이를 통해 컴파일 시간에 상수 값을 설정할 수 있어, 런타임이 아닌 컴파일 타임에 상수 값을 사용할 수 있게 됩니다. 이는 특히 배열 크기와 같은 고정된 값에 유용합니다. tl.constexpr
를 사용하면 성능 최적화와 코드 최적화를 돕습니다. 예를 들어, 블록 크기와 같은 값을 tl.constexpr
로 정의하면, 해당 값을 컴파일 타임에 고정하여 더 효율적인 코드를 생성할 수 있습니다.
컴파일 시간 (Compile Time)
- 정의: 소스 코드를 기계어 코드로 변환하는 동안의 시간.
- 활동: 구문 분석, 코드 최적화, 오류 검출.
- 예시: 코드가 수정되었을 때 컴파일러가 코드를 컴파일하여 실행 파일을 생성하는 과정.
- 장점: 컴파일러가 코드를 최적화하여 실행 시간을 단축시킬 수 있음, 코드의 일부 오류를 미리 검출 가능.
런타임 (Runtime)
- 정의: 프로그램이 실제로 실행되는 시간.
- 활동: 메모리 할당, 입력/출력 처리, 런타임 오류 발생 가능.
- 예시: 사용자 입력에 따라 프로그램이 동작하고 결과를 출력하는 과정.
- 장점: 동적 데이터 처리 가능, 다양한 입력에 대응할 수 있는 유연성 제공.
차이점 요약
- 컴파일 시간: 코드 작성 후, 실행 전 발생, 정적 분석 및 최적화.
- 런타임: 프로그램 실행 중 발생, 동적 데이터 처리 및 유연성 제공.
컴파일 시간에 값을 결정하면, 즉 이때 tl.constexpr
로 정의된 값은 컴파일러가 컴파일러는 상수 값을 알고 있기 때문에 코드 최적화를 수행할 수 있습니다. 불필요한 계산을 제거하고 더 효율적인 기계어 코드를 생성할 수 있습니다.
또, 런타임에 값을 결정하지 않아서 오버헤드 감소, 컴파일 시간에 배열이나 데이터 구조의 크기가 고정되어 있어 더 빠른 메모리 접근과 관리가 가능합니다.
반면에, 런타임에 값을 결정하면 프로그램 실행 중에 값이 결정되므로 다양한 입력 값이나 조건에 따라 동적으로 대응할 수 있다. 또한, 실행중에 크기가 바뀔 수 있는 데이터에 적합하다.
출처 : https://learn.microsoft.com/ko-kr/cpp/cpp/constexpr-cpp?view=msvc-170
4. launch grid 혹은 grid
런치 그리드(launch grid)는 GPU 커널을 실행할 때 병렬로 실행되는 스레드 블록의 배치를 정의하는 것입니다. 이는 CUDA와 Triton에서 커널을 실행할 때 중요한 개념입니다. 각 블록은 특정 데이터를 처리하며, 그리드는 이러한 블록이 어떻게 배열되고 배치되는지를 결정합니다. 예를 들어, 1D 그리드는 1차원 배열 형태로 블록을 배치하며, grid = lambda meta: (triton.cdiv(n_elements, meta['BLOCK_SIZE']), )
처럼 정의하여 병렬 실행을 최적화합니다.
이를 통해 병렬 처리를 최대화하고, 성능을 향상시킬 수 있습니다.
출처 1 : https://junstar92.tistory.com/244
출처 2 : https://junstar92.tistory.com/245
'인공지능 최적화 > triton' 카테고리의 다른 글
Triton (2) - Triton 설치 (0) | 2024.05.31 |
---|---|
Triton (1) - Triton 이란? (0) | 2024.05.31 |