Ubuntu18.04 + PyTorch 설치 및 예제 테스트

| 2020년 2월 29일 | 0 Comments
안녕하세요. 스마일서브 기술지원팀 신규철입니다.
Ubuntu 18.04에서 PyTorch를 설치하고 튜토리얼 페이지에 있는 예제 하나를 실행해보도록 하겠습니다.
 
PyTorch는 Torch를 기반으로 한, Python을 위한 오픈소스 머신 러닝 라이브러리입니다.
Tensorflow의 사용자가 많지만 비직관적인 구조와 난이도 때문에 PyTorch의 사용자도 늘어나고 있는 추세입니다.
 
Tensorflow와 PyTorch의 가장 큰 차이점은 딥러닝을 구현하는 패러다임이 다르다는 점입니다.
Tensorflow의 경우 Define-and-Run 프레임워크인 반면에 PyTorch는 Define-by-Run 방식입니다.
 
이 구현 패러다임의 차이로 인해 Tensorflow에 비해 직관적인 구조를 갖는다는 평을 받고있습니다.
(출처 : 위키미디어 – https://ko.wikipedia.org/wiki/PyTorch)
 
본문에서는 PyTorch에 대한 이론적인 내용을 다루는 것이 아닌 위에서 말한 것처럼 간단히 Ubuntu 18.04 Xwindows 환경에서 PyTorch를 설치하고 PyTorch 튜토리얼 홈페이지에 있는 예제를 그대로 실행해보도록 하겠습니다.
 
설치 환경은 아래와 같습니다.
  OS GPU nvidia driver CUDA PyTorch
버전 Ubuntu 18.04 Geforce RXT 2080 nvidia driver-440 10.1 1.4.0
 
다음 순서로 진행하겠습니다.
1. nvidia driver 설치
2. CUDA 설치
3. anaconda 설치
4. PyTorch 설치
5. PyTorch 예제 테스트
 
 
1. nvidia driver 설치

우선 레포지토리를 추가해줍니다.

# add-apt-repository ppa:graphics-drivers/ppa

진행간에 ENTER를 눌러서 계속 진행합니다.

# apt-get update

# apt-get install nvidia-driver-440

설치 완료 후 nvidia-smi 명령어로 그래픽 카드 정보를 확인해보겠습니다.

# nvidia-smi –query | fgrep ‘Product Name’

위와 같이 GeForce RTX 2080 그래픽카드가 확인됩니다.

 

2. CUDA 설치

https://developer.nvidia.com/cuda-10.0-download-archive

url에서 OS 버전에 맞게 선택하여 CUDA 를 다운로드 받습니다.

 

# wget https://developer.nvidia.com/compute/cuda/10.0/Prod/local_installers/cuda_10.0.130_410.48_linux

#sh cuda_10.0.130_410.48_linux

설치 파일을 실행하면서 묻는 설치 경로 등은 모두 기본값으로 진행하였습니다.

 

3. anaconda 설치

이제 패키지 관리 시스템인 anaconda를 설치하겠습니다.

#curl -O https://repo.anaconda.com/archive/Anaconda3-2019.03-Linux-x86_64.sh

#sh Anaconda3-2019.03-Linux-x86_64.sh

실행 파일을 실행한 뒤 엔터를 눌러 계속 진행해줍니다. 이후 나오는 경로 등은 기본 경로로 설정하였습니다.

# vi /root/.bashrc

bashrc 파일을 확인해보면 anaconda 관련한 내용이 하단에 추가되어있습니다. source로 적용시켜줍니다.

 

4. PyTorch 설치

conda 명령어로 Pytorch를 설치해줍니다.

# conda install pytorch torchvision cudatoolkit=10.0 -c pytorch

위와 같은 패키지들이 설치되는 것을 확인할 수 있습니다 .이후 y를 입력하여 설치를 계속 진행합니다.

PyTorch 설치 후 GPU를 사용가능여부와 cuda 버전이 알맞게 설치되었는지 확인해보겠습니다.

# python3

>> import torch

>> print(torch.cuda.is_available())

>> print(torch.version.cuda)

위와 같이 True가 나오면 GPU를 사용할 수 있는 상태인것이며, cuda 버전 또한 설치한 10.0 버전이 확인됩니다.

 
5. PyTorch 예제 테스트
 
설치가 완료되면 python3 을 통해 pytorch 튜토리얼 페이지에 나와있는 classifier 예제를 그대로 실행해보겠습니다.
(pytorch 참고 예제 url – https://tutorials.pytorch.kr/beginner/blitz/cifar10_tutorial.html)
 
 
위 url에서 해당 예제는 아래와 같은 단계로 구성되어있다고 나와있습니다.
 
1. torchvision 을 사용하여 CIFAR10의 학습용 / 시험용 데이터셋을 불러오고, 정규화(nomarlizing)합니다.
2. 합성곱 신경망(Convolution Neural Network)을 정의합니다.
3. 손실 함수를 정의합니다.
4. 학습용 데이터를 사용하여 신경망을 학습합니다.
5. 시험용 데이터를 사용하여 신경망을 검사합니다.
 
 

# python3

transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2)
testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2)
classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
 
이제 이미지를 무작위로 가져와 검사하여 label을 출력해보겠습니다.
 
 
import matplotlib.pyplot as plt
import numpy as np
# 이미지를 보여주기 위한 함수
def imshow(img):
    img = img / 2 + 0.5     # unnormalize
    npimg = img.numpy()
    plt.imshow(np.transpose(npimg, (1, 2, 0)))
    plt.show()
# 학습용 이미지를 무작위로 가져오기
dataiter = iter(trainloader)
images, labels = dataiter.next()
# 이미지 보여주기
imshow(torchvision.utils.make_grid(images))
 
 
위와 같은 이미지가 불러와졌는데요.
 
print(' '.join('%5s' % classes[labels[j]] for j in range(4)))

보이는 이미지와 같이 cat horse truck cat 으로 label 이 출력된 것을 확인할 수 있었습니다.

 
 
import torch.nn.functional as F
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x
net = Net()
Convolution Neural Network를 정의합니다.
 
 
import torch.optim as optim
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
손실 함수와 Optimizer 를 정의합니다.
 
 
for epoch in range(2):   # 데이터셋을 수차례 반복합니다.

    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        # [inputs, labels]의 목록인 data로부터 입력을 받은 후;
        inputs, labels = data

        # 변화도(Gradient) 매개변수를 0으로 만들고
        optimizer.zero_grad()

        # 순전파 + 역전파 + 최적화를 한 후
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        # 통계를 출력합니다.
        running_loss += loss.item()
        if i % 2000 == 1999:    # print every 2000 mini-batches
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 2000))
            running_loss = 0.0
print('Finished Training')
신경망을 학습하고 학습한 모델을 저장합니다.
 
 
dataiter = iter(testloader)
images, labels = dataiter.next()
# 이미지를 출력합니다.
imshow(torchvision.utils.make_grid(images))
print('GroundTruth: ', ' '.join('%5s' % classes[labels[j]] for j in range(4)))
이제 시험용 데이터를 불러오고 신경망이 불러온 데이터를 어떻게 해석했는지 확인해봅니다.
제가 봤을 때는 cat, ship, ship, plane 이네요.
 
 
dataiter = iter(testloader)
images, labels = dataiter.next()
# 이미지를 출력합니다.
imshow(torchvision.utils.make_grid(images))
print('GroundTruth: ', ' '.join('%5s' % classes[labels[j]] for j in range(4)))
신경망은 cat car car plane 으로 해석했네요. 50% 정도의 정확도를 보였습니다.
 
 
 
실제로 전체 데이터셋에 대해 검사해봤을 때 53%의 정확도를 보이는 것을 확인할 수 있었습니다.
 
이상으로 Ubuntu 18.04 환경에서 PyTorch 설치 및 예제 테스트를 마치겠습니다.
감사합니다.
 

Category: LINUX, 솔루션/IT기타

Avatar

About the Author ()