Reporting Date: September. 30, 2024
API의 정의 및 필요성에 대해 다루고자 한다.
목차01 그래픽 프리미티브
02 공간상의 개념
03 GPU 성능이 우수한 이유?
04 AI에서 행렬이 중요한 이유?
05 API
06 OpenGL
01 그래픽 프리미티브
(Graphic Primitives)
그래픽을 구성하는 가장 기본적인 단위 요소들.
이는 복잡한 그래픽을 만들기 위해 사용되는 기초적인 도형이나 구조로,
모든 2D 및 3D 그래픽은 이러한 기본 요소들을 조합해 만들어진다.
① 점 (Point)
공간 상의 하나의 위치를 나타내는 가장 기본적인 프리미티브.
좌표 값으로 표현되며, 2D 또는 3D 공간에서 하나의 점을 나타낸다.
② 선 (Line)
두 점을 연결하여 만든 선.
직선이나 곡선처럼 두 점을 이어서 경로를 정의할 수 있다.
이 선은 2D 및 3D 그래픽에서 형태나 모양을 정의하는 데 사용된다.
③ 면 (Polygon)
세 개 이상의 점을 연결하여 만든 다각형.
2D 그래픽에서는 삼각형, 사각형 같은 도형을 만들고,
3D 그래픽에서는 복잡한 형태의 표면을 구성하는 단위가 된다.
특히 3D 모델링에서는 수많은
폴리곤이 모여 하나의 오브젝트를 형성하게 된다.
여러 오브젝트가 모여 서브 메시, 그리고 이 서브 메시들이
합쳐져 최종적으로 하나의 메시, 즉 3D 형태가 완성된다.
수천 개의 점들이 메시 안에서 집합적으로 작동하기 위해서는
벡터와 행렬과 같은 기하학적 수학 연산이 필수적이다.
02 공간상의 개념
① 스칼라 (數量, Scalar)
크기만을 나타내는 물리적 양으로,
방향 정보는 포함하지 않는다.
② 벡터 (向量, Vector)
크기와 방향을 가진 물리적 양으로,
공간상에서의 위치나 이동을 나타낸다.
벡터는 두 점 사이의 거리나 방향을 화살표로 나타낼 수 있으며,
심지어 점 하나만으로도 원점으로부터의 벡터를 정의할 수 있다.
③ 행렬 (行列, Matrix)
벡터는 1차원 개념이지만,
여러 벡터가 모인 행렬은 2차원으로 표현된다.
벡터는 행렬의 한 부분 집합으로서,
행렬은 공간 상에서 다수의 점들을 다룰 때 중요한 도구가 된다.
이 행렬은 점들의 이동, 회전, 확대, 축소 등 다양한 변환 연산에 사용되며,
이는 3D 그래픽에서 객체의 변형을 처리하는 핵심 메커니즘이다.
<GPU가 성능이 우수한 이유?>
GPU가 성능이 우수한 이유는
병렬 처리가 가능하기 때문이다.
GPU는 수천 개 이상의 코어(작은 프로세서들)를 가지고 있어,
동시에 많은 작업을 처리할 수 있는 구조로 설계되어 있다.
이는 그래픽 렌더링뿐만 아니라 대규모 데이터 처리나
AI 연산, 행렬 연산과 같은 작업에서 강력한 성능을 발휘하는 이유이다.
1 . 병렬 처리 능력
GPU는 수많은 코어를 가지고 있어, 여러 작업을 병렬로 처리할 수 있다.
이는 CPU가 대부분 순차적으로 작업을 처리하는 것과 비교해 큰 차이를 만든다.
예를 들어, 3D 그래픽에서 각 픽셀의 색상 계산,
또는 기계 학습에서 대규모 데이터의 행렬 연산을 동시에 처리할 수 있다.
2 . 주요 프로세스
GPU는 일반적으로 그래픽 전용 프로세스와
일반적인 데이터 연산을 처리하는 CUDA 코어 같은
추가적인 프로세스를 가지고 있어, 그래픽 및 연산 작업을 동시에 수행할 수 있다.
이는 그래픽 처리가 필요한 작업뿐만 아니라 딥러닝과 같은
과학적 계산에서도 뛰어난 성능을 발휘하는 이유 중 하나이다.
3 . 연산의 효율성
3D 그래픽, 물리 시뮬레이션, 딥러닝에서는
벡터와 행렬 연산이 매우 빈번하게 사용된다.
GPU는 이러한 행렬 연산에 특화된 구조를 가지고 있어,
대규모 행렬 곱셈, 변환 연산을 빠르게 처리할 수 있다.
특히, 딥러닝의 학습 과정에서의 행렬 연산은
GPU의 병렬 처리 능력을 극대화하여 속도를 크게 향상시킨다.
<AI에서 행렬이 중요한 이유?>
AI 분야에서 행렬이 중요한 이유는
데이터 표현과 처리의 핵심적인 역할을 하기 때문이다.
특히, 이미지 데이터와 문장 데이터를 다룰 때,
행렬과 벡터는 데이터를 수치적으로 표현하고 연산하는 데 필수적인 도구이다.
1 . 이미지 데이터
일반적으로 픽셀값으로 구성된 행렬로 표현된다.
예를 들어, 컬러 이미지는 3개의 색 채널 RGB로 구성되며,
각 채널은 픽셀 단위로 행렬로 나타낼 수 있다.
이런 방식으로 이미지 데이터는 2D 또는 3D 행렬로 표현되며,
이 행렬을 사용해 AI 모델은 이미지를 분석하고 분류할 수 있다.
2 . 문장 데이터
문장 데이터를 다룰 경우,
AI는 단어와 문장을 수치적으로 표현할 필요가 있다.
이를 위해 단어 임베딩(word embedding)이라는 기법을 사용한다.
예를 들어, 쇼핑 리뷰 분석에서는 리뷰에 포함된 단어들을 임베딩하여,
상품에 대한 긍정적인 또는 부정적인 의견을 파악하거나,
특정 특징이 반복되는 패턴을 분석할 수 있다.
이 과정에서 단어 임베딩은 텍스트 데이터를
모델이 학습할 수 있는 형태로 변환하는 중요한 역할을 한다.
3 . 단어 임베딩 및 벡터화
문장을 벡터로 표현하기 위해서는
먼저 문장을 구성하는 단어들을 "토큰화"하고,
그 단어들이 문장에서 나타나는지 여부를 이진 벡터로 표현한다.
예를 들어, "좋은 상품"이라는 리뷰가 있을 때,
이를 다음과 같이 벡터로 변환할 수 있다.
이때, 각 단어는 차원을 나타내며,
이 벡터는 문장이나 단어 간의 관계를 수학적으로 처리할 수 있게 해준다.
4 . 행렬 변환
여러 개의 문장이 있을 경우,
각 문장을 위와 같은 벡터로 변환하여 행렬로 구성한다.
예를 들어, 3개의 리뷰가 있다면 각 리뷰는 벡터 형태로 변환되고,
이를 모으면 단어-문장 행렬이 만들어진다.
이 행렬에서 각 행은 하나의 문장을 나타내고,
열은 각 단어의 존재 여부를 나타낸다.
5 . 단어 임베딩
단어 임베딩은 단어를 고차원의 벡터로 매핑하여
각 단어의 의미를 수치적으로 나타내는 방법이다.
예를 들어, "좋은"과 "훌륭한"은 의미적으로 비슷한 단어로,
임베딩 기법을 사용하면 두 단어는 유사한 벡터 값으로 표현된다.
이렇게 표현된 벡터는 컴퓨터가 단어 간의
의미적 관계를 이해하고, 텍스트 분석에 유용하게 활용된다.
6 . 유사도 계산
단어들이 벡터로 표현되면, 유사도 계산이 가능해진다.
이때 유클리드 거리나 코사인 유사도와 같은
수학적 방법을 통해 단어 간의 거리를 계산할 수 있다.
예를 들어, 두 단어의 의미가 얼마나 비슷한지,
문장이 얼마나 유사한지를 계산할 수 있다.
이를 위해 두 가지 방법을 사용할 수 있다.
① 유클리드 거리
(Euclidean Distance)
두 단어 벡터 간의 실제 거리를 측정하는 방법.
벡터 공간에서 두 벡터의 차이를 기반으로 계산된다.
② 코사인 유사도
(Cosine Similarity)
두 벡터의 방향이 얼마나 비슷한지를 측정하는 방법.
벡터 간의 내적을 벡터 크기의 곱으로 나누어 계산되며,
이 방법은 벡터의 크기 차이와 관계없이 방향성에만
초점을 맞춰 유사도를 평가한다.
7 . 행렬 공간
AI에서 데이터는 행렬 공간에 위치한다고 할 수 있다.
각 문장은 벡터로 표현되고, 여러 벡터가 모여서 행렬을 형성한다.
이 공간에서 벡터 간의 관계를 계산하고,
머신러닝 알고리즘은 이를 통해 패턴을 학습하게 된다.
8 . 핵심 포인트
행렬과 벡터는 데이터를 수학적으로 다루는 데 필수적이다.
중요한 것은 "어떤 형태의 벡터와 행렬을 사용할 것인가"이다.
다양한 데이터(예: 이미지, 텍스트)에 적합한
벡터화 및 임베딩 기법을 선택해야 성능이 좋아진다.
이를 통해 AI는 데이터를 효과적으로 분석하고 예측할 수 있다.
05 API
응용프로그램 인터페이스
Application Programming Interface
응용 프로그램이 서로 소통하고, 외부 시스템이나
라이브러리, 하드웨어와 데이터를 교환하기 위한 통로.
라이브러리나 함수 형태로 제공되어,
개발자가 직접 시스템의 복잡한 세부사항을
다루지 않고도 특정 기능을 활용할 수 있도록 도와준다.
1 . 역할
특정 기능을 구현한 코드를 외부에서
호출할 수 있게 해주는 인터페이스.
예를 들어, 그래픽 프로그램을 만들 경우,
GPU와 상호작용하는 API를 사용하여 화면에
이미지를 표시하거나 3D 모델을 렌더링할 수 있다.
또한, GPU 연산, VRAM, 프레임 버퍼를
다루는 방식이 API를 통해 간단히 처리된다.
2 . 저수준 vs 고수준
(Low-level vs High-level)
C와 같은 언어에서는 하드웨어나 운영체제와
직접 상호작용할 수 있는 저수준의 접근이 가능하다.
예를 들어, 마우스, 키보드와 같은 입력 장치에
직접 접근하거나 GPU 드라이버와 상호작용하는 것이 가능하다.
Java와 같은 고수준 언어는 하드웨어나 OS의 세부 사항을 직접 다루지 않는다.
대신, API를 사용해 개발자가 쉽게 작업할 수 있도록 추상화된 기능을 제공한다.
그래픽 프로그램에서는 GPU를 사용하여 화면을 그리거나,
이미지를 표시하는 등의 작업을 하게 되며,
이때 GPU를 제어하는 저수준 API가 필요하다.
저수준 API는 GPU 드라이버와 연동되어
하드웨어에서 직접 연산을 수행하며,
프레임 버퍼를 사용하여 화면에 이미지를 저장한다.
Python은 기본적으로 고수준 언어지만, C를 기반으로 만들어져,
확장 라이브러리를 통해 저수준 작업을 할 수 있다.
Cython, NumPy, ctypes, PyOpenGL과 같은 라이브러리를 통해
저수준의 GPU 연산이나 시스템 자원에 접근할 수 있다.
3 . 저수준 프로그래밍
(Low-level Programming)
물리적 하드웨어와의 상호작용을 가능하게 한다.
예를 들어, 운영체제나 드라이버에 대한 이해가 필요하며,
마더보드의 GPU나 다른 하드웨어 장치에 직접 접근하는 방식이 필요할 수 있다.
이 과정은 종종 운영체제의 드라이버와 같은 소프트웨어에 의해 관리되며,
이를 통해 물리적인 하드웨어가 작동할 수 있게 된다.
06 OpenGL
C로 구현된 그래픽 전용 API
개방형 표준을 지향하며,
크로스 플랫폼에서 작동할 수 있는 특징을 가지고 있다.
다양한 운영체제와 플랫폼에 구애받지 않고,
동일한 방식으로 그래픽을 처리할 수 있다.
1 . Open API
OpenGL은 오픈 소스로, 누구나 그 구조를 보고 활용할 수 있다.
이 때문에 다양한 하드웨어 및 소프트웨어 환경에서도
통일된 방식으로 그래픽을 처리할 수 있다.
2 . 크로스 플랫폼
OpenGL은 다양한 운영체제에서 동일하게 동작하도록 설계되었다.
따라서 Windows, macOS, Linux, Android 등 여러 플랫폼에서
동일한 코드로 그래픽을 처리할 수 있다.
3 . 웹앱
웹은 이미 개방형이고,
표준화된 기술을 기반으로 동작한다.
따라서 OpenGL과 같은 기술을 사용하면 플랫폼에
구애받지 않고 웹 브라우저를 통해 그래픽을 실행할 수 있다.
이는 웹 애플리케이션이 데스크탑 애플리케이션처럼
다양한 환경에서 동일하게 구동될 수 있음을 의미한다.
4 . 그래픽 파이프라인
OpenGL과 같은 그래픽 API는
그래픽 파이프라인을 통해 데이터를 처리한다.
이 파이프라인은 단계적으로 데이터를 GPU로 보내고,
각 단계에서 연산을 통해 최종적으로 화면에 그래픽을 렌더링한다.
운영체제의 메모리 구조와도 비슷한 개념이다.
5 . 명령어 패치 및 인터프리트
CPU 명령어는 하드웨어마다 다를 수 있다.
따라서 특정 하드웨어에 맞는 명령어를 패치하여
해당 시스템에서 실행 가능하게 해야 한다.
6 . 패치-인터프리트
패치는 CPU가 인식할 수 있는 명령어로 변환하는 과정이며,
인터프리테이션은 해당 명령어를 시스템이 해석 및 실행할 수 있도록 하는 과정이다.
이들은 파이프라인처럼 연속적으로 처리되며, 일련의 작업이 설정되면 그 상태는 지속된다.
7 . 그래픽 설정 지속
그래픽 API에서 폰트나 글씨 크기와 같은 설정을
한 번 정의하면, 해당 설정은 계속 유지된다.
예를 들어, 특정 폰트 설정이 유지되어
다른 작업에서도 동일한 형식으로 표시된다.
이는 작업의 효율성을 높여주며, 반복적인 설정을 줄여 준다.
교제: OpenGL로 배우는 3차원 컴퓨터 그래픽스(p.108)
'2024 - 2학기 > OpenGL' 카테고리의 다른 글
4.3 오픈지엘 API (2) | 2025.02.05 |
---|---|
4.2 오픈지엘 API (0) | 2025.02.05 |
3.2 그래픽 컬러 처리 (6) | 2025.02.04 |
3.1 그래픽 컬러 처리 (0) | 2025.02.02 |
2.5 그래픽 프로세서 (12) | 2024.12.24 |