병렬 컴퓨팅 플랫폼 및 API 모델로, GPU(Graphic Processing Unit)를 사용하여 복잡한 계산 작업을 병렬로 수행할 수 있도록 설계
CUDA는 그래픽 처리 장치에서 수행하는 알고리즘을 C 프로그래밍 언어를 비롯한 산업 표준 언어를 사용하여 작성할 수 있도록 하는 GPGPU 기술이다. CUDA는 엔비디아가 개발해오고 있으며 이 아키텍처를 사용하려면 엔비디아 GPU와 특별한 스트림 처리 드라이버가 필요하다.
cuDNN
cuDNN(CUDA® Deep Neural Network library) : cuDNN은 엔비디아 CUDA 딥 뉴럴 네트워크 라이브러리, 즉 딥 뉴럴 네트워크를 위한 GPU 가속화 라이브러리의 기초 요소로 컨볼루션(Convolution), 풀링(Pooling), 표준화(Nomarlization), 활성화(Activation)와 같은 일반적인 루틴을 빠르게 이행할 수 있도록 하는 라이브러리입니다.
!ls : 현재 디렉토리의 내용을 보여준다.
%cd dir: dir 디렉토리로 이동한다.
%pwd: 현재 위치한 디렉토리 위치를 보여준다.
!git: git 명령어를 실행시킨다.
!nvidia-smi: 현재 사용하고 있는 GPU의 스펙과 작동 상황을 보여준다.
!nvcc: Nvidia CUDA Compiler를 실행시킨다.
프로그램이 "스레드"와 "블록"이라는 기본 단위로 구성되어 병렬 처리를 수행
스레드(Thread)
스레드는 병렬 작업을 수행하는 기본 실행 단위입니다. GPU에서 각 스레드는 독립적으로 실행되어 특정 작업을 수행합니다. 다수의 스레드가 병렬로 실행되므로, 대규모 데이터 처리 및 계산 작업을 빠르게 처리할 수 있습니다.
블록(Block)
블록은 여러 개의 스레드를 포함하는 그룹입니다. 블록 내의 모든 스레드는 동시에 실행되며, 블록의 스레드들은 서로 협력하여 작업을 수행할 수 있습니다. 각 블록은 1차원, 2차원 또는 3차원으로 구성될 수 있으며, 이로 인해 복잡한 데이터 구조를 쉽게 매핑할 수 있습니다.
%%writefile hello_cuda.cu
# include <stdio.h>
__global__ void helloCUDA(void)
{
printf("Hello thread %d in block %d\n", threadIdx.x, blockIdx.x);
}
int main()
{
helloCUDA<<<2, 3>>>();
cudaDeviceReset();
return 0;
}
!nvcc ./hello_cuda.cu -o hello_cuda
!./hello_cuda
# 결과
Hello thread 0 in block 0
Hello thread 1 in block 0
Hello thread 2 in block 0
Hello thread 0 in block 1
Hello thread 1 in block 1
Hello thread 2 in block 1
신경망의 가중치(weight)와 활성화 함수(activation function) 출력을 더 작은 비트 수로 표현하도록 변환하는 기술

LLM 모델에 양자화를 통해 필요한 메모리의 양을 크게 감소시켜 고성능 GPU가 없는 환경에서도 동작하며 빠른 추론 결과를 얻을 수 있게 해주는 package