TensorFLow 是深度学习和机器学习最流行的开源框架,它最初是由谷歌研究团队开发的并致力于解决深度神经网络的机器学习研究,从2015年开源到现在得到了广泛的应用。特别是 Tensorboard 这一利器,对于数据科学家的工作非常有用。

背景信息

Jupyter notebook 是强大的数据分析工具,它能够帮助快速开发并且实现机器学习代码的共享,是数据科学团队用来做数据实验和组内合作的利器,也是机器学习初学者入门这一个领域的好起点。

利用 Jupyter 开发 TensorFLow 是许多数据科学家的首选,但是如何能够快速从零搭建一套这样的环境,并且配置 GPU 的使用,同时支持最新的 TensorFLow 版本,对于数据科学家来说既复杂,同时也浪费精力。在阿里云的 Kubernetes 集群上,您可以通过简单的 Web 界面,一键式创建一套完整的 tensorFlow 实验环境,包括 Jupyter Notebook开发模型,利用 Tensorboard 调整模型。

准备Kubernetes环境

阿里云容器服务Kubernetes 1.9.3目前已经上线,但是购买按量付费的GPU计算型服务器需要申请ECS工单开通。创建包含适当数量弹性计算资源(GPU 服务器)的 Kubernetes 集群,可以参见创建 GN5 型 Kubernetes 集群

需要登录 Master节点,执行相关命令,参见SSH 访问 Kubernetes 集群

  1. 准备数据。
    1. 创建NAS文件存储,并且设置vpc内挂载点。可以参考管理文件系统。并且查看挂载点,这里假设挂载点为xxxxxx.cn-shanghai.nas.aliyuncs.com
    2. 准备名字为/data的数据文件夹。
      mkdir /nfs
       mount -t nfs -o vers=4.0 xxxxxx.cn-hangzhou.nas.aliyuncs.com:/ /nfs
       mkdir -p /nfs/data
       umount /nfs
  2. 创建 persistent volume。
    以下为创建NAS的nas.yaml样例,实际上也可以创建云盘或者OSS等持久化存储。
    1. 创建并拷贝以下内容到nas.yaml文件。
      apiVersion: v1
      kind: PersistentVolume
      metadata:
        labels:
          train: mnist
        name: pv-nas-train
      spec:
        persistentVolumeReclaimPolicy: Retain
        accessModes:
          - ReadWriteMany
        capacity:
          storage: 5Gi
        flexVolume:
          driver: alicloud/nas
          options:
            mode: "755"
            path: /data
            server: xxxxxx.cn-hangzhou.nas.aliyuncs.com
            vers: "4.0"
      说明 这里需要指定label为model: mnist,该标签对于 pvc 选择 pv 绑定非常重要。另外和NAS相关的具体配置可以参考NAS存储卷使用说明
    2. 运行以下命令,创建阿里云NAS。
      kubectl create -f nas.yaml
      persistentvolume "pv-nas" created

通过应用目录部署 TensorFlow 应用

  1. 登录容器服务管理控制台
  2. 在 Kubernetes 菜单下,单击左侧导航栏中的市场 > 应用目录,进入应用目录列表。
  3. 单击 ack-tensorflow-dev,进入对应的 chart 页面。
    char控制台
  4. 单击参数,就可以通过 Web 界面配置参数,然后单击 创建
    说明 默认的配置下,是使用 CPU 进行计算。
    配置tensorflow

    本示例使用 GPU 节点进行 tensorflow 开发,具体的配置如下:

    jupyter: 
       image: 
         pullPolicy: Always
         repository: registry.cn-hangzhou.aliyuncs.com/tensorflow-samples/jupyter
         tag: 1.5.0-devel-gpu
       password: tensorflow
       resources: 
         limits: 
           nvidia.com/gpu: 1
         requests: 
           nvidia.com/gpu: 1
     service: 
       type: LoadBalancer
     tensorboard: 
       image: 
         pullPolicy: Always
         repository: registry.cn-hangzhou.aliyuncs.com/tensorflow-samples/tensorboard
         tag: "1.1.0"
     persistence:
       enabled: true
       mountPath: /data
       pvc:
         matchLabels:
            train: mnist
         storage: 5Gi
    您也可以登录到 Kubernetes master 节点,运行以下命令进行部署。
    $ helm install --name ack-tensorflow-dev-default incubator/ack-tensorflow
  5. 部署完成后,单击集群右侧的控制台,进入 Kubernetes Dashboard,查看 tensorflow 应用启动的状态。
    tensorflow应用启动状态

至此,ack-tensorflow-dev 应用成功运行。

使用 TensorFlow 实验环境

  1. 首先通过 ssh 登录 Kubernetes 集群,查看 tensorflow 应用列表。
    $ helm list
    NAME                            REVISION        UPDATED                         STATUS          CHART                           NAMESPACE
    ack-tensorflow-dev-default      1               Tue Apr 17 16:05:31 2018        DEPLOYED        ack-tensorflow-dev-0.1.0        default
  2. 利用 helm status 命令检查应用配置。
     $ helm status ack-tensorflow-dev-default
     LAST DEPLOYED: Tue Apr 17 16:05:31 2018
     NAMESPACE: default
     STATUS: DEPLOYED
     RESOURCES:
     ==> v1/Service
     NAME                        TYPE          CLUSTER-IP    EXTERNAL-IP    PORT(S)                      AGE
     ack-tensorflow-dev-default  LoadBalancer  172.21.XX.XX  120.55.XX.XX   6006:32203/TCP,80:30795/TCP  7m
     ==> v1beta2/Deployment
     NAME                        DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
     ack-tensorflow-dev-default  1        1        1           1          7m
     NOTES:
     1. Get the application URL by running these commands:
          NOTE: It may take a few minutes for the LoadBalancer IP to be available.
                You can watch the status of by running 'kubectl get svc -w ack-tensorflow-dev-default'
       export SERVICE_IP=$(kubectl get svc --namespace default ack-tensorflow-dev-default -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
       echo http://$SERVICE_IP:
    说明 可以看到外部 SLB 的 IP 是 120.55.XX.XX, Jupyter Notebook 的端口为 80,Tensorboard 为 6006。
  3. 通过 Jupyter 访问端点登录,本示例中 Jupyter 的访问地址是 http://120.55.XX.XX,输入前面设定的密码,单击 Log in, 在本示例中我们设定的是 tensorflow。
    jupyter登录页面
  4. 单击 New > Terminal,进入 Terminal 页面。
    Terminal 页面
  5. 在 bash 执行环境下,在 Terminal 内执行 nvidia-smi,可以看到 GPU 的配置。
    GPU配置
  6. 通过 git 命令下载tensorflow样例代码。
    $ git clone https://code.aliyun.com/kubernetes/Tensorflow-Examples.git
     Clone into  "Tensorflow-Examples"...
     remote: Counting objects: 885, done.
     remote: Total 885 (delta 532), reused 885 (delta 532)
     Receiving objects: 100% (885/885), 17.89 MiB | 0 bytes/s, done.
     Resolving deltas: 100% (532/532), done.
     Checking connectivity... done.
     root@ack-tensorflow-dev-default-84c7
  7. 查看mount进来的/data路径。
    ls /data
    返回 Jupyter 主页您就能看到 Tensorflow-Examples 已经下载到您的工作目录。工作目录
  8. 进入 /Tensorflow-Examples/notebooks/4_Utils/tensorboard_basic.ipynb 目录,运行程序。
    说明 如果您需要用Tensorboard观测训练效果,请将日志记录到/output/training_logs下。
    观测训练效果
以下为训练结果输出。训练输出结果

执行结果

这时您可以登录 Tensorboard 查看训练效果, 本示例中Tensorboard的地址为 http://120.55.XX.XX:6006。这里您可以看到模型的定义和训练的收敛趋势。模型定义模型收敛趋势