【Kubeflowのラズパイ包み】ラズパイにKubeflowをインストールして機械学習基盤化するとこまで

前回作ったkubernetesのラズパイ包みを、Kubeflowのラズパイ包みにして、機械学習基盤のおもちゃにする。

tkzs.hatenablog.com

まずはksonnetからのインストールから

ksonnetはkubernetesをjsonnetというJSON用のDSLを使った設定ファイル管理ツールっぽい。これを使ってKubeflowのデプロイなどの設定を行う。

Home ⋅ ksonnet

macOSならbrewで入れられるのだが、それ以外はバイナリからのビルドになる。

github.com

インストールにgolang必要そうなので、まずはそっちインストールから。

$ wget https://golang.org/dl/go1.10.1.linux-armv6l.tar.gz
$ sudo tar -C /usr/local -xzf go1.10.1.linux-armv6l.tar.gz
$ ls -l /usr/local/go
$ cat /usr/local/go/VERSION
$ sudo vi ~/.bashrc
$ source $HOME/.bashrc

次にksonnet。GitHubのリポジトリからバイナリを取ってきて、インストールし、パスを通す。

# Clone the ksonnet repo into your GOPATH
$ go get github.com/ksonnet/ksonnet

# Build and install binary under shortname `ks` into $GOPATH/bin
$ cd $GOPATH/src/github.com/ksonnet/ksonnet
$ make install
$ PATH=$PATH:$GOPATH/bin
$ ks version
ksonnet version: dev-2018-07-20T09:11:08+0000
jsonnet version: v0.10.0
client-go version: kubernetes-1.10.4

とりあえず入った。

ksコマンドは下記わかってればなんとかなる。

  • ks generate : componentsについてのmanifestを作成
  • ks apply : クラスタに実行可能なmanifestをあてる

ここから先はKubeflow v0.1のアナウンスを参考にする。

kubernetes.io

$ NAMESPACE=kubeflow
$ kubectl create namespace ${NAMESPACE}
$ VERSION=v0.1.3

# Initialize a ksonnet app. Set the namespace for it's default environment.
$ APP_NAME=my-kubeflow
$ ks init ${APP_NAME}
INFO Using context "kubernetes-admin@kubernetes" from kubeconfig file "/home/pi/.kube/config"
INFO Creating environment "default" with namespace "default", pointing to "version:v1.9.9" cluster at address "https://192.168.13.2:6443"
INFO Generating ksonnet-lib data at path '/home/pi/my-kubeflow/lib/ksonnet-lib/v1.9.9'

$ cd ${APP_NAME}
$ ks env set default --namespace ${NAMESPACE}

# Install Kubeflow components
$ ks registry add kubeflow github.com/kubeflow/kubeflow/tree/${VERSION}/kubeflow
$ ks pkg install kubeflow/core@${VERSION}
INFO Retrieved 22 files
$ ks pkg install kubeflow/tf-serving@${VERSION}
INFO Retrieved 5 files
$ ks pkg install kubeflow/tf-job@${VERSION}
INFO Retrieved 5 files

# Create templates for core components
$ ks generate kubeflow-core kubeflow-core
INFO Writing component at '/home/pi/my-kubeflow/components/kubeflow-core.jsonnet'

# Deploy Kubeflow
$ ks apply default -c kubeflow-core 
ERROR handle object: patching object from cluster: merging object with existing state: Get https://192.168.13.2:6443/api/v1/namespaces/kubeflow/configmaps/jupyterhub-config: net/http: TLS handshake timeout

最後のks applyでエラー吐くので、issueからWork aroundを見つけて対応。

github.com

$ ks show default -c kubeflow-core | kubectl apply -f 
service "k8s-dashboard" created
deployment "ambassador" created
service "ambassador" created
serviceaccount "ambassador" created
role "ambassador" created
rolebinding "ambassador" created
service "ambassador-admin" created
clusterrole "tf-job-dashboard" created
clusterrolebinding "tf-job-dashboard" created
clusterrole "tf-job-operator" created
clusterrolebinding "tf-job-operator" created
serviceaccount "jupyter-hub" created
role "jupyter-role" created
rolebinding "jupyter-role" created
configmap "jupyterhub-config" created
deployment "tf-job-dashboard" created
configmap "tf-job-operator-config" created
customresourcedefinition "tfjobs.kubeflow.org" created
deployment "tf-job-operator" created
statefulset "tf-hub" created
service "tf-hub-0" created
service "tf-hub-lb" created
service "tf-job-dashboard" created
serviceaccount "tf-job-dashboard" created
serviceaccount "tf-job-operator" created

眠すぎて、一旦とりあえず今日はここまで。モデルのServingとかは持ち越し。

events.linuxfoundation.org

KubeCon + CloudNativeCon EU 2018のセッションの資料を見ると、TF servingじゃなくてSeldon使えたり、TFじゃなくてsklearn使えるようになるっぽい。もう出来るようになっている?ぼちぼち試していく。

処理遅いしGKEでやりゃ良くね?みたいなことはコマンド打つ毎に考えるけど、それ言い出したらせっかくのラズパイ包み楽しくないから多少のことは我慢する。

参考