구글 클라우드 플랫폼(GCP)으로 pgGAN 실행하기
딥러닝(Deep-Learning)

구글 클라우드 플랫폼(GCP)으로 pgGAN 실행하기

반응형

구글 클라우드 플랫폼(GCP)으로 pgGAN 실행하기




여러가지 딥러닝 기술 중 pgGAN(progressive_growing_of_gans)을 GCP에서 gpu를 할당받아 실행해보는 과정을 진행해보겠습니다.


우선, 구글 클라우드 플랫폼에서 gpu를 할당받는 방법은 아래 포스팅을 참고하시면 됩니다.


2018/08/14 - [정보] - 구글 클라우드 플랫폼(GCP)으로 NVIDIA GPU 사용해보기


이 포스팅을 토대로 플랫폼을 사용할 환경이 다 만들어졌다면, pgGAN을 가져와보도록 하겠습니다.


pgGAN github주소 : https://github.com/tkarras/progressive_growing_of_gans


이 주소를 통해 pgGAN의 전체 소스코드를 clone 해올 수 있고, README에 저장된 정보로 진행과정에 대해 자세히 습득할 수 있습니다.




pgGAN을 학습에 필요한 시스템 요구사항(System requirements)


1. Both Linux and Windows are supported, but we strongly recommend Linux for performance and compatibility reasons.

리눅스와 윈도우 모두 지원을 하고 있지만, 리눅스에서 퍼포먼스가 더 강하기 때문에 가상 머신을 활용해 우분투 환경에서 진행할 예정입니다.


2. 64-bit Python 3.6 installation with numpy 1.13.3 or newer. We recommend Anaconda3.

현재 GCP 인스턴스에 다운로드한 모듈은 파이썬 3.5버전인데, pgGAN은 3.6버전을 필요로하므로 업그레이드가 필요합니다. 이 방법은 아래에서 진행하도록 하겠습니다.


3. One or more high-end NVIDIA Pascal or Volta GPUs with 16GB of DRAM. We recommend NVIDIA DGX-1 with 8 Tesla V100 GPUs.

학습에 추천하는 GPU를 알려주고 있습니다. 우리가 이전 포스팅에서 생성한 K80은 이보다 낮은 효율의 gpu이지만, 일단 진행해보도록 합시다.


4. NVIDIA driver 391.25 or newer, CUDA toolkit 9.0 or newer, cuDNN 7.1.2 or newer.

setup 당시 3가지에 대해 모두 다운로드가 완료된 상태입니다.(이전 포스팅 참고)


5. Additional Python packages listed in requirements-pip.txt

requirements-pip.txt 또한 install 진행과정을 아래에서 진행하도록 하겠습니다.




다음 훈련 진행에 앞서 시스템에서 요구되는 사항에 대해 알아봤구요. 이에 필요한 요소들을 우선 ssh 환경에서 모두 설치해야 합니다.



소스코드 clone하기


가장 먼저, pgGAN의 전체 소스코드를 clone 합시다. ssh 터미널에 아래와 같이 입력합니다.

git clone https://github.com/tkarras/progressive_growing_of_gans.git


이제 pgGAN에 대한 폴더가 생성된 모습을 볼 수 있습니다.





python3.6 다운로드 후 기본 상태로 변경


현재 터미널 상에서 'python'을 입력하면 3.5버전이 실행되는 모습을 볼 수 있습니다. 우리는 3.6버전이 필요하기 때문에 우선 파이선 3.6버전을 인스턴스 안에서 다운로드 하도록 합시다.


터미널에 아래와 같이 입력합니다.


sudo add-apt-repository ppa:jonathonf/python-3.6 

 

sudo apt-get update 

sudo apt-get install python3.6


이제 파이썬 3.6버전이 설치가 완료되었습니다. 하지만 아직도 python을 입력하면 시스템 상에서 기본 버전은 3.5를 지원하고 있습니다. 이를 바꿔주려면 update-alternative를 이용해야 합니다.


sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 1 

 

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2 

 

sudo update-alternatives --config python 


다음과 같이 입력을 진행한다면, 아래와 같은 화면이 출력됩니다.



번호를 고른 후 enter하라는 명령이 나오는데요. 우리는 3.6을 사용할 것이기 때문에 0번 혹은 2번을 누르고 enter합시다.



이제 그냥 python이라고 입력해도 3.6버전이 실행되도록 변경되었습니다!




가상환경(virtualenv) 생성



가상 환경을 준비하기에 앞서 pip를 설치해줍니다.

sudo add-apt install python3-pip


이제 아래와 같은 순서로 가상환경을 만들어주도록 합시다. 가상환경 이름은 각자 원하는 것으로 작성합니다.


python3.6 -m pip install virtualenv 

 

python3.6 -m virtaulenv "이름(ex. plzwork)" 

 

source "이름"/bin/activate 

자신이 생성한 이름의 경로를 통해 가상환경 안에서 원하는 모듈을 설치하고 훈련을 진행할 공간으로 만들어봅시다.



virtaulenv로 잘 접속되면 위처럼 앞에 자신이 설정한 이름이 나오게 됩니다.


psGAN을 실행해보려면 텐서플로우가 필요하므로 pip를 통해 설치해주도록 합시다.

pip install tensorflow




pgGAN 학습 준비


github에 작성되어있는 학습 준비 순서는 다음과 같습니다.


Importing and using pre-trained networks


1. Pull the Progressive GAN code repository and add it to your PYTHONPATH environment variable.


우리의 PYTHONPATH 환경에 pgGAN 코드가 존재하는 repository를 pull하라고 하네요.

이는 가상환경에 activate 된 상태에서 ls -al로 숨김 파일까지 모두 열어보면 .profile 이라는 파일이 존재하는 걸 확인할 수 있습니다.



이 파일 안에다가 PYTHONPATH 환경설정을 해줘야하는데요. vi 명령어를 통해 파일을 열고 추가시킬 수 있겠죠?



vi .profile로 파일 코드를 연 후


export PATH=/usr/local/bin:$PATH 

export PYTHONPATH=~/progressive_growing_of_gans


이 두 줄을 맨 아래에 위 캡처화면처럼 추가해주고 저장하도록 합시다.

( 'i'키를 누르면 삽입 가능상태로 변경되며, 입력이 끝난 후에는 esc를 누르고 ':wq'로 빠져나오면 됩니다.)


우리가 수정한 파일을 갱신 시켜주는 코드는 아래와 같습니다.


source .profile


제대로 환경변수가 입력되었는지 살펴볼까요? python에 들어가서 import sys 입력 후, sys.path를 통해 아래처럼 확인가능합니다.



path의 처음에 pgGAN 경로가 잘 나오는 것을 확인할 수 있습니다!


이제 pgGAN에 대한 환경변수 입력이 완료되었습니다. 다음 단계로 갑시다.




2. Install the required Python packages with pip install -r requirements-pip.txt


pip install을 통해서 requirements-pip.txt에 필요한 파이선 패키지들을 다운로드 하면 됩니다.


우선 pgGAN 경로로 들어가주고요.


cd progressive_growing_of_gans/ 


pip로 설치를 진행합시다.


pip install -r requirements-pip.txt


설치 중에 lmdb에 관한 error가 나올 수도 있습니다. (ex. failed building wheel for lmdb)

이럴 때는 python3.6-dev를 설치해주고 따로 lmdb만 install 해주도록 합시다.


* lmdb error 발생 시

sudo apt-get install python3.6-dev 

pip install lmdb



3. Download import_example.py from networks/tensorflow-version/example_import_script

4. Download karras2018iclr-celebahq-1024x1024.pkl from networks/tensorflow-version and place it in the same directory as the script.


이제는 두 가지 파일을 다운로드 할 예정인데요. 이는 github 사이트에서 링크를 통해 다운로드가 가능합니다. 같은 디렉토리 공간에 위치하라고 했기 때문에, 두 파일을 다운로드한 뒤 progressive_growing_of_gans/ 경로에 넣어주도록 합시다. 저는 window에서 파일을 다운받아 jupyter notebook을 이용해 두 파일을 업로드 한 후, progressive_growing_of_gans 폴더로 옮겼습니다.


- progressive_growing_of_gans 폴더에 파일을 넣으려고 하면, 퍼미션 부정이 뜰 수도 있는데요. 이럴때는 chmod 777로 폴더 자체 권한을 수정해주고 진행하시면 됩니다.


(사진에서는 다운로드 한 두 파일을 progressive_growing_of_gans 폴더에 업로드하고 있지 않은데, 이 폴더 안에 업로드 하셔야합니다.)



5. Run the script with python import_example.py


activate인 상태에서 import_example.py를 python을 통해 실행시킵니다.



6. If everything goes well, the script should generate 10 PNG images (img0.png – img9.png) that match the ones found in networks/tensorflow-version/example_import_script exactly.


이제 ls를 입력해보면 아래와 같이 이미지가 10개 생성된 모습을 볼 수 있습니다.


(이건 가상머신을 활용한 터미널이라 기존과 화면 모습이 약간 다릅니다)


img0부터 img9까지 잘 생성된 모습을 볼 수 있습니다. 학습 준비를 잘 마쳤구요. 이제 dataset을 학습시킬 준비를 할 차례입니다.





데이터셋 학습 준비(Preparing datasets for training)


학습을 위한 데이터셋을 준비하는 것에 대해 알아보겠습니다. 현재 pgGAN의 github 설명을 보면, dataset_tool.py가 가진 create 메소드를 사용해서 훈련에 사용될 데이터를 생성해야 함을 알 수 있습니다.


progressive_growing_of_gans 경로 안에 dataset_tool.py을 python으로 실행해보면 아래와 같은 출력문이 나올겁니다.



python dataset_tool.py

usage: dataset_tool.py [-h] <command> ...

    display             Display images in dataset.
    extract             Extract images from dataset.
    compare             Compare two datasets.
    create_mnist        Create dataset for MNIST.
    create_mnistrgb     Create dataset for MNIST-RGB.
    create_cifar10      Create dataset for CIFAR-10.
    create_cifar100     Create dataset for CIFAR-100.
    create_svhn         Create dataset for SVHN.
    create_lsun         Create dataset for single LSUN category.
    create_celeba       Create dataset for CelebA.
    create_celebahq     Create dataset for CelebA-HQ.
    create_from_images  Create dataset from a directory full of images.
    create_from_hdf5    Create dataset from legacy HDF5 archive.

Type "dataset_tool.py <command> -h" for more information.

여러 데이터셋을 생성해주는 기능을 담당하고 있는데요. 이 중에서 cifar10을 통해 학습을 진행해보도록 하겠습니다.


나중에 train.py로 학습을 진행하기 위해서는 tfrecords 파일이 필요하다는 설명이 나와있는데요. 이 dataset_tool.py를 통해 해당 데이터셋을 create하면 아래와 같이 생성된다고 합니다.


> python dataset_tool.py create_cifar10 datasets/cifar10 ~/downloads/cifar10
> ls -la datasets/cifar10
drwxr-xr-x  2 user user         7 Feb 21 10:07 .
drwxrwxr-x 10 user user        62 Apr  3 15:10 ..
-rw-r--r--  1 user user   4900000 Feb 19 13:17 cifar10-r02.tfrecords
-rw-r--r--  1 user user  12350000 Feb 19 13:17 cifar10-r03.tfrecords
-rw-r--r--  1 user user  41150000 Feb 19 13:17 cifar10-r04.tfrecords
-rw-r--r--  1 user user 156350000 Feb 19 13:17 cifar10-r05.tfrecords
-rw-r--r--  1 user user   2000080 Feb 19 13:17 cifar10-rxx.labels

정말 tfrecords 파일이 만들어지는 모습을 볼 수 있네요. 한번 따라해보도록 합시다.




어떤 디렉토리가 필요한지 알아보기 위해 python dataset_tool.py create_cifar10 -h로 알아봤습니다.


총 두 개의 argument가 요구되고 있는데요.


1. tfrecord_dir : 만들어진 새로운 데이터셋을 저장할 디렉토리

2. cifar10_dir : cifar-10이 포함된 디렉토리


이 두 경로를 입력해줘야 제대로 실행이 될 것입니다. tfrecord_dir 같은 경우는, 새롭게 만들어진 데이터셋을 저장할 디렉토리 이름을 자신이 원하는대로 설정해주면 됩니다. 현재 예시에서는 datasets/cifar10이라고 경로를 지정했네요. 저는 예시와 똑같이 진행했습니다. 만약 실행이 잘 된다면 progressive_growing_of_gans에 datasets라는 폴더가 새롭게 만들어질 것입니다. 

(위에 스크린샷은 이미 진행했던거라 이미 존재합니다. 처음하시는 분들은 아직 datasets라는 폴더가 없을겁니다.)


다음으로 필요한건 cifar10_dir겠죠? 이건 따로 다운로드를 받아와야 합니다.


cifar10 홈페이지 : https://www.cs.toronto.edu/~kriz/cifar.html


해당 홈페이지를 들어가시면 dataset을 다운로드 받을 수 있습니다.



우리는 파이썬으로 진행중이니 첫번째를 다운받으면 되겠죠?


다운받은 파일을 scp를 이용해서 전송하거나 jupyter notebook으로 업로드하는 식으로 gcp 환경의 downloads 폴더로 옮겨주도록 합시다.



cifar10을 다운받아 jupyter를 통해 downloads 폴더로 업로드한 결과구요. cifar10 안에는 data_batch로 파일이 존재하는 것을 볼 수 있습니다. 이제 데이터까지 가져왔으니 실행하면 datasets/cifar10 경로 안에 tfrecords 파일이 만들어져야 합니다.


아래와 같이 명령어를 입력해봅시다.


python dataset_tool.py create_cifar10 datasets/cifar10 ~/downloads/cifar10


(중간에 shape (50000, 3, 32, 32)이나 50000이라는 수가 출력되는건 제가 따로 vi편집기로 print를 찍어본 것이기 때문에 무시하셔도 됩니다)



50000개의 데이터가 쭉 저장되는 모습을 눈으로 확인할 수 있을겁니다. 

마지막으로 Added 50000 images.라는 출력을 보면 제대로 실행된 겁니다!

이제 새로 생성한 datasets/cifar10 경로에 들어가보면 tfrecords와 labels가 생성된 것을 볼 수 있습니다.


이제 train할 환경이 모두 만들어졌습니다. 우리는 gpu를 이용해서 데이터 학습이 가능하게 되었습니다! (두근두근)




학습 진행


진행 순서는 아래와 같습니다.


1. Edit config.py to specify the dataset and training configuration by uncommenting/editing specific lines.

2. Run the training script with python train.py.

3. The results are written into a newly created subdirectory under config.result_dir

4. Wait several days (or weeks) for the training to converge, and analyze the results.


요약하면 아래와 같습니다.


자신이 원하는 데이터셋에 맞게 config.py를 수정하고, 스크립트를 train.py를 통해 훈련 시작. 훈련 과정은 result라는 디렉토리가 새로 만들어져 저장이 될 것이며 모든 훈련결과는 며칠에서 몇주까지 소요될 수도 있다는 것을 알려주고 있습니다.


vi 편집기를 통해 config.py에 데이터셋 설정을 먼저 해보겠습니다.


아래로 내리다보면, Dataset 영역이 나오게됩니다.



하나만 선택하라고 나와있죠? 현재 자신이 훈련을 진행할 데이터셋에 맞게 주석을 해제하면 됩니다.

베이스로는 첫번째인 'celebahq'가 열려있는데, 우리는 cifar10을 해볼 것이기 때문에 주석처리해주고, cifar10 문장의 주석을 아래와 같이 해제하고 :wq를 통해 저장 후 빠져나오면 되겠습니다.




이제 모든 환경을 만들어줬습니다.


python train.py로 훈련을 시작해봅니다!


커맨드 창을 보면, 텐서플로우가 실행되는 등 훈련이 진행되는 모습을 볼 수 있습니다. 하지만 상당히 오랜시간이 소요되는데요. 하나의 훈련 데이터를 만드는 시간도 약 7분정도가 소요되는 것 같았습니다. 만약 끝까지 결과를 보려면 오랫동안 켜둬야 가능할 것 같습니다.


저는 일단 실행이 된다는 것만 확인하고 약 15분간 학습데이터를 기다려본 후 종료시켰는데요. 어떤 결과물이 나왔나 확인해볼까요?



설명서처럼, 학습이 진행되면 results라는 새로운 폴더가 생성되고 이 안에 학습 데이터들이 저장되는 모습을 볼 수 있습니다.

fake이미지를 통해 계속 숫자가 증가하며 이미지가 생성되고 있으며 점점 진짜 이미지와 유사하게 학습이 진행될 것입니다. 직접 눈으로 확인해볼까요?



jupyter를 통해 훈련 진행과정의 모습을 확인해보도록 하겠습니다.



results안에 이처럼 훈련한 데이터가 들어있는 디렉토리가 생성됩니다. (훈련을 종료하고 다시 시작하면 새로운 디렉토리가 생성됩니다)





이미지는 png파일로 저장이 되네요. 한번 열어보겠습니다.


우선 실제 이미지 사진인데요.



최종적으로 이러한 이미지 데이터가 학습되도록 진행될 것입니다.




그렇다면, 생성 중인 fake이미지들을 살펴보겠습니다.


3개의 생성된 fake 이미지를 나열한 모습입니다.



점차 모습을 가져가는 게 보이지 않나요? 이처럼 계속 training을 유지한다면 real 이미지와 흡사한 fake 이미지가 생성될 것입니다. pgGAN의 모습을 cifar10 데이터를 활용해 진행해본 결과입니다.


실제로 진행해보니 상당히 흥미롭고 재미있네요. 이와 같은 과정을 토대로 새로운 GAN을 생성해내거나, celebA와 같이 다른 데이터들도 학습을 진행하는 것이 가능할 것 같습니다.

반응형