天天看點

Kubeflow實戰系列:利用TFJob導出分布式TensorFlow模型

介紹

本系列将介紹如何在阿裡雲容器服務上運作

Kubeflow

, 本文介紹如何使用

TfJob

導出分布式模型訓練模型。

模型訓練導出簡介

前文

中介紹了如何利用

TFJob

進行分布式的模型訓練。對于深度學習的産品化來說,訓練隻是手段不是目的,目的是将通過訓練産生的模型放到手機的程式裡或者網際網路的應用中,用于語音或者文字的識别等應用場景中。

Kubeflow實戰系列:利用TFJob導出分布式TensorFlow模型

TensorFlow Serving是Google開源的一個靈活的、高性能的機器學習模型服務系統,能夠簡化并加速從模型到生産應用的過程。它除了原生支援TensorFlow模型,還可以擴充支援其他類型的機器學習模型。但是TensorFlow Serving支援的模型檔案格式是protobuf,而不是TensorFlow模型訓練産生的checkpoint檔案。這就需要能夠将模型訓練産生的

model.ckpt

轉化成

.pb

檔案。

在本示例中,我們會提供一個簡單的方案示例: 将訓練好的checkpoint從用于訓練的NAS資料卷遷移到用于模型預測的NAS資料卷,用來給

TensorFlow Serving

系統加載。這裡訓練和預測的NAS資料卷,可以選擇同一個NAS的不同子目錄,隻需要通過不同的PV進行辨別即可。

建立模型預測使用的NAS

1. 建立NAS資料卷,并且設定與目前Kubernetes叢集的同一個具體vpc的挂載點。操作詳見

文檔

2. 在NAS上建立

/serving

的資料檔案夾, 下載下傳mnist訓練所需要的資料

mkdir -p /nfs
mount -t nfs -o vers=4.0 0fc844b526-rqx39.cn-hangzhou.nas.aliyuncs.com:/ /nfs
mkdir -p /nfs/serving
umount /nfs           

3. 建立NAS的PV, 以下為示例nas-tf-serving.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: tf-serving-pv
  labels:
    role: tf-serving
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nas
  flexVolume:
    driver: "alicloud/nas"
    options:
      mode: "755"
      path: /serving
      server: 0fc844b526-rqx39.cn-hangzhou.nas.aliyuncs.com
      vers: "4.0"           

将該模闆儲存到

nas-tf-serving.yaml

, 并且建立

pv

:

# kubectl create -f nas-tf-serving.yaml
persistentvolume "tf-serving-pv" created           

4. 利用

tf-serving-pvc.yaml

建立PVC

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: tf-serving-pvc
spec:
  storageClassName: nas
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      role: tf-serving           

具體指令:

# kubectl create -f tf-serving-pvc.yaml
persistentvolumeclaim "kubeflow-servin-pvcg" created           

檢視PVC是否建立成功:

# kubectl get pvc tf-serving-pvc
NAME             STATUS    VOLUME          CAPACITY   ACCESS MODES   STORAGECLASS   AGE
tf-serving-pvc   Bound     tf-serving-pv   10Gi       RWX            nas            28s           

5. 建立執行模型導出任務的

TFJob

apiVersion: kubeflow.org/v1alpha1
kind: TFJob
metadata:
  name: export-mnist-model
spec:
  replicaSpecs:
    - replicas: 1 # 1 Master
      template:
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/tensorflow-samples/export-mnist-model
              name: tensorflow
              command: ["python", "/app/export_model.py"]
              args:
                - --model_version=1 
                - --checkpoint_path=/training/tensorflow/logs/
                - /serving/mnist
              volumeMounts:
              - name: kubeflow-dist-nas-mnist
                mountPath: "/training"
              - name: tf-serving-pvc
                mountPath: "/serving"
          volumes:
            - name: kubeflow-dist-nas-mnist
              persistentVolumeClaim:
                claimName: kubeflow-dist-nas-mnist
            - name: tf-serving-pvc
              persistentVolumeClaim:
                claimName: tf-serving-pvc
          restartPolicy: Never           
  • kubeflow-dist-nas-mnist

    是上一篇分布式訓練中儲存checkpoint的NAS資料卷,對應的checkpoint檔案在其

    /training/tensorflow/logs/

6. 檢視

TFJob

現在可以看到

TFJob

資源已經被建立了:

# kubectl get tfjob
NAME                 AGE
export-mnist-model   48s
           

獲得該

TFJob

的RUNTIME ID,這個RUNTIME ID是TFJob和其對應Pod之間的關聯

# RUNTIMEID=$(kubectl get tfjob export-mnist-model -o=jsonpath='{.spec.RuntimeId}')           

根據RUNTIME ID查詢對應執行該訓練任務

# kubectl get po -lruntime_id=$RUNTIMEID -a
NAME                                   READY     STATUS    RESTARTS   AGE
export-mnist-model-master-bl1o-0-r7ji0   0/1       Completed   0          4m           

在Pod運作過程中,可以通過

kubectl logs

檢查訓練模型導出日志, 可以看到模型已經被導出在

/serving/mnist/1

下:

# kubectl logs export-mnist-model-master-bl1o-0-r7ji0 
/usr/local/lib/python2.7/dist-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters
2018-06-13 13:43:45.183857: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
WARNING:tensorflow:From /app/export_model.py:74: initialize_all_tables (from tensorflow.python.ops.lookup_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use `tf.tables_initializer` instead.
Tensor("input/x-input:0", shape=(?, 784), dtype=float32)
Tensor("cross_entropy/logits:0", shape=(?, 10), dtype=float32)
Exporting trained model to /serving/mnist/1
Done exporting!           

7. 檢視模型

登入到NAS上檢查模型檔案

# tree serving
serving
└── mnist
    └── 1
        ├── saved_model.pb
        └── variables
            ├── variables.data-00000-of-00001
            └── variables.index           

并且可以通過

saved_model_cli

檢查模型定義, 這裡可以看到輸入的input是

images

,輸出的結果是

scores

。這個在模型預測中,寫grpc用戶端會用到

# saved_model_cli show --dir /serving/mnist/1 --all

MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:

signature_def['predict_images']:
The given SavedModel SignatureDef contains the following input(s):
inputs['images'] tensor_info:
    dtype: DT_FLOAT
    shape: (-1, 784)
    name: input/x-input:0
The given SavedModel SignatureDef contains the following output(s):
outputs['scores'] tensor_info:
    dtype: DT_FLOAT
    shape: (-1, 10)
    name: cross_entropy/logits:0
Method name is: tensorflow/serving/predict           

總結

模型導出是從訓練轉向服務的橋梁,通過使用

TFJob

完成分布式模型訓練的導出,可以标準化和自動化這部分工作,進而有機會建立從模型訓練,驗證,導出,預測的工作流。在後面的文章中,我們會介紹如何通過

TensorFlow Serving

使用導出的模型進行預測。

繼續閱讀