AMDのGPUでCuPyを動かす

  • このエントリーをはてなブックマークに追加
AMDのGPUでCuPyを動かす

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を使用します。

インストール方法

以下に従ってインストールをすれば問題ありません。

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のバイナリパッケージをインストールします。

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を使ってみてはいかがでしょうか?

  • このエントリーをはてなブックマークに追加