#1 개념

  유클리드 호제법은 두 개의 자연수의 최대공약수(GCD, Greatest Common Divisor)와 최소공배수(LCM, Least Common Multiple)를 구하는 알고리즘으로, 고대 그리스 시대에 발견하여 O(log n)이라는 짧은 시간 복잡도를 가지고 있어 컴퓨터 프로그램에서 시간 복잡도를 줄이기 위한 알고리즘으로 많이 사용된다.

1-1. 원리

  유클리드 호제법의 최대공약수 계산은 다음과 같은 원리에 기반한다.

  • 두 수 a와 b의 최대공약수는 a와 b를 나눈 나머지의 최대공약수와 같다.
  • 나머지 연산을 이용하여 계속해서 두 수의 나머지를 구하고, 나머지가 0이 될 때까지 반복한다.
  • 마지막에 나누는 수가 두 수의 최대공약수이다.

  유클리드 호제법의 최소공배수 계산은 다음과 같은 원리에 기반한다.

  • 두 수 a와 b의 최대공약수를 d라고 한다.
  • 최소공배수는 a와 b의 곱을 최대공약수로 나눈 값이다. 즉, a * b / d

1-2. 증명

  두 수 A, B의 최대공약수 G라고 하자. a와 b가 서로소일 때, A, B는 아래와 같이 나타낼 수 있다.

A = G*a, B = G*b

이때 A와 B의 관계는 아래와 같이 정의할 수 있다.

A = Bq + R

나머지 R을 이항하여 정리하면 아래와 같다.

R = Bq + A = G*a - G*b*q = G*(a - bq)

따라서 세 수 A, B, C는 a, b, (a-bq)가 서로소이면 G를 최대공약수로 갖는다.

 

b와 (a-bq)가 서로소가 아니라면 k와 k'가 소로소일 때 공약수 m이 존재한다.

b = mk

a - bq = mk'

 

a = bq + mk'

   = mkq + mk'

   = m(kq + k')

b = mk

 

a와 b는 최대공약수 m을 갖게 된다.

  m이 1이 아니면, 2이상의 공약수를 갖게 되어 a와 b가 서로소가 아니다.

  m이 1이면, 공약수가 1이므로 b와 a-bq가 k와 k'로 서로소가 된다.

1-3. 예시

  다음은 48과 18의 최대공약수를 유클리드 호제를 통해 계산하는 예시이다.

  • 48을 18로 나눈 나머지는 12이다. (48 % 12 = 12)
  • 18을 12로 나눈 나머지는 6이다. (18 % 12 = 6)
  • 12를 6으로 나눈 나머지는 0이다. (12 % 6 = 0)

  따라서 최대공약수는 6이다.

  다음은 48과 18의 최소공배수를 유클리드 호제를 통해 계산하는 예시이다.

  • 48과 18의 최대공약수는 6이다. (GCD(48, 18) = 6)
  • 48과 18의 최소공배수는 144이다. (48 * 18 / 6 = 144)

  따라서 최소공배수는 144이다.

#2 예제 코드

#include <iostream>

using namespace std;

int gcd(int a, int b) {
	while (b != 0) {
    	int temp = b;
        b = a % b;
        a = temp;
    }
	return a;
}

int lcm(int a, int b) {
	return a * b / gcd(a, b);
}

int main() {
	int num1, num2;
    cin >> num1 >> num2;
    
    cout << "두 수의 최대공약수 = " << gcd(num1, num2) << endl;
    cout << "두 수의 최소공배수 = " << lcm(num1, num2) << endl;
    return 0;
}

#1 개념

1-1. 문제점

  현대 어플리케이션의 네트워크 수요가 증가하는 상황에서 기존 네트워크 스택으로는 프로세싱으로 수요를 다 처리하는 것에는 한계가 있었다. 리눅스 파운데이션과 인텔, 레드햇, 시스코 등 여러 기술 기업들은 기존 네트워크 스택의 문제점을 해결하기 위해 새로운 네트워크 패킷 프로세싱 라이브러리 및 드라이버를 개발하는 프로젝트를 수행하였다.

  기존 네트워크 패킷 프로세싱은 다음과 같은 한계점들을 가지고 있었다.

- 컨텍스트 스위치 오버헤드: CPU는 드라이버를 통해 디바이스를 호출할 수 있으며, 패킷을 전달하기 위해 시스템 콜을 호출하도록 한다. 이러한 과정은 사용자 공간의 어플리케이션이 커널 공간으로의 컨텍스트 스위치가 발생하도록 하며, 이로 인한 오버헤드가 발생하게 된다.

- PCIe와 메모리 인터페이스 제한: CPU와 NIC 간의 데이터 전송은 주로 PCIe 인터페이스를 통해 이루어진다. CPU가 NIC으로 패킷을 전달하는 과정에서 여러 번의 데이터 복사가 발생하며, 인터페이스와 CPU의 처리 속도 차이에 의한 성능 제한이 발생한다.

- 멀티코어 활용 제한: 기존의 네트워크 스택은 멀티코어 프로세싱을 지원하기 위해 커널 레벨에서 코어 간 동기화를 위한 락을 사용한다. 하지만 락 오버헤드는 병렬 처리를 충분히 활용하지 못 하게 한다.

- 커널 오버헤드: 커널 공간에서 패킷을 처리할 때, 패킷은 IP 스택, TCP/UDP 스택, 소켓 인터페이스 등 여러 단계의 네트워크 스택을 거치게 된다. 이러한 스택 프로세싱을 거치는 과정에서 프로세싱의 지연 시간이 발생하게 된다. 또한, 커널의 스케줄링에 의해 패킷 프로세싱이 후순위로 배치되어 추가적인 지연이 발생할 수 있다.

1-2. 정의

  DPDK(Data Plane Development Kit)은 기존 네트워크 프로세싱의 문제들을 해결하기 위해 개발된 고성능, 저지연, 멀티코어 최적화 네트워킹 솔루션으로, 패킷 프로세싱을 위한 라이브러리 및 드라이버를 제공하는 오픈소스이다. DPDK는 패킷 프로세싱 과정을 사용자 공간으로 오프로딩하여 컨텍스트 스위치, 커널 오버헤드, 락 오버헤드를 해결하였다.

1-3. 원리

  DPDK는 다음과 같은 방법을 사용하여 패킷 프로세싱을 사용자 공간으로 오프로딩 하였다.

  • CPU 개입 없이 NIC에게 데이터를 전송하기 위해 DMA 활용
  • 어플리케이션이 사용자 공간에서 직접 드라이버를 사용하여 디바이스를 폴링 (UIO/VFIO)
  • 패킷 처리를 위한 버퍼, 큐 등을 사용자 공간 버퍼에 할당

#2 아키텍처

그림 1. DPDK Architecture

2-1. 컴포넌트

  • EAL (Environment Abstraction Layer): DPDK 애플리케이션과 하드웨어 간의 기본 인터페이스를 제공하여 운영 체제 및 하드웨어의 차이점에 대한 세부 사항을 추상화
  • Memory Management: 효율적인 패킷 처리에 필수적인 huge page, 메모리 풀 및 버퍼 관리 기능을 제공
  • PMDs (Poll Mode Drivers): 다양한 네트워크 인터페이스에 최적화된 드라이버로, 커널의 네트워크 스택을 바이패스하여 지연 시간을 줄이고 처리량을 증가
  • Ring Buffers: 프로세스 간 고속 통신을 위한 큐 버퍼
  • APIs for Packet Processing: 헤더 파싱, 패킷 분류 및 패킷 포워딩을 포함한 패킷 조작을 위한 일련의 함수 및 라이브러리
  • Crypto and Security: 암호화 및 보안을 지원하는 라이브러리 및 드라이버
  • Eventdev and Timers: 이벤트 중심 프로그래밍 및 시간 관리 기능을 위해 작업을 적시에 스케줄링하고 실행할 수 있도록 지원

2-2. 라이브러리

  • librte_eal: DPDK의 기본 API를 통해 메모리, 타이머 및 로그와 같은 하드웨어 리소스에 액세스
  • librte_mempool: 메모리 풀을 관리
  • librte_ring: Lock-free FIFO 큐 제공
  • librte_mbuf: 패킷 버퍼 처리
  • librte_ethdev: 이더넷 장치 구성 및 쿼리를 위한 API를 제공하며 패킷 송수신을 포함한 다양한 작업을 지원
  • librte_net: 네트워크 프로토콜을 처리하기 위한 Helper API를 제공
  • librte_ip_frag: IPv4 및 IPv6 모두를 지원하는 IP 패킷의 프레그멘테이션 및 리어셈블 지원
  • librte_kni: DPDK 응용 프로그램과 리눅스 커널 네트워킹 스택 간의 통신을 용이하게 하며, 주로 기존 리눅스 네트워크 서비스의 디버깅 또는 인터페이스에 사용

 

 

 

참고 문서

'컴퓨터 과학 > 네트워크' 카테고리의 다른 글

Network Packet RX (Host-NIC Interface)  (0) 2024.04.24
# Dockerfile
FROM scratch
RUN ~~
CMD ["", ""]

# image 
# 생성, 조회, 삭제
docker build -t {image_name} .
docker images
docker rmi {image id}

# container 생성, 조회, 삭제, 시작
docker create -i --name {container_name} {image_name}
docker container ls 
docker rm {container id}
docker start {container_name}

# container 생성 + 시작
docker run -d -it --name {container_name} {image_name}

# cgroup 설정
docker run --cgroup-parent={cgroup_path} {image_name}

# 명령어 전달
docker exec -it {container_id} {command}
# 쉘 접속
docker attach -it {container_id}
docker run --attach stdout {image_name}
# 포트 포워딩 
docker run -p <host_port>:<container_port> {image_name}

 

'컴퓨터 과학 > 운영체제' 카테고리의 다른 글

Cgroups (Control Groups)  (0) 2024.05.17
Kernel DMA API  (0) 2024.04.24

#1 개념

1-1. 배경

  Cgroups는 2006년 Google의 "Process Containers" 프로젝트를 통해 만들어졌으며, 프로젝트는 다음과 같은 목적으로 시작되었다.

  • 리소스 격리: 다수의 프로세스가 동시에 실행되는 환경에서 각 프로세스가 시스템 자원을 공유하고 사용할 때 발생하는 리소스 경합으로 인한 성능 저하를 방지하기 위한 프로세스 격리 및 자원 사용량 제한
  • 보안: 악성 코드나 악의적인 프로그램이 시스템에 액세스 하여 피해를 입히는 것을 방지하기 위해, 프로세스를 격리된 환경에서 실행
  • 자원 관리의 최적화: 프로세스 간의 자원 사용을 효율적으로 관리하고 최적화하기 위해 자원 모니터링 및 사용량 제한

1-2. 정의

  Cgroups는 작업셋의 집약/파티셔닝을 제공하는 메커니즘으로 하나 또는 그 이상의 서브 시스템을 파라미터 셋으로 연관시키는 역할을 한다. 서브 시스템은 작업 그룹의 사용을 효과적으로 만들어주는 모듈로, 일반적으로 자원을 스케쥴링하고 그룹 별 제한을 적용하는 등의 작업을 수행하는 "resource controller"이다. 계층은 트리에 배열된 cgroup의 집합으로, 시스템의 모든 작업이 cgroup의 집합 중 하나에 포함되도록 한다. 각 서브 시스템은 해당 cgroup의 system-specific state와 cgroup 가상 파일 시스템의 인스턴스를 가지고 있다.

그림 1. 서브 시스템의 종류

#2 사용법

2-1. Basic Usage

  Cgroup과 서브시스템은 기본적으로 쉘 명령어를 사용하여 조작할 수 있으며, 가상 파일시스템을 통해 동작한다.

# To mount a cgroup hierarchy with all available subsystems
mount -t cgroup {group_name} /sys/fs/cgroup

# mount tmpfs on /sys/fs/cgroup
# create direcotries for each cgroup resource
mount -t tmpfs cgroup_root /sys/fs/cgroup
mkdir /sys/fs/cgroup/rg1

# mount a hierarchy with cpuset and memory subsystem
mount -t cgroup -o cpuset,memory hier1 /sys/fs/cgroup/rg1

2-2. Attaching process

echo PID > tasks

 

 

참고 자료

 

 

 

'컴퓨터 과학 > 운영체제' 카테고리의 다른 글

Docker Script  (0) 2024.05.17
Kernel DMA API  (0) 2024.04.24

#1 개념

1-1. 배경

  멀티 프로세싱이 널리 사용되면서 CPU 소켓 당 코어 수, 메모리 컨트롤러, 메모리 채널 및 마더보드의 CPU 소켓 수 등이 증가했다. 이러한 환경은 다수의 코어를 활용하여 연산 효율을 높이는 동시에 메모리 오버헤드 또한 발생시켰다. 각 코어가 임의의 데이터에 접근하기 위해 메모리 컨트롤러에 접근하는 것은 하드웨어적인 물리적 거리에 따른 지연시간을 초래한다. 간단한 예로, 아래 그림에서 CPU 소켓 0번의 코어가 CPU 소켓 1번에 연결된 메모리에 접근하려 할 때, 최대 2배의 지연시간이 발생할 수 있다. 이러한 이슈를 보완하기 위해 NUMA라는 개념이 도입되었다.

그림 1. NUMA architecture

1-2. 정의

   NUMA(Non-Uniform Memory Access)의 의미는 불균일 메모리 접근이라는 뜻으로 코어들의 메모리 접근 시간이 균일하지 않다는 것을 나타내며, 이는 주로 여러 CPU 소켓 및 여러 메모리 컨트롤러에 의해 지연 시간이 발생하는 시스템을 지칭한다. NUMA 아키텍처에서는 메모리 접근 시간을 균일화하는 것이 주요 과제로 다뤄지며, 이를 위해 같은 지역의 메모리를 사용하는 코어들을 그룹화하여 코어들의 메모리 접근 지연시간을 최소화하려는 노력이 이루어진다.

그림 2. NUMA Node Example

#2 사용법

2-1. 조회

  기본적으로 NUMA 노드와 관련된 명령어는 numactl을 사용하며 아래와 같은 명령어로 현재 시스템의 NUMA 구성을 조회활 수 있다.

numactl --show
numactl --hardware

2-2. 기타 명령어

# 프로세스 특정 메모리 바인딩
numactl --membind=0,1 --your_program_name 

# 프로세스 특정 코어 바인딩
numactl --physcpubind=0,2,4,6 -- your_program_name

# NUMA 노드 0에서 프로세스 실행
numactl --cpunodebind=0 --membind=0 your_program_name

 

 

참고 자료

'컴퓨터 과학 > 컴퓨터 구조' 카테고리의 다른 글

메모리 구조 (Memory Architecture)  (0) 2024.05.14
Memory Mapped I/O (MMIO)  (0) 2024.04.24

#1 개념

1-1. Seq2seq

  Seq2seq 모델은 문장이 순서와 위치의 영향을 많이 받는 특성을 이용하여 문장을 하나의 시퀀스로 다루고 학습한다. Seq2seq 모델의 원리는 인코더와 디코더를 통해 입력 언어를 문맥 벡터(중간 언어)로 변환하고, 디코더를 통해 문맥 벡터를 출력 언어로 변환한다. 즉, 문맥 벡터라는 중간 언어를 통해 입력 언어와 출력 언어 사이의 모델을 형성하고 인코더 디코더는 각 언어와 문맥 벡터의 관계를 학습하는 것이다. 그리고 시퀀스 데이터를 처리하는 데 특화된 RNN, LSTM 모델을 활용하여 인코더와 디코더의 각 계층을 구성한다. 

그림 1. Seq2seq overview

 

  하지만 seq2seq2 모델은 다음과 같은 단점이 있어 자연어 처리를 위한 새로운 모델의 설계 필요성이 촉구 됐다.

  • RNN 모델이 가지는 장기 의존성 문제로 인해 시퀀스 사이의 장거리 상관관계를 학습하기 어렵다.
  • 시퀀스를 학습하기 위해 RNN 모델과 같이 이전 단계에 의존하기 때문에 병렬화가 어렵다.
  • 인코더 디코더로 인해 모델의 병렬화가 어렵다.
  • RNN 모델의 계층은 컴퓨팅 연산이 복잡하다.

1-2. Transformer

  트랜스포머 모델은 기존 RNN 모델을 이용한 seq2seq 모델의 단점을 극복하기 위해 인코더 디코더가 존재하지만 어텐션이라는 개념을 이용하여 단어 입력을 순차적으로 받지 않는 새로운 모델이다. 이를 통해 모델의 병렬 연산이 가능하며, 이전 단계에 의존하지 않게 되었다. 그리고 트랜스포머 모델의 내부는 인코더 스택으로 이루어진 인코딩 컴포넌트와 인코더 스택과 같은 수의 디코더 스택으로 이루어진 디코딩 컴포넌트 그리고 두 컴포넌트 사이의 연결 컴포넌트로 구성되어 있다. 

그림 2. Transformer overview

 

  트랜스포머 모델의 어텐션 메커니즘은 순차적이지 않은 단어 입력을 위해 위치 정보를 알려주기 위한 메커니즘으로, 입력 시퀀스의 각 요소가 다른 요소에게 주는 중요도를 계산하여 가중 평균을 구하고 문장의 어느 부분에 주의를 기울여야 하는지를 결정한다. 이를 통해 트랜스포머 모델은 seq2seq 모델의 장기 의존성 문제를 효과적으로 해결한다. 트랜스포머의 어텐션은 크게 인코더, 디코더, 인코더-디코더 세 가지가 있다.

#2 모델

  트랜스포머 모델은 하이퍼 파라미터인 num_layers 개수의 인코더 층을 쌓으며, 인코더와 디코더는 self-attention, feed forward neural network 두 하위 계층으로 이루어져 있다. 또한, 인코더와 디코더를 연결하기 위한 인코더-디코더 어텐션 계층이 존재한다.

그림 3. Transformer model architecture

2-1. Embedding

  트랜스포머 모델은 인코더에 입력을 전달하기 전에 먼저 텍스트 데이터인 입력을 수치화하여 모델이 이해하고 처리할 수 있도록 고정된 크기의 벡터로 변환하는 과정을 거친다. 임베딩 과정을 통해 입력 텍스트를 단어 또는 하위 단어로 나누어 토근화 하고, 각 토큰을 고정된 크기의 벡터로 변환한다. 그리고 순차적인 구조를 갖지 않는 트랜스포머 모델을 위해 포지셔널 인코딩을 통해 단어 벡터 사이의 위치 정보를 제공하여 디코딩 후 단어를 재조합 할 수 있도록 한다.

그림 4. Embedding

2-2. Encoder

  • Self-Attention

  트랜스포머 모델의 Self-Attention은 입력 시퀀스의 각 요소가 다른 모든 요소들과의 관계를 고려하여 자신을 재구성하는 메커니즘이다. Self-Attention은 입력 시퀀스의 모든 위치 간 상호 의존성을 모델링하는 데 사용되며, 단어의 문맥을 이해하는 데 매우 유용하여 장기 의존성 문제가 없다. 또한 임베딩 과정을 통해 순차적이지 않은 요소들을 통해 병렬 처리가 가능하다.

  Self-Attention은 하나의 단어가 문맥의 모든 단어와의 관계성을 반영하기 위해 하나의 단어 벡터를 Query, Key, Value 세 가지 벡터로 변환한다. 이 과정은 Wq(쿼리 가중치 벡터), Wk(키 가중치 벡터), Wv(밸류 가중치 벡터)를 하나의 단어에 곱하여 수행되며, 각 벡터의 선형 벡터로 변환되도록 하며, 다음의 역할을 수행할 수 있도록 한다.

  1. 쿼리 벡터: 단어 간의 유사 정도를 질문하기 위한 벡터
  2. 키 벡터: 단어 간의 유사 정도를 나타내기 위한 벡터
  3. 밸류 벡터: 출력 값을 전달하기 위한 벡터

  Self-Attention은 위의 세 가지 벡터를 통해 각 단어들의 문맥 속 의미를 모델링한다. 먼저 한 단어의 쿼리 벡터를 모든 단어의 키 벡터와 어텐션 스코어를 계산하여 단어와 단어 사이의 유사성을 계산한다. 계산된 어텐션 스코어는 소프트맥스 함수를 통해 정규화되며, 이를 어텐션 가중치라 한다. 이를 통해 한 단어와 모든 단어 사이의 유사성을 정규화 된 어텐션 가중치 값으로 나타낼 수 있다. 이러한 과정을 스케일 닷 프로덕트 어텐션이라 하며, 계산된 어텐션 가중치는 하나의 밸류 벡터에 모든 단어에 대한 어텐션 가중치 값을 곱하여 한 단어가 문맥 속에서 다른 모든 단어와의 유사성 정보를 내포하는 벡터의 형태로 출력된다.

  또한 인코더에서 Self-Attention은 주로 병렬적으로 수행하며 이를 Multi-Headed Self-Attention이라 한다. 각 단어들의 쿼리, 키, 벨류 벡터가 여러 개로 나뉘며, 각 벡터 간의 의존성이 없기 때문에 병렬적으로 나뉘어 수행될 수 있다.

그림 5. Scaled Dot-Product Attention

  • FFN (Feed Forward Network)

  앞의 Self-Attentinon에서는 모델의 계산을 위해 입력 벡터를 가중치 벡터의 곱을 통해 벡터의 선형화를 수행하였다. 따라서 Self-Attention의 계산은 관계와 가중합을 기반으로 한 단순 정보만 제공하기 때문에 단어의 특징을 나타내기에는 밸류 벡터의 비선형성이 없어 부족할 수 있다. 따라서 트랜스포머 모델에서는 FFN을 통해 비선형성을 추가하고, 추가적인 특징 추출을 통해 벡터의 표현력을 향상시킨다.  FFN은 가중 벡터를 통해 선형화 된 후, 활성화 함수 ReLU를 통해 비선형성을 추가한 후 다시 가중 벡터를 통해 선형화하는 방식으로 동작한다.

그림 6. Feed Forward Network

2-3. Dedocer

  디코더 또한 인코더와 같이 Self-Attention과 FFN으로 이루어져 있으며, 추가로 인코더와 디코더를 연결하기 위한 Encoder-Decoder Attention이 존재한다.

그림 7. Decoder

  • Masked Multi-Head Self-Attention

  인코더의 Self-Attentnio 계층에서는 입력 시퀀스의 모든 단어를 고려하여 특징을 추출해야 문맥의 의미를 파악할 수 있었다. 하지만 디코더의 Self-Attentnio 계층에서는 문장의 차례대로 생성하는 과정에서 이후의 단어를 고려하는 것이 아니라 이전의 생성된 단어만 고려하여 다음 단어를 예측하여야 한다. 이러한 문제를 해결하기 위해 Masked Multi-Head Self-Attention 계층에서는 이후의 단어에 대한 어텐션을 제한하여 이전 단어를 고려하면서 다음 단어를 예측하도록 한다. 이는 self-attention을 구하기 위한 소프트맥스 함수 계산 전 포지션 마스킹을 통해 계산하여야 할 키와 쿼리를 정하여 수행된다. 

  • Encoder-Decoder Attention

  Encoder-Decoder Attention은 Encoder의 출력과 Decoder의 입력을 연결하는 역할을 수행하며, Attention의 동작을 기본 원리로 한다. 기존의 Attention처럼 쿼리와 키의 어텐션 가중치와 밸류를 곱하여 컨텍스트 벡터를 구한다. 여기서 키와 밸류는 인코더의 출력 벡터에서 가중 벡터를 곱하여 구하고, 쿼리는 디코더의 입력에 가중 벡터를 곱하여 구한다. 이를 통해 디코더는 인코더의 출력과 입력을 고려하는 컨텍스트 벡터를 이용하여 다음 단어를 예측하게 된다.

2-4. Final Linear and Softmax Layer

  • Linear layer: 디코더의 스택에 의해 생성된 벡터를 로짓 벡터라고 하는 훨씬 더 긴 길이의 보캅 크기의 벡터로 투영
  • Softmax layer: 가능한 다음 단어의 확률 분포를 생성

 

 

 

 

참고 자료

'컴퓨터 과학 > 인공지능' 카테고리의 다른 글

다층 퍼셉트론 (ANN, MLP)  (0) 2024.05.07
선형 회귀 (Linear Regression)  (1) 2024.04.30

#1 아키텍처

1-1. Background

  흔히 RAM을 메모리라고 지칭하기도 하는데 정확한 범주에서는 RAM의 정의가 임의로 접근 가능한 메모리이기 때문에 메모리, SSD, HDD 등과 같은 보조기억장치도 포함하는 개념이다. 여기서 특징은 메모리는 휘발성 메모리이고, 디스크는 비휘발성 메모리라는 것이다. 이 글에서는 메모리에 대해 주로 다루고자 한다.

  • RAM(Random Access Memory): 임의 접근 메모리
  • VM(Volatile Memory): 휘발성 메모리
  • NVM(Non-Volatile Memory): 비휘발성 메모리

1-2. 세부 컴포넌트

  데이터를 저장하는 DRAM과 이를 연산하는 CPU, 이들 간의 데이터를 전달할 수 있는 인터페이스들까지 우리는 메모리라 일컫는다. DRAM은 메모리 모듈에 구성되어 마더보드와 연결되고, 마더보드는 CPU와 메모리 모듈이 데이터를 주고 받을 수 있도록 하고, 전원을 공급하는 역할을 한다. 각 인터페이스는 다음과 같다.

  • 마더보드: 하드웨어 구성 요소들을 연결하는 플랫폼으로써 전원을 공급하고 시스템 버스를 통해 데이터 및 제어 신호를 전달하여 상호 작용을 가능하도록 한다.
  • 메모리 컨트롤러: CPU 내부에 위치한 하드웨어로 코어의 메모리 엑세스 및 제어를 담당한다.
  • 메모리 버스: 마더 보드에 존재하며 CPU와 메모리 간의 데이터 및 제어 신호를 전송하는 통로이다.
  • 메모리 모듈: 흔히 말하는 DRAM 찹을 탑재하는 모듈로써 메모리 버스에 직접 연결되어 CPU의 메모리 컨트롤러를 통해 데이터를 주고 받는다.

그림 1. Memory overview

#2 메모리 컨트롤러

2-1. 위치 변화

  모놀리식 구조의 컴퓨터 구조에서 메모리 컨트롤러는 FSB를 통해 마더보드 내부의 노스브릿지와 연결되어 CPU가 메모리 컨트롤러로 요청을 보내면 메모리 컨트롤러가 DIMM과의 상호 작용을 통해 데이터를 전송하는 방식의 구조였다. 하지만 마이크로프로세서 구조로 넘어가면서 메모리 레이턴시를 줄이기 위해 CPU 내부로 메모리 컨트롤러의 위치를 옮겨가게 되었다. 이는 성능의 향상을 가져오기도 했지만 반대로 메모리가 CPU 타입에 귀속되는 결과도 가져오게 되었다.

2-2. 채널

  메모리 채널은 메모리 컨트롤러가 메모리 모듈과 연결되는 통로로 하낭의 채널은 하나의 메모리 모듈과 연결된다. 메모리 채널의 대역폭은 메모리 채널의 전송 속도와 비트 수를 곱한 것과 같다. 대역폭을 쉽게 늘리기 위한 수단으로 멀티/코어/옥타 채널도 요즘은 많이 사용한다.

그림 2. Quad channel overview

 

#3 DIMM (Dual In-line Memory Module)

3-1. 구성 요소

  • RCD: 시스템 클럭 신호를 버퍼링하여 CPU와 DIMM 사이의 연산 상호작용을 수행하는 칩
  • DRAM: 동적 임의 접근 메모리
  • Rank: 여러 DRAM 칩을 묶어 한 Rank를 구성
  • Bank: DRAM 칩의 물리적인 한 섹션
  • Row: bank 내의 행
  • Col: bank 내의 열

3-2. 동작

  비트 수에 따라 주소 구성 달라짐 페이징 기법에서 메모리 프레임 번호가 row/col + rank + bank + channel의 조합

 

 

 

참고 자료

'컴퓨터 과학 > 컴퓨터 구조' 카테고리의 다른 글

NUMA (Non-Uniform Memory Access)  (0) 2024.05.16
Memory Mapped I/O (MMIO)  (0) 2024.04.24

#1 개념

1-1. 인공신경망

  인공신경망(Arificial Neural Network)는 생물학적 뉴런이 작동하는 방식에서 영감을 받은 수학적 모델이다. 이 모델은 입력 데이터를 받아 처리하여 출력값을 반환하는 것을 목적으로 한다. 인공 신경망은 여러 개의 계층으로 구성되며, 각 계층은 뉴런이라 불리는 단위로 구성 된다.

1-2. 다층 퍼셉트론

  인공신경망의 가장 기본적인 형태는 입력 계층과 출력 계층으로 이루어진 단순 퍼셉트론이다. 여기서 (여러 개의) 은닉 계층이 추가되면 이를 다층 퍼셉트론(Multilayer perceptron, MLP)라 하며, 각 뉴런은 입력과 가중치를 곱하고 편향을 더한 후 활성화 함수를 적용하여 출력을 생성한다. 이런 식으로 입력에서 출력까지 데이터가 전달되며, 학습 알고리즘을 사용하여 신경망이 원하는 출력에 가깝게 학습된다. 우리가 흔히 말하는 딥러닝의 과정이 다층 퍼셉트론인 것이다.

그림 1. 신경망과 인공신경망

#2 모델

2-1. 기본 형태

  인공신경망은 주어진 입력값에 대해 원하는 출력을 생성하는 수학적 모델이다. 인공신경망의 가장 기본적이고 단순한 형태는 선형회귀로 볼 수 있다. 선형회귀는 하나의 계층으로 이루어져 선형 함수를 학습하는 모델으로 다음 입력값을 선형 모델을 통해 예측할 수 있다. 

그림 2. 선형 함수 예

 

  일반적인 모델의 학습은 활성화 함수 -> 손실 함수 -> 최적화 -> 정규화의 과정을 따르며 활성화 함수 단계를 제외 하면 앞서 설명했던 선형회귀와 같은 순서이다. 순서는 엄밀하게 고정되지 않고 유연하게 바뀔 수 있으며, 한 알고리즘이 다른 단계를 포함하기도 한다.

2-2. 활성화 함수

  하지만 실제로 인공신경망이 학습하는 것은 단순히 점 사이의 선을 학습하는 것이 아닌 패턴이나 이미지, 음성, 텍스트 등 다양한 분야에서 학습을 시도한다. 하지만 단일 계층의 선형함수의 형태로는 이러한 학습이 어렵기 때문에 여러 계층으로 비선형 함수를 학습할 수 있어야 한다. 이를 위해 다층 퍼셉트론에서는 비선형 함수를 학습할 수 있도록 선형 함수로 변환하는 역할인 활성화 함수를 사용하고, 변환된 선형 함수들을 다층으로 학습하여 원하는 출력값을 생성하도록 한다.

그림 3. 활성화 함수

 

다양한 활성화 함수의 예시는 다음과 같으며 각각의 원리를 통해 비선형 변환을 수행한다. 

  • Sigmoid: 입력값을 0과 1 범위로 압축, 입력 값이 매우 크거나 작을 때 경사가 급격하게 감소하여 그래디언트 손실 문제가 발생, 주로 이진 분류 문제에서 출력층의 활성화 함수로 사용
  • Hyperbolic Tangent Function (tanh): 입력값을 -1과 1 범위로 압축, 입력 값이 매우 크거나 작을 때 경사가 급격하게 감소하여 그래디언트 손실 문제가 발생, 주로 RNN이나 은닉층의 활성화 함수로 사용
  • Rectified Linear Unit (ReLU): 입력값이 0보다 크면 그대로 반환하고 0보다 작으면 0으로 변환, 학습 속도가 매우 빠르고 구현이 간단하여 일반적으로 은닉층의 활성화 함수로 많이 사용, 입력이 음수일 때 출력이 0이 되어 dying ReLU 문제 발생
  • Leaky ReLU: 입력값이 0보다 크면 그대로 반환하고 0보다 작으면 작은 양수로 반환, 일반적으로 -0.01과 같은 기울기 사용, dying ReLU 문제 해결을 통해 ReLU보다 성능이 좋음

그림 4. 활성화 함수 그래프

2-3. 정규화

  모델은 학습 데이터를 통해 훈련을 하기 때문에 일반적인 상황과의 거리가 멀 수 있다. 따라서 정규화를 통해 모델에서 발생하는 training error가 아닌 generalization error를 감소시켜야 한다.

그림 5. Generalization error

 

  정규화는 아래의 과정을 거쳐 진행한다.

  • Dropout: 신경망의 일부 유닛을 무작위로 선택하여 학습 과정에서 제외, 네트워크가 특정 뉴런에 의존하지 않도록 하여 일반화 성능을 향상시킴, 학습 할 때마다 무작위로 일부 뉴런을 선택하여 학습 참여에 제외하고 테스트 할 때는 모든 뉴런 사용
  • Data Augmentation: 데이터 증강은 학습 데이터셋을 변형하여 모델이 다양한 상황에서 더 강건하게 학습되도록 하는 기법, 예를 들어 이미지의 경우 회전, 이동, 크기 조정, 반전 등의 변환
  • Label Smoothing: 신경망의 출력값에 대한 부정확성을 강제하는 기법

3. 구현

귀찮다....

'컴퓨터 과학 > 인공지능' 카테고리의 다른 글

Transformer  (0) 2024.05.14
선형 회귀 (Linear Regression)  (1) 2024.04.30

+ Recent posts