自分のキャリアをあれこれ考えながら、Pythonで様々なデータを分析していくブログです

Google ColabのGPU環境でGPU版torchとGPU版mxnetの動作確認をしてみた。

Python
Python

本記事では、今後ディープラーニング系のライブラリを使っていこうと思っている中でGPUを使える環境を準備したかったので、Google ColaboratoryのGPU環境の確認とGPU版のtorchとmxnetというライブラリを使ってみた結果をまとめたものです。

22年8月現在、Colabで実行すれば同じ結果になると思いますが、インストールパッケージなどが更新された場合はその時の環境やバージョンに習って修正や確認をお願いいたします。

また、基本的にNVIDIA社のGPUを搭載しているマシンや環境であることを前提としています。

そもそもGoogle Colaboratoryとは何?という方は以前記事にしておりますので、下記をご確認ください。

Google Colaboratoryについて調べてみた
今回はウェブ上で分析作業が出来てしまうGoogle社のColaboratoryというサービスを見てみます。Colab(正式名称「Colaboratory」)では、ブラウザ上で Python を記述、実行できます。以下の機能を使用できます。・...

torchはオープンソースの機械学習ライブラリで、mxnetは深層学習用ライブラリのようです。

GPU版の場合、torch+cu110 や mxnet+cu110 など cu+CUDAのバージョンが付属していることが多いです。

CPU版の場合は、torch+cpu や mxnet など +cpuがついたりライブラリ名以外何もついていないことが多いです。

torchやmxnetに限らず、インストール方法を確認してGPUかCPUどちらのライブラリをインストールすべきか確認が必要なようです。

NVIDIA社のGPUを搭載しているマシンがあることを前提とすると、本来GPU搭載のPCやサーバーを購入した後にはNVIDIAのドライバーのインストール、CUDAのインストール、(コンテナ使う場合は) nvidia-dockerのインストールなど実施する必要がありますが、Colabでランタイムを接続した際にはすでにドライバーやCUDAはインストール済みでしたので、GPUを使って演算処理をする環境は整っているようです。

> 22/11/25追記
nvidia-smiのCUDAのバージョンとnvccのCUDAのバージョンが異なっていても問題ないことを追加

> 22/11/26追記
NVIDIAデータセンターGPUの前方互換についてとNVIDIAの後方互換について追加

スポンサーリンク

ColabでGPUを使うように設定する

上部のメニューバーより、「ランタイム」→ 「ランタイムのタイプの変更」→ ハードウェアアクセラレーターを「GPU」を選択するとGPUを使うことが出来るようになります。

スポンサーリンク

GPU関連の情報を確認する

# https://developer.nvidia.com/nvidia-system-management-interface
# GPU関連の情報を確認する (ちなみにNVIDIA System Management Interfaceの略のようです。)
# 他の例: nvidia-smi --query-gpu=timestamp,name,temperature.gpu,utilization.gpu,memory.total,memory.free,memory.used --format=csv -l 1
!nvidia-smi
Out[0]
Sat Aug 13 05:49:17 2022       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.32.03    Driver Version: 460.32.03    CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
| 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  Tesla T4            Off  | 00000000:00:04.0 Off |                    0 |
| N/A   34C    P8     9W /  70W |      0MiB / 15109MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

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

Colabで割り当てられているGPUはTesla T4という名称のデバイスのようです。

Driverのバージョンは460.32.03で、CUDAは11.2までがサポートされているようです。

ただし、TeslaT4H100などのNvidia Datacenter GPUは前方互換があるので通常のドライバーバージョンだと11.2までがサポートされているようですが、新しい11.3以降も使えるようです。

Forward Compatibility is applicable only for systems with NVIDIA Data Center GPUs or select NGC Server Ready SKUs of RTX cards.
引用: https://docs.nvidia.com/deploy/cuda-compatibility/index.html#forward-compatible-upgrade

GPUを使った処理をすると下部のNo running processes foundのところにGPU利用中のプロセスが表示されます。

ちなみにNvidia Driverは後方互換があるので、古いCUDAのバージョンは気にせず使えるようです

Drivers have always been backwards compatible with CUDA
引用: https://docs.nvidia.com/deploy/cuda-compatibility/index.html#faq

スポンサーリンク

NVIDIAドライバーとは

What are NVIDIA Drivers?
A driver is a software that enables the operating system to communicate with hardware or a device. Thus, for an NVIDIA graphics driver, it allows the OS to communicate with the video card, ensuring that it functions properly.
引用: https://www.driversupport.com/knowledge-article/how-do-i-update-my-nvidia-geforce-graphics-driver/

ドライバーとはOSとハードウェアやデバイスをやり取り可能にさせるソフトウェアのことのようです。NVIDIAグラフィックドライバーとはOSとNVIDIAのグラフィックカード(=~GPU)をやり取りさせるソフトウェアのことと言えそうです。

スポンサーリンク

CUDAとは

CUDAとはNVIDIA社が開発・提供しているGPU向けの並立コンピューティングプラットフォームです。CUDAを使うとこれらのグラフィック以外の用途でGPUを使った負荷分散のシステムを開発することができるようになります。
引用: https://techacademy.jp/magazine/48099

GPUで行列計算をさせたいという場合はCUDAを利用してGPUで素早く演算できるようになるんですね。

CUDAのインストールには最低限必要なドライバーのバージョンがあるようです。

NVIDIAの公式ページにまとめがありました。

引用: https://docs.nvidia.com/deploy/cuda-compatibility/index.html#minor-version-compatibility

ColabのインストールされているNVIDIAのバージョンは460.32.03で、CUDA10もCUDA11も使用は問題なさそうです。

スポンサーリンク

Colab環境の情報確認

# OSの確認
!cat /etc/os-release
Out[0]
NAME="Ubuntu"
VERSION="18.04.6 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.6 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

OSはUbuntu 18.04のようです。

# CUDAのバージョンの確認
!nvcc --version
Out[0]
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2020 NVIDIA Corporation
Built on Mon_Oct_12_20:09:46_PDT_2020
Cuda compilation tools, release 11.1, V11.1.105
Build cuda_11.1.TC455_06.29190527_0

CUDA11.1のようです。


> 22/11/25 追記
nvidia-smiのcuda(ver11.2)とnvccのcuda(ver11.1)のバージョンが違いますが問題ないようです。driver APIとruntime APIの差のようです。

The necessary support for the driver API (e.g. libcuda.so on linux) is installed by the GPU driver installer.
The necessary support for the runtime API (e.g. libcudart.so on linux, and also nvcc) is installed by the CUDA toolkit installer
引用: https://stackoverflow.com/questions/53422407/different-cuda-versions-shown-by-nvcc-and-nvidia-smi


# PATHの確認
!echo "$PATH"
!echo "$LD_LIBRARY_PATH"
Out[0]
/opt/bin:/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/tools/node/bin:/tools/google-cloud-sdk/bin
/usr/lib64-nvidia

/usr/local/nvidia/bin:/usr/local/cuda/bin ここらへんがGPU関連のパスでしょうか

# インストール済みのcudaのバージョンを確認
!ls -la /usr/local/ | grep cuda
Out[0]
lrwxrwxrwx  1 root root   22 Aug  3 20:13 cuda -> /etc/alternatives/cuda
drwxr-xr-x 16 root root 4096 Aug  3 19:56 cuda-10.0
drwxr-xr-x 15 root root 4096 Aug  3 19:59 cuda-10.1
lrwxrwxrwx  1 root root   25 Aug  3 20:13 cuda-11 -> /etc/alternatives/cuda-11
drwxr-xr-x 15 root root 4096 Aug  3 20:02 cuda-11.0
drwxr-xr-x  1 root root 4096 Aug  3 20:12 cuda-11.1

CUDA10.0, CUDA10.1, CUDA11.0, CUDA11.1がインストール済みのようです。

# /etc/alternatives/cudaの確認
!ls -la /etc/alternatives/cuda
Out[0]
lrwxrwxrwx 1 root root 20 Aug  3 20:13 /etc/alternatives/cuda -> /usr/local/cuda-11.1

/etc/alternatives/cudaは/usr/local/cuda-11.1を指しているようです。

スポンサーリンク

(オプション) 異なるバージョンのCUDAをインストールする方法

# CUDA11.3のインストール
# https://developer.nvidia.com/cuda-11.3.0-download-archive?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=18.04&target_type=deb_local
!wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda-repo-ubuntu1804-11-3-local_11.3.0-465.19.01-1_amd64.deb
!dpkg -i cuda-repo-ubuntu1804-11-3-local_11.3.0-465.19.01-1_amd64.deb
!apt-key add /var/cuda-repo-ubuntu1804-11-3-local/7fa2af80.pub
!apt-get update
!apt-get -y install cuda-11-3

# CUDA11.3をPathに追加する
# 参考: https://qiita.com/ysit/items/a601cb59523cc1961556
import os
p = os.getenv('PATH')
ld = os.getenv('LD_LIBRARY_PATH')
os.environ['PATH'] = f"/usr/local/cuda-11.3/bin:{p}"
os.environ['LD_LIBRARY_PATH'] = f"/usr/local/cuda-11.3/lib64:{ld}"

他にもCUDA compat packageを使う下記の方法が使えるかも知れません (正攻法?)。時間があるときに試してみます。

# 参考: https://docs.nvidia.com/deploy/cuda-compatibility/index.html#installing-title
apt-get install -y cuda-compat-11-3
D_LIBRARY_PATH=/usr/local/cuda/compat:$LD_LIBRARY_PATH samples/bin/x86_64/linux/release/deviceQuery
スポンサーリンク

mxnet-cu112とmxnet-cu101の動作確認

mxnet-cu112の動作確認

CUDA11.2はインストールしていないが動作するのかを確認

# mxnet-cu112のインストール
!python3 -m pip install mxnet-cu112
Out[0]
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Collecting mxnet-cu112
  Downloading mxnet_cu112-1.9.1-py3-none-manylinux2014_x86_64.whl (499.4 MB)
     |████████████████████████████████| 499.4 MB 1.8 kB/s 
Requirement already satisfied: requests<3,>=2.20.0 in /usr/local/lib/python3.7/dist-packages (from mxnet-cu112) (2.23.0)
Requirement already satisfied: numpy<2.0.0,>1.16.0 in /usr/local/lib/python3.7/dist-packages (from mxnet-cu112) (1.21.6)
Collecting graphviz<0.9.0,>=0.8.1
  Downloading graphviz-0.8.4-py2.py3-none-any.whl (16 kB)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.20.0->mxnet-cu112) (2022.6.15)
Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.20.0->mxnet-cu112) (2.10)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.20.0->mxnet-cu112) (1.24.3)
Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.20.0->mxnet-cu112) (3.0.4)
Installing collected packages: graphviz, mxnet-cu112
  Attempting uninstall: graphviz
    Found existing installation: graphviz 0.10.1
    Uninstalling graphviz-0.10.1:
      Successfully uninstalled graphviz-0.10.1
Successfully installed graphviz-0.8.4 mxnet-cu112-1.9.1

インストールはできたようです。

# mxnet-cu112が動作するか確認
# https://mxnet.apache.org/versions/1.7/api/python/docs/tutorials/getting-started/crash-course/6-use_gpus.html

from mxnet import nd, gpu, gluon, autograd
from mxnet.gluon import nn
from mxnet.gluon.data.vision import datasets, transforms
import time

x = nd.ones((3,4), ctx=gpu())
x
Out[0]
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
 in ()
      2 # https://mxnet.apache.org/versions/1.7/api/python/docs/tutorials/getting-started/crash-course/6-use_gpus.html
      3 
----> 4 from mxnet import nd, gpu, gluon, autograd
      5 from mxnet.gluon import nn
      6 from mxnet.gluon.data.vision import datasets, transforms

/usr/local/lib/python3.7/dist-packages/mxnet/__init__.py in ()
     21 """MXNet: a concise, fast and flexible framework for deep learning."""
     22 
---> 23 from .context import Context, current_context, cpu, gpu, cpu_pinned
     24 from . import engine, error
     25 from .base import MXNetError

/usr/local/lib/python3.7/dist-packages/mxnet/context.py in ()
     21 import warnings
     22 import ctypes
---> 23 from .base import classproperty, with_metaclass, _MXClassPropertyMetaClass
     24 from .base import _LIB
     25 from .base import check_call

/usr/local/lib/python3.7/dist-packages/mxnet/base.py in ()
    354 __version__ = libinfo.__version__
    355 # library instance of mxnet
--> 356 _LIB = _load_lib()
    357 
    358 # type definitions

/usr/local/lib/python3.7/dist-packages/mxnet/base.py in _load_lib()
    345         lib = ctypes.CDLL(lib_path[0], winmode=0x00000008)
    346     else:
--> 347         lib = ctypes.CDLL(lib_path[0], ctypes.RTLD_LOCAL)
    348     # DMatrix functions
    349     lib.MXGetLastError.restype = ctypes.c_char_p

/usr/lib/python3.7/ctypes/__init__.py in __init__(self, name, mode, handle, use_errno, use_last_error)
    362 
    363         if handle is None:
--> 364             self._handle = _dlopen(self._name, mode)
    365         else:
    366             self._handle = handle

OSError: libnvrtc.so.11.2: cannot open shared object file: No such file or directory

libnvrtc.so.11.2が見つからないというエラーが出てしまいました。CUDA11.2をインストールしていないことが影響していると思われます。

# libnvrtcを探す
!find /usr -type f -name "libnvrtc*"
Out[0]
/usr/local/lib/python3.7/dist-packages/torch/lib/libnvrtc-1ea278b5.so.11.2
/usr/local/lib/python3.7/dist-packages/torch/lib/libnvrtc-builtins.so.11.3
/usr/local/cuda-11.0/targets/x86_64-linux/lib/libnvrtc-builtins.so.11.0.221
/usr/local/cuda-11.0/targets/x86_64-linux/lib/libnvrtc.so.11.0.221
/usr/local/cuda-11.0/targets/x86_64-linux/lib/stubs/libnvrtc.so
/usr/local/cuda-10.0/targets/x86_64-linux/lib/libnvrtc-builtins.so.10.0.130
/usr/local/cuda-10.0/targets/x86_64-linux/lib/libnvrtc.so.10.0.130
/usr/local/cuda-10.0/targets/x86_64-linux/lib/stubs/libnvrtc.so
/usr/local/cuda-10.1/targets/x86_64-linux/lib/libnvrtc.so.10.1.243
/usr/local/cuda-10.1/targets/x86_64-linux/lib/stubs/libnvrtc.so
/usr/local/cuda-10.1/targets/x86_64-linux/lib/libnvrtc-builtins.so.10.1.243
/usr/local/cuda-11.1/targets/x86_64-linux/lib/stubs/libnvrtc.so
/usr/local/cuda-11.1/targets/x86_64-linux/lib/libnvrtc-builtins.so.11.1.105
/usr/local/cuda-11.1/targets/x86_64-linux/lib/libnvrtc.so.11.1.105

やはりlibnvrtc.soはCUDAのバージョン毎に存在するファイルのようです。解決するにはCUDA11.2が必要だと思われますが今回はお試しだったので、CUDA11.2はインストールせずインストール済みのCUDA10.1のmxnet-cu101が動作するか試してみようと思います。

mxnet-cu101の動作確認

# mxnet-cu112のアンインストールとmxnet-cu101のインストール
!python3 -m pip uninstall mxnet-cu112 -y
!python3 -m pip install mxnet-cu101 
Out[0]
・・・省略・・・
Successfully installed graphviz-0.8.4 mxnet-cu101-1.9.1
# mxnet-cu101が使えるかどうか確認
# https://mxnet.apache.org/versions/1.7/api/python/docs/tutorials/getting-started/crash-course/6-use_gpus.html

from mxnet import nd, gpu, gluon, autograd
from mxnet.gluon import nn
from mxnet.gluon.data.vision import datasets, transforms
import time

x = nd.ones((3,4), ctx=gpu())
x
Out[0]
[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]

無事動作しました!

スポンサーリンク

torch1.12.0+cu113と1.10.0+cu102の動作確認

# インストール済みのtorchのバージョンを確認
!pip freeze | grep torch
Out[0]

torch @ https://download.pytorch.org/whl/cu113/torch-1.12.1%2Bcu113-cp37-cp37m-linux_x86_64.whl
torchaudio @ https://download.pytorch.org/whl/cu113/torchaudio-0.12.1%2Bcu113-cp37-cp37m-linux_x86_64.whl
torchsummary==1.5.1
torchtext==0.13.1
torchvision @ https://download.pytorch.org/whl/cu113/torchvision-0.13.1%2Bcu113-cp37-cp37m-linux_x86_64.whl

torchはすでにtorch1.12.0+cu113がインストールされていたので、これで動作確認を進めてみようと思います。
CUDA11.3はインストールしていないのですが動作するのでしょうか?

# もしtorch1.12.0+cu113がインストールされていない場合は下記でインストール出来ます。
!python3 -m pip install torch==1.12.0+cu113 torchvision==0.13.0+cu113 torchtext==0.13.0 --extra-index-url https://download.pytorch.org/whl/cu113

torch1.12.0+cu113の動作確認

import torch
x = torch.rand(5, 3)
print(x)
Out[0]
tensor([[0.7764, 0.4614, 0.1315],
        [0.4351, 0.2581, 0.8506],
        [0.3848, 0.9851, 0.9991],
        [0.8729, 0.9660, 0.4203],
        [0.7925, 0.7677, 0.8062]])

動作してしまいました。

CUDA11.3がインストールされていないのに、torch1.12.0+cu113がなぜ正常動作するのかなと思って少し調べたらstackoverflowに下記のようなコメントがありました。

If you installed pytorch through pip or conda then pytorch uses its own copy of the cuda library delivered with torch and never sees the system cuda (you don't need to have cuda installed on your system in this case)
引用:https://stackoverflow.com/questions/67568713/can-i-install-different-versions-of-cuda-toolkit-and-pytorch

なるほど、ソースからインストールしない限り問題ないのかな?

しかし、mxnet-cu112はCUDAのshared object file (libnvrtc.so.11.2)を見にいったがCUDA11.2をインストールしていなくてエラーになったので、利用するライブラリによるのかも知れません。対応するバージョンのCUDAをインストールしておいた方が無難なのかも知れません。

# GPUとCUDAが有効になっていて、torchからアクセス出来るかどうか確認
print(torch.cuda.is_available())

# torchのCUDAバージョン確認
print(torch.version.cuda)

# torchのバージョン確認
print(torch.__version__)
Out[0]
True
'11.3'
1.12.0+cu113

torch1.10.0+cu102の動作確認

# torch1.10.0+cu102のインストール
!python3 -m pip uninstall torch torchvision torchaudio torchtext -y
!python3 -m pip install torch==1.10.0+cu102 torchvision==0.11.0+cu102 torchaudio==0.10.0 -f https://download.pytorch.org/whl/torch_stable.html
Out[0]
・・・省略・・・
Installing collected packages: torch, torchvision, torchaudio
Successfully installed torch-1.10.0+cu102 torchaudio-0.10.0+rocm4.1 torchvision-0.11.0+cu102
import torch
x = torch.rand(5, 3)
print(x)
Out[0]
tensor([[0.8345, 0.5335, 0.4301],
        [0.9470, 0.7598, 0.0373],
        [0.7464, 0.9056, 0.1449],
        [0.2772, 0.9947, 0.8339],
        [0.6411, 0.1079, 0.5263]])

CUDA10.2もインストールしていませんが、利用することが出来ました。

print(torch.version.cuda)
print(torch.__version__)
Out[0]
10.2
1.10.0+cu102
スポンサーリンク

まとめ

Google ColaboratoryでGPU環境を試してみました。

torchもmxnetも正常に動作するところまで確認しました。

torchはpipからインストールするとCUDAのライブラリが含まれているらしくサーバー側にCUDAがインストールされていなくても動作することが分かりました。一方でmxnetはpipからインストールしたとしても、対象のCUDAのバージョンがインストールされていないとlibnvrtc.soが参照できないので利用できないことが分かりました。

可能であればインストールするライブラリで利用しているCUDAのバージョンとインストールされているCUDAのバージョンが合致していることが望ましいのではないかという結論に至りました。

スポンサーリンク

参考

https://docs.nvidia.com/datacenter/tesla/drivers/index.html

タイトルとURLをコピーしました