728x90

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
728x90

가상환경 설정

우선 가상환경을 설정한다. 괜히 뭐 잘못 설치하면 골치아프다.

conda create -n [가상환경 이름] python=3.10
conda activate [가상환경 이름]

[가상환경 이름] 부분은 본인이 설정한다. 나는 triton으로 했다.
파이썬 버전은 공식문서에 따르면 CPython 3.8-3.12를 지원한다. Python 버전도 이 사이로 설정하면 된다. 무난하게 3.10 ㄱㄱ

패키지 설치

이제 아래 코드로 triton 패키지를 설치한다.

pip install triton

직접 git clone해서 설치하는 방법도 있긴하지만.... 굳이?

추가 설치 사항

언제나 그렇듯이 공식문서 외에 필요한 dependency가 존재한다.

우선 torch를 설치하자

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117

추가적으로 우리는 파이썬을 위한 C 컴파일러가 필요하다.

sudo apt update
sudo apt install build-essential

이후에 또 오류 발생하면 환경변수에 CC를 추가하자

본인 컴파일러 경로부터 확인하자

나는 gcc이기 때문에(terminal에 python 찍으면 python 버전 밑에 GCC 라고 뜬다)

이후에 경로를 CC로 설정한다

which gcc
which clang

export CC=/usr/bin/gcc 

'인공지능 최적화 > triton' 카테고리의 다른 글

Triton (3) - Triton을 이해하기 위한 잡지식  (0) 2024.05.31
Triton (1) - Triton 이란?  (0) 2024.05.31
728x90

Triton이란?

  • 효율적인 커스텀 Deep Learning Primitive를 구현하기 위한 언어 및 컴파일러
  • 목표 : Cuda보다 더 빠르고 더 높은 생산성있는 코드 + 현존 DSL(Domain-Specific Language) 보다 큰 유연성
  • 환경 : Linux + NVIDIA GPUs (Compute Capability 7.0+)

https://www.reddit.com/r/OpenAI/comments/18nf310/openai_triton_coursetutorial_recommendations/

Unsloth 이라는 llm fine-tuning의 속도를 높여주는 프레임워크도 Triton으로 구현됨

요약

  • Cuda는 C언어를 사요하지만 Triton은 python을 사용한다.

  • Triton을 사용하면 인공지능 뿐만 아니라 병렬적인 gpu 연산이 필요한 task에서 성능을 향상시킬 수 있다.

'인공지능 최적화 > triton' 카테고리의 다른 글

Triton (3) - Triton을 이해하기 위한 잡지식  (0) 2024.05.31
Triton (2) - Triton 설치  (0) 2024.05.31

+ Recent posts