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

简介: 本系列将介绍如何在阿里云容器服务上运行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

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使用导出的模型进行预测。

相关实践学习
函数计算部署PuLID for FLUX人像写真实现智能换颜效果
只需一张图片,生成程序员专属写真!本次实验在函数计算中内置PuLID for FLUX,您可以通过函数计算+Serverless应用中心一键部署Flux模型,快速体验超写实图像生成的魅力。
目录
相关文章
|
4月前
|
机器学习/深度学习 PyTorch TensorFlow
TensorFlow与PyTorch深度对比分析:从基础原理到实战选择的完整指南
蒋星熠Jaxonic,深度学习探索者。本文深度对比TensorFlow与PyTorch架构、性能、生态及应用场景,剖析技术选型关键,助力开发者在二进制星河中驾驭AI未来。
779 13
|
7月前
|
人工智能 Kubernetes 数据可视化
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
本文回顾了一次关键词监测任务在容器集群中失效的全过程,分析了中转IP复用、调度节奏和异常处理等隐性风险,并提出通过解耦架构、动态IP分发和行为模拟优化采集策略,最终实现稳定高效的数据抓取与分析。
140 2
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
|
9月前
|
消息中间件 运维 Kafka
直播预告|Kafka+Flink双引擎实战:手把手带你搭建分布式实时分析平台!
在数字化转型中,企业亟需从海量数据中快速提取价值并转化为业务增长动力。5月15日19:00-21:00,阿里云三位技术专家将讲解Kafka与Flink的强强联合方案,帮助企业零门槛构建分布式实时分析平台。此组合广泛应用于实时风控、用户行为追踪等场景,具备高吞吐、弹性扩缩容及亚秒级响应优势。直播适合初学者、开发者和数据工程师,参与还有机会领取定制好礼!扫描海报二维码或点击链接预约直播:[https://developer.aliyun.com/live/255088](https://developer.aliyun.com/live/255088)
637 35
直播预告|Kafka+Flink双引擎实战:手把手带你搭建分布式实时分析平台!
|
4月前
|
人工智能 自然语言处理 TensorFlow
134_边缘推理:TensorFlow Lite - 优化移动端LLM部署技术详解与实战指南
在人工智能与移动计算深度融合的今天,将大语言模型(LLM)部署到移动端和边缘设备已成为行业发展的重要趋势。TensorFlow Lite作为专为移动和嵌入式设备优化的轻量级推理框架,为开发者提供了将复杂AI模型转换为高效、低功耗边缘计算解决方案的强大工具。随着移动设备硬件性能的不断提升和模型压缩技术的快速发展,2025年的移动端LLM部署已不再是遥远的愿景,而是正在成为现实的技术实践。
|
9月前
|
消息中间件 运维 Kafka
直播预告|Kafka+Flink 双引擎实战:手把手带你搭建分布式实时分析平台!
直播预告|Kafka+Flink 双引擎实战:手把手带你搭建分布式实时分析平台!
286 11
|
11月前
|
数据采集 存储 数据可视化
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
1235 0
分布式爬虫框架Scrapy-Redis实战指南
|
7月前
|
数据采集 缓存 NoSQL
分布式新闻数据采集系统的同步效率优化实战
本文介绍了一个针对高频新闻站点的分布式爬虫系统优化方案。通过引入异步任务机制、本地缓存池、Redis pipeline 批量写入及身份池策略,系统采集效率提升近两倍,数据同步延迟显著降低,实现了分钟级热点追踪能力,为实时舆情监控与分析提供了高效、稳定的数据支持。
326 1
分布式新闻数据采集系统的同步效率优化实战
|
8月前
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
2348 7
|
9月前
|
监控 Java 调度
SpringBoot中@Scheduled和Quartz的区别是什么?分布式定时任务框架选型实战
本文对比分析了SpringBoot中的`@Scheduled`与Quartz定时任务框架。`@Scheduled`轻量易用,适合单机简单场景,但存在多实例重复执行、无持久化等缺陷;Quartz功能强大,支持分布式调度、任务持久化、动态调整和失败重试,适用于复杂企业级需求。文章通过特性对比、代码示例及常见问题解答,帮助开发者理解两者差异,合理选择方案。记住口诀:单机简单用注解,多节点上Quartz;若是任务要可靠,持久化配置不能少。
857 4