この資料について

この資料は VCP Hands-on 「201-GPUインスタンスの利用.ipynb」 の内容をJupyterNotebook環境のない状態でも閲覧できるように用意した自習用資料です。各ステップの終わりに、そのステップをJupyterNotebookで実行した様子を見ることができる動画がついています。
全体を実行している様子はハンズオンの動画 でみることができます。

GPUの利用

GPU利用のために必要となる設定

インスタンスタイプ、VMサイズ

GPUが利用できるEC2インスタンスタイプ(Amazon)、VMサイズ(Microsoft Azure)を指定する必要があります。

Amazon EC2 であれば、以下のものが候補になります。

Microsoft Azure VM であれば、以下のものが候補になります。

ドライバ、ライブラリなど

GPUを利用するためには、GPUドライバ、ライブラリなどを準備する必要があります。

VCPではGPUドライバなどをVCノードの構成に合わせた形でセットアップしたものを事前に用意してあります。そのため通常のVCノードを利用する場合にspec指定を行ったのと同様の手順で、いくつかのパラメータを specに指定するだけでGPUを利用することが出来ます。

GPUを利用しない場合(下図左側)と、GPUを利用する場合(下図右側)のVCノードの構成を以下に示します。

GPUコンテナ

GPUを利用しない場合との違いを以下に示します。

nvidia ドライバはカーネルモジュールになっているため、VMのカーネルバージョンに強く依存しています。そのためnvidiaドライバはBaseコンテナではなくOS(マシンイメージ)にインストールしています。

操作手順

この Notebook では以下の操作を行います。

  1. GPU用のVCノードを起動する
  2. GPUを利用するアプリケーションコンテナを起動する

GPU用VCノードを起動する

GPUを利用するために必要となるパラメータを specに指定して、VCノードを起動する。

アクセストークンの入力

VCP SDKを利用するにはVC Controllerのアクセストークンが必要となります。次のセルを実行すると入力枠が表示されるのでアクセストークンの値を入力してください。

アクセストークン入力後に Enter キーを押すことで入力が完了します。

In [1]:
from getpass import getpass
vcc_access_token = getpass()
········

このステップのJupyterNotebookでの実行の様子


VCP SDKの初期化

VCP SDKの初期化を行います。

In [2]:
from common import logsetting
from vcpsdk.vcpsdk import VcpSDK

# VCの管理オブジェクトの作成
vcp = VcpSDK(
    vcc_access_token,  # VCCのアクセストークン
)

上のセルの実行結果がエラーとなり以下のようなメッセージが表示されている場合は、入力されたアクセストークンに誤りがあります。

2018-09-XX XX:XX:XX,XXX - ERROR - config vc failed: http_status(403)
2018-09-XX XX:XX:XX,XXX - ERROR - 2018/XX/XX XX:XX:XX UTC: VCPAuthException: xxxxxxx:token lookup is failed: permission denied

この場合はアクセストークンの入力からやり直してください。


このステップのJupyterNotebookでの実行の様子


VCノードのspecを指定する

GPUを利用するVCノードのspecを指定します。

specの取得

プロバイダと flavorを指定して specオブジェクトを取得します。ここでは以下の値を指定します。

  • プロバイダ: aws
  • flavor: gpu

flavorgpu を指定することで、GPUが利用できるインスタンスタイプが選択されます。

In [3]:
spec = vcp.get_spec(
    'aws',    # プロバイダ
    'gpu'  # flavor
)

GPUを利用するための nvidiaドライバや、GPUコンテナを実行するためのランタイム(nvidia-docker2)を準備したVMイメージ、Baseコンテナイメージを spec の設定に追加します。

In [4]:
# Baseコンテナイメージの設定
spec.image = 'vcp/gpu:1.6-nvidia-384'
# 仮想マシンイメージの設定
spec.cloud_image = 'niivcp-gpu-20190925'

このステップのJupyterNotebookでの実行の様子


sshの鍵ファイルを設定する

VCノードにsshでログインするためには事前に公開鍵認証の鍵を登録する必要があります。そのための設定をここで行います。

VCノードに登録する公開鍵認証の公開鍵のパスを次のセルで指定してください。

In [5]:
import os
ssh_public_key = os.path.expanduser('~/.ssh/id_rsa.pub')

指定した公開鍵を spec に設定します。

In [6]:
spec.set_ssh_pubkey(ssh_public_key)

後でVCノードにSSHでログインする際に秘密鍵も必要になるので、ここで設定しておきます。次のセルで秘密鍵のパスを指定してください。

In [7]:
ssh_private_key = os.path.expanduser('~/.ssh/id_rsa')

公開鍵と秘密鍵が正しいペアであることをチェックします。次のセルを実行してエラーにならないことを確認してください。

In [8]:
!grep -q "$(ssh-keygen -y -f {ssh_private_key})" {ssh_public_key}

このステップのJupyterNotebookでの実行の様子


specの設定内容の確認

ここまで spec に設定した内容を確認してみます。

In [9]:
print(spec)
========================
aws
------------------------

    cci_version: "1.1"
    name: 
    description: 
    private_network: default
    num_nodes: 1
    image: vcp/gpu:1.6-nvidia-384
    recovery_mode: none
    docker_opt: {}
    params:
        {'v': [], 'e': ['AUTHORIZED_KEYS=c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFCQVFET0NVZGV3YW9JM0ZQaWZNdWIrZGR2MmQxaUsybkZpU0Y4YktKTjlUMlBEbk42UHlhTVlId2ZucWtGSnZyYTc2T2lqQllUSy81V2gwaElYc0RaYmdkQ0lwR2F5WXpwRVBtUiszZnd0ZllickJ4T0JqdnBUYmI3MU9wS08zd0NNM2JmazRjZzJxdFJSTVk4T09iZFFpckZFUzdwMGpyVXVBVTI1Z3d0ZDByY2orOE9qTGx2Qk12L2RIejhpQmZYVE94QWtYaEVuVHFVZ0lYQXNUMW8wV2JmdXNXWEwyZGJNUmw2M0lMSXJQYjZkNGUwcWVZK3pwMVlkcHFnY2NHWG8yVnZOV0hKZUZZSmdtUmJPdUV2UitmbmpNNXRxa1JKZHNtSFRrWktVOFp3VFI5K0JTU3BZVXVieTljcTR6UUs0ZnVmdlRBeGg2R2dPODBmcDRGNkVzRVAgam92eWFuQDU3YmEzM2IxZGEwMwo=']}

    instance_type: g3.4xlarge
    volume_size: 40
    volume_type: gp2
    volume_id: []
    cloud_image: niivcp-gpu-20190925
    ip_address_list: []
    tags: {}
========================

このステップのJupyterNotebookでの実行の様子


VCノードの起動

VCノードの起動と、VCノードを操作するためのAnsible設定を行います。

Unitの作成とVCノードの起動

Unitの作成とVCノードの起動を行います。

まずはUnitGroupを作成します。UnitGroupの名前は handson201とします。

In [10]:
unit_group = vcp.create_ugroup(
    'handson201'                   # UnitGroupの名前
)

VCノードを起動する前のUnitとVCノードの状態を確認しておきます。

In [11]:
from IPython.display import display

# Unitの一覧を DataFrame で表示する
display(unit_group.df_units())

# VCノードの一覧を DataFrame で表示する
display(unit_group.df_nodes())
vctype vcno vcname vc_state vcid cdate unit_name unit_state
[]

Unitの作成とVCノードの起動を行います。

処理が完了するまで2分~7分程度かかります。

In [12]:
# Unitの作成(同時に VCノードが作成される)
unit_group.create_unit(
    'gpu',         # Unit名
    spec
)
2020-11-11 12:54:00,513 - INFO - BOOTING ... 0 sec
2020-11-11 12:54:05,628 - INFO - BOOTING ... 5 sec
2020-11-11 12:54:10,743 - INFO - BOOTING ... 10 sec
2020-11-11 12:54:15,860 - INFO - BOOTING ... 15 sec
2020-11-11 12:54:20,981 - INFO - BOOTING ... 20 sec
2020-11-11 12:54:26,097 - INFO - BOOTING ... 25 sec
2020-11-11 12:54:31,217 - INFO - BOOTING ... 30 sec
2020-11-11 12:54:36,334 - INFO - BOOTING ... 35 sec
2020-11-11 12:54:41,456 - INFO - BOOTING ... 40 sec
2020-11-11 12:54:46,570 - INFO - BOOTING ... 45 sec
2020-11-11 12:54:51,685 - INFO - BOOTING ... 50 sec
2020-11-11 12:54:56,801 - INFO - BOOTING ... 55 sec
2020-11-11 12:55:01,929 - INFO - BOOTING ... 60 sec
2020-11-11 12:55:07,043 - INFO - BOOTING ... 65 sec
2020-11-11 12:55:12,159 - INFO - BOOTING ... 70 sec
2020-11-11 12:55:17,280 - INFO - BOOTING ... 75 sec
2020-11-11 12:55:22,395 - INFO - BOOTING ... 80 sec
2020-11-11 12:55:27,510 - INFO - BOOTING ... 85 sec
2020-11-11 12:55:32,629 - INFO - BOOTING ... 90 sec
2020-11-11 12:55:37,747 - INFO - BOOTING ... 95 sec
2020-11-11 12:55:42,864 - INFO - BOOTING ... 100 sec
2020-11-11 12:55:47,981 - INFO - BOOTING ... 105 sec
2020-11-11 12:55:53,105 - INFO - BOOTING ... 110 sec
2020-11-11 12:55:58,221 - INFO - BOOTING ... 115 sec
2020-11-11 12:56:03,349 - INFO - BOOTING ... 120 sec
2020-11-11 12:56:08,469 - INFO - BOOTING ... 125 sec
2020-11-11 12:56:13,707 - INFO - BOOTING ... 130 sec
2020-11-11 12:56:18,888 - INFO - BOOTING ... 135 sec
2020-11-11 12:56:24,075 - INFO - BOOTING ... 140 sec
2020-11-11 12:56:29,255 - INFO - BOOTING ... 145 sec
2020-11-11 12:56:34,394 - INFO - BOOTING ... 150 sec
2020-11-11 12:56:39,527 - INFO - BOOTING ... 155 sec
2020-11-11 12:56:44,680 - INFO - BOOTING ... 160 sec
2020-11-11 12:56:49,797 - INFO - BOOTING ... 165 sec
2020-11-11 12:56:54,913 - INFO - BOOTING ... 170 sec
2020-11-11 12:57:00,033 - INFO - BOOTING ... 175 sec
2020-11-11 12:57:05,153 - INFO - BOOTING ... 180 sec
2020-11-11 12:57:10,268 - INFO - BOOTING ... 185 sec
2020-11-11 12:57:15,383 - INFO - BOOTING ... 190 sec
2020-11-11 12:57:20,498 - INFO - BOOTING ... 195 sec
2020-11-11 12:57:25,624 - INFO - BOOTING ... 200 sec
2020-11-11 12:57:36,755 - INFO - unit gpu is RUNNING
Out[12]:
<vcpsdk.vcpsdk.VcpUnitClass at 0x7fdbdf63f790>

起動したUnit, VCノードの一覧を表示します。

In [13]:
# Unitの一覧を DataFrame で表示する
display(unit_group.df_units())

# VCノードの一覧を DataFrame で表示する
display(unit_group.df_nodes())
vctype vcno vcname vc_state vcid cdate unit_name unit_state
0 compute 89 handson201 RUNNING af4b2d8a... 2020/11/11 03:53:59 UTC gpu RUNNING
vcno vcname unit_name unit_state node_no node_id node_state cloud_instance_address cloud_instance_id cloud_instance_name volumes
0 89 handson201 gpu RUNNING 1 1c6236b1... RUNNING 172.30.2.46 i-0f363421fb15c0e52 VCP-f7944417-af4b2d8a none

このステップのJupyterNotebookでの実行の様子

※ VCノード作成のセルの実行は時間がかかるため、この動画では編集し短くしています


疎通確認

起動した VC ノードに SSHでログイン出来ることを確認します。

まず、VCノードのIPアドレスを確認します。

In [14]:
ip_address = unit_group.find_ip_addresses(node_state='RUNNING').pop()
print(ip_address)
172.30.2.46

ping による疎通確認を行います。

In [15]:
!ping -c 4 {ip_address}
PING 172.30.2.46 (172.30.2.46) 56(84) bytes of data.
64 bytes from 172.30.2.46: icmp_seq=1 ttl=63 time=0.603 ms
64 bytes from 172.30.2.46: icmp_seq=2 ttl=63 time=0.374 ms
64 bytes from 172.30.2.46: icmp_seq=3 ttl=63 time=0.311 ms
64 bytes from 172.30.2.46: icmp_seq=4 ttl=63 time=0.310 ms

--- 172.30.2.46 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2998ms
rtt min/avg/max/mdev = 0.310/0.399/0.603/0.121 ms

VCノードにSSHでログインする準備としてVCノードのホストキーを ~/.ssh/known_hosts に登録します。

In [16]:
!touch ~/.ssh/known_hosts
# ~/.ssh/known_hosts から古いホストキーを削除する
!ssh-keygen -R {ip_address}
# ~/.ssh/known_hostsにVCノードを登録する
!ssh-keyscan -H {ip_address} >> ~/.ssh/known_hosts
Host 172.30.2.46 not found in /home/jovyan/.ssh/known_hosts
# 172.30.2.46:22 SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.8
# 172.30.2.46:22 SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.8
# 172.30.2.46:22 SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.8

VCノードにSSHでログインをしてコマンドを実行してみます。

In [17]:
!ssh root@{ip_address} ls -la
total 36
drwx------ 1 root root 4096 Sep 18  2019 .
drwxr-xr-x 1 root root 4096 Nov 11 03:57 ..
-rw-r--r-- 1 root root 3106 Oct 22  2015 .bashrc
drwx------ 1 root root 4096 Nov 11 03:57 .cache
drwxr-xr-x 3 root root 4096 Sep 18  2019 .gem
drwxr-xr-x 1 root root 4096 Sep 18  2019 go
-rw-r--r-- 1 root root  148 Aug 17  2015 .profile
drwx------ 1 root root 4096 Nov 11 03:57 .ssh
-rw-r--r-- 1 root root  264 Sep 18  2019 .wget-hsts

このステップのJupyterNotebookでの実行の様子


GPU環境の確認

NVIDIA GPUではGPUデバイスを管理、監視するためのコマンドnvidia-smiが提供されています。ここでは、起動したVCノードのGPUに関する状態を取得するためにnvidia-smiコマンドを実行してみます。

nvidia-smi コマンドを利用するとGPU名やドライババージョン、GPUメモリ使用量、GPU使用率、GPUの温度などのGPUに関する情報を取得することができます。nvidia-smiコマンドが表示するサマリ情報の例を以下に示します。

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.130                Driver Version: 384.130                   |
|-------------------------------+----------------------+----------------------+
| 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 K80           Off  | 00000000:00:1E.0 Off |                    0 |
| N/A   51C    P0    59W / 149W |      0MiB / 11439MiB |     96%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

nvidia-smiコマンドはCUDAコンテナの中で実行するので、まずコンテナイメージの取得を行います。

コンテナイメージの取得に1~3分程度かかります。

In [18]:
!ssh root@{ip_address} docker pull nvidia/cuda:8.0-cudnn5-runtime-ubuntu16.04
8.0-cudnn5-runtime-ubuntu16.04: Pulling from nvidia/cuda
4f53fa4d2cf0: Pulling fs layer
6af7c939e38e: Pulling fs layer
903d0ffd64f6: Pulling fs layer
04feeed388b7: Pulling fs layer
0aab2536bab1: Pulling fs layer
ee9958bf392b: Pulling fs layer
be3ab1ddf5bd: Pulling fs layer
c9ad32de5026: Pulling fs layer
b4ab48c331ca: Pulling fs layer
04feeed388b7: Waiting
0aab2536bab1: Waiting
c9ad32de5026: Waiting
ee9958bf392b: Waiting
b4ab48c331ca: Waiting
903d0ffd64f6: Download complete
6af7c939e38e: Verifying Checksum
6af7c939e38e: Download complete
04feeed388b7: Verifying Checksum
04feeed388b7: Download complete
4f53fa4d2cf0: Verifying Checksum
4f53fa4d2cf0: Download complete
0aab2536bab1: Verifying Checksum
0aab2536bab1: Download complete
be3ab1ddf5bd: Verifying Checksum
be3ab1ddf5bd: Download complete
c9ad32de5026: Download complete
4f53fa4d2cf0: Pull complete
6af7c939e38e: Pull complete
903d0ffd64f6: Pull complete
04feeed388b7: Pull complete
0aab2536bab1: Pull complete
b4ab48c331ca: Verifying Checksum
b4ab48c331ca: Download complete
ee9958bf392b: Verifying Checksum
ee9958bf392b: Download complete
ee9958bf392b: Pull complete
be3ab1ddf5bd: Pull complete
c9ad32de5026: Pull complete
b4ab48c331ca: Pull complete
Digest: sha256:a5d924bfa7797b95974db7b289ab3181aecd4625151b391cd14567a8d156001e
Status: Downloaded newer image for nvidia/cuda:8.0-cudnn5-runtime-ubuntu16.04
docker.io/nvidia/cuda:8.0-cudnn5-runtime-ubuntu16.04

実際にCUDAコンテナからnvidia-smi コマンドを実行してGPUに関するサマリ情報が表示させてみます。

コンテナを実行する際にdocker runコマンドの引数に--runtime=nvidiaオプションを追加しています。このオプションを指定することで、コンテナ内からGPUを利用するための処理が nvidia-docker2 によって実行されています。

In [19]:
!ssh root@{ip_address} docker run --runtime=nvidia --rm \
    nvidia/cuda:8.0-cudnn5-runtime-ubuntu16.04 nvidia-smi
Wed Nov 11 04:36:36 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.130                Driver Version: 384.130                   |
|-------------------------------+----------------------+----------------------+
| 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 M60           Off  | 00000000:00:1E.0 Off |                    0 |
| N/A   26C    P8    14W / 150W |      1MiB /  7613MiB |      1%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

GPUに関する詳細情報を取得するために --queryオプションを指定して nvidia-smi コマンドを実行してみます。

nvidia-smiコマンドの他のオプションについては nvidia-smi documentationを参照してください。

In [20]:
!ssh root@{ip_address} docker run --runtime=nvidia --rm \
    nvidia/cuda:8.0-cudnn5-runtime-ubuntu16.04 nvidia-smi --query
==============NVSMI LOG==============

Timestamp                           : Wed Nov 11 04:36:37 2020
Driver Version                      : 384.130

Attached GPUs                       : 1
GPU 00000000:00:1E.0
    Product Name                    : Tesla M60
    Product Brand                   : Tesla
    Display Mode                    : Enabled
    Display Active                  : Disabled
    Persistence Mode                : Disabled
    Accounting Mode                 : Disabled
    Accounting Mode Buffer Size     : 1920
    Driver Model
        Current                     : N/A
        Pending                     : N/A
    Serial Number                   : 0324716143384
    GPU UUID                        : GPU-845b1ede-4839-cb53-6c4e-8625b0def626
    Minor Number                    : 0
    VBIOS Version                   : 84.04.A6.00.01
    MultiGPU Board                  : Yes
    Board ID                        : 0x1e
    GPU Part Number                 : 900-2G402-0000-000
    Inforom Version
        Image Version               : G402.0040.00.04
        OEM Object                  : 1.1
        ECC Object                  : 3.0
        Power Management Object     : N/A
    GPU Operation Mode
        Current                     : N/A
        Pending                     : N/A
    GPU Virtualization Mode
        Virtualization mode         : Pass-Through
    PCI
        Bus                         : 0x00
        Device                      : 0x1E
        Domain                      : 0x0000
        Device Id                   : 0x13F210DE
        Bus Id                      : 00000000:00:1E.0
        Sub System Id               : 0x113A10DE
        GPU Link Info
            PCIe Generation
                Max                 : 3
                Current             : 1
            Link Width
                Max                 : 16x
                Current             : 16x
        Bridge Chip
            Type                    : N/A
            Firmware                : N/A
        Replays since reset         : 0
        Tx Throughput               : 0 KB/s
        Rx Throughput               : 0 KB/s
    Fan Speed                       : N/A
    Performance State               : P8
    Clocks Throttle Reasons
        Idle                        : Active
        Applications Clocks Setting : Not Active
        SW Power Cap                : Not Active
        HW Slowdown                 : Not Active
        Sync Boost                  : Not Active
        SW Thermal Slowdown         : Not Active
    FB Memory Usage
        Total                       : 7613 MiB
        Used                        : 1 MiB
        Free                        : 7612 MiB
    BAR1 Memory Usage
        Total                       : 256 MiB
        Used                        : 2 MiB
        Free                        : 254 MiB
    Compute Mode                    : Default
    Utilization
        Gpu                         : 0 %
        Memory                      : 0 %
        Encoder                     : 0 %
        Decoder                     : 0 %
    Encoder Stats
        Active Sessions             : 0
        Average FPS                 : 0
        Average Latency             : 0
    Ecc Mode
        Current                     : Enabled
        Pending                     : Enabled
    ECC Errors
        Volatile
            Single Bit            
                Device Memory       : 0
                Register File       : N/A
                L1 Cache            : N/A
                L2 Cache            : N/A
                Texture Memory      : N/A
                Texture Shared      : N/A
                CBU                 : N/A
                Total               : 0
            Double Bit            
                Device Memory       : 0
                Register File       : N/A
                L1 Cache            : N/A
                L2 Cache            : N/A
                Texture Memory      : N/A
                Texture Shared      : N/A
                CBU                 : N/A
                Total               : 0
        Aggregate
            Single Bit            
                Device Memory       : 0
                Register File       : N/A
                L1 Cache            : N/A
                L2 Cache            : N/A
                Texture Memory      : N/A
                Texture Shared      : N/A
                CBU                 : N/A
                Total               : 0
            Double Bit            
                Device Memory       : 0
                Register File       : N/A
                L1 Cache            : N/A
                L2 Cache            : N/A
                Texture Memory      : N/A
                Texture Shared      : N/A
                CBU                 : N/A
                Total               : 0
    Retired Pages
        Single Bit ECC              : 0
        Double Bit ECC              : 0
        Pending                     : No
    Temperature
        GPU Current Temp            : 26 C
        GPU Shutdown Temp           : 91 C
        GPU Slowdown Temp           : 88 C
        GPU Max Operating Temp      : N/A
        Memory Current Temp         : N/A
        Memory Max Operating Temp   : N/A
    Power Readings
        Power Management            : Supported
        Power Draw                  : 15.19 W
        Power Limit                 : 150.00 W
        Default Power Limit         : 150.00 W
        Enforced Power Limit        : 150.00 W
        Min Power Limit             : 112.50 W
        Max Power Limit             : 162.00 W
    Clocks
        Graphics                    : 405 MHz
        SM                          : 405 MHz
        Memory                      : 324 MHz
        Video                       : 405 MHz
    Applications Clocks
        Graphics                    : 557 MHz
        Memory                      : 2505 MHz
    Default Applications Clocks
        Graphics                    : 557 MHz
        Memory                      : 2505 MHz
    Max Clocks
        Graphics                    : 1177 MHz
        SM                          : 1177 MHz
        Memory                      : 2505 MHz
        Video                       : 1083 MHz
    Max Customer Boost Clocks
        Graphics                    : N/A
    Clock Policy
        Auto Boost                  : On
        Auto Boost Default          : On
    Processes                       : None


このステップのJupyterNotebookでの実行の様子

※ コンテナイメージ取得のセルの実行は時間がかかるため、この動画では編集し短くしています


GPU環境の利用

構築したGPU環境を利用して OpenPose を実行してみます。OpenPoseは画像、動画から人の体、手、顔、および足のキーポイントを検出するシステムです。

準備

起動時のオプションなどを記述した docker-compose.ymlファイルをGPU環境に配置します。

OpenPoseのコンテナイメージを作成するためのDockerfileとコンテナを起動する際のオプションなどを記述した docker-compose.yml をGPU環境に配置します。

In [21]:
# プライベートレジストリのアドレスを取得
registry = vcp.vcc_info()['docker_registry']['official']

!scp -r openpose/ root@{ip_address}:.
!ssh root@{ip_address} sed -i -e '/image:/s/{{{{registry}}}}/{registry}/' openpose/docker-compose.yml
docker-compose.yml                            100%  253    83.6KB/s   00:00    
Dockerfile                                    100% 1142   984.5KB/s   00:00    

このステップのJupyterNotebookでの実行の様子


OpenPoseコンテナのビルド(取得)と実行

OpenPoseをアプリケーションコンテナとして実行できるように、コンテナイメージのビルド(取得)を行い、コンテナを実行します。

VCPのプライベートレジストリに既にビルドしたOpenPoseコンテナのイメージが格納されている場合は、次のセルを実行するとイメージの取得が行われます。イメージの取得には1~3分程度かかります。

In [22]:
!ssh root@{ip_address} "cd openpose && docker-compose pull"
Pulling openpose ... 
ing openpose ... downloading (27.5%))nposeing openpose ... doneoaded newer image fo...[1A

事前にプライベートレジストリにイメージが格納されていない場合は次のセルのコメントを外して、イメージのビルドを行ってください。 イメージのビルドには7~8分程度かかります。

プライベートレジストリからイメージを取得した場合は、ビルドを行う必要はありません。

In [23]:
# import tempfile
# log_file = tempfile.mkstemp()
# !ssh root@{ip_address} "cd openpose && docker-compose build" > {log_file[1]} 2>&1

OpenPoseのコンテナを起動します。

In [24]:
!ssh root@{ip_address} 'cd openpose && docker-compose up -d'
Creating network "openpose_default" with the default driver
Creating openpose ... 
ting openpose ... done

コンテナが起動されたことを確認します。次のセルを実行してStateUp と表示されていればコンテナの起動に成功しています。

In [25]:
!ssh root@{ip_address} 'cd openpose && docker-compose ps'
  Name      Command    State   Ports
------------------------------------
openpose   /bin/bash   Up           

このステップのJupyterNotebookでの実行の様子

※ コンテナイメージ取得のセルの実行は時間がかかるため、この動画では編集し短くしています


OpenPoseの利用

サンプルの画像を処理する

OpenPoseのサンプル画像を処理してみます。

まず処理前のファイルを格納するディレクトリを作成します。

In [26]:
result_dir = './openpose_result'
!mkdir -p {result_dir}

処理前のファイルを取得します。

In [27]:
!ssh root@{ip_address} \
    'cd openpose && docker cp openpose:/root/openpose/examples/media .'
!scp -r root@{ip_address}:openpose/media {result_dir}
COCO_val2014_000000000459.jpg                 100%  190KB  35.9MB/s   00:00    
COCO_val2014_000000000415.jpg                 100%  115KB  32.7MB/s   00:00    
COCO_val2014_000000000589.jpg                 100%   95KB  33.1MB/s   00:00    
COCO_val2014_000000000192.jpg                 100%  225KB  38.0MB/s   00:00    
COCO_val2014_000000000360.jpg                 100%  116KB  28.6MB/s   00:00    
COCO_val2014_000000000257.jpg                 100%  204KB  37.7MB/s   00:00    
COCO_val2014_000000000488.jpg                 100%  103KB  33.3MB/s   00:00    
COCO_val2014_000000000328.jpg                 100%  156KB  37.2MB/s   00:00    
COCO_val2014_000000000623.jpg                 100%  110KB  34.1MB/s   00:00    
COCO_val2014_000000000294.jpg                 100%   74KB  31.6MB/s   00:00    
COCO_val2014_000000000357.jpg                 100%  128KB  29.8MB/s   00:00    
COCO_val2014_000000000395.jpg                 100%  241KB  37.3MB/s   00:00    
COCO_val2014_000000000564.jpg                 100%  127KB  32.0MB/s   00:00    
COCO_val2014_000000000536.jpg                 100%   22KB  18.1MB/s   00:00    
COCO_val2014_000000000428.jpg                 100%  100KB  31.8MB/s   00:00    
COCO_val2014_000000000474.jpg                 100%  128KB  33.2MB/s   00:00    
COCO_val2014_000000000569.jpg                 100%  127KB  34.4MB/s   00:00    
COCO_val2014_000000000338.jpg                 100%   80KB  33.2MB/s   00:00    
COCO_val2014_000000000544.jpg                 100%  184KB  36.8MB/s   00:00    
video.avi                                     100% 1362KB  41.4MB/s   00:00    
COCO_val2014_000000000241.jpg                 100%  105KB  32.7MB/s   00:00    

処理前の画像を1つ表示させてみます。

In [28]:
from IPython.display import Image
Image(filename='openpose_result/media/COCO_val2014_000000000192.jpg')
Out[28]:

処理前の画像のリンクから他の画像を確認することもできます。

OpenPoseで画像の処理を行います。

In [29]:
!ssh root@{ip_address} 'docker exec -t openpose \
    build/examples/openpose/openpose.bin --display 0 \
    --image_dir examples/media --write_images /root/result \
    --write_images_format jpg'
Starting OpenPose demo...
Configuring OpenPose...
Starting thread(s)...
Auto-detecting all available GPUs... Detected 1 GPU(s), using 1 of them starting at GPU 0.
OpenPose demo successfully finished. Total time: 4.843884 seconds.

処理後のファイルを取得します。

In [30]:
!scp -r root@{ip_address}:openpose/result {result_dir}
COCO_val2014_000000000294_rendered.jpg        100%  165KB  28.0MB/s   00:00    
COCO_val2014_000000000395_rendered.jpg        100%  315KB  28.7MB/s   00:00    
COCO_val2014_000000000338_rendered.jpg        100%  154KB  35.6MB/s   00:00    
COCO_val2014_000000000569_rendered.jpg        100%  244KB  38.0MB/s   00:00    
COCO_val2014_000000000459_rendered.jpg        100%  247KB  36.4MB/s   00:00    
COCO_val2014_000000000328_rendered.jpg        100%  273KB  39.7MB/s   00:00    
COCO_val2014_000000000564_rendered.jpg        100%  234KB  37.4MB/s   00:00    
COCO_val2014_000000000544_rendered.jpg        100%  353KB  44.3MB/s   00:00    
COCO_val2014_000000000415_rendered.jpg        100%  166KB  39.8MB/s   00:00    
COCO_val2014_000000000474_rendered.jpg        100%  174KB  43.4MB/s   00:00    
COCO_val2014_000000000192_rendered.jpg        100%  308KB  44.3MB/s   00:00    
COCO_val2014_000000000536_rendered.jpg        100%   76KB  33.0MB/s   00:00    
COCO_val2014_000000000357_rendered.jpg        100%  127KB  37.8MB/s   00:00    
COCO_val2014_000000000428_rendered.jpg        100%  138KB  32.9MB/s   00:00    
COCO_val2014_000000000589_rendered.jpg        100%  208KB  35.2MB/s   00:00    
COCO_val2014_000000000241_rendered.jpg        100%  241KB  31.6MB/s   00:00    
COCO_val2014_000000000623_rendered.jpg        100%  166KB  39.9MB/s   00:00    
COCO_val2014_000000000360_rendered.jpg        100%  150KB  31.2MB/s   00:00    
COCO_val2014_000000000488_rendered.jpg        100%  224KB  36.0MB/s   00:00    
COCO_val2014_000000000257_rendered.jpg        100%  279KB  36.4MB/s   00:00    

OpenPoseで処理した画像を1枚表示させてみます。

In [31]:
Image(filename='openpose_result/result/COCO_val2014_000000000192_rendered.jpg')
Out[31]:

処理結果のリンクから他の処理結果の画像を確認することもできます。


このステップのJupyterNotebookでの実行の様子


サンプルの動画を処理する

処理前の動画を確認します。

OpenPoseのサンプル動画を処理してみます。

処理には30秒程度かかります。

In [32]:
!ssh root@{ip_address} 'docker exec -t openpose \
    build/examples/openpose/openpose.bin --display 0 \
    --video /root/openpose/examples/media/video.avi --write_video /root/result/result.avi'
Starting OpenPose demo...
Configuring OpenPose...
Starting thread(s)...
Auto-detecting all available GPUs... Detected 1 GPU(s), using 1 of them starting at GPU 0.
OpenPose demo successfully finished. Total time: 24.153069 seconds.

処理結果のファイルを取得します。

In [33]:
!scp -r root@{ip_address}:openpose/result {result_dir}
COCO_val2014_000000000294_rendered.jpg        100%  165KB  38.6MB/s   00:00    
COCO_val2014_000000000395_rendered.jpg        100%  315KB  43.8MB/s   00:00    
COCO_val2014_000000000338_rendered.jpg        100%  154KB  38.1MB/s   00:00    
result.avi                                    100%   17MB  46.1MB/s   00:00    
COCO_val2014_000000000569_rendered.jpg        100%  244KB  50.2MB/s   00:00    
COCO_val2014_000000000459_rendered.jpg        100%  247KB  47.7MB/s   00:00    
COCO_val2014_000000000328_rendered.jpg        100%  273KB  35.4MB/s   00:00    
COCO_val2014_000000000564_rendered.jpg        100%  234KB  40.9MB/s   00:00    
COCO_val2014_000000000544_rendered.jpg        100%  353KB  45.0MB/s   00:00    
COCO_val2014_000000000415_rendered.jpg        100%  166KB  38.9MB/s   00:00    
COCO_val2014_000000000474_rendered.jpg        100%  174KB  39.3MB/s   00:00    
COCO_val2014_000000000192_rendered.jpg        100%  308KB  39.8MB/s   00:00    
COCO_val2014_000000000536_rendered.jpg        100%   76KB  39.3MB/s   00:00    
COCO_val2014_000000000357_rendered.jpg        100%  127KB  35.1MB/s   00:00    
COCO_val2014_000000000428_rendered.jpg        100%  138KB  18.0MB/s   00:00    
COCO_val2014_000000000589_rendered.jpg        100%  208KB  39.5MB/s   00:00    
COCO_val2014_000000000241_rendered.jpg        100%  241KB  40.7MB/s   00:00    
COCO_val2014_000000000623_rendered.jpg        100%  166KB  43.7MB/s   00:00    
COCO_val2014_000000000360_rendered.jpg        100%  150KB  42.9MB/s   00:00    
COCO_val2014_000000000488_rendered.jpg        100%  224KB  41.1MB/s   00:00    
COCO_val2014_000000000257_rendered.jpg        100%  279KB  41.5MB/s   00:00    

処理後の動画を確認します。


このステップのJupyterNotebookでの実行の様子


GrafanaでVCノードの利用状況を確認する

GrafanaでVCノードの利用状況を確認してみます。

ログインするためのユーザ、パスワードは admin/admin です。


このステップのJupyterNotebookでの実行の様子


インターネット上の画像を処理する

インターネット上の画像を処理してみます。

処理対象となる画像の URL のリストを設定してください。

In [34]:
image_urls = [
# (例)
#    'http://www.example.com/sample.jpg',
]

処理対象の画像ファイルをOpenPoseコンテナに配置します。

In [35]:
for url in image_urls:
    !ssh root@{ip_address} 'cd openpose/data && curl -O {url}'

OpenPoseの処理を実行します。

In [36]:
if len(image_urls) > 0:
    !ssh root@{ip_address} 'docker exec -t openpose \
        build/examples/openpose/openpose.bin --display 0 \
        --image_dir /root/data/ --write_images /root/result2'

処理結果のファイルを取得します。

In [37]:
!scp -r root@{ip_address}:openpose/result2 {result_dir}

処理結果を確認します。

後始末

ビルドしたOpenPoseのイメージをプライベートレジストリに格納する場合は、次のセルのコメントを削除して実行してください。

完了するまで2分程度かかります。

In [38]:
# !ssh root@{ip_address} 'cd openpose && docker-compose push'

全てのリソースを削除します。

処理が完了するまで1分~2分程度かかります。

In [39]:
unit_group.cleanup()
2020-11-11 15:04:56,243 - INFO - gpu is DELETING ... 0 sec
2020-11-11 15:05:01,356 - INFO - gpu is DELETING ... 5 sec
2020-11-11 15:05:06,478 - INFO - gpu is DELETING ... 10 sec
2020-11-11 15:05:11,592 - INFO - gpu is DELETING ... 15 sec
2020-11-11 15:05:16,707 - INFO - gpu is DELETING ... 20 sec
2020-11-11 15:05:21,823 - INFO - gpu is DELETING ... 25 sec
2020-11-11 15:05:26,940 - INFO - gpu is DELETING ... 30 sec
2020-11-11 15:05:32,053 - INFO - gpu is DELETING ... 35 sec
2020-11-11 15:05:37,170 - INFO - gpu is DELETING ... 40 sec
2020-11-11 15:05:42,286 - INFO - gpu is DELETING ... 45 sec
2020-11-11 15:05:47,416 - INFO - gpu is DELETING ... 50 sec
2020-11-11 15:05:52,536 - INFO - gpu is DELETING ... 55 sec
2020-11-11 15:05:57,654 - INFO - gpu is DELETING ... 60 sec
2020-11-11 15:06:02,773 - INFO - gpu is DELETING ... 65 sec
2020-11-11 15:06:07,892 - INFO - gpu is DELETING ... 70 sec
2020-11-11 15:06:13,013 - INFO - gpu is DELETING ... 75 sec
2020-11-11 15:06:18,130 - INFO - gpu is DELETING ... 80 sec
2020-11-11 15:06:23,249 - INFO - gpu is DELETING ... 85 sec
2020-11-11 15:06:28,365 - INFO - gpu is DELETING ... 90 sec
2020-11-11 15:06:33,484 - INFO - gpu is DELETING ... 95 sec
2020-11-11 15:06:38,602 - INFO - gpu is DELETING ... 100 sec
2020-11-11 15:06:43,719 - INFO - gpu is DELETING ... 105 sec
2020-11-11 15:06:48,838 - INFO - gpu is DELETING ... 110 sec
2020-11-11 15:06:53,955 - INFO - gpu is DELETING ... 115 sec
2020-11-11 15:06:59,076 - INFO - gpu is DELETING ... 120 sec
2020-11-11 15:07:04,193 - INFO - gpu is DELETING ... 125 sec
2020-11-11 15:07:09,312 - INFO - gpu is DELETING ... 130 sec
2020-11-11 15:07:14,428 - INFO - gpu is DELETING ... 135 sec
2020-11-11 15:07:19,552 - INFO - gpu is DELETING ... 140 sec
2020-11-11 15:07:24,670 - INFO - gpu is DELETING ... 145 sec
2020-11-11 15:07:29,792 - INFO - gpu is DELETING ... 150 sec
2020-11-11 15:07:34,908 - INFO - gpu is DELETING ... 155 sec
2020-11-11 15:07:40,024 - INFO - gpu is DELETING ... 160 sec
2020-11-11 15:07:45,146 - INFO - gpu is DELETING ... 165 sec
2020-11-11 15:07:50,260 - INFO - gpu is DELETING ... 170 sec
2020-11-11 15:07:55,376 - INFO - gpu is DELETING ... 175 sec
2020-11-11 15:08:00,493 - INFO - gpu is DELETING ... 180 sec
2020-11-11 15:08:05,616 - INFO - gpu is DELETING ... 185 sec
2020-11-11 15:08:10,740 - INFO - gpu is DELETING ... 190 sec
2020-11-11 15:08:15,859 - INFO - gpu is DELETING ... 195 sec
2020-11-11 15:08:20,975 - INFO - gpu is DELETING ... 200 sec
2020-11-11 15:08:26,097 - INFO - gpu is DELETING ... 205 sec
2020-11-11 15:08:31,218 - INFO - gpu is DELETING ... 210 sec
2020-11-11 15:08:36,337 - INFO - gpu is DELETING ... 215 sec
2020-11-11 15:08:41,456 - INFO - gpu is DELETING ... 220 sec
2020-11-11 15:08:46,578 - INFO - gpu is DELETING ... 225 sec
2020-11-11 15:08:51,702 - INFO - gpu is DELETING ... 230 sec
2020-11-11 15:08:56,817 - INFO - gpu is DELETING ... 235 sec
2020-11-11 15:09:01,943 - INFO - gpu is DELETING ... 240 sec
2020-11-11 15:09:07,068 - INFO - gpu is DELETING ... 245 sec
2020-11-11 15:09:12,190 - INFO - gpu is DELETING ... 250 sec
2020-11-11 15:09:17,307 - INFO - gpu is DELETING ... 255 sec
2020-11-11 15:09:22,427 - INFO - gpu is DELETING ... 260 sec
2020-11-11 15:09:27,544 - INFO - gpu is DELETING ... 265 sec
2020-11-11 15:09:32,661 - INFO - gpu is DELETING ... 270 sec
2020-11-11 15:09:37,783 - INFO - gpu is DELETING ... 275 sec
2020-11-11 15:09:42,904 - INFO - gpu is DELETING ... 280 sec
2020-11-11 15:09:48,023 - INFO - gpu is DELETING ... 285 sec
2020-11-11 15:09:53,137 - INFO - gpu is DELETING ... 290 sec
2020-11-11 15:09:58,257 - INFO - gpu is DELETING ... 295 sec
2020-11-11 15:10:03,376 - INFO - gpu is DELETING ... 300 sec
2020-11-11 15:10:08,499 - INFO - gpu is DELETING ... 305 sec
2020-11-11 15:10:13,620 - INFO - gpu is DELETING ... 310 sec
2020-11-11 15:10:18,743 - INFO - gpu is DELETING ... 315 sec
2020-11-11 15:10:23,860 - INFO - gpu is DELETING ... 320 sec
2020-11-11 15:10:28,978 - INFO - gpu is DELETING ... 325 sec
2020-11-11 15:10:34,099 - INFO - gpu is DELETING ... 330 sec
2020-11-11 15:10:39,213 - INFO - gpu is DELETING ... 335 sec
2020-11-11 15:10:44,330 - INFO - gpu is DELETING ... 340 sec
2020-11-11 15:10:49,450 - INFO - gpu is DELETING ... 345 sec
2020-11-11 15:10:54,569 - INFO - gpu is DELETING ... 350 sec
2020-11-11 15:10:59,691 - INFO - gpu is DELETING ... 355 sec
2020-11-11 15:11:04,810 - INFO - gpu is DELETING ... 360 sec
2020-11-11 15:11:09,931 - INFO - gpu is DELETING ... 365 sec
2020-11-11 15:11:15,051 - INFO - gpu is DELETING ... 370 sec
2020-11-11 15:11:20,170 - INFO - gpu is DELETING ... 375 sec
2020-11-11 15:11:25,232 - INFO - cleanup completed. vc  is cleanup(no unit)

ビルドのログがある場合は削除します。

In [40]:
if 'log_file' in locals():
    !rm -f {log_file[1]}

取得した画像ファイルなどを削除します。

In [41]:
!rm -rf {result_dir}

このステップのJupyterNotebookでの実行の様子

※ リソース削除のセルの実行は時間がかかるため、この動画では編集し短くしています