OCI(Oracle Cloud Infrastructure) GPU VM 구성

OCI(Oracle Cloud Infrastructure) GPU VM 구성

Oracle Cloud Infrastructure(OCI)에서는 NVIDIA Tesla P100과 V100 두 가지 GPU를 지원하며 이 두 GPU를 기반으로 총 6개1의 Shape을 제공합니다. 이 문서에서는 OCI GPU에 대한 소개와 VM 인스턴스를 만드는 방법을 정리합니다. 특히 다음과 같은 내용을 다룹니다.

  • OCI에서 GPU를 제공하는 Shape에 대한 소개
  • GPU Shape을 선택하여 VM 인스턴스 생성 방법
    • 보안 설정
  • Jupyter로 ML(Machine Learning)/DL(Deep Learning) 개발 환경 구성

OCI GPU 지원 Shape

OCI에서 제공하는 GPU Shape은 다음 테이블과 같이 정리할 수 있습니다.

Shape GPU 유형 GPU 수 OCPU 수 메모리(GB) 블록 스토리지 메모리(GB) 네트워크 GPU당 비용(Hr)
VM.GPU2.1 NVIDIA Tesla P100 1 12 104 최대 1PB 8 Gbps 8 Gbps $1.275
BM.GPU2.2 NVIDIA Tesla P100 2 28 192 최대 1PB 8 Gbps 2 x 25 Gbps $1.275
VM.GPU3.1 NVIDIA Tesla V100 1 6 90 최대 1PB 8 Gbps 4 Gbps $2.95
VM.GPU3.2 NVIDIA Tesla V100 2 12 180 최대 1PB 8 Gbps 8 Gbps $2.95
VM.GPU3.4 NVIDIA Tesla V100 4 24 360 최대 1PB 8 Gbps 24.6 Gbps $2.95
BM.GPU3.8 NVIDIA Tesla V100 8 52 768 최대 1PB 8 Gbps 2 x 25 Gbps $2.95

Shape 이름에서 “VM“은 가상 머신을 나타내고 “BM“은 Bare metal 서버를 의미합니다. Bare metal 서버는 사용자에게 서버 1대를 전용으로 제공하는 서비스입니다. 또한 “GPUX.Y“에서 X는 GPU 타입을 의미합니다. “1“은 Tesla P100이고 “2“는 Tesa V100을 나타냅니다. Y는 GPU 수입니다. 각 Shape은 GPU를 최소 1개에서 8개까지 사용합니다.

이 표에서 네트워크는 각 Shape이 사용 가능한 Network Bandwidth입니다. BM의 경우 25Gbps 2개를 지원합니다.

VM.GPU3.2, VM.GPU3.4 및 BM.GPU3.8은 “GPU Interconnect”로 NVLINK를 제공합니다. 여러 GPU를 사용하는 시스템은 PCIe 대역폭이 병목 지점이 될 수 있습니다. 이런 문제를 해결하고 더 빠르고, 더 확장 가능한 다중 프로세서 상호 연결을 지원하는 기술이 VNLINK입니다. VNLIKN는 여러 GPU 사이에 브릿지 역할을 하는 고속의 링크로 병렬 처리 성능을 높입니다.

GPU 사용 비용은 “사용한 GPU 개수 X 사용 시간”을 기준으로 책정됩니다. P100 사용료는 GPU 1장당 1시간 기준 1.25달러입니다. V100 사용료는 GPU 1장당 1시간 기준 2.95달러입니다.

이 가격은 List Price이며, 결재 방식 및 계약 기간에 따라서 별도 할인율이 적용됩니다.

OCI가 제공하는 6개 GPU Shape은 운영체제로 Oracle Linux 7.x와 Ubuntu 16.4를 사용할 수 있습니다.

Oracle Linux 7.6, Oracle Linux 7.7 및 Ubuntu 16.4로 VM 인스턴스를 생성하면 NVIDIA와 CUDA 드라이버가 기본적으로 설치되어 있습니다. Ubuntu 18.4와 같은 다른 OS로 VM을 생성하면 GPU는 마운트 되지만, NVIDIA와 CUDA 드라이버는 설치되어 있지 않습니다. 사용자가 직접 NVIDA 드라이버와 CUDA 드라이버를 설치해야 합니다.

OCI GPU VM 생성: 사전 준비

OCI GPU VM을 만들기 위해서는 다음과 같은 사전 준비가 필요합니다.

  1. GPU 자원 할당 상태 확인
  2. SSH 접속을 위한 Key Pair 준비
  3. GPU VM을 프로비저닝할 Compartment 선정
  4. VCN(Virtual Cloud Network) 생성

1. GPU 자원 할당 상태 확인

GPU VM 인스턴스를 만들기 전에 현재 사용하는 계정이 GPU Shape을 사용할 수 있는지 확인해야 합니다. OCI 메인 페이지에서 다음 그림과 같이 햄버거 메뉴 버튼을 통해서 “Limits, Quotas and Limits”를 실행합니다. 이 메뉴로 이동한 페이지에서는 현재 리전(데이터 센터)에서 사용 가능한 자원 목록이 출력됩니다. 다음 그림과 같은 자원 목록에서 6개 GPU Shape의 자원 할당 상태를 확인 할 수 있습니다.

위 그림의 자원 목록을 보면 현재 계정에 다음과 같은 자원이 할당되어 있는 것을 확인 할 수 있습니다.

  • BM.GPU3.8: 2개
  • VM.GPU3.1: 5개
  • VM.GPU3.2: 5개
  • VM.GPU3.4: 4개

“Limits, Quotas and Limits” 목록에 GPU 자원 할당이 없는 것으로 출력되면, 다음 그림과 같이 “Request a Service Limit Increase”를 이용하여 추가 자원 할당을 요청할 수 있습니다.

2. SSH 접속을 위한 Key Pair 준비

OIC VM 인스턴스를 만든 후, 사용자가 VM에 터미널 접근을 할 때 패스워드가 아닌 SSH Key Pair를 사용합니다. SSH Key Pair는 개인키 (Private Key)와 공개키(Public Key)로 구성됩니다. 개인키는 사용자가 사용자의 컴퓨터에 보관되고 공개키는 VM 인스턴스에 저장됩니다. 공개키는 VM을 생성할 때 등록됩니다.

SSH 접속을 위한 Key Pair의 보안키를 새로 만들어야 한다면 다음 문서를 참조하여 준비하시기 바랍니다.

위 문서를 참조하여 다음 두 개 파일을 준비합니다.

  • 개인키 파일: oracloud_rsa
  • 공개키 파일: oracloud_rsa.pub

3. GPU 인스턴스를 Compartment 선정

Compartment는 자원을 쉽게 관리하는 논리적인 묶음입니다. Tenancy가 생성되면 Root Compartment 하나가 만들어집니다. 관리자는 Root Compartment 아래에 새로운 Compartment를 디렉토리 구조로 추가할 수 있습니다. 인스턴스, 블록 스토리지, VCN, 서브넷 등 모든 OCI 자원을 생성할 때 반드시 Compartment를 지정해야 합니다. OCI는 Compartment 단위로 사용자 접근 정책을 관리합니다.

Root Compartment“를 사용하는 것은, 관리적인 측면을 고려할 때 바람직하지 않습니다. 별도로 Compartment를 만들어 사용하는 것이 좋습니다.

Compartment를 새로 만들어야 한다면 다음 그림과 같이 새로운 Compartment를 생성합니다. OCI 메인 페이지의 “햄버거 아이콘 -> Identity -> Compartments” 메뉴를 통해서 Compartments 관리 페이지로 이동합니다. 아래 그림에서는 “sandbox” Compartment를 만들었습니다. 본 문서에서는 “sandbox” Compartment에 모든 OCI 자원을 만들 것입니다.

4. VCN(Virtual Cloud Network) 생성

이 절에서는 GPU 인스턴스를 위한 VCN을 만들고, 외부에서 접속할 수 있도록 8888 포트2를 외부에 공개하는 설정을 추가할 것입니다.

다음 그림의 메뉴 패스로 VCN 관리 페이지로 이동하고 새로운 VCN을 만들 수 있습니다.

다음 그림과 같이 “Create Virtual Cloud Network” 생성 팝업에서 VCN 이름을 입력하고 사용할 Compartment를 지정합니다. 그리고 “CREATE VIRTUAL CLOUD NETWORK PLUS RELATED RESOURCES”를 선택합니다. 이 옵션을 선택하면 VCN을 만들 때, 이 VCN과 관련된 Internet Gateway, Route Table, AD 별 서브넷이 한꺼번에 생성됩니다.

“CREATE VIRTUAL CLOUD NETWORK PLUS RELATED RESOURCES”을 선택하면 “Create Virtual Cloud Network” 생성 팝업에 다음과 같은 내용이 출력됩니다. 아래의 “create virtual cloud network” 버튼을 클릭하면 VCN이 생성됩니다.

앞에서 만든 “gpuvcn“에 8888 포트를 오픈하는 Ingress Rule을 추가해야 합니다. 이 설정을 위해서 Network의 Virtual Cloud Network의 상세 페이지에서 gpuvcn을 선택한 후, 해당 VCN의 “default security list”에 Ingress Rule을 추가합니다.

위 그림에서 “Add Ingress Rule” 클릭하면 다음과 같은 “Add Ingress Rule” 생성 팝업이 나타납니다. 이 팝업에 다음과 같이 “Source CIDR”과 “Destination Port Range”를 설정하고 “Add Ingress Rule” 버튼을 클릭하면 Ingress Rule이 생성됩니다. 이 Ingress Rule을 통해서 외부 컴퓨터가 앞으로 생성할 GPU VM에 접속할 수 있게 됩니다.

위 그림과 같이 Ingress Rule이 정상적으로 등록되면, 다음과 같이 “Security List”에 새로 등록된 Ingress Rule이 출력됩니다. 위 그림에서 Jupyter를 위한 8888 포트와 ssh 접속을 위한 22번 포트가 오픈된 것을 확인 할 수 있습니다.

이것으로 GPU VM 인스턴스 생성을 위한 준비 작업이 완료되었습니다. 이제 GPU VM을 만들고 관련 개발 환경을 구성해볼 것입니다.

GPU VM 인스턴스 생성

다음 그림과 같이 “햄버거 메뉴 버튼 -> Compute -> Instance” 메뉴 패스로 VM 인스턴스 관리 페이지로 이동합니다. 이 페이지에서 sandbox 컴파트먼트를 선택하고 “Create Instance” 버튼을 클릭하면 “Create Compute Instance” 페이지로 이동합니다.

앞으로 다음과 같은 환경에서 GPU VM 인스턴스를 만들 것입니다.

  • 리전: Asburn
  • AD: AD 2
  • Shape: VM.GPU3.2
  • 운영체제: Oracle Linux 7.6
  • VCN: gpuvcn
  • Compartment: sandbox

다음 그림과 같이 각 항목을 설정하고 “create” 버튼을 클릭하면 인스턴스가 생성됩니다.

VM 인스턴스 생성 시간은 약 1분 정도 소요됩니다.

위 그림의 “Primary VNIC Information” 섹션에서 “Public IP Address”로 부터 공개 IP를 확인할 수 있습니다.

  • Puboic IP: 132.145.209.180

SSH 접근

이제 GPU VM 인스턴스는 생성되었습니다. 앞에서 준비한 SSH Key pair의 개인키를 이용하여 VM에 접근할 수 있습니다.

ssh -i <private key 파일 위치> opc@<Puboic IP>

공개 IP(Public IP)가 “132.145.209.180” 일 때, 다음 그림과 같이 ssh로 접속할 수 있습니다.

OCI에서 Oracle Linux의 기본 User는 “opc“이고 Ubuntu의 기본 User는 “ubuntu“입니다. VM의 운영체제로 Ubuntu 16.04 선택했다면 ssh -i <private key 파일 위치> ubuntu@<Puboic IP> 명령으로 접속하면 됩니다.

GPU VM 인스턴스 둘러보기

GPU VM 인스턴스에는 디폴트로 NVIDIA 드라이버와 CUDA 드라이버가 설치되어 있습니다.

다음 명령으로 NVIDIA GUP 마운트 상태를 확인 할 수 있습니다.

[opc@gpuvm01 ~]$ lspci | grep -i nvidia
00:04.0 3D controller: NVIDIA Corporation GV100GL [Tesla V100 SXM2 16GB] (rev a1)
00:05.0 3D controller: NVIDIA Corporation GV100GL [Tesla V100 SXM2 16GB] (rev a1)
[opc@gpuvm01 ~]$

다음 명령으로 설치된 NVIDIA 드라이버 버전을 확인 할 수 있습니다.

[opc@gpuvm01 ~]$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  418.67  Sat Apr  6 03:07:24 CDT 2019
GCC version:  gcc version 4.8.5 20150623 (Red Hat 4.8.5-36.0.1) (GCC)
[opc@gpuvm01 ~]$

다음 명령으로 설치된 CUDA 드라이버 버전을 확인 할 수 있습니다.

[opc@gpuvm01 ~]$ cat /usr/local/cuda/version.txt
CUDA Version 10.1.168
[opc@gpuvm01 ~]$

또한 nvidia-smi 도 기본 설치되어 제공됩니다.

[opc@gpuvm01 ~]$ nvidia-smi
Wed Sep 11 07:59:18 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.67       Driver Version: 418.67       CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla V100-SXM2...  Off  | 00000000:00:04.0 Off |                    0 |
| N/A   45C    P0    41W / 300W |      0MiB / 16130MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla V100-SXM2...  Off  | 00000000:00:05.0 Off |                    0 |
| N/A   43C    P0    40W / 300W |      0MiB / 16130MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
[opc@gpuvm01 ~]$

마지막으로 OpenJDK 1.8.0_222 버전과 Python 2.7 버전이 설치되어 있습니다.

[opc@gpuvm01 ~]$ java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
[opc@gpuvm01 ~]$

OCI IaaS의 모든 VM에서는 Oracle Java와 GraalVM Enterprise Edition을 자유롭게 사용할 수 있습니다. 필요할 경우 Oracle Java와 GraalVM EE를 설치 및 사용이 가능하고 정식 서포트를 받을 수 있습니다.

머신러닝 환경 구성

이제 부터 ssh로 VM 인스턴스에 접근한 상태에서 Jupyter 기반 머신러밍 환경을 구성합니다.

방화벽 포트 오픈

이제 운영체제가 관리하는 방화벽에 8888 포트를 오픈합니다. Oracle Linux 7.x를 사용하는 VM 인스턴스는 방화벽을 관리하는 firewalld 데몬을 사용합니다. 그릭고 firewall-cmd 명령으로 방화벽을 관리합니다. Oracle Linux 7.x를 사용하는 VM에서는 다음 명령을 사용하여 8888 포트를 오픈합니다.

sudo firewall-cmd --zone=public --add-port=8888/tcp --permanent
sudo firewall-cmd --reload

ssh로 접속한 VM에서 실행한 명령은 다음과 같습니다.

[opc@gpuvm01 ~]$ sudo firewall-cmd --zone=public --add-port=8888/tcp --permanent
success
[opc@gpuvm01 ~]$ sudo firewall-cmd --reload
success
[opc@gpuvm01 ~]$

python 3.6 설치

Oracle Linux 7.X에서는 다음 명령을 실행하여 python 3.6을 설치합니다.

sudo yum install -y oracle-epel-release-el7
sudo yum install -y python36

Anaconda 설치

아래 URL에서 제공하는 Anaconda 최신 버전을 다운로드한 다음에 설치합니다.

2019년 9월 현재 최신 버전은 “Anaconda2-2019.07-Linux-x86_64.sh” 입니다. 이 파일을 다운로드하고 설치합니다.

다음 wget 명령을 수행하여 최신 Anaconda 배포본을 다운로드합니다.

wget https://repo.continuum.io/archive/Anaconda3-2019.07-Linux-x86_64.sh

실제 실행한 로그는 다음과 같습니다.

[opc@gpuvm01 ~]$ wget https://repo.continuum.io/archive/Anaconda3-2019.07-Linux-x86_64.sh
--2019-09-11 11:59:11--  https://repo.continuum.io/archive/Anaconda3-2019.07-Linux-x86_64.sh
Resolving repo.continuum.io (repo.continuum.io)... 104.18.200.79, 104.18.201.79, 2606:4700::6812:c84f, ...
Connecting to repo.continuum.io (repo.continuum.io)|104.18.200.79|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 541906131 (517M) [application/x-sh]
Saving to: 'Anaconda3-2019.07-Linux-x86_64.sh'

100%[============================================>] 499,266,771  105MB/s   in 4.7s

2019-09-11 11:41:07 (101 MB/s) - 'Anaconda3-2019.07-Linux-x86_64.sh' saved [499266771/499266771]

[opc@gpuvm01 ~]$

다운드로한 스크립트를 다음 명령으로 실행하여 Anaconda를 설치합니다. 그리고 PATH 환경변수를 수정하고 활성화합니다.

bash ./Anaconda3-2019.07-Linux-x86_64.sh -b
echo 'export PATH="$HOME/anaconda3/bin:$PATH"' >> $HOME/.bashrc
source ~/.bashrc

다음 명령을 실행하여 conda가 최신 버전으로 업데이트됩니다.

conda update -n base -c defaults conda

실제 실행한 결과는 다음과 같습니다.

[opc@gpuvm01 ~]$ conda --version
conda 4.7.10
[opc@gpuvm01 ~]$ conda update -n base -c defaults conda
Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: /home/opc/anaconda3

  added / updated specs:
    - conda


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    conda-4.7.11               |           py37_0         2.8 MB
    ------------------------------------------------------------
                                           Total:         2.8 MB

The following packages will be UPDATED:

  conda                                       4.7.10-py37_0 --> 4.7.11-py37_0


Proceed ([y]/n)? yn
Invalid choice: yn
Proceed ([y]/n)? y


Downloading and Extracting Packages
conda-4.7.11         | 2.8 MB    | ############################################### | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
[opc@gpuvm01 ~]$ conda --version
conda 4.7.11
[opc@gpuvm01 ~]$

conda activate 명령을 사용하기 위해서 다음 명령을 실행하여 .bashrc 파일을 업데이트합니다. 그리고 source 명령을 실행하여 .bashrc 설정을 현재 세션에 반영합니다.

conda init bash
source ~/.bashrc

위 명령의 실제 실행한 결과는 다음과 같습니다.

[opc@gpuvm01 ~]$ conda init bash
no change     /home/opc/anaconda3/condabin/conda
no change     /home/opc/anaconda3/bin/conda
no change     /home/opc/anaconda3/bin/conda-env
no change     /home/opc/anaconda3/bin/activate
no change     /home/opc/anaconda3/bin/deactivate
no change     /home/opc/anaconda3/etc/profile.d/conda.sh
no change     /home/opc/anaconda3/etc/fish/conf.d/conda.fish
no change     /home/opc/anaconda3/shell/condabin/Conda.psm1
no change     /home/opc/anaconda3/shell/condabin/conda-hook.ps1
no change     /home/opc/anaconda3/lib/python3.7/site-packages/xontrib/conda.xsh
no change     /home/opc/anaconda3/etc/profile.d/conda.csh
modified      /home/opc/.bashrc

==> For changes to take effect, close and re-open your current shell. <==

[opc@gpuvm01 ~]$ source ~/.bashrc
(base) [opc@gpuvm01 ~]$

새로운 가상환경 만들기

다음 명령을 실행하여 ‘sandbox’ 가상 환경을 만듭니다.

conda create --name sandbox

위 명령의 실제 실행한 결과는 다음과 같습니다.

(base) [opc@gpuvm01 ~]$ conda create --name sandbox
Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: /home/opc/anaconda3/envs/sandbox



Proceed ([y]/n)?  y

Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
#
#     $ conda activate sandbox
#
# To deactivate an active environment, use
#
#     $ conda deactivate

(base) [opc@gpuvm01 ~]$

sandbox 가상환경을 활성화할 때는 다음 명령을 사용합니다.

conda activate sandbox

sandbox 가상환경을 비활성화시킬 때는 다음 명령을 사용합니다.

conda deactivate
(base) [opc@gpuvm01 ~]$ conda activate sandbox
(sandbox) [opc@gpuvm01 ~]$ conda deactivate
(base) [opc@gpuvm01 ~]$

Jupyter 설치

sandbox 가상 환경을 활성화하고 다음 명령을 실행하여 Jupyter를 설치합니다.

conda activate sandbox
conda install notebook

Jupyter kernel 설치

다음 명령을 실행하여 ipykernel을 설치하고 Python 3.6 커널을 생성합니다.

sudo python3.6 -m pip install ipykernel
sudo python3.6 -m ipykernel install \
  --name python3.6 --display-name "Python 3.6" \
  --prefix /home/opc/anaconda3/envs/sandbox

위 명령에서 “__” 문자는 명령이 종료되지 않고 다음 줄로 연결된다는 의미입니다. 위 명령은 2개의 명령입니다. 위 명령은 다음과 같이 실행됩니다.

(sandbox) [opc@gpuvm01 ~]$ sudo python3.6 -m pip install ipykernel
WARNING: Running pip install with root privileges is generally not a good idea. Try `__main__.py install --user` instead.
Collecting ipykernel
  Downloading https://files.pythonhosted.org/packages/d4/16/43f51f65a8a08addf04f909a0938b06ba1ee1708b398a9282474531bd893/ipykernel-5.1.2-py3-none-any.whl (116kB)
    100% |################################| 122kB 7.1MB/s
//로그 생략
Successfully installed backcall-0.1.0 decorator-4.4.0 ipykernel-5.1.2 ipython-7.8.0 ipython-genutils-0.2.0 jedi-0.15.1 jupyter-client-5.3.1 jupyter-core-4.5.0 parso-0.5.1 pexpect-4.7.0 pickleshare-0.7.5 prompt-toolkit-2.0.9 ptyprocess-0.6.0 pygments-2.4.2 python-dateutil-2.8.0 pyzmq-18.1.0 six-1.12.0 tornado-6.0.3 traitlets-4.3.2 wcwidth-0.1.7
(sandbox) [opc@gpuvm01 ~]$
(sandbox) [opc@gpuvm01 ~]$ sudo python3.6 -m ipykernel install \
>   --name python3.6 --display-name "Python 3.6" \
>   --prefix /home/opc/anaconda3/envs/sandbox
[InstallIPythonKernelSpecApp] WARNING | Installing to /home/opc/anaconda3/envs/sandbox/share/jupyter/kernels, which is not in ['/root/.local/share/jupyter/kernels', '/usr/local/share/jupyter/kernels', '/usr/share/jupyter/kernels', '/root/.ipython/kernels']. The kernelspec may not be found.
Installed kernelspec python3.6 in /home/opc/anaconda3/envs/sandbox/share/jupyter/kernels/python3.6
(sandbox) [opc@gpuvm01 ~]$

Tensorflow GPU 버전 설치

다음 명령을 수행하여 Tensorflow GPU 버전을 설치합니다.

sudo python3.6 -m pip install tensorflow-gpu

Jupyter 설정

다음 명령으로 Jupyter에 설정 파일을 생성합니다. 그리고 몇 가지 간단한 설정을 추가합니다. 그 다음 Jupyter 로그인에 사용할 패스워드를 등록할 것입니다. 다음 명령을 실행하여 Jupyter 설정 파일을 생성합니다.

jupyter notebook --generate-config

위 명령을 실행하면 다음 파일이 만들어집니다.

  • /home/opc/.jupyter/jupyter_notebook_config.py

위 명령은 다음과 같이 실행됩니다.

(sandbox) [opc@gpuvm01 ~]$ jupyter notebook --generate-config
Writing default config to: /home/opc/.jupyter/jupyter_notebook_config.py
(sandbox) [opc@gpuvm01 ~]$

/home/opc/.jupyter/jupyter_notebook_config.py 파일을 열고 다음 코드를 마지막에 추가합니다.

c = get_config()
c.NotebookApp.ip = '0.0.0.0'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8888

다음 명령을 입력하여 Jupyter 로그인 패스워드를 설정합니다.

jupyter notebook password

위 명령은 다음과 같이 실행됩니다. 아래 실행에서는 패스워드로 “Welcome1“을 설정했습니다.

(sandbox) [opc@gpuvm01 ~]$ jupyter notebook password
Enter password:
Verify password:
[NotebookPasswordApp] Wrote hashed password to /home/opc/.jupyter/jupyter_notebook_config.json
(sandbox) [opc@gpuvm01 ~]$

Jupyter 실행 및 테스트 코드 실행

다음 명령을 입력하여 Jupyter를 실행합니다.

jupyter notebook

위 명령은 다음과 같이 실행됩니다.

(sandbox) [opc@gpuvm01 ~]$ jupyter notebook
[I 14:22:16.346 NotebookApp] Writing notebook server cookie secret to /home/opc/.local/share/jupyter/runtime/notebook_cookie_secret
[I 14:22:16.548 NotebookApp] Serving notebooks from local directory: /home/opc
[I 14:22:16.548 NotebookApp] The Jupyter Notebook is running at:
[I 14:22:16.548 NotebookApp] http://gpuvm01:8888/
[I 14:22:16.548 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

위에서 Jupyter Notebook을 실행하면, 브라우저에서 VM의 Public IP의 8888포트로 접근하여 앞에서 설정한 패스워드로 로그인합니다.

Jupyter에 로그인했으면 Notebook을 하나 만들고 다음 코드를 실행합니다.

import tensorflow as tf
from time import strftime, localtime, time

tf.set_random_seed(42)
A = tf.random_normal([10000,10000])
B = tf.random_normal([10000,10000])

def check():
    start_time = time()
    print('Starting at {}...'.format(strftime('%H:%M:%S', localtime(start_time))))
    with tf.Session() as sess:
        sess.run(tf.reduce_sum(tf.matmul(A,B)))
    finish_time = time()
    elapsed_time = finish_time - start_time
    print('Done! It took {:.3f} seconds'.format(elapsed_time))

check()

위 코드는 크기가 (10,000 X 10,000)인 두 행렬 (요소가 1억 개인 행렬)을 만들고, 두 행렬의 행렬 곱을 수행한 결과 행렬의 모든 요소를 합하는 코드입니다. 이 코드를 Tesla V100 GPU 1장을 사용하는 VM.GPU3.1에서 실행하면 약 3~4초가 걸립니다.

다음 그림은 위 코드를 VM.GPU3.2 Shape의 VM (Tesla V100 GPU 2개)에서 실행한 결과입니다. VM.GPU3.2 VM에서 이 코드를 처리하는 데 1.98초가 걸렸습니다.

요약

지금까지 운영 체제로 Oracle Linux 7.X를 사용하는 OCI GPU VM을 만들었습니다. 그리고 딥러닝 수행을 위한 Jupyter 환경을 구성해 보았습니다. 그리고 마지막으로 Jupyter에서 1억개 요소를 갖는 두 행렬의 행렬곱 연산하고 모든 요소를 합하는 코드를 수행해 보았습니다.

OCI에서 GPU VM을 만들고 관련 보안 설정과 관련 소프트웨어를 설치하는 과정을 Ansible 혹은 Terraform으로 인프라 구성을 자동화 할 수 있습니다.

다음 주제로 Terrform을 이용하여 GPU VM 구성을 자동화하는 기법을 다루겠습니다.

참고 자료


  1. OCI는 2019년 9월 10일 기준으로 6개의 shape을 제공합니다. [return]
  2. 8888 포트는 Jupyter가 사용하는 기본 포트입니다. [return]
김태완 avatar
작성자: 김태완
1999년 부터 Java, Framework, Middleware, SOA, DB Replication, Cache, CEP, NoSQL, Big Data, Cloud를 키워드로 살아왔습니다. 현재는 빅데이터와 Machine Learning을 중점에 두고 있습니다.
E-mail: taewanme@gmail.com

이 저작물은 Oracle과 관계없이 개인으로서 개인의 시간을 할애하여 작성된 글 입니다. 본 글의 내용, 입장, 예측은 Oracle을 공식적으로 절대 대변하지 않습니다.