Skip to content

Commit

Permalink
edited for image
Browse files Browse the repository at this point in the history
  • Loading branch information
wonchul-kim committed Jan 6, 2024
1 parent 27f0b50 commit ccebbb0
Show file tree
Hide file tree
Showing 73 changed files with 36 additions and 69 deletions.
4 changes: 2 additions & 2 deletions _posts/2021-07-02-DL.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ tag: ANNs

2세대 신경망은 현재 많은 발전을 이루고 있는

<img src='./imgs/ann2.jfif'>
<img src='/assets/dl/ann2.jfif'>

ref: https://blog.lgcns.com/1750

Expand All @@ -24,7 +24,7 @@ ref: https://blog.lgcns.com/1750

Spiking Neural Networks(SNN)는 앞선 2세대 신경망에서의 뇌의 synapse를 모방하고자 하는 학습과정을 좀 더 정교하게 반영하고자 한다. 인간의 뉴런과 시냅스 간의 정보 전달은 전기적 신호에 기반하고, 이는 시간의 흐름에 따라 강도가 조절되며 시냅스를 통해 다음 뉴런으로 전달된다. 2세대에서는 이를 단순히 가중치의 합으로 구현하였지만, SNN에서는 신호전달 과정을 모델링하려고 한다.

<img src='./imgs/ann3.jfif'>
<img src='/assets/dl/ann3.jfif'>

ref: https://blog.lgcns.com/1750

Expand Down
2 changes: 1 addition & 1 deletion _posts/2021-08-08-metrics.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ $$ FPR = \frac{FP}{FP + TN} = 1 - specificity$$

실제 `False`인 것을 알고리즘이 `False`라고 예측할 확률이다.

<p align='center'><img src='./imgs/fpr_`threshold`.png' loc=center></p>
<p align='center'><img src='/assets/metrics/fpr_`threshold`.png' loc=center></p>

* `threshold`를 높이면, positive rate가 커지기 떄문에 FPR(sensitivity)는 증가하지만, specificity는 감소한다.

Expand Down
33 changes: 0 additions & 33 deletions _posts/2021-10-10-segmentations.md

This file was deleted.

2 changes: 1 addition & 1 deletion _posts/2021-11-13-react_intro.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,5 +83,5 @@ https://react-anyone.vlpt.us/
* Updating
* Unmounting
<img src='./imgs/lifecycle.png'>
<img src='/assets/react_intro/lifecycle.png'>
2 changes: 1 addition & 1 deletion _posts/2021-11-20-react_intro1.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ tag: react
* 기본적인 pipeline은 `public/indext.html` -> `App.js` -> `src/index.js`로 연동되면서 화면에 출력
* 코드를 작성하는 데에 있어서는 `function type`과 `class type`이 존재
<img src='./imgs/code.png'>
<img src='/assets/react_intro/code.png'>
* `Component`내에서는 하나의 최상위 `tag`만 사용해야 한다.
Expand Down
2 changes: 1 addition & 1 deletion _posts/2022-08-22-nexus3.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ docker login <ip>:5000
browse -> <등록한 docker registry> 선택

예를 들어, 아래와 같이 되어 있다면,
<img src="./imgs/nexus_1.png">
<img src="/assets/nexus3/nexus_1.png">

일반적으로는 아래의 명령어를
```
Expand Down
2 changes: 1 addition & 1 deletion _posts/2023-01-28-ubuntu_setting_mounts.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ sudo fdisk -l
sudo fdisk /dev/sdb
```

<img src='./imgs/ubuntu_setting_mounts/partition.png'>
<img src='/assets/ubuntu_setting_mounts/partition.png'>

3. Partition format
```
Expand Down
2 changes: 1 addition & 1 deletion _posts/2023-02-11-computer-vision-iou.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ tag: iou

1. IoU of tow rectangles without rotation

<img src='./imgs/iou/hbb_iou.png' width=400 >
<img src='/assets/iou/hbb_iou.png' width=400 >

```python
area_bbox1 = (rbx1 - ltx1)*(rby1 - lty1)
Expand Down
2 changes: 1 addition & 1 deletion _posts/2023-04-23-python-celery.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ tag: celery

전체적인 프로세스는 아래와 같다.

<img src="./imgs/celery/celery.png">
<img src="/assets/celery/celery.png">

메인 프로그램에서 `task``Message broker`에게 넘기고, `celery worker`에서 `Queue`에 쌓이 `task`를 처리하도록 한다.

Expand Down
10 changes: 5 additions & 5 deletions _posts/2023-10-05-large-scale-distributed.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@ tag: large-scale, distributed programming
- Local Rank: 한 node에서의 프로세스의 우선순위를 의미하지만, ML에서는 node에서의 GPU id(number)를 의미
- World Size: 모든 node에서의 프로세스의 개수

<img src='./imgs/large_scale/node.png'>
<img src='/assets/large_scale/node.png'>

-------------------------------------
### Pytorch에서 multi-process application을 실행하는 방법

#### 1. User code가 main process로 하여 특정 함수를 subprocess로 분기

<img src='./imgs/large_scale/multiprocess.png'>
<img src='/assets/large_scale/multiprocess.png'>

subprocess를 분기하는 방법으로는

Expand All @@ -35,7 +35,7 @@ subprocess를 분기하는 방법으로는

#### 2. Pytorch launcher가 main-process가 되어 사용자의 코드 전체를 sub-process로 분기

<img src='./imgs/large_scale/multiprocess_2.png'>
<img src='/assets/large_scale/multiprocess_2.png'>

`torch`에 내장된 launcher가 전체 프로세스를 관장하는 방식으로 다음과 같이 python의 옵션을 활용해서 실행해야 한다.

Expand Down Expand Up @@ -63,7 +63,7 @@ Message Passing에 사용되는 여러 연산 (broadcast, reduce, scatter, gathe

[DISTRIBUTED COMMUNICATION PACKAGE - TORCH.DISTRIBUTED](https://pytorch.org/docs/stable/distributed.html)에서 더 자세한 정보를 참고할 수 있으며, 다음과 같이 정리된다.

<img src='./imgs/large_scale/mpi.png'>
<img src='/assets/large_scale/mpi.png'>


#### Process Group
Expand All @@ -77,7 +77,7 @@ Message Passing에 사용되는 여러 연산 (broadcast, reduce, scatter, gathe

### P2P Communication (Point to Point)

<img src='./imgs/large_scale/p2p.png'>
<img src='/assets/large_scale/p2p.png'>

`torch.distributed`

Expand Down
14 changes: 7 additions & 7 deletions _posts/2023-10-05-large-scale-parallelism.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,27 +12,27 @@ tag: large-scale, Parallel Processing

### Data Parallel

<img src='./imgs/large_scale/data_parallel.png'>
<img src='/assets/large_scale/data_parallel.png'>

각 GPU에 모델을 복사하고, 데이터는 batch-size만큼 분배하여 학습을 하는 방식으로 GPU 갯수만큼 batch-size를 더 크게 할 수 있다.


### Model Parallel

<img src='./imgs/large_scale/model_parallel.png'>
<img src='/assets/large_scale/model_parallel.png'>

만약, 모델이 하나의 GPU에 올라갈 수 없을 정도로 크다면, 모델을 내부 파리미터 단위로 하여금 여러
GPU에 분배하여 학습하는 방식이다.

#### Inter-layder Model Parallel

<img src='./imgs/large_scale/inter_layer.png'>
<img src='/assets/large_scale/inter_layer.png'>

layer 단위로 모델을 분리하여 각 GPU에 올려서 학습하는 방식이다.

#### Intra-layer Model Parallel

<img src='./imgs/large_scale/intra_layer.png'>
<img src='/assets/large_scale/intra_layer.png'>

layer와 관계없이 tensor 자체를 쪼개는 방식으로 **NVIDIA의 Megatron-LM**이 이데 해당한다. 예를 들어, [256, 256] 사이즈의 parameter는 [128, 256] 또는 [256, 128]로 쪼갠다.

Expand All @@ -41,16 +41,16 @@ layer와 관계없이 tensor 자체를 쪼개는 방식으로 **NVIDIA의 Megatr

inter-layer 방식의 단점을 개선한 방법으로 inter-layer는 layer 단위로 쪼개지면 각 layer가 학습되어야 하는 순서가 존재한다. 예를 들어, 1번 layer가 진행되어야 2번 layer가 진행되고, ... N번 layer가 순차적으로 진행되기 때문에 모델을 쪼개서 학습하는 것 자체는 병렬화라고 하지만 완전 병렬 처리는 아니라고 할 수 있다.

<img src='./imgs/large_scale/pipeline_parallel_1.png'>
<img src='/assets/large_scale/pipeline_parallel_1.png'>

이런 문제점을 해결하기 위해서 아래 그림처럼 연산과정을 병렬적으로 파이프라인을 구성하는 방식이다.

<img src='./imgs/large_scale/pipeline_parallel_2.png'>
<img src='/assets/large_scale/pipeline_parallel_2.png'>


#### Multi-dimension parallel

<img src='./imgs/large_scale/multi_dimension_parallel.png'>
<img src='/assets/large_scale/multi_dimension_parallel.png'>

앞선 병렬처리 방법들은 동시에 여러 개를 적용할 수 있으며, 각각의 방법은 하나의 dimension을 의마할 수 있다.

Expand Down
6 changes: 3 additions & 3 deletions _posts/2023-10-06-large-scale-data_parallelism.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ tag: large-scale, Data Parallel

### Forward Pass

<img src='./imgs/large_scale/dp_forward.png>
<img src='/assets/large_scale/dp_forward.png>

1. mini-batch를 `Scatter`를 통해 각 device(GPU)로 전송
2. main device에 로드되어 있는 모델의 파라미터를 `Broadcast`를 통해 각 device에 복사
Expand All @@ -22,7 +22,7 @@ tag: large-scale, Data Parallel

### Backward Pass

<img src='./imgs/large_scale/dp_backward.png>
<img src='/assets/large_scale/dp_backward.png>

1. 계산된 loss를 각 device에 `Scatter`를 통해 전송
2. 각 device에서는 전송된 loss로 backward로 gradiens 계산
Expand All @@ -40,7 +40,7 @@ tag: large-scale, Data Parallel

> logits는 vector이나 loss는 scalar이기 때문에 크기가 훨씬 작기 때문이다.
<img src='./imgs/large_scale/dp_forward_2.png>
<img src='/assets/large_scale/dp_forward_2.png>

결국에는 logits로부터 loss를 계산하는 것도 multi-thread에서 수행하는 것이다. 이 때, loss에 대한 reduction이 2번 (그림에서 4, 5) 발생하게 되는 단점이 있으나, 메모리 불균형을 해결하고 loss computation에 대한 부분을 병렬화할 수 있다는 장점이 더 크게 작용한다.

Expand Down
12 changes: 6 additions & 6 deletions _posts/2023-10-06-large-scale-distributed_data_parallelism.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ tag: large-scale, Data Parallel

#### [Ring All-reduce ](https://github.com/baidu-research/baidu-allreduce)

<img src='./imgs/large_scale/ring_allreduce.gif'>
<img src='/assets/large_scale/ring_allreduce.gif'>


**Ring All-reduce****DDP**의 개발에 핵심이 된 이론으로
Expand All @@ -19,22 +19,22 @@ tag: large-scale, Data Parallel

**DDP**는 기존의 **DP**의 문제점을 해결하면서, **single/multi node에서 multi-GPUs**로 동작할 수 있다.

<img src='./imgs/large_scale/ddp.png'>
<img src='/assets/large_scale/ddp.png'>


### All-reduce를 언제 수행!?

All-reduce는 네트워크 통신이고, `backward()``step()`은 GPU 연산이기 때문에 동시에 처리가 가능하다.

먼저 아래의 그림을 보면, `backward()``step()`보다 훨신 큰 연산이다.
<img src='./imgs/large_scale/ddp_3.png'>
<img src='/assets/large_scale/ddp_3.png'>

그렇기 때문에 `backward()`가 끝날 때까지 기다리기 보다는 함께 처리하는 것이 더 효율적이며, 아래처럼 latency를 줄일 수 있다.
<img src='./imgs/large_scale/ddp_4.png'>
<img src='/assets/large_scale/ddp_4.png'>


결과적으로는 아래와 같이 수행된다.
<img src='./imgs/large_scale/ddp_2.png'>
<img src='/assets/large_scale/ddp_2.png'>

좀 더 자세히 들어가면,

Expand All @@ -47,7 +47,7 @@ All-reduce는 네트워크 통신이고, `backward()`와 `step()`은 GPU 연산
> A2: 아닙니다. Gradient Bucketing을 수행합니다. Bucket이 가득차면 All-reduce를 수행합니다

<img src='./imgs/large_scale/ddp_5.png'>
<img src='/assets/large_scale/ddp_5.png'>

Gradient Bucekting는 Gradient를 일정한 사이즈의 bucket에 저장해두고 가득차면 다른 프로세스로 전송하는 방식입니다. 가장 먼저 backward() 연산 도중 뒤쪽부터 계산된 Gradient들을 차례대로 bucket에 저장하다가 bucket의 용량이 가득차면 All-reduce를 수행해서 각 device에 Gradient의 합을 전달합니다. 그림 때문에 헷갈릴 수도 있는데, bucket에 저장되는 것은 모델의 파라미터가 아닌 해당 레이어에서 출력된 Gradient입니다. 모든 bucket은 일정한 사이즈를 가지고 있으며 bucket_size_mb 인자를 통해 mega-byte 단위로 용량을 설정 할 수 있습니다.

Expand Down
12 changes: 6 additions & 6 deletions _posts/2023-10-06-large-scale-pipeline_parallel.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ tag: large-scale, Data Parallel

#### [Ring All-reduce ](https://github.com/baidu-research/baidu-allreduce)

<img src='./imgs/large_scale/ring_allreduce.gif'>
<img src='/assets/large_scale/ring_allreduce.gif'>


**Ring All-reduce****DDP**의 개발에 핵심이 된 이론으로
Expand All @@ -19,22 +19,22 @@ tag: large-scale, Data Parallel

**DDP**는 기존의 **DP**의 문제점을 해결하면서, **single/multi node에서 multi-GPUs**로 동작할 수 있다.

<img src='./imgs/large_scale/ddp.png'>
<img src='/assets/large_scale/ddp.png'>


### All-reduce를 언제 수행!?

All-reduce는 네트워크 통신이고, `backward()``step()`은 GPU 연산이기 때문에 동시에 처리가 가능하다.

먼저 아래의 그림을 보면, `backward()``step()`보다 훨신 큰 연산이다.
<img src='./imgs/large_scale/ddp_3.png'>
<img src='/assets/large_scale/ddp_3.png'>

그렇기 때문에 `backward()`가 끝날 때까지 기다리기 보다는 함께 처리하는 것이 더 효율적이며, 아래처럼 latency를 줄일 수 있다.
<img src='./imgs/large_scale/ddp_4.png'>
<img src='/assets/large_scale/ddp_4.png'>


결과적으로는 아래와 같이 수행된다.
<img src='./imgs/large_scale/ddp_2.png'>
<img src='/assets/large_scale/ddp_2.png'>

좀 더 자세히 들어가면,

Expand All @@ -47,7 +47,7 @@ All-reduce는 네트워크 통신이고, `backward()`와 `step()`은 GPU 연산
> A2: 아닙니다. Gradient Bucketing을 수행합니다. Bucket이 가득차면 All-reduce를 수행합니다

<img src='./imgs/large_scale/ddp_5.png'>
<img src='/assets/large_scale/ddp_5.png'>

Gradient Bucekting는 Gradient를 일정한 사이즈의 bucket에 저장해두고 가득차면 다른 프로세스로 전송하는 방식입니다. 가장 먼저 backward() 연산 도중 뒤쪽부터 계산된 Gradient들을 차례대로 bucket에 저장하다가 bucket의 용량이 가득차면 All-reduce를 수행해서 각 device에 Gradient의 합을 전달합니다. 그림 때문에 헷갈릴 수도 있는데, bucket에 저장되는 것은 모델의 파라미터가 아닌 해당 레이어에서 출력된 Gradient입니다. 모든 bucket은 일정한 사이즈를 가지고 있으며 bucket_size_mb 인자를 통해 mega-byte 단위로 용량을 설정 할 수 있습니다.

Expand Down
Binary file removed _posts/figs/segmentations.png
Binary file not shown.
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes.
File renamed without changes.
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes

0 comments on commit ccebbb0

Please sign in to comment.