Colab에서 CUDA 사용하기

차례대로 실행

!apt-get --purge remove cuda nvidia* libnvidia-*
!dpkg -l | grep cuda- | awk '{print $2}' | xargs -n1 dpkg --purge
!apt-get remove cuda-*
!apt autoremove
!apt-get update
!wget https://developer.nvidia.com/compute/cuda/9.2/Prod/local_installers/cuda-repo-ubuntu1604-9-2-local_9.2.88-1_amd64 -O cuda-repo-ubuntu1604-9-2-local_9.2.88-1_amd64.deb
!dpkg -i cuda-repo-ubuntu1604-9-2-local_9.2.88-1_amd64.deb
!apt-key add /var/cuda-repo-9-2-local/7fa2af80.pub
!apt-get update
!apt-get install cuda-9.2
!pip install git+git://github.com/andreinechaev/nvcc4jupyter.git
%load_ext nvcc_plugin

완료

더보기

!apt-get --purge remove cuda nvidia* libnvidia-*
!dpkg -l | grep cuda- | awk '{print $2}' | xargs -n1 dpkg --purge
!apt-get remove cuda-*
!apt autoremove
!apt-get update

 

 

!wget https://developer.nvidia.com/compute/cuda/9.2/Prod/local_installers/cuda-repo-ubuntu1604-9-2-local_9.2.88-1_amd64 -O cuda-repo-ubuntu1604-9-2-local_9.2.88-1_amd64.deb
!dpkg -i cuda-repo-ubuntu1604-9-2-local_9.2.88-1_amd64.deb
!apt-key add /var/cuda-repo-9-2-local/7fa2af80.pub
!apt-get update
!apt-get install cuda-9.2

 

 

!pip install git+git://github.com/andreinechaev/nvcc4jupyter.git

 

 

%load_ext nvcc_plugin

 

출처: https://harshityadav95.medium.com/how-to-run-cuda-c-or-c-on-google-colab-or-azure-notebook-ea75a23a5962

 

 


Hello_CUDA!

위와 같이 Colab에서 CUDA 프로그래밍을 위한 설정이 끝났습니다.

이제 아래와 같이 작성을 해주면

"Hello CUDA!" 를 볼 수 있습니다.

  • __global__ : Host(CPU)에서 GPU를 이용하기 위해 호출하는 code -> Kernel
  • __host__ : Host(CPU)에서 호출 가능한 code
  • __device__ : Device(GPU)에서 호출 가능한 code

 

※ Kernel (커널) : Device thread들의 동작을 정의하는 C function

※ <<<>>> : Host가 Device code를 호출함을 표시, 각종 설정 지정 (사용할 thread 수, memory allocation 등)

※ .cu: source code, .cuh: header file


다른 예제

이것들을 Colab에서 하면 ERROR는 안나는데 출력이 안된다... 왜 그런지는 모르겠다!

'Cuda' 카테고리의 다른 글

06_Where_is_Thread_CUDA  (0) 2021.08.30
05_How_Kernel_Works_CUDA  (0) 2021.08.30
04_Vector_Sum_CUDA  (0) 2021.08.27
02_용어정리_CUDA  (0) 2021.08.26
01_Parallel_Computing_CUDA  (0) 2021.08.25

  • Program: Instruction들을 어떤 Data들에 적용하는 것
  • Task: 전체 프로그램 중의 일부, Instruction들의 집합
  • Task parallelism: Task를 병렬 처리하는 것
  • Data parallelism: Data를 병렬 처리하는 것

 


  • SISD: 하나의 스트림에 하나의 데이터
  • SIMD: 하나의 스트림에 여러개의 데이터
  • MISD: 여러 스트림에 하나의 데이터
  • MIMD: 여러 스트림에 여러개의 데이터
  • SIMT: 하나의 스트림에 여러개(32개)의 Thread, GPU가 여기에 해당된다.

 


  • Latency: 어떤 명령을 내리고 끝나는 시간
  • Bandwidth: Data를 Core에 전달하는 스트림의 크기
  • Throughput: 주어진 시간안에 연산을 몇개 처리할 수 있는가

'Cuda' 카테고리의 다른 글

06_Where_is_Thread_CUDA  (0) 2021.08.30
05_How_Kernel_Works_CUDA  (0) 2021.08.30
04_Vector_Sum_CUDA  (0) 2021.08.27
03_Hello_CUDA_(Colab에서 CUDA 설정하기)  (0) 2021.08.26
01_Parallel_Computing_CUDA  (0) 2021.08.25

XOR 문제 해결하기

XOR 문제를 해결하기 위해 Multi Layer를 사용하면 됩니다.

코드는 아래쪽에 적어두었으니 참고하시길 바랍니다.

 

아래의 사진과 같이 XOR 문제를 해결하기 위해서 3개의 Network가 필요합니다.

글로 설명하기 애매하니 사진으로 대체하겠습니다.

 

위와 같이 하나의 Perceptron(하나의 직선, y = wx + b)로는 AND, OR 문제는 해결할 수 있지만

XOR 문제는 하나의 Perceptron으로는 해결이 불가능 합니다.

 

그래서 나온것이 MLP(Multi Layer Perceptron, 다층 퍼셉트론)입니다.

위의 사진과 같이 여러개의 Perceptron 층을 이루는 구조입니다.

여기서 직접 손으로 계산을 해주면

이렇게 결과가 나오게 됩니다.

결국 Weight와 Bias값만 잘 주어지면 XOR 문제도 해결이 가능하게 되었습니다.

하지만 Weight와 Bias가 항상 잘 주어지는 경우는 없습니다.

그래서 적절한 W,B의 값을 컴퓨터가 직접 찾기 위해서 나온 것이 Backpropagation 입니다.

기존에 단일 Perceptron일 경우에는 경사하강법을 사용해서 학습을 시켰지만

여러개의 Perceptron일 경우에는 경사하강법을 적용하기 매우 복잡해져

Backpropagation이라는 방법이 나온것 같습니다.

이 부분은 정확한 부분이 아니기 때문에 지적해주시면 감사하겠습니다.


 

Colab에서 기본 환경 셋팅을 해줍니다.

 

 

XOR에 해당되는 X,Y를 선언해줍니다.

 

여기서 Layer는 자유롭게 여러층을 구성하셔도 무방합니다.

하지만 Input과 Output은 꼭 2,1로 지정해주시길 바랍니다.

 

Cost Function은 BCELoss(Binary Cross Entropy Loss)를 사용해 주시고

Optimizer는 SGD를 사용하겠습니다.

 

이렇게 XOR 문제를 해결할 수 있는 Layer를 직접 작성해보았습니다.

 

 

 

 

 

출처:

https://www.youtube.com/watch?v=GYecDQQwTdI&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm&index=25 

'Deep Learning > Pytorch' 카테고리의 다른 글

14_Pytorch_Weight Initialization  (0) 2021.09.09
13_Pytorch_Activation_Gradient Vanishing  (0) 2021.09.08
11_Pytorch_Backpropagation  (0) 2021.08.25
10_Pytorch_Perceptron_XOR  (0) 2021.08.25
09_Pytorch_Softmax_Classifier MNIST  (0) 2021.08.25

역전파 (Backpropagation)

경사 하강법(Gradient Descent) 을 이용하기 위해서는 미분을 이용해야 합니다.

Cost 함수에서 미분을 이용하여 최적의 값을 찾아야 합니다.

하지만 위와 같은 Neural Network에 들어오면서 계산이 굉장히 복잡해 졌습니다.

이를 위해 나온 것이 역전파(Backpropagation) 입니다.

 

Sung Kim 교수님의 유튜브에 나온

간단한 예를 들어 직접 손으로 계산해 보겠습니다.

이 계산 과정에서 Chain rule을 한번 읽어보고 진행을 하면

간단하게 계산이 가능합니다.

이런 식으로 복잡한 Layer도 계산이 가능합니다.

f에 w가 미치는 영향은 5라고 볼 수 있습니다.

즉, w값이 1이 바뀌면 f에는 5의 영향력을 행사할 수 있는 겁니다.

 

 


Pytorch에서의 역전파

 

pytorch 에서 자주 쓰였던 backward() 함수를 이제는 이해 할 수 있습니다.

cost.backward() 로 역전파(Backpropagation)를 계산해주고

optimizer.step() 으로 계산된 역전파를 이용해 각각의 Layer에 적용을 해줍니다.

만약 경사하강법을 사용한다면

이런식으로 업데이트를 해줄 수 있습니다.

 

 

 

출처: 

https://www.youtube.com/watch?v=573EZkzfnZ0&t=913s

https://wikidocs.net/60682

 

'Deep Learning > Pytorch' 카테고리의 다른 글

13_Pytorch_Activation_Gradient Vanishing  (0) 2021.09.08
12_Pytorch_Multi_Layer_Perceptron_XOR  (0) 2021.08.25
10_Pytorch_Perceptron_XOR  (0) 2021.08.25
09_Pytorch_Softmax_Classifier MNIST  (0) 2021.08.25
08_Pytorch_Softmax_Classification  (0) 2021.08.18

Perceptron

다수의 입력으로부터 하나의 결과를 내보내는 알고리즘입니다.

실제 뇌를 구성하는 신경 세포 뉴런의 동작과 비슷하여 인공신경망이라 불립니다.

 

OR, AND, XOR

위의 사진을 보시다시피 OR와 AND 연산은 직선 하나를 이용하여 구분이 가능하지만

XOR에서는 직선 하나를 이용하여 +와 -를 구분할 수 업습니다.

그래서 나온 방법이 Multi Layer입니다.

 

 


XOR 문제 직접 만들어보기

torch, torchvision 설치

 

 


import 및 device 정의 해주기

 

 


맨 위의 XOR 문제를 재현하기 위해 X와 같은 형태로 선언을 해줍니다.

Input = 2, Output = 1이므로 torch.nn.Linear(2, 1, bias = True)로 설정해줍니다.

criterion의 torch.nn.BCELoss()가 있는데

BCELoss()는 Binary Cross Entropy의 약자로 생각하시면 편할것 같습니다.

 

결과값을 보면 loss값이 줄어들지 않는것을 볼 수 있습니다.

 

 


조금 더 정확하게 보기 위해 위와 같이 출력을 해주면

최종 정확도는 0.5 (50%)가 나오는 것을 알 수 있습니다.

'Deep Learning > Pytorch' 카테고리의 다른 글

12_Pytorch_Multi_Layer_Perceptron_XOR  (0) 2021.08.25
11_Pytorch_Backpropagation  (0) 2021.08.25
09_Pytorch_Softmax_Classifier MNIST  (0) 2021.08.25
08_Pytorch_Softmax_Classification  (0) 2021.08.18
07_Pytorch_Logistic_Regression  (0) 2021.08.18

Parallel Computing (병렬 처리)

  • 하나의 문제를 여러개의 computing resources를 이용하여 푸는 것.

※ resources: Multiple core, computing nodes 등...

 


Parallel vs Concurrent computing

  • Concurrent computing: 여러개의 작업을 동시에 수행하는 것.

 


Why Parallel Computing??

  • 빠르고 정확한 연산을 위해
  • 하지만 어떤 연산을 하냐에 따라 CPU로 돌리는게 더 빠를수도 있다.

 


간단한 Parallel Computing 비교

 

Parallel_01

Parallel_01에서 보면 24개의 숫자를 3개씩 나누어 8개의 코어로 병렬 연산을 한 후에,

마지막으로 이 값들을 다 더해주는 것입니다.

※ 1+4+3, 9+2+8, ...

 

그렇다면 여기에서 일어나는 총 연산 수는

2(3묶음씩 병렬로 처리했기 때문에) + 7 = 9라는 연산 횟수를 얻을 수 있습니다.

※ 1 + 4 + 3 -> +연산이 2번 일어난다.

※ 8 + 19 + 7 + 15 + 7 + 13 + 12 + 14 -> +연산이 7번 일어난다.

 

이제 개선된 병렬 연산을 보겠습니다.

Parallel_02

여기서는 마지막에 더해주는 연산을 하나의 코어에서 실행하지 않고

여러개의 코어를 사용한 것입니다.

총 연산 수를 계산해보면,

2 + 1 + 1 + 1 = 5 라는 연산 횟수를 얻을 수 있습니다.

 

물론 Parallel_01로 계산을 하면 연산 횟수를 줄일 수 있지만

Parallel_02를 이용하여 계산을 하면 연산 횟수를 더욱 줄일 수 있다는 것을 알 수 있습니다.

 

 

※ 출처:

https://www.youtube.com/watch?v=si3B4mYVWrE&list=PLBrGAFAIyf5pp3QNigbh2hRU5EUD0crgI&index=1 

'Cuda' 카테고리의 다른 글

06_Where_is_Thread_CUDA  (0) 2021.08.30
05_How_Kernel_Works_CUDA  (0) 2021.08.30
04_Vector_Sum_CUDA  (0) 2021.08.27
03_Hello_CUDA_(Colab에서 CUDA 설정하기)  (0) 2021.08.26
02_용어정리_CUDA  (0) 2021.08.26

MNIST DataSet을 다뤄보겠습니다.

MNIST DataSet

  • training set images: 60,000 장
  • training set labels: 0~9 중 숫자
  • test set images: 10,000 장
  • test set labels: 0~9 중 숫자

이제 60,000장의 traning DataSet를 이용해 학습을 진행한 후

test set images를 이용해 학습이 잘 됐는지 확인하겠습니다.


먼저 Colab에 MNIST DataSet을 불러오도록 하겠습니다.

구글 드라이브에 데이터를 직접 다운받아 불러올 수도 있지만

MNIST란 데이터가 워낙 유명하다보니 굳이 드라이브에 저장을 하지 않고도 사용할 수 있습니다.

그리고 불러올 수 있는 방법도 여러가지가 있습니다.

첫번째 방법, sklearn 사용하기

두번째 방법, keras 사용하기

세번째 방법, torchvision 사용하기

위의 세가지 방법중 하나를 골라 사용하면 됩니다.

저는 세번째 방법인 torchvision을 이용하여 진행하겠습니다.


불러온 데이터를 편하게 사용하기 위해 DataLoader를 사용하겠습니다.

torch.utils.data.DataLoader(데이터셋, batch_size, 데이터를 섞는다면 True, drop_last)

여기서 drop_last는 60,030개의 데이터가 있고 batch_size 100이 있다고 가정을 합니다.

60,030 / 100을 진행하면 30이라는 데이터가 남게 되는데

True로 할시 30개의 데이터를 사용하지 않고, False로 할시 나머지의 데이터도 사용하게 됩니다.

 


DataLoader를 통해 사용하기 쉽게 만들어 줬다면 이제 학습을 시작하겠습니다.

일단 device를 정의해주도록 하겠습니다.

device를 정의해주어 GPU를 사용할 수 있는 환경을 만들어줍니다.

 

linear = torch.nn.Linear(784, 10, bias = true).to(device)

우리가 사용하는 mnist의 train dataset은 (60000, 28, 28)입니다.

하지만 Linear에는 입력 차원이 (x, y)이기 때문에

(28 * 28, 10)으로 맞춰줍니다.

input은 784, output은 0~9 총 10개의 label이 있기때문에 10

※ 후에 cnn에서는 (60000, 28, 28) 그대로 사용할 수 있다.

'Deep Learning > Pytorch' 카테고리의 다른 글

11_Pytorch_Backpropagation  (0) 2021.08.25
10_Pytorch_Perceptron_XOR  (0) 2021.08.25
08_Pytorch_Softmax_Classification  (0) 2021.08.18
07_Pytorch_Logistic_Regression  (0) 2021.08.18
05_Pytorch_nn.Module  (0) 2021.08.13

Softmax_Classification

H(x) = wx의 단점은 리턴값이 어떤 실수의 값이 되기 때문에 2개중 하나를 고르는 Logistic Regression에 적합하지 않습니다.

그래서 Sigmoid라는 함수를 사용했습니다.

Sigmoid

하지만 여기서 0 or 1이 아니라 선택지가 여러개 있으면 Linear과 Logistic을 사용하기에는 적합하지 않습니다.

그래서 나온 개념이 Softmax Classification입니다.

※ Sigmoid를 여러번 사용하면 여러개의 클래스를 구분할 수 있다.

 

Softmax의 output은 각 클래스에 대한 확률값이 나오고 그 확률값들을 모두 더해주면 1이라는 값이 나옵니다.

 

이제 간단한 설명은 끝났으니 Pytorch로 Softmax를 만들어 보겠습니다.

 


Module

먼저 필요한 모듈들을 import 해주겠습니다.


Data

필요한 데이터들을 선언해주겠습니다.


Model and Training

w, b를 선언을 해줍니다.

여기서 w가 (4, 3)의 값을 갖는 이유는 데이터를 보면서 설명하겠습니다.

처음에 [1, 2, 1, 1]이라는 4개의 숫자가 input이 되고

2라는 숫자가 output이 됩니다.

그런데 y_train값들을 살펴보면 0, 1, 2로 이루어져 있는 것을 알 수 있고

즉, Class의 수는 3개라는 뜻입니다.

그래서 (4, 3)이라는 형태로 넣어주게 됩니다.

※ x1w1 + x2w2 + x3w3 + x4w4 = y

'Deep Learning > Pytorch' 카테고리의 다른 글

10_Pytorch_Perceptron_XOR  (0) 2021.08.25
09_Pytorch_Softmax_Classifier MNIST  (0) 2021.08.25
07_Pytorch_Logistic_Regression  (0) 2021.08.18
05_Pytorch_nn.Module  (0) 2021.08.13
04_Pytorch_Multivariate_Linear_Regression  (0) 2021.08.12

+ Recent posts