本記事では、今後ディープラーニング系のライブラリを使っていこうと思っている中でGPUを使える環境を準備したかったので、Google ColaboratoryのGPU環境の確認とGPU版のtorchとmxnetというライブラリを使ってみた結果をまとめたものです。
22年8月現在、Colabで実行すれば同じ結果になると思いますが、インストールパッケージなどが更新された場合はその時の環境やバージョンに習って修正や確認をお願いいたします。
また、基本的にNVIDIA社のGPUを搭載しているマシンや環境であることを前提としています。
そもそもGoogle Colaboratoryとは何?という方は以前記事にしておりますので、下記をご確認ください。
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
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までがサポートされているようです。
ただし、TeslaT4やH100などの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
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
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"
/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
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
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
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
--------------------------------------------------------------------------- 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*"
/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
・・・省略・・・ 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
[[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
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)
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__)
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
・・・省略・・・ 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)
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__)
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