SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Server 2017 における GPU の利用 (ML Services の GPU 利用) について

leave a comment

SQL Server 2017 の GPU サポートについて、まとめておきたいと思います。

https://gist.github.com/MasayukiOzawa/7965ffce226a8f94ba457671dd844b92 に今回勉強をする中で使用したサンプルを置いてあります。
情報については Linux/Docker 版も登場! Microsoft SQL Server 2017 の情報まとめ【5/1 更新】 を確認していただくとよいかと考えていますが、SQL Server 2017 の GPU の対応については次のような記載となっています。

NVIDIA GPU アクセラレーションの実現: R/Python を利用して GPU による高速計算での機械学習も実現、1 秒あたり100 万件の予測処理が可能です。

SQL Server 2017 が GPU を使用可能になっている範囲ですが「Machine Learning Services で GPU 対応のパッケージ (処理) を使用」した場合に、GPU を使用できるという理解でいます。
そのため、SQL Server の通常のクエリプロセッシングで GPU が使われるのではなく、ML Services で R または Python のスクリプトを実行する際に、GPU 対応したパッケージを介して、GPU を使用する処理を実施している場合のみ、SQL Server で GPU が使用できる形になるのではないでしょうか。

GPU を使用した検証ですが、Azure を使用している場合は、N シリーズのインスタンスを使用することで、GPU の検証を実施することが可能です。
Azure の N シリーズで、Windows Server をデプロイした直後は、GPU ドライバーがインストールされていない状態となっていますので、Windows Server を実行している N シリーズ VM の GPU ドライバーをセットアップする の手順に従い、グラフィックドライバーをインストールする必要があります。
(CUDA をインストールしたタイミングでもグラフィックドライバーインストールされている気もしますが。)
N シリーズに搭載されている GPU が正常に認識されている場合は、ディスプレイアダプターに搭載している GPU が認識できている状態となります。
今回の検証については、NV6 を使用しているため、Tesla M60 が認識されている状態となります。
image
 
この後に、SQL Server を ML Services を有効にしてインストールを実施します。
SQL Server のインストールが完了したら、次のクエリを実行した後に、SQL Server のサービスを再起動して、ML Services を動作するようにします。

EXEC sp_configure  'external scripts enabled', 1
RECONFIGURE WITH OVERRIDE

 
これで、下準備は完了です。

実際に GPU を使用する処理ですが、Tensorflow については、CPU / GPU の両バージョンがありますので、これを使って GPU の利用を確認してみたいと思います。
GPU 版の Tensorflow のインストールですが、次の記事を参考にさせていただきました。

CUDA 等がわかっていないので、四苦八苦していましたが TensorFlowのGPU版でImportError: DLL load failed: 指定されたモジュールが見つかりません。とModuleNotFoundError: No module named ‘_pywrap_tensorflow_internal’が出る の記事の内容で作業をすることで、SQL Server から GPU を使用することができました。
SQL Server から Python を実行することで、以下の画像のような状態となり、GPU がブンブン使われている状態にすることはできました。

(画像でキャプチャする際に、CUI より GUI の方がわかりやすいかと思い、NVIDIA System Management Interface (「C:\Program Files\NVIDIA Corporation\NVSMI」の nvidia-smi.exe) ではなく、ELSA System Graph を使用して確認しています)
image
SQL Server の ML Services への Python パッケージの追加インストールですが、既定のインスタンスで実行lした場合には「C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES\Scripts」の「pip」を使用することで、パッケージを追加することができます。
tensorflow をインストールする場合「pip install tensorflow」でインストールをすると CPU 版がインストールされるため、次のコマンドを実行して GPU 版をインストールします。

(バージョンの関係はきちんと理解できていないので、参考記事のバージョンを使用しています…)

pip install tensorflow-gpu==1.2.1

 
Python 側のインストールが終わったら、CUDA (Compute Unified Device Architecture) と、cuDNN (CUDA Deep Neural Network library) をインストールします。
今回の環境ですが、SQL Server + SQL Server Management Studio をインストールした環境を使用していますので、VC++  2015 の再頒布可能パッケージのインストールは個別には実施していません。
CUDA については、CUDA Toolkit Download からダウンロードすることができます。
今回は Base Installer の「cuda_8.0.61_win10.exe」をインストールしています。

(インストール中にグラフィックドライバーのインストールのダイアログが表示されますが、こちらは、Yes でインストールしています)
image
cuDNN については、NVIDIA cuDNN からダウンロードします。

こちらについては、メンバーシップ登録が必要となります。
今回は「Download cuDNN v5.1 (Jan 20, 2017), for CUDA 8.0 」から、「cuDNN v5.1 Library for Windows 10」をダウンロードしています。
image
ZIP ファイルを展開し「bin」に含まれている「cudnn64_5.dll」を「C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin」にコピーします。
これで準備が整いましたので、「C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES」の「python.exe」を起動して、「import tensorflow」を実行します。
CUDA / cuDNN が正常にインストール / 配置されているのであれば、エラーは発生せずにモジュールをインポートできるはずです。
GPU が使われている場合には、次のスクリプトを実行した場合に、

import tensorflow as tf
hello = tf.constant("Hello, TensorFlow!")
sess = tf.Session()

 
GPU の情報が取得されます。

name: Tesla M60
major: 5 minor: 2 memoryClockRate (GHz) 1.1775
pciBusID add3:00:00.0
Total memory: 8.00GiB
Free memory: 6.70GiB

 
CPU 版の Tensorflow を使用している場合は、GPU の情報は表示されず、次のようなメッセージとなっているかと。

2017-09-19 14:22:35.273618: W C:\tf_jenkins\home\workspace\rel-win\M\windows\PY\35\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
2017-09-19 14:22:35.273675: W C:\tf_jenkins\home\workspace\rel-win\M\windows\PY\35\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations.

 
実際に GPU が使われているかのテストですが、次の記事のスクリプトを実行しています。
Deep MNIST for Experts
サンプルデータのダウンロードが必要となるため、 Security Considerations for the R Runtime in SQL Server の設定を実施し、ML Serivces からネットワークにアクセスできるようにしています。
学習のタイミングでは、GPU が使われる処理となっているかと思いますので、処理の特定のタイミングになると、GPU を使用していることが確認できるかと思います。
今回は、SQL Server 2017 RC2 Express Edition を使用したのですが、Express Edition の ML Services でも RC2 時点では、GPU を使用する Python のパッケージを実行することができていました。

(Enterprise Edition とそれ以外のエディションの性能の違いは Revoscale パッケージを利用した際のパフォーマンス (マルチスレッド管理) /メモリ上限と、外部リソースに対してのリソースガバナーの設定についてという認識でいます)
TensorflowでGPUを制限・無効化する の記事を参考に、Tensorflow の MNIST のチュートリアルの実行時に次のように GPU の設定を変更しながら処理時間を調べてみました。

config = tf.ConfigProto(
    device_count={"GPU":0}, # GPUの数0に
    log_device_placement=True
)
with tf.Session(config=config) as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(10):
      batch = mnist.train.next_batch(50)
      if i % 100 == 0:
        train_accuracy = accuracy.eval(feed_dict={x: batch[0], y_: batch[1], keep_prob: 1.0})
        print("step %d, training accuracy %g" % (i, train_accuracy))
      train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})
      print("test accuracy %g" % accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))

 
"GPU":1 の場合、28 秒 / "GPU":0 の場合、88 秒となっており、ML Services 内で学習のプロセスを実行した際に、GPU の有無による処理時間の変化についても確認することができました。
下の画像は、左が "GPU":1/右が "GPU":0 を指定した際の GPU の使用状況の違いですが、スパイクの有無が異なる (GPU が使われているか否かが異なる) のが確認できるかと。
imageimage
 
ここまでは、Tensorflow を例にして GPU を使用してきましたが、ML Services の標準パッケージの GPU の対応状況についてはどうなっているかも気になります。
少し調べてみたところ、Microsoft ML パッケージの rxNeuralNet については、GPU に対応しているようです。
Getting started with GPU acceleration for MicrosoftML’s rxNeuralNet
安定の虎の穴からの情報となっていますが、このパッケージについては、R Server や、ML Services に含まれているものとなります。

What is the MicrosoftML package?
R の場合は rxNeuralNet: Neural Net 、Python の場合は microsoftml.rx_neural_network: Neural Network を使用することになりますが、これらのパッケージについては GPU をサポートしているようです。
以下は、Python 版のパッケージのドキュメントですが、GPU アクセラレーションについてのオプションが記載されています。

neural networks as well as in cases where training produces unbounded weights.

acceleration

Specifies the type of hardware acceleration to use. Possible values are “sse_math” and “gpu_math”. For GPU acceleration, it is recommended to use a miniBatchSize greater than one. If you want to use the GPU acceleration, there are additional manual setup steps are required:

  • Download and install NVidia CUDA Toolkit 6.5 (CUDA Toolkit).
  • Download and install NVidia cuDNN v2 Library (cudnn Library).
  • Find the libs directory of the microsoftml package by calling import microsoftml, os, os.path.join(microsoftml.__path__[0], "mxLibs").
  • Copy cublas64_65.dll, cudart64_65.dll and cusparse64_65.dll from the CUDA Toolkit 6.5 into the libs directory of the microsoftml package.
  • Copy cudnn64_65.dll from the cuDNN v2 Library into the libs directory of the microsoftml package.

このパッケージは AzureML に含まれていますが GPU アクセラレーションを行うためには、「Copy cudnn64_65.dll from the cuDNN v2 Library into the libs directory of the microsoftml package. 」を実施する必要があるようです。

cudnn64_65.dll のファイルの配置が必要となるようですので、Native Scoreing (SQL Server 2017 の PREDICT を使用した学習済みモデルの利用 で紹介した内容) では、使用することは難しいのかもしれないですね。
上記の引用のなかでも記載されていますが、Microsoft ML パッケージからの GPU の利用については、CUDA を使用しており、バージョンに関しては上述のバージョンを利用する必要があります。
microsoftml.rx_neural_network: Neural Network のチュートリアルのコードで GPU を使用するためには、「acceleration」オプションに、GPU を使用する設定のディクショナリを指定する必要があります。
「acceleration={"name":"SseMath"}」というようなオプションの指定になるのですが、ディクショナリについては、次のような構文で生成ができます。

from microsoftml import gpu_math
OPTION = gpu_math(cu_dnn=True)
print(OPTION)

 
GPU が使用されている場合は、次のようなメッセージが出力されます。
image
CUDA のライブラリの DLL の配置を「C:\Program Files\Microsoft SQL Server\MSSQL14.<インスタンス IO>\PYTHON_SERVICES\lib\site-packages\microsoftml\mxLibs」に実施していなかったり、異なるバージョンのライブラリを使用している場合は、GPU を使用することができず、エラーになり、「AvxMath」が使用されているかと思います。
手探りで利用のされ方の違いを調べたので時間がかかってしまいましたが、ML Services の GPU の使用方法についてはもう少し深堀して学習したいですね。

Share

Written by Masayuki.Ozawa

9月 20th, 2017 at 12:07 am

Leave a Reply