本文共 5571 字,大约阅读时间需要 18 分钟。
本系列将介绍如何在阿里云容器服务上运行, 本文介绍如何使用Jupyter Hub。
时间过得真快,李世乭和AlphaGo的人机对弈已经是两年前的事情。在过去的两年中,人工智能开始从学术界向工业界转型,基于人工智能技术的产品化落地和工业界方案的探索正如火如荼的进行。而随着计算和数据的规模化,机器学习模型持续迭代的常态化,人们意识到过去实验室里的手工作坊式的做法已经无法应对新的变化。
而Kubernetes作为基于容器技术的云平台,正在悄然的改变大规模部署和应用程序管理的行业标准,越来越多的企业开始使用Kubernetes来部署和运维自己的应用。虽然Kubernetes最擅长解决的是无状态服务生命周期管理,但是越来越多的其他类型的工作负载也在开始向这个平台迁移,目的在于利用Kubernetes平台本身的API,可靠性和生命周期管理能力。
而最近新兴的Kubeflow社区,就是利用Kubernetes将大规模机器学习变得模块化,可迁移和易扩展。
Kubeflow致力于利用Kubernetes将机器学习(ML)工作流程的部署变得简单,便携和可扩展。其目标不是重新创建其他服务,而是提供一种直接的方式将机器学习的最佳开源系统部署到各种基础架构中。 在运行Kubernetes的任何地方,都应该可以运行Kubeflow。该项目一直在不断的演进和丰富之中,目前主要包含的模块:
Kubeflow分别支持本地部署模式和云平台部署,阿里云Kubernetes容器服务针对于KubeFlow做了本地化的定制,方便您在阿里云上运行Kubeflow方案。
具体参考
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
echo "export GITHUB_TOKEN=${GITHUB_TOKEN}" >> ~/.bashrcexport GITHUB_TOKEN=${GITHUB_TOKEN}
该问题是ksonnet的限制:可以参考文档了解其中的细节。
# 创建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
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. 可以通过{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}))
# ks delete default -c kubeflow-core# kubectl delete ns kubeflow
为了方便阿里云的用户学习和使用Kubeflow, 阿里云Kubernetes容器服务提供了本地化运行的方案。当然Kubeflow目前还不够成熟,但是它的社区热度和演进速度还是让人充满了期待;我们会进一步加强Kubeflow和阿里云自身负载均衡,存储和认证机制相结合,进一步降低在阿里云使用Kubernetes上的机器学习栈的难度。
转载地址:http://cnvpa.baihongyu.com/