Japan
サイト内の現在位置
jupyter(仮)
no.0102021.4.30 jupyter notebook上でPythonプログラミングを行う機会はは多いかと思います。
Jupyterカーネルが内部的にipythonを呼び出すことによりインタラクティブな形でコードを実行可能なだけでなく、Markdownを使ったドキュメントをコードの間に埋め込むことやmatplotlibによるグラフの表示など、優れたwebベースのコード開発環境です。
今回はjupyter notebookを使いながらSX-Aurora TSUBASAでFrovedisによるデータ処理や機械学習APIの簡単なサンプルコードを実行しながら、デモ形式でFrovedisを御紹介していきます。
まず初めに、前準備について。クライアント側のwebでSX-Aurora TSUBASAで動作するjupyter notebook serverを使用するための設定、そしてFrovedisを使用するための環境変数設定について説明していきます。
クライアント側のwebからJupyterNotebook serverへ接続できるようにするためにクライアントPCで~/.jupyter/jupyter_notebook_config.pyに以下の設定を追加します。
c = get_config()
c.NotebookApp.ip = '0.0.0.0'
c.NotebookApp.open_browser = False
c.NotebookApp.notebook_dir = '/path/to/save/notebook'
続いて、sourceコマンドを用いたスクリプトを実行し、Frovedis server実行のための環境変数を設定します。
実行するスクリプトによりPYTHONPATH、LD_LIBRARY_PATHといったPath設定の他、mpirunの実行先をSX-Aurora TSUBASAのベクトルプロセッサに切り替える設定が実施されます。SSHを通してSX-Aurora TSUBASAにターミナルログインするたびにこのスクリプトを実行して環境変数を設定しなおす必要があります。変更する環境変数を~/.profileに設定を記述することでターミナルログインの度にスクリプトを実行しないようにすることも可能です。
ターミナルでJupyter Notebookを起動します。次のように表示されたら、次にクライアントPCのwebブラウザーを起動してURLを入力します。passwordを入れるとこれでJupyter Notebookの使用準備が整います。
Frovedisに限らず、scikit-learnによる学習を考えるとき、作業としてデータの用意があげられます。データは何らかの方法で収集したたものを使うほか、疑似的に作成したデータで学習をテストすることも可能です。
例えばクラスタリング学習ではdatasets.make_blobsを用いたデータ作成が考えられます。このようなデータの用意をSX-Aurora TSUBASAのホストサーバで動作するPythonで実施する他、Frovedis serverに用意される Distributed matrixやDistributed vectorを使って行うことも可能です。
Distributed matrixやdistributed vectorを使うメリットとして、機械学習する際にSX-Aurora TSUBASAのホストサーバ(以降、ホストサーバ)からベクトルプロセッサへのデータ転送によるコストを削減できる点にあります。
ホストサーバのPythonで用意したデータをFrovedis serverで機械学習するにはベクトルプロセッサに転送しなければなりませんが、初めからベクトルプロセッサ側でデータを準備することによって転送することなく学習に落とし込むことができます。さらには、データ格納方法を工夫することにより高速な学習処理が行えるよう配慮がなされています。
Distributed matrixには、データの素性に応じて疎行列を圧縮して格納するCRS matrix (FrovedisCRSMatrix)、密行列を格納する dense matrix (FrovedisRowmajorMatrix, FrovedisColmajorMatrix)、そしてFrovedisBlockcyclicMatrixの3種類が用意されています。
CRS matrixは疎行列(行列内の要素に0を多く含むものです)から0以外のデータだけ抽出して圧縮する形式のものですが、こうすることによって非常に大きなサイズの行列データであっても効率的にメモリからプロセッサに転送して処理することができるようになります。
また、最後のBlock Cyclic Matrixは行列をいくつかのブロックに分割し、各ブロックを複数のプロセスとして並列処理することで高速化図るためのものです。
では、早速3種類のDistributed matrixの使い方をJupyter Notebookを使って確認していきます。
%matplotlib inline
Demonstration of k-means assumptions (Frovedis API版)¶
This example is meant to illustrate situations where k-means will produce unintuitive and possibly unexpected clusters. In the first three plots, the input data does not conform to some implicit assumption that k-means makes and undesirable clusters are produced as a result. In the last plot, k-means returns intuitive clusters despite unevenly sized blobs.
print(__doc__)
# Author: Phil Roth <mr.phil.roth@gmail.com>
# License: BSD 3 clause
import numpy as np
import os
import matplotlib.pyplot as plt
Automatically created module for IPython interactive environment
To use Frovedis, you need to import FrovedisServer
from frovedis.exrpc.server import FrovedisServer
Import KMeans Clustering from Frovedis from sklearn.cluster import KMeans <-- In the case of scikit-learn, following module is imported instead
from frovedis.mllib.cluster import KMeans
from sklearn.datasets import make_blobs
fit methodを使用する前にfrovedis_serverを起動
FrovedisServer.initialize("mpirun -np 4 {}".format(os.environ['FROVEDIS_SERVER']))
n_samples = 1500
random_state = 170
X, y = make_blobs(n_samples=n_samples, random_state=random_state)
# Incorrect number of clusters
y_pred = KMeans(n_clusters=2, random_state=random_state).fit_predict(X)
plt.figure(figsize=(12, 12))
plt.subplot(221)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.title("Incorrect Number of Blobs")
# Anisotropicly distributed data
transformation = [[0.60834549, -0.63667341], [-0.40887718, 0.85253229]]
X_aniso = np.dot(X, transformation)
y_pred = KMeans(n_clusters=3, random_state=random_state).fit_predict(X_aniso)
plt.subplot(222)
plt.scatter(X_aniso[:, 0], X_aniso[:, 1], c=y_pred)
plt.title("Anisotropicly Distributed Blobs")
# Different variance
X_varied, y_varied = make_blobs(n_samples=n_samples,
cluster_std=[1.0, 2.5, 0.5],
random_state=random_state)
y_pred = KMeans(n_clusters=3, random_state=random_state).fit_predict(X_varied)
plt.subplot(223)
plt.scatter(X_varied[:, 0], X_varied[:, 1], c=y_pred)
plt.title("Unequal Variance")
# Unevenly sized blobs
X_filtered = np.vstack((X[y == 0][:500], X[y == 1][:100], X[y == 2][:10]))
y_pred = KMeans(n_clusters=3,
random_state=random_state).fit_predict(X_filtered)
plt.subplot(224)
plt.scatter(X_filtered[:, 0], X_filtered[:, 1], c=y_pred)
plt.title("Unevenly Sized Blobs")
plt.show()
FrovedisServer.shut_down()