基于kubernetes的tensorflow单机训练与服务部署

目标:使用kubernetes实现tensorflow mnist的训练与服务部署

环境:kubernetes 1.11集群 / gpu: nvidia p100

步骤:mnist深度学习样例简介->模型训练->模型服务->服务测试

 

1.mnist深度学习样例简介

MNIST - 深度学习经典入门样例

    --NIST数据集的一个子集

    --包含60000张图片作为训练数据,10000张图片作为测试数据

    --每一张图片都代表0~9中的一个数字

    --图片大小为28*28

    --数字出现在图片正中间

数据集地址

    --http://yann.lecun.com/exdb/mnist

参考代码:https://github.com/tensorflow/serving/tree/master/tensorflow_serving/example

mnist_input_data.py: 数据读入部分的代码

mnist_saved_model.py: 模型训练与存储部分代码

mnist_client.py: 客户端测试模型服务代码

代码需要修改的部分为工作目录、模型输出目录等运行所需环境信息

 

2.模型训练

训练使用kubernetes中的Job进行:

apiVersion: batch/v1
kind: Job
metadata:
  labels:
    job: caoxin-train-1
  name: caoxin-train-1
  namespace: default
spec:
  template:
    spec:
      containers:
      - command:
        - /bin/sh
        - -c
        - cd /data;python mnist_saved_model.py --training_iteration=10000 --model_version=2
          /data/mnist
        image: tensorflow/tensorflow:1.12.0-gpu-py3
        name: caoxin-train-1
        ports:
        - containerPort: 2222
          protocol: TCP
        resources:
          limits:
            cpu: "1"
            memory: 2Gi
            nvidia.com/gpu: "1"
        volumeMounts:
        - mountPath: /data
          name: data
      restartPolicy: OnFailure
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: caoxin-dev

其中持久化存储改成集群中的cephfs

 

3.模型服务

基于tensorflow/serving镜像进行部署

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    serve: caoxin-serve
  name: caoxin-serve
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      serve: caoxin-serve
  template:
    spec:
      containers:
      - command:
        - /bin/sh
        - -c
        - tensorflow_model_server --port=9000 --model_name=mnist --model_base_path=/data/mnist
        image: tensorflow/serving:1.12.0-gpu
        name: caoxin-serve
        ports:
        - containerPort: 9000
          protocol: TCP
        resources:
          limits:
            cpu: "1"
            memory: 2Gi
            nvidia.com/gpu: "2"
        volumeMounts:
        - mountPath: /data
          name: data
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: caoxin-dev

部署Service

apiVersion: v1
kind: Service
metadata:
  labels:
    serve: caoxin-serve
  name: caoxin-serve
  namespace: default
spec:
  ports:
  - nodePort: 30053
    port: 80
    protocol: TCP
    targetPort: 9000
  selector:
    serve: caoxin-serve
  type: NodePort

 

4.服务测试

训练日志:

基于kubernetes的tensorflow单机训练与服务部署_第1张图片

查看模型服务容器日志:

基于kubernetes的tensorflow单机训练与服务部署_第2张图片

启动成功并运行在容器9000端口

node节点执行nvidia-smi查看gpu使用信息

通过service的nodeport进行服务测试:

此处的server ip为容器运行的node节点

基于kubernetes的tensorflow单机训练与服务部署_第3张图片

10000轮训练后,识别错误率在5%

可以重新部署job并增加训练轮数,生成新模型,测试错误率会减小。

以上。

 

你可能感兴趣的:(Kubernetes,tensorflow,mnist,kubernetes)