Kubeflow实战系列:利用TFJob导出分布式TensorFlow模型

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本系列将介绍如何在阿里云容器服务上运行Kubeflow, 本文介绍如何使用`TfJob`导出分布式模型训练模型。

介绍

本系列将介绍如何在阿里云容器服务上运行Kubeflow, 本文介绍如何使用TfJob导出分布式模型训练模型。

模型训练导出简介

前文中介绍了如何利用TFJob进行分布式的模型训练。对于深度学习的产品化来说,训练只是手段不是目的,目的是将通过训练产生的模型放到手机的程序里或者互联网的应用中,用于语音或者文字的识别等应用场景中。

export_model

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
AI 代码解读

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"
AI 代码解读

将该模板保存到nas-tf-serving.yaml, 并且创建pv:

# kubectl create -f nas-tf-serving.yaml
persistentvolume "tf-serving-pv" created
AI 代码解读

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
AI 代码解读

具体命令:

# kubectl create -f tf-serving-pvc.yaml
persistentvolumeclaim "kubeflow-servin-pvcg" created
AI 代码解读

查看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
AI 代码解读

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
AI 代码解读
  • kubeflow-dist-nas-mnist是上一篇分布式训练中保存checkpoint的NAS数据卷,对应的checkpoint文件在其/training/tensorflow/logs/

6. 查看TFJob

现在可以看到TFJob资源已经被创建了:

# kubectl get tfjob
NAME                 AGE
export-mnist-model   48s
AI 代码解读

获得该TFJob的RUNTIME ID,这个RUNTIME ID是TFJob和其对应Pod之间的关联

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

根据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
AI 代码解读

在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!
AI 代码解读

7. 查看模型

登录到NAS上检查模型文件

# tree serving
serving
└── mnist
    └── 1
        ├── saved_model.pb
        └── variables
            ├── variables.data-00000-of-00001
            └── variables.index
AI 代码解读

并且可以通过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
AI 代码解读

总结

模型导出是从训练转向服务的桥梁,通过使用TFJob完成分布式模型训练的导出,可以标准化和自动化这部分工作,从而有机会建立从模型训练,验证,导出,预测的工作流。在后面的文章中,我们会介绍如何通过TensorFlow Serving使用导出的模型进行预测。

相关实践学习
基于ECS和NAS搭建个人网盘
本场景主要介绍如何基于ECS和NAS快速搭建个人网盘。
阿里云文件存储 NAS 使用教程
阿里云文件存储(Network Attached Storage,简称NAS)是面向阿里云ECS实例、HPC和Docker的文件存储服务,提供标准的文件访问协议,用户无需对现有应用做任何修改,即可使用具备无限容量及性能扩展、单一命名空间、多共享、高可靠和高可用等特性的分布式文件系统。 产品详情:https://www.aliyun.com/product/nas
目录
相关文章
鸿蒙HarmonyOS应用开发 | 探索 HarmonyOS Next-从开发到实战掌握 HarmonyOS Next 的分布式能力
HarmonyOS Next 是华为新一代操作系统,专注于分布式技术的深度应用与生态融合。本文通过技术特点、应用场景及实战案例,全面解析其核心技术架构与开发流程。重点介绍分布式软总线2.0、数据管理、任务调度等升级特性,并提供基于 ArkTS 的原生开发支持。通过开发跨设备协同音乐播放应用,展示分布式能力的实际应用,涵盖项目配置、主界面设计、分布式服务实现及部署调试步骤。此外,深入分析分布式数据同步原理、任务调度优化及常见问题解决方案,帮助开发者掌握 HarmonyOS Next 的核心技术和实战技巧。
393 76
鸿蒙HarmonyOS应用开发 | 探索 HarmonyOS Next-从开发到实战掌握 HarmonyOS Next 的分布式能力
Python 高级编程与实战:深入理解并发编程与分布式系统
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化、调试技巧、数据科学、机器学习、Web 开发、API 设计、网络编程和异步IO。本文将深入探讨 Python 在并发编程和分布式系统中的应用,并通过实战项目帮助你掌握这些技术。
Python 高级编程与实战:构建分布式系统
本文深入探讨了 Python 中的分布式系统,介绍了 ZeroMQ、Celery 和 Dask 等工具的使用方法,并通过实战项目帮助读者掌握这些技术。ZeroMQ 是高性能异步消息库,支持多种通信模式;Celery 是分布式任务队列,支持异步任务执行;Dask 是并行计算库,适用于大规模数据处理。文章结合具体代码示例,帮助读者理解如何使用这些工具构建分布式系统。
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
本教程演示如何在ACK中多机分布式部署DeepSeek R1满血版。
|
3月前
|
Java中的分布式缓存与Memcached集成实战
通过在Java项目中集成Memcached,可以显著提升系统的性能和响应速度。合理的缓存策略、分布式架构设计和异常处理机制是实现高效缓存的关键。希望本文提供的实战示例和优化建议能够帮助开发者更好地应用Memcached,实现高性能的分布式缓存解决方案。
55 9
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
鸿蒙技术分享:HarmonyOS Next 深度解析 随着万物互联时代的到来,华为发布的 HarmonyOS Next 在技术架构和生态体验上实现了重大升级。本文从技术架构、生态优势和开发实践三方面深入探讨其特点,并通过跨设备笔记应用实战案例,展示其强大的分布式能力和多设备协作功能。核心亮点包括新一代微内核架构、统一开发语言 ArkTS 和多模态交互支持。开发者可借助 DevEco Studio 4.0 快速上手,体验高效、灵活的开发过程。 239个字符
291 13
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
秒杀抢购场景下实战JVM级别锁与分布式锁
在电商系统中,秒杀抢购活动是一种常见的营销手段。它通过设定极低的价格和有限的商品数量,吸引大量用户在特定时间点抢购,从而迅速增加销量、提升品牌曝光度和用户活跃度。然而,这种活动也对系统的性能和稳定性提出了极高的要求。特别是在秒杀开始的瞬间,系统需要处理海量的并发请求,同时确保数据的准确性和一致性。 为了解决这些问题,系统开发者们引入了锁机制。锁机制是一种用于控制对共享资源的并发访问的技术,它能够确保在同一时间只有一个进程或线程能够操作某个资源,从而避免数据不一致或冲突。在秒杀抢购场景下,锁机制显得尤为重要,它能够保证商品库存的扣减操作是原子性的,避免出现超卖或数据不一致的情况。
131 10
TensorFlow,一款由谷歌开发的开源深度学习框架,详细讲解了使用 TensorFlow 构建深度学习模型的步骤
本文介绍了 TensorFlow,一款由谷歌开发的开源深度学习框架,详细讲解了使用 TensorFlow 构建深度学习模型的步骤,包括数据准备、模型定义、损失函数与优化器选择、模型训练与评估、模型保存与部署,并展示了构建全连接神经网络的具体示例。此外,还探讨了 TensorFlow 的高级特性,如自动微分、模型可视化和分布式训练,以及其在未来的发展前景。
520 5
基于TensorFlow的深度学习模型训练与优化实战
基于TensorFlow的深度学习模型训练与优化实战
212 3

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等