Kubeflow on Alibaba Cloud 第一回~JupyterHub環境を立ち上げる

CJNANです。

最近、主にDeep LearningをベースとしたAI技術が理論研究フェーズからビジネス業界への展開スピードがどんどん早くなるのを感じています。NAS(Neural Networks Search)のようなハイパパラメタの最適化を商用化したGCPのAutoMLやENAS(Effect NAS)をOSS化したAutoKerasが今後のDeep Learning手法の主なトレンドになれると思います。一方は、もっとビジネスサイドで応用できるための、開発環境やIaaS構成が求められてきて、これに着目したもう一つのOSSプロジェクト「Kubeflow」について、Alibaba Cloudでの実現方法を紹介します。

Kubeflowについて

簡単に言うとKubernetes上で簡単に機械学習用の環境を構築、管理できるようにしたものです。KuberflowはGoogleから開発したOSSで、Kuebrnetes(コンテナ化されたアプリケーションの展開やスケーリングおよび管理をおこなうオーケストレーションツール)の強大な機能を通じて、機械学習の開発からデリバリーまでの作業をもっと簡単に実現できるし、拡張性が良いサービスを実現することができます。KuberflowはKuernetesの環境であれば、すぐ実現できる特徴がありますので、Kubernetesユーザに対しても、導入コストが低い特徴があります。

機能

KuberflowはまだリリースしたばかりのOSSです。現時点で提供するモジュール(機能)を簡単に紹介します。

  • JupyterHub (Jupyterを複数ユーザーで使えるようにしたもの)

(Jupyter notebookは、データ サイエンティストが Python やその他のランタイムを使用して実験を構築して実行するための一般的なツールです。)

  • TensorFlow Training Controller (学習用の分散環境が簡単に構築できる)
  • TensorFlow Serving (構築したモデルをgrpcとREST APIで公開できる)

Alibaba CloudでKueflowを実現する

現時点に日本サイトでは、香港米国西部クアラルンプール(マレーシア)で、Kuberneteseのワーカノード にECSのGPUインスタンスGN5シリーズ(NVIDIA P100)の購入ができます。ここでは、香港リージョンでAlibaba CloudのKubernetesサービスを使って、Kubeflowを実現します。

参照スペック

  • Masterノード:ecs.sn1.medium三台構成
  • Workerノード:ecs.gn5-c4g1.xlarge三台構成

Container Service for Kubernetesクラスタの構築は下記のリンクをご参照ください。

https://techblog.sbcloud.co.jp/2018/07/09/basic-kubernetes/

Kubeflowの実装

まず、SSHでクラスタに接続して、Ksonnetをインストールします。KsonnetはKubernetesのmainfestを管理するツールです。ここでは、Alibaba Cloudで用意したバージョンをダウンロードしてみます。

# curl -o ks_0.9.2_linux_amd64.tar.gz http://kubeflow.oss-cn-beijing.aliyuncs.com/ks_0.9.2_linux_amd64.tar.gz
# tar -xvf ks_0.9.2_linux_amd64.tar.gz
# cp ks_0.9.2_linux_amd64/ks /usr/local/bin/
# ks version

Kubeflowをインストールする前に、github api rate limitに掛かれために、Tokenを作成しましょう。https://github.com/settings/tokensからTokenを作成し、下記のようにスクリプトを実行します。

echo "export GITHUB_TOKEN=${GITHUB_TOKEN}" >> ~/.bashrc
export GITHUB_TOKEN=${GITHUB_TOKEN}

そして、下記の手順でKubeflowをインストールします。

# Kubeflow用にnamespaceを作成
NAMESPACE=kubeflow
kubectl create namespace ${NAMESPACE}

# Alibaba CloudバージョンのKubeflowを指定
VERSION=jupyterhub-alibaba-cloud

# Kubeflow初期化、そしてnamespaceをdefaultに設定
APP_NAME=my-kubeflow
ks init ${APP_NAME} --api-spec=version:v1.9.3
cd ${APP_NAME}
ks env set default --namespace ${NAMESPACE}

# Kubeflow をADD
ks registry add kubeflow github.com/cheyang/kubeflow/tree/${VERSION}/kubeflow
ks registry list

ks pkg install kubeflow/core@${VERSION}
ks pkg install kubeflow/tf-serving@${VERSION}
ks pkg install kubeflow/tf-job@${VERSION}

# kubeflow-core
ks generate kubeflow-core kubeflow-core

# Alibaba CloudのContainer Service for K8sに対応させる
ks param set kubeflow-core cloud ack

ks param set kubeflow-core jupyterHubImage registry.aliyuncs.com/kubeflow-images-public/jupyterhub-k8s:1.0.1
ks param set kubeflow-core tfJobImage registry.cn-hangzhou.aliyuncs.com/kubeflow-images-public/tf_operator:v20180326-6214e560
ks param set kubeflow-core tfAmbassadorImage registry.aliyuncs.com/datawire/ambassador:0.34.0
ks param set kubeflow-core tfStatsdImage registry.aliyuncs.com/datawire/statsd:0.34.0

ks param set kubeflow-core jupyterNotebookRegistry registry.aliyuncs.com
ks param set kubeflow-core JupyterNotebookRepoName kubeflow-images-public

# SLBのip設定
ks param set kubeflow-core jupyterHubServiceType LoadBalancer
ks param set kubeflow-core tfAmbassadorServiceType LoadBalancer
ks param set kubeflow-core tfJobUiServiceType LoadBalancer


# KubeFlow実行
ks apply default -c kubeflow-core

これでKubeflowのインストールが完了しました。では、Podがうまく作動しているのかを確認してみましょう。

[root@xxxxxxxxxxxxxxxxxxxxxxx my-kubeflow]# kubectl get po -n kubeflow
NAME                                READY     STATUS    RESTARTS   AGE
ambassador-5b87cdf94d-xxxxx         2/2       Running   0          4m
ambassador-5b87cdf94d-xxxxx         2/2       Running   0          4m
ambassador-5b87cdf94d-xxxxx         2/2       Running   0          4m
centraldxxxxxxxxxx                  1/1       Running   0          4m
tf-job-dashboard-xxxxxxxxxxxxxxxx   1/1       Running   0          4m
tf-job-operator-xxxxxxxxxxxxxxxx    1/1       Running   0          4m

Jupyter Hubにアクセスする

では早速Jupyter Hubをアクセスしましょう。まず、kubectlコマンドでグローバルIPを確認しましょう。

[root@xxxxxxxxxxxxxxxxxxxxxxx my-kubeflow]# kubectl get svc -n kubeflow tf-hub-lb
NAME        TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
tf-hub-lb   LoadBalancer   172.19.6.xxx   47.xx.xx.xxx   80:32478/TCP   4m

表示されたIPにアクセスして見ると、下記のようにJupyterHubが開きます。

ここで、Tensorflow1.7指定してみます。GPUリソースを使うためには、Extra Resource Limitsに{"nvidia.com/gpu":"1"}を指定する必要があります。少し時間を待ちますと、下記のようにJupyter Notebookのイメージが立ち上がり、はじめて機械学習開発などを行えます。

ここで、MNISTのTutorialコードを走って、うまく動くかを確認できます。

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

import tensorflow as tf

x = tf.placeholder(tf.float32, [None, 784])

W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))

y = tf.nn.softmax(tf.matmul(x, W) + b)

y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))

train_step = tf.train.GradientDescentOptimizer(0.05).minimize(cross_entropy)

sess = tf.InteractiveSession()
tf.global_variables_initializer().run()

for _ in range(1000):
  batch_xs, batch_ys = mnist.train.next_batch(100)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

Jupyter notebookのTerminalからもGPUリソースが問題なく表示されますね。香港リージョンのGN5シリーズはNvidia P100が搭載されているのが見えます。

Kubeflowの削除

# ks delete default -c kubeflow-core
# kubectl delete ns kubeflow

最後に

本ドキュメントで、Alibaba CloudのContainer Service for Kubernetesを使って、機械学習の開発管理ツールKubeflowを実装してみました。次は、TFJobを使ったTensoflowの分散機械学習を紹介します。