본문 바로가기

반응형

분류 전체보기

(369)
스레드 세이프 (Thread-safe) GIL (Global Interpreter Lock), Multi-Threading 이전 포스트에서 GIL을 살펴봤는데 GIL 자체가 하나의 스레드가 리소스를 점유하는 것이니 멀티 스레드를 사용할 때 더 이상 상호 배제 락 (mutext)를 사용하지 않아도 되는 것으로 생각할 수 있습니다. GIL이 파이썬에서 멀티 스레딩을 막는다면 당연히 프로그램의 데이터 구조에 동시에 접근할 수 없게끔 (Thread-safe) 구현되있지 않을까 하는 것이죠. 하지만 GIL은 스레드 세이프를 보장해주지 못합니다. 파이썬 스레드는 한 번에 단 하나만 실행되지만 여러 스레드가 같은 데이터 구조에 동시에 접근하는 것은 막지 못하며 안타깝게도 스레드끼리 언제 인터럽트될지 알 수가 없습니다. 예를 들어 병렬적으로 여러 가지의 개..
GIL (Global Interpreter Lock), Multi-Threading 파이썬의 표준 구현을 CPython 이라고 합니다. CPython은 1) 소스 코드를 구문 분석해서 8비트 명령어로 이루어진 바이트코드 (파이썬 3.6 부터는 16비트 명령어를 사용하므로 워드코드) 로 변환하고, 2) 스택 기반 인터프리터를 통해 바이트코드를 실행합니다. 바이트코드 인터프리터에는 파이썬 프로그램이 실행되는 동안 일관성 있게 유지해야 하는 상태가 존재하는데 CPython은 스레드 세이프하지 않은 메모리 관리를 쉽게 하기 위해, GIL (Global Interpreter Lock) 이라는 방법으로 여러 개의 스레드의 메모리 접근을 제한하는 형태로 일관성을 강제로 유지합니다. 즉, Figure 1에서 처럼 여러 개의 스레드가 병렬로 존재한다고 하더라도 실제로는 특정 순간에 하나의 스레드만 동작..
코딩테스트 문제 (28) - 정렬 리스트 병합하기 문제 여러 개의 정렬된 리스트를 1개의 정렬된 리스트로 병합하는 문제입니다. a = [[1,4,5],[1,3,4],[2,6]] => [1,1,2,3,4,4,5,6] 풀이 이 문제는 우선순위 큐를 사용해 풀 수 있는 문제로 파이썬에서 heapq 모듈을 사용하면 됩니다. 파이썬의 heapq 모듈은 최소힙이 구현된 것으로 리스트 원소를 heappush 메소드로 넣고 heappop 메소드로 리스트를 추출할때 이미 정렬되어 있으므로 맨 앞의 원소를 뽑아내고 다시 heap 구조에 집어 넣습니다. from heapq import heappush, heappop def solution(ListofList): result = [] heap = [] for i, l in enumerate(ListofList): heapp..
Object Detection - EfficientDet (2) 이전 포스트 [Machine Learning/Vision] - Object Detection - EfficientDet (1) Experiements Object detection COCO 2017 테스트 데이터셋에 대해 성능을 평가하고 data augmentation 기법으로 horizontal flipping 과 cropping 직전에 이미지를 0.1-2.0 사이로 리사이즈하는 scale jittering 을 사용합니다. 성능평가 방법으로 soft-NMS를 사용합니다. 성능평가 결과는 Table 2와 같습니다. Table 2는 비슷한 성능을 가진 다른 baseline 모델과 묶은 것으로 먼저 EfficientDet-D0는 YOLOv3 과 성능이 비슷하면서 FLOPS는 28배 정도 적습니다. Retin..
Object Detection - EfficientDet (1) CNN 모델의 속도-성능 tradeoff 문제는 굉장히 중요합니다. MobileNet, ShuffleNet, EfficientNet 모델과 같이 모델의 파라미터와 연산량을 (FLOPS) 줄이면서 컴퓨터 비젼의 다양한 태스크에 대한 성능을 높이려는 경량화 시도가 계속되고 있는데요, 여러 vision 관련 태스크 중에서도 object detection 태스크는 핸드폰, 자율주행, 로봇 등 다양한 분야에 적용되므로 모델의 연산량, 크기를 줄이면서 정확도를 높이는 것이 매우 중요합니다. 이번 포스트에서 살펴볼 내용은 구글에서 발표한 EfficientDet 으로 scalable, efficient object detection 을 위해 1) BiFPN detector, 2) EfficientNet compount..
GELU (Gaussian Error Linear Unit) BERT, GPT, ViT 모델에서는 인코더 블락 안의 2-layer MLP 구조의 활성화 함수로 ReLU가 아닌 GELU (Gaussian Error Linear Unit) 함수가 사용됩니다. 최신 NLP, Vision SOTA 성능을 도출하는 모델들이 GELU 함수를 사용하면서 최근에 발표된 것이 아닌가 싶지만 arxiv 상에서는 16년 6월에 올라온 나름 오래된 함수입니다. 입력 $x$의 부호에 대해서 self-gating 하는 ReLU 함수와 달리 ($x 1_{x>0}$) GELU 함수는 $x\Phi (x)$ 형태로 정의되는데요, 한번 살펴보도록 하겠습니다. GELU 함수는 dropout, zoneout, ReLU 함수의 특성을 조합하여 유도되었습니다. 먼저 ReLU 함수는 입력 $x$의 부호에 ..
Vision Transformer (4) - Pytorch 구현 Vision Transformer (1) Vision Transformer (2) Vision Transformer (3) - Attention Map 이번 포스트에서는 Pytorch 프레임워크를 이용하여 Vision Transformer 모델을 구현해보도록 하겠습니다. 복습을 위해 다시 한번 ViT 모델의 구조를 보도록 하겠습니다. Figure 1을 보면 먼저 입력 이미지를 패치 크기만큼 나누어 순서대로 정렬한 후 임베딩을 수행합니다. 이후에 Encoder 에서 Multihead Self-Attention, MLP, Layer Normalization 블락들이 residual connection 과 함께 수행되죠. 최종적인 분류를 위해서는 $z_0^0$에 학습가능한 파라미터로 삽입한 'class tok..
Vision Transformer (3) - Attention Map Vision Transformer (1) Vision Transformer (2) Transformer 모델의 가장 큰 특징은 self-attention 으로 시퀀스의 각 위치가 어느 위치에 집중하는지 쉽게 시각화해서 볼 수 있다는 점입니다. 이미지 기반 딥러닝에서도 모델의 결과를 설명하려는 interpreting explanability (XAI) 시도가 매우 많고 이를 여러 포스트에서 살펴보았는데요, 이번 포스트에서는 ViT 모델의 입력 이미지에 대한 explaianability 를 attention 을 이용하여 알아보도록 하겠습니다. 또한, 실습으로 최근 페이스북에서 릴리즈한 3개의 헤드를 가진 Deit Tiny 모델을 사용하도록 하겠습니다. 사용하기 위해서는 timm 이라는 대표적인 이미지모델의 ..

반응형