業界最安値の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 |
No.4 | 4 |
RasPI |
Raspbeerry PI 4 |
外部機器から映像を |
No.5 | 5 |
カメラ |
MIPI、 |
カメラを使用する場合。 |
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 |
No.2 | 2 |
Docker |
20.10.17, |
No.3 | 3 |
Python |
3.6.9 |
No.4 | 4 |
OpenCV |
4.5.5 |
No.5 | 5 |
CUDA |
release 11.4, |
環境変数
本ブログのシリーズで共通に使用するホストPCの環境変数です。GPU、クラウドの使用の有無に関わらず共通に使用します。環境による違いの多くを吸収することも担います。この定義はホストPCとインスタンスに設定します。コンテナには設定しません。GPUSOROBANを使用しない場合は共通環境変数のみを設定します。
表1-3 共通環境変数
No. | 変数名 | 説明 | |
---|---|---|---|
No.1 | 1 |
WORK_DIR |
作業ディレクトリ |
No.2 | 2 |
USER_NAME |
ホストPC、及び |
No.3 | 3 |
GROUP_NAME |
上記のグループ |
No.4 | 4 |
HOST_IP |
ホストPCの |
No.5 | 5 |
DISPLAY |
X11のウィンドウ |
No.6 | 6 |
RASPI_IP |
RasPIの |
No.7 | 7 |
RASPI_PORT |
RasPIの |
表1-4 クラウド用環境変数
No. | 変数名 | 説明 | |
---|---|---|---|
No.1 | 1 |
HOME_GLOBAL_IP |
自宅のグローバル |
No.2 | 2 |
BARE_ADR |
インスタンスの |
No.3 | 3 |
BARE_USER |
インスタンスの |
No.4 | 4 |
BARE_GROUP |
上記のグループ |
No.5 | 5 |
ACCESS_ADR |
アクセスサーバ |
No.6 | 6 |
CONNECT_PORT |
アクセスサーバ |
No.7 | 7 |
SSH_PORT |
インスタンスの |
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のインストールは完了です。
おわりに
最後までご覧いただきありがとうございました!
次回もよろしくお願いします。