
GPUは本来、画像処理を専門とするデバイスでしたが、現代では汎用的な計算に使用されることが一般的になっています。汎用計算に使用される事例の一つに、GPU向け汎用配列計算ライブラリのCuPyがあります。
このCuPyはNumPy互換のインターフェースを持ち、行列演算をGPUで計算できるという特徴を持っています。
CuPyはこれまではNVIDIA社が開発・提供しているプラットフォームであるCUDAにて提供されてきました。そのため、NVIDIA社のGPUしか公式にはサポートされていませんでした。
しかし、2021年4月22日のCuPy v9のリリースにて、AMD社が提供するROCmプラットフォームを公式にサポートすることが発表されました。これにより、公式サポートのもと、AMD社のGPUでCuPyを動かせるようになりました。
そこで、本記事ではAMDのGPUでCuPyを使用する方法を紹介します。
ROCmとは
本項では、AMD社が提供するROCmというプラットフォームについて説明します。また、ROCmのインストール手順を紹介していきます。
概要
ROCmとは、GPUの演算用プラットフォームです。イメージとしては、NVIDIAのGPUに対するCUDAが、AMDのGPUに対するROCmであると考えて頂くとわかりやすいかと思います。
ディープラーニングのフレームワークであるTensorFlowやPyTorchもこのROCmに対応し、AMDのGPUでの演算をサポートしています。
2021年6月現在、ROCmはバージョン4.2までがリリースされています。今回は、CuPy公式の提供しているバイナリに合わせてバージョン4.0.1を使用します。
- (参考)ROCm公式サイト
インストール方法
以下に従ってインストールをすれば問題ありません。
- ROCm Installation(AMD社・英語)
1点注意事項として、記載されているコマンドをそのままコピペすると最新バージョンがインストールされてしまいます。以下の注意書きを参考に対応します。
**Note**: For developer systems or Docker containers (where it could be beneficial to use a fixed ROCm version), select a versioned repository from:
https://repo.radeon.com/rocm/apt/
ROCm のapt repositoryを指定する際、以下のように指定しているのを書き換え、バージョンを記載すると過去のバージョンがインストールできます。
echo ‘deb [arch=amd64] https://repo.radeon.com/rocm/apt/debian/ ubuntu main’ | sudo tee /etc/apt/sources.list.d/rocm.list
今回はバージョン4.0.1を指定するので、以下のようにコマンドを実行します。
echo ‘deb [arch=amd64] http://repo.radeon.com/rocm/apt/4.0.1 xenial main’ | sudo tee /etc/apt/sources.list.d/rocm.list
CuPyとは
本項では、CuPyについて説明します。また、CuPyのインストール手順を紹介していきます。
概要
CuPyは、GPU向けの汎用配列計算ライブラリです。先述の通り、NumPy互換のインターフェースを持ち、行列演算をGPUで計算できるという特徴を持っています。
NumPy互換のインターフェースを持つことについて、具体例を以下に示します。
まず、NumPyで以下のスクリプトを実装します。要素数10の1次元ベクトルをランダム生成し、内積を求める計算です。
import numpy as np
N = 10
arr_1 = np.random.rand(N)
arr_2 = np.random.rand(N)
ip = np.dot(arr_1, arr_2)
これをCuPyで計算するときは、以下のように実装します。
import cupy as cp
N = 10
arr_1 = cp.random.rand(N)
arr_2 = cp.random.rand(N)
ip = cp.dot(arr_1, arr_2)
このように、ソースコードを大きく書き換えることなくCPU演算をGPU演算に切り替えることができます。
CuPyは、Preferred Networks社により開発が進められています。元々Chainerのバックエンドとして開発されていましたが、その後はChainerと分離して現在も開発が続いています。
2021/06現在の最新バージョンはv9.1.0です。今回は最新バージョンを使用します。
- (参考) CuPy公式サイト
インストール方法
今回は、以下の公式ドキュメントに従って、CuPyのバイナリパッケージをインストールします。
pip install cupy-rocm-4-0
CuPyを実行してみる
公式のGitHubに公開されている、NumPyとCuPyが比較できるexampleを実行してみます。今回は、k-meansというアルゴリズムをCPUとGPUで実行し、GPU計算による高速化が実現できているかどうかを確認してみました。
実行用ソースコードの準備
手元にgit cloneし、examplesディレクトリに移動します。
git clone https://github.com/cupy/cupy.git
cd cupy/examples
kmeansの実行
まずは、k-means法のベンチマークを確認してみます。GPUを使用することにより、8倍程度高速化できていることがわかります。
$ python kmeans/kmeans.py
CPU : 12.634823 sec
GPU : 1.566474 sec
要素の数を増やすと、さらにGPUでの計算が有利になります。要素数を4倍に増やしたときのベンチマークが以下のようになります。11倍程度の高速化となりました。
$ python kmeans/kmeans.py –num 20000000
CPU : 51.045236 sec
GPU : 4.657105 sec
GPUの状態の確認
kmeansを実行しているときのGPUのログは次のものです。rocm-smiというGPU状態を確認できるコマンドで確認をすると、GPUが想定通り稼働していることが確認できます。
$ /opt/rocm/bin/rocm-smi
======================= ROCm System Management Interface =======================
================================= Concise Info =================================
GPU Temp AvgPwr SCLK MCLK Fan Perf PwrCap VRAM% GPU%
0 48.0c 11.0W 1269Mhz 800Mhz 0.78% auto 165.0W 0% 0%
1 54.0c 3.0W 1269Mhz 800Mhz 0.78% auto 165.0W 0% 0%
2 49.0c 6.0W 1269Mhz 800Mhz 0.78% auto 165.0W 0% 0%
3 51.0c 86.0W 1622Mhz 800Mhz 0.78% auto 165.0W 58% 99%
================================================================================
============================= End of ROCm SMI Log ==============================
まとめ
CuPyは、AMDのGPU上でも動かすことが可能です。ROCmをインストールし、ROCm対応版のCuPyをインストールすることで実行させることができます。行列演算をGPUで行うことにより、高速化できることを実際に確認できました。
AMDのGPUをお持ちで、CPUでの行列演算が遅くてお困りの際はCuPyを使ってみてはいかがでしょうか?