kubernetes学习笔记|利用 Kubeflow 管理 Tensorflow 程序

Posted by ShenHengheng on 2018-11-23

参考

介绍

每个人是不是都想拥有一个属于自己的 “人工智能实验室”,他有哪些特点呢?主要包括以下几个特点:

  1. 支持 tensorflow/torch/keras等等主流深度学习库
  2. 用户界面友好
  3. 支持分布式训练
  4. 支持 GPU 训练
  5. 支持快速产生人工智能产品原型

Kubeflow 是 Google 开源的机器学习工具,目的是简化 Kubernetes 上运行机器学习的工程,使之更简单、可携带与可扩展。Kubeflow 目标不是在于重建其他服务,而是提供一个最佳的开发系统用于部署到各种基础设施架构中,另外由于使用kubernetes 来作为基础,因此只要有 Kubernetes 的地方,都能夠执行 Kubeflow。

该工具可以用来建立如下功能:

  1. 用于建立与管理工具(IDE) Jupyter notebook 的 JupyterHub。
  2. 可以使用 CPU 或 GPU,并可以通过单一设定来调整单个数据集的 Tensorflow Training Controller。
  3. 用 TensorFlow Serving 容器來提供模型服务。

Kubeflow 目标是通过 Kubernetes 的特性使机器学习更加简单和快捷:

  1. 在不同 IaaS 上实现简单可重复的携带性部署(Laptop <-> ML rig <-> Training cluster <-> Production cluster)。
  2. 管理与部署松耦合的微服务。
  3. 可根据需要来自动扩缩容

安装

本次安装基于 1.12.1 版本的 kube*,我的安装比较简单粗暴!适合有运维经验的同学,如果有疑问可以联系我或者访问上面给出的链接?。

本次安装假定你的集群已经运行,且稳定!

注意:这里只给出 CPU 版本

安装 ksonnet 0.9.2,请参考以下:

$ wget https://github.com/ksonnet/ksonnet/releases/download/v0.9.2/ks_0.9.2_linux_amd64.tar.gz
$ tar xvf ks_0.9.2_linux_amd64.tar.gz
$ sudo cp ks_0.9.2_linux_amd64/ks /usr/local/bin/
$ ks version
ksonnet version: 0.9.2
jsonnet version: v0.9.5
client-go version: 1.8

部署 Kubeflow

本节將说明如歌利用 ksonnet 来部署 Kubeflow 到 Kubernetes 集群中。首先在 master 节点初始化 ksonnet 应用程序目录:

$ ks init my-kubeflow

如果遇到以下问题的話,可以自己建立 GitHub Token 来存取 GitHub API,请参考 Github rate limiting errors

ERROR GET https://api.github.com/repos/ksonnet/parts/commits/master: 403 API rate limit exceeded for 122.146.93.152.

接着安装 Kubeflow 套件到上面创建的应用程序目录下:

$ cd my-kubeflow
$ ks registry add kubeflow github.com/kubeflow/kubeflow/tree/master/kubeflow$ VERSION=v0.1.2
$ ks pkg install kubeflow/core@${VERSION}
$ ks pkg install kubeflow/tf-serving@${VERSION}
$ ks pkg install kubeflow/tf-job@${VERSION}

然后建立 Kubeflow 核心组件,该组件包含 JupyterHub 和 TensorFlow job controller:

$ kubectl create namespace kubeflow
$ kubectl create clusterrolebinding tf-admin --clusterrole=cluster-admin --serviceaccount=default:tf-job-operator
$ ks generate core kubeflow-core --name=kubeflow-core --namespace=kubeflow
$ ks env add kubeflow
$ ks env set kubeflow --namespace kubeflow
$ ks apply kubeflow -c kubeflow-core
$ PODNAME=`kubectl get pods --namespace=kubeflow --selector="app=tf-hub" --output=template --template="{{with index .items 0}}{{.metadata.name}}{{end}}"`

这样就可以访问了!如果想要在集群外部访问,修改 tf-hub-lb service 的类型为 NodePort 或者 LoadBalancer 即可!

$ kubectl get service tf-hub-lb  -nkubeflow
NAME        TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
tf-hub-lb   LoadBalancer   10.109.167.223   172.16.3.4    8000:30962/TCP   34m

img

测试

img

Bug

could not post report: HTTPSConnectionPool(host=’kubernaut.io’, port=443): Max

For those who just got started with kubernetes in general. Here’s what you need to do

$ kubectl edit configmap coredns -n kube-system

NOTE: the changes are permanent and will survive a reboot of the node.

You’ll need to add 8.8.8.8 at two places, upstream and proxy

...
apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           upstream 8.8.8.8 8.8.4.4
           fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        proxy . /etc/resolv.conf 8.8.8.8 8.8.4.4
        cache 30
        reload
    }

...