1. 株式会社PALTEK
  2. TECHブログ
  3. 製品情報
  4. 業界最安値のGPUaaS「GPUSOROBAN」を実際に試してみた(2)~Dockerコンテナを使用し機械学習プロト環境を作る~【環境構築その1】

TECHブログ

業界最安値のGPUaaS「GPUSOROBAN」を実際に試してみた(2)~Dockerコンテナを使用し機械学習プロト環境を作る~【環境構築その1】

GPU
業界最安値のGPUaaS「GPUSOROBAN」を実際に試してみた(2)~Dockerコンテナを使用し機械学習プロト環境を作る~【環境構築その1】

皆さん、こんにちは。

本ブログは最新のGPUが使える上に、とても安いと噂の「GPUSOROBAN」がどんな感じのものなのか、Dockerコンテナを使用し機械学習プロト環境を作成し、最終的にはオンプレ環境とクラウド環境でリアルタイムに顔検出を行う工程を実際に試してみたブログです。

前回は、イントロ回として実際に作成するシステムの構成について紹介しました。
今回は環境構築について紹介します。少々長くなるので、環境構築を2回に分けて記載します。
今回は1回目として、以下の工程を進めます。
・使用する機材の説明
・使用するソフトウェア環境に関する説明
・本シリーズ共通の環境変数の定義
・オンプレのPCにCUDAをインストール

それでは始めましょう。

目次

使用機材

本ブログに記載するにあたり使用した機材です。

表1-1 使用機材

  No. 呼び名 機材 必要条件
No.1 1

ホストPC

PC(ubuntu 18.04.6)

必須。

No.2 2

コンテナ

Dockerのコンテナ

Dockerを使用する場合。

No.3 3

GPU

CUDAに対応したGPU

オンプレの推論にGPU
を使用する場合。
使用しない場合は
CPUで可。

No.4 4

RasPI

Raspbeerry PI 4

外部機器から映像を
取得する場合。
ない場合はPCで代用、
または
ファイル入力で可。

No.5 5

カメラ

MIPI、
またはUSBカメラ

カメラを使用する場合。
ない場合はファイル
から入力可。

No.6 6

インスタンス

GPUSOROBAN
ベアメタルインスタンス

クラウドのGPUを
使用する場合。
オンプレのみでも可。

本ブログでは各機材を表3-1の呼び名で記述します。

ソフトウェア環境

OSは(https://releases.ubuntu.com/18.04/)からダウンロードしたubuntu-18.04.6-desktop-amd64.isoをインストールしている状態から始めます。
インストール中の設定は、以下の項目以外はデフォルトで進めました。

・言語選択:日本語
・ユーザアカウント名:kirin
・コンピュータの名前:xeon-e3

できるだけ環境構築の時期によるバージョンの不整合の発生を防ぐため、このシリーズではOSのインストール後にapt upgrageは行いません。

以下の理由でubuntuのバージョンを18.04.6にしました。
・今ある資産が18.04のものが多い
・私の周りのFPGAのAI開発環境も18.04が多く使われている
・18.04のリリースから4年以上経過しているので今後のアップデートは少なそう(現状から変化しない)
・サポート期限が2023年4月まで延長された

サイト ubuntu wiki
タイトル release
URL https://wiki.ubuntu.com/Releases
コラム

ubuntu 18.04のインストール後、
画面が表示されない

GTX 1650を挿したホストPCにubuntuのインストールを完了して、再起動した際にGUIのログイン画面が表示されない現象にあいました。GTX 745では起こりませんでした。
この時の対処方のメモです。

OS自体は起動しているようだったので、以下の方法で回避しました。
・CTRL+ALT+F2でCUIのログインのターミナルに切り替える
・/etc/gdm3/custom.confを編集してWaylandを無効にする

custom.conは
#WaylandEnable=false
のコメントアウトを外して
WaylandEnable=false
にします。再起動後から表示されるようになりました。

本シリーズでは、dockerを使用しますが、dockerを使用しなくても同じ手順で試しやすいように、Dockerfileを使用せず、コマンドベースでソフトウェアのインストールや環境の設定を行います。ただし、Dcokerコンテナにはrootでログインしているケースがあるので、必要に応じてsudoを付与します。

作成するdockerコンテナはオンプレ、クラウド共通で使えるように設計します。
本ブログでは、Anacondaは使用しません。

表1-2 使用する主なソフトウェアのバージョン

  No. ソフトウェア バージョン
No.1 1

OS

Ubuntu Desktop
18.04.6 LTS 64bit

No.2 2

Docker

20.10.17,
build 100c701

No.3 3

Python

3.6.9

No.4 4

OpenCV

4.5.5

No.5 5

CUDA

release 11.4,
V11.4.48

環境変数

本ブログのシリーズで共通に使用するホストPCの環境変数です。GPU、クラウドの使用の有無に関わらず共通に使用します。環境による違いの多くを吸収することも担います。この定義はホストPCとインスタンスに設定します。コンテナには設定しません。GPUSOROBANを使用しない場合は共通環境変数のみを設定します。

表1-3 共通環境変数

  No. 変数名 説明
No.1 1

WORK_DIR

作業ディレクトリ

No.2 2

USER_NAME

ホストPC、及び
コンテナで
使用する
ユーザID

No.3 3

GROUP_NAME

上記のグループ

No.4 4

HOST_IP

ホストPCの
IPアドレス

No.5 5

DISPLAY

X11のウィンドウ
を表示する端末

No.6 6

RASPI_IP

RasPIの
IPアドレス

No.7 7

RASPI_PORT

RasPIの
映像送信ポート


表1-4 クラウド用環境変数

  No. 変数名 説明
No.1 1

HOME_GLOBAL_IP

自宅のグローバル
IPアドレス

No.2 2

BARE_ADR

インスタンスの
IPアドレス

No.3 3

BARE_USER

インスタンスの
ユーザID

No.4 4

BARE_GROUP

上記のグループ

No.5 5

ACCESS_ADR

アクセスサーバ
(踏み台)の
IPアドレス

No.6 6

CONNECT_PORT

アクセスサーバ
(踏み台)の
sshポート

No.7 7

SSH_PORT

インスタンスの
sshポート

No.8 8

KEY_ACCESS

アクセスサーバ
(踏み台)の
秘密鍵ファイル

No.9 9

KEY_PRIVATE

GPUSOROBANに
登録した
公開鍵とペアの
秘密鍵ファイル


私の環境では以下の設定をホストPCとインスタンスの~/.bashrcに追加しています。

左右にスクロールしてご覧ください
export WORK_DIR=/work
export USER_NAME=kirin
export GROUP_NAME=kirin
export HOST_IP=192.168.0.90
export DISPLAY=192.168.0.90:0
export RASPI_IP=192.168.0.143
export RASPI_PORT=40080
export REVISION=01-20220817a

# 以下はGPUクラウドを使用するための設定です。後で説明します。
export HOME_GLOBAL_IP=自宅のグローバルIPアドレス
export BARE_ADR=インスタンスのIPアドレス
export BARE_USER=インスタンスのユーザID
export BARE_GROUP=上記のグループ
export ACCESS_ADR=アクセスサーバ(踏み台)のIPアドレス
export CONNECT_PORT=アクセスサーバ(踏み台)のsshポート
export SSH_PORT=インスタンスのsshポート
export KEY_ACCESS=~/.ssh/sshkey-bare-20220711/ackey.txt
export KEY_PRIVATE=~/.ssh/sshkey-bare-20220711/id_rsa_soroban

CUDA環境構築

オンプレにCUDAが使える環境を作ります。
GPUを使用する際に必要になります。GPUを使用しない場合は本手順をスキップします。
私は、ubuntu 18.04がインストールされGTX 1650を搭載したホストPCで行いました。

まずは以下のnVidiaのWebサイトでCUDA toolkitをインストールするコマンドを調べます。

サイト nVidia DEVELOPER
タイトル The Developer Conference for the Era of AI and the Metaverse
URL https://developer.nvidia.com

以下の理由でCUDAのバージョンを11.4.0にしました。
・そこそこに新しい(それほど古くないし新しくもない)
・OS同様にFPGAのAI開発環境も18.04が多く使われている

この先の工程で知ることになったのですが、nVidiaの提示する手順でGPUSOROBANにCUDAをインストールすると11.4がインストールされるので、11.4より新しいバージョンが必要な場合はGPUSOROBANへのCUDAのインストール手順を別途用意する必要があります。

では、インストールをはじめます。nVidiaのWebサイトを開いたら上部の「DOWNLOAD」をクリックします。DOWNLOADとなっていますが、実際はwebからのダウンロードは行いません。進めていくとコマンドが提示され、それを実行することでダウンロード、インストールされるので以下のWebサイトでの操作はスキップして構いません。


次に少し下の方にスクロールして、左下にある「CUDA toolkit」をクリックします。


少し下の方の「DOWNLOAD NOW」をクリックします。


するとプラットフォームを選択する画面になりますが、バージョン11.4.0を使用するので
下の方の「Archive of Previous CUDA Releases」をクリックします。


過去にリリースされたバージョンの一覧が表示されるので、「CUDA Toolkit 11.4.0」をクリックします。


するとプラットフォームを選択する画面になります。


上から順に「Linux」、「x86_64」、「Ubuntu」、「18.04」、「deb [local]」を選択します。


「Base installer」にインストールするコマンドが表示されます。
ホストPCにログインしたターミナルからWebサイトに表示された以下のコマンドを実行してCUDAのドライバをインストールします。

左右にスクロールしてご覧ください
# 作業フォルダを作成します。
sudo mkdir -p $WORK_DIR/cuda
sudo chown $USER_NAME.$USER_NAME $WORK_DIR/cuda
cd $WORK_DIR/cuda

# Webサイトに表示されたコマンドを実行します。
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.4.0/local_installers/cuda-repo-ubuntu1804-11-4-local_11.4.0-470.42.01-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804-11-4-local_11.4.0-470.42.01-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu1804-11-4-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda
コラム

sudo apt-get -y install cudaで
依存関係のエラーが発生

以下のエラーが発生しました。
このときの対処方のメモです。

kirin@xeon-e3:/work/cuda$ sudo apt-get -y install cuda
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得ない状況を要求したか、
(不安定版ディストリビューションを使用しているのであれば)必要なパッケージがまだ作成されていないことやIncomingから移動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
cuda : 依存: cuda-11-6 (>= 11.6.2) しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。

OSのインストール直後に「ソフトウェアとアップデート」の設定ですべてのアップデートを無効にしたPCで発生しました。パッケージのリポジトリが更新されないことが原因のようてすが追究はしていません。デフォルトのままにすることで回避しました。

これでCUDAのインストールは完了ですが、nvidia-smiを実行すると以下のエラーになります。

左右にスクロールしてご覧ください
kirin@xeon-E3:~$ nvidia-smi
Failed to initialize NVML: Driver/library version mismatch

ロードされているカーネルモジュールを確認してみます。なんだか少ないです。

左右にスクロールしてご覧ください
kirin@xeon-e3:/work/cuda$ lsmod | grep nvidia
nvidia              35250176  1
drm                   491520  6 drm_kms_helper,nvidia,ttm,nouveau

ロードされているモジュールとカーネルが使用中のドライバのバージョンを見てみます。

左右にスクロールしてご覧ください
kirin@xeon-e3:/work/cuda$ modinfo nvidia | grep version
version:        470.42.01
srcversion:     00F9E8DEACC0FB98727C03C
vermagic:       5.4.0-124-generic SMP mod_unload modversions

kirin@xeon-e3:/work/cuda$ sudo cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  470.42.01  Tue Jun 15 21:26:37 UTC 2021
GCC version:  gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)

過去の経験ではいつもモジュールとカーネルドライバのバージョンが一致していなかったのですが今回は一致しています。
正しいドライバをロードさせるためにOSを再起動します。

左右にスクロールしてご覧ください
kirin@xeon-E3:~$ sudo reboot

再起動後、再度バージョンを確認します。

左右にスクロールしてご覧ください
kirin@xeon-e3:~$ lsmod | grep nvidia
nvidia_uvm            995328  0
nvidia_drm             57344  3
nvidia_modeset       1196032  7 nvidia_drm
nvidia              35250176  314 nvidia_uvm,nvidia_modeset
drm_kms_helper        188416  1 nvidia_drm
drm                   491520  7 drm_kms_helper,nvidia,nvidia_drm 
kirin@xeon-e3:~$ modinfo nvidia | grep version
version:        470.42.01
srcversion:     00F9E8DEACC0FB98727C03C
vermagic:       5.4.0-124-generic SMP mod_unload modversions 

kirin@xeon-e3:~$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  470.42.01  Tue Jun 15 21:26:37 UTC 2021
GCC version:  gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)

バージョンに変化はありませんが、ロードされているモジュールが増えました。
あらためてnvidia-smiを実行してみると無事実行できました。省略されていてGPUの型番は読み取れませんが認識されています。

左右にスクロールしてご覧ください
kirin@xeon-e3:~$ nvidia-smi
Mon Aug 15 18:14:17 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.42.01    Driver Version: 470.42.01    CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0 NVIDIA GeForce ...  On | 00000000:01:00.0  On |                  N/A |
| 46%   48C    P8    10W /  75W |    108MiB /  3909MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      1073      G   /usr/lib/xorg/Xorg                 57MiB |
|    0   N/A  N/A      1116      G   /usr/bin/gnome-shell               48MiB |
+-----------------------------------------------------------------------------+

~/.bashrcを編集してCUDAのパスを追加します。

左右にスクロールしてご覧ください
vi ~/.bashrc

~/.bashrcの末尾に以下のパス設定を追加します。

左右にスクロールしてご覧ください
# cuda
export PATH=/usr/local/cuda-11.4/bin/:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.4/lib64:$LD_LIBRARY_PATH

一旦shellを開きなおし、一通りバージョン等を確認しておきます。

左右にスクロールしてご覧ください
kirin@xeon-e3:~$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  470.42.01  Tue Jun 15 21:26:37 UTC 2021
GCC version:  gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)

kirin@xeon-e3:~$ lspci | grep -i nvidia
01:00.0 VGA compatible controller: NVIDIA Corporation Device 1f82 (rev a1)
01:00.1 Audio device: NVIDIA Corporation Device 10fa (rev a1)

kirin@xeon-e3:~$  cat /usr/local/cuda-11.4/version.json  | egrep "(CUDA SDK|CUDA NVCC)" -A1
      "name" : "CUDA SDK",
      "version" : "11.4.0"
--
      "name" : "CUDA NVCC",
      "version" : "11.4.48"

kirin@xeon-e3:~$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Wed_Jun__2_19:15:15_PDT_2021
Cuda compilation tools, release 11.4, V11.4.48
Build cuda_11.4.r11.4/compiler.30033411_0

動作確認のためにCUDAのサンプルをビルドします。

左右にスクロールしてご覧ください
sudo apt install git

cd $WORK_DIR/cuda/
git clone https://github.com/NVIDIA/cuda-samples.git -b v11.4 --depth 1
cd cuda-samples
time make -j8

サンプルを実行します。

左右にスクロールしてご覧ください
kirin@xeon-e3:/work/cuda/cuda-samples$ cd bin/x86_64/linux/release/
kirin@xeon-e3:/work/cuda/cuda-samples/bin/x86_64/linux/release$ ./deviceQuery
./deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "NVIDIA GeForce GTX 1650"
  CUDA Driver Version / Runtime Version          11.4 / 11.4
  CUDA Capability Major/Minor version number:    7.5
  Total amount of global memory:                 3909 MBytes (4099276800 bytes)
  (014) Multiprocessors, (064) CUDA Cores/MP:    896 CUDA Cores
  GPU Max Clock rate:                            1665 MHz (1.66 GHz)
  Memory Clock rate:                             4001 Mhz
  Memory Bus Width:                              128-bit
  L2 Cache Size:                                 1048576 bytes
  Maximum Texture Dimension Size (x,y,z)         1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
  Maximum Layered 1D Texture Size, (num) layers  1D=(32768), 2048 layers
  Maximum Layered 2D Texture Size, (num) layers  2D=(32768, 32768), 2048 layers
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total shared memory per multiprocessor:        65536 bytes
  Total number of registers available per block: 65536
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  1024
  Maximum number of threads per block:           1024
  Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
  Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and kernel execution:          Yes with 3 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Disabled
  Device supports Unified Addressing (UVA):      Yes
  Device supports Managed Memory:                Yes
  Device supports Compute Preemption:            Yes
  Supports Cooperative Kernel Launch:            Yes
  Supports MultiDevice Co-op Kernel Launch:      Yes
  Device PCI Domain ID / Bus ID / location ID:   0 / 1 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 11.4, CUDA Runtime Version = 11.4, NumDevs = 1
Result = PASS

最終行のResultがPASSになっていれば動作確認はOKです。
以上でホストPCへのCUDAのインストールは完了です。

おわりに

最後までご覧いただきありがとうございました!
次回もよろしくお願いします。


見積もり・無償評価などに関する
お問い合わせはこちら

このブログのシリーズ