Kubeflow實戰系列--阿里雲上使用JupyterHub
來自專欄我是程序員
15 人贊了文章
介紹
本系列將介紹如何在阿里雲容器服務上運行Kubeflow, 本文介紹如何使用Jupyter Hub。
- 第一篇:阿里雲上使用JupyterHub
- 第二篇:阿里雲上小試TFJob
- 第三篇:利用TFJob運行分散式TensorFlow
- 第四篇:利用TFJob導出分散式TensorFlow模型
- 第五篇:利用TensorFlow Serving進行模型預測
背景介紹
時間過得真快,李世乭和AlphaGo的人機對弈已經是兩年前的事情。在過去的兩年中,人工智慧開始從學術界向工業界轉型,基於人工智慧技術的產品化落地和工業界方案的探索正如火如荼的進行。而隨著計算和數據的規模化,機器學習模型持續迭代的常態化,人們意識到過去實驗室里的手工作坊式的做法已經無法應對新的變化。
而Kubernetes作為基於容器技術的雲平台,正在悄然的改變大規模部署和應用程序管理的行業標準,越來越多的企業開始使用Kubernetes來部署和運維自己的應用。雖然Kubernetes最擅長解決的是無狀態服務生命周期管理,但是越來越多的其他類型的工作負載也在開始向這個平台遷移,目的在於利用Kubernetes平台本身的API,可靠性和生命周期管理能力。
而最近新興的Kubeflow社區,就是利用Kubernetes將大規模機器學習變得模塊化,可遷移和易擴展。
Kubeflow介紹
Kubeflow致力於利用Kubernetes將機器學習(ML)工作流程的部署變得簡單,便攜和可擴展。其目標不是重新創建其他服務,而是提供一種直接的方式將機器學習的最佳開源系統部署到各種基礎架構中。 在運行Kubernetes的任何地方,都應該可以運行Kubeflow。該項目一直在不斷的演進和豐富之中,目前主要包含的模塊:
- JupyterHub創建和管理互動式Jupyter筆記本。 Jupyter本身支持跨所有編程語言的互動式數據科學和科學計算。
- TensorFlow訓練管理控制器,可以配置使用CPU或者GPU,並且動態調整訓練集群的規模
- TensorFlow服務將訓練好的模型以grpc和REST的方式提供API調用
Kubeflow分別支持本地部署模式和雲平台部署,阿里雲Kubernetes容器服務針對於KubeFlow做了本地化的定製,方便您在阿里雲上運行Kubeflow方案。
部署阿里雲Kubernetes容器服務,並且選擇GPU類型
具體參考創建GPU集群
部署Kubeflow
安裝ksonnet
Kubeflow 利用 ksonnet 打包和部署其組件。
首先,安裝ksonnet版本 0.9.2
# 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
準備Github Token
- 登錄https://github.com/settings/tokens創建token。你無須提供任何許可權給這個token
- 請保存好該token,因為你無法再查看到這個token。如果沒有記錄好token,你就只能重現創建一個新的token
- 可以將該token保存到shell啟動腳本中,比如
echo "export GITHUB_TOKEN=${GITHUB_TOKEN}" >> ~/.bashrcexport GITHUB_TOKEN=${GITHUB_TOKEN}
該問題是ksonnet的限制:可以參考文檔github-rate-limiting-errors了解其中的細節。
安裝Kubeflow
# 創建Kubeflow運行的namespaceNAMESPACE=kubeflowkubectl create namespace ${NAMESPACE}# 指定特有版本VERSION=jupyterhub-alibaba-cloud# 初始化Kubeflow應用,並且將其namespace設置為default環境APP_NAME=my-kubeflowks init ${APP_NAME} --api-spec=version:v1.9.3cd ${APP_NAME}ks env set default --namespace ${NAMESPACE}# 安裝 Kubeflow 模塊ks registry add kubeflow github.com/cheyang/kubeflow/tree/${VERSION}/kubeflowks registry listks pkg install kubeflow/core@${VERSION}ks pkg install kubeflow/tf-serving@${VERSION}ks pkg install kubeflow/tf-job@${VERSION}# 創建核心模塊的模板ks generate kubeflow-core kubeflow-core# 支持運行在阿里雲Kubernetes容器服務ks param set kubeflow-core cloud ackks param set kubeflow-core jupyterHubImage registry.aliyuncs.com/kubeflow-images-public/jupyterhub-k8s:1.0.1ks param set kubeflow-core tfJobImage registry.cn-hangzhou.aliyuncs.com/kubeflow-images-public/tf_operator:v20180326-6214e560ks param set kubeflow-core tfAmbassadorImage registry.aliyuncs.com/datawire/ambassador:0.34.0ks param set kubeflow-core tfStatsdImage registry.aliyuncs.com/datawire/statsd:0.34.0ks param set kubeflow-core jupyterNotebookRegistry registry.aliyuncs.comks param set kubeflow-core JupyterNotebookRepoName kubeflow-images-public# 這裡為了使用簡單,將服務以LoadBalancer的方式暴露,這樣可以直接通過阿里雲SLB的ip訪問。ks param set kubeflow-core jupyterHubServiceType LoadBalancerks param set kubeflow-core tfAmbassadorServiceType LoadBalancerks param set kubeflow-core tfJobUiServiceType LoadBalancer# 部署KubeFlowks apply default -c kubeflow-core
驗證部署
查看相關的Pod是否處於Running狀態
# kubectl get po -n kubeflowNAME READY STATUS RESTARTS AGEambassador-58f64cb77-9cqq2 2/2 Running 0 3hambassador-58f64cb77-fqn8x 2/2 Running 0 3hambassador-58f64cb77-g8pb6 2/2 Running 0 3hcentraldashboard-648d5f56d9-xp9c8 1/1 Running 0 3htf-hub-0 1/1 Running 0 3htf-job-dashboard-759c7d4dd-6mj2j 1/1 Running 0 3htf-job-operator-7684bcf66b-qqvt8 1/1 Running 0 3h
體驗Jupyter Hub
1. 可以通過kubectl命令查看Jupyter Hub的外網訪問ip, 在本例子里,外網ip為101.37.178.121
# kubectl get svc -n kubeflow tf-hub-lbNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEtf-hub-lb LoadBalancer 172.19.3.22 101.37.178.121 80:32373/TCP 4h
注意由於Kubeflow的Jupyter Hub目前僅僅提供http訪問,並不推薦在生產環境使用LoadBalancer模式的Service,建議在生產環境,可以使用
kubectl proxy的模式訪問
2. 通過外網ip訪問Jupyter Hub, 默認沒有提供認證插件,可以通過任何用戶名和密碼登錄

3. 點擊Start My Server創建Jupyter Notebook

4. 可以從下拉框里,選擇不同版本TensorFlow的Jupyter Notebook(1.4.1,1.5.1,1.6.0, 1.7.0), 這裡的地址都是阿里雲容器鏡像的地址,無需擔心鏡像下拉失敗的問題。如果要使用一塊GPU卡,請在Extera Resource Limits填入{"nvidia.com/gpu":"1"}, 點擊Spwan:

5. 這時可以看到啟動頁面一直處於載入狀態,這是由於Jupyter Notebook的鏡像通常很大,下載時間較長。

6. 當Jupyter Notebook啟動完成後,就會完成自動跳轉.這時候可以從下拉框選擇Terminal, 並且點擊

7. 可以在Terminal執行nvidia smi, 可以看到當前環境是P100的單卡

8. 可以通過http://{ip}/user/{user}/tree返回到Jupyter主頁, 從下拉框選擇python 3,並且點擊

9. 運行簡單的mnist softmas測試

以下為測試代碼:
from tensorflow.examples.tutorials.mnist import input_datamnist = input_data.read_data_sets("MNIST_data/", one_hot=True)import tensorflow as tfx = 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}))
刪除Kubeflow
# ks delete default -c kubeflow-core# kubectl delete ns kubeflow
總結
為了方便阿里雲的用戶學習和使用Kubeflow, 阿里雲Kubernetes容器服務提供了本地化運行的方案。當然Kubeflow目前還不夠成熟,但是它的社區熱度和演進速度還是讓人充滿了期待;我們會進一步加強Kubeflow和阿里雲自身負載均衡,存儲和認證機制相結合,進一步降低在阿里雲使用Kubernetes上的機器學習棧的難度。
本文作者: 必嘫,阿里雲技術專家
更多技術乾貨敬請關注云棲社區知乎機構號:阿里云云棲社區 - 知乎
本文為雲棲社區原創內容,未經允許不得轉載。
推薦閱讀:
※k8s kustomize 使用指南:名字前綴
※Kuberntes 排錯工具
※Kubernetes 驚天地泣鬼神之大Bug
※systemd和Docker究竟要相殺多久?
※喜憂參半的 Kubernetes 生產之路
TAG:人工智慧 | Kubernetes | 容器計算 |

