从 Darknet 到 Tensorfow 图像识别一站式平台的工程实践 张力柯

QCon大会

2019/06/25 发布于 技术 分类

QCon  QCon2019 

文字内容
1. 从 Darknet 到 Tensorflow: 图像 识别一站式平台的工程实践 张力柯( Like Zhang ) 腾讯互娱 Turing Lab 副总监
2. 自我介绍
3. 自我介绍 2008~2011 Core Operating System, Microsoft, Redmond 2008 University of Texas at San Antonio, PhD in Computer Science 2017~现在 2013~2015 回国创业, 移动游戏 2011~2012 Tagged/Funzio/Gree, San Francisco Tencent IEG, Turing Lab副总监 2015~2017 BCG, Uber, Data Platform & Mobile
4. 目录 Ø 图像识别的落地误区 Ø 图像识别从工具到平台 Ø 数据标注 Ø 模型训练 Ø 服务部署 Ø Demo
5. 图像识别服务:Good Enough? Google Vision API Example: Azure Vision API Example:
6. The Next Step 视觉识别算法研究人员 我们能识别汽车了! 可是识别汽车没有实际意义啊,我 们需要识别具体车的类型和型号 视觉识别算法研究人员 应用设计人员/PM/开发工程师 没有关系,原理是一样的,给你们一段代 码,你们照着用就行 …我还能说什么? 应用设计人员/PM/开发工程师
7. Then 应用开发人员 训练的数据你们从哪里来的啊? 都是标准数据集啊?什么?新的数据?需要 你们自己采集并标注啊。。。 应用开发人员 我们标注了一万多张图片,为什么没达到 效果呢? 哦,我们用的Imagenet/COCO这些数据集 最少都有几十万张图片 应用开发人员 算法设计人员 算法设计人员 我们的部署环境是Tensorflow,你用 pytorch写的模型怎么转化啊? 我们不负责这个工作啊,你那边研究一下 呢? 算法设计人员
8. 哪里出了问题? 算法人员关注点 开发人员关注点 Batch Size/Learning Rate和 Recall/Accuracy的关系 数据哪里来?怎么存?怎么方便导入? 修改调整不同Layer,提高模型整体测 试准确率 至少要标注多少才能达到可用标准?并 不追求“最佳效果” 以第三方数据集为准,assume 数据集 真的是ground truth 标注数据集是否真的准确,是否能反应 实际线上情况? 本地完成算法模型为目标,部署环境是 什么? 算法能否在生产环境部署?不能部署或 者难以扩展的都不能投入生产
9. 如何解决? 算法研究人员 应用开发人员 统一机器学习平台(数据、标注、训练、调试、部署) Google Cloud Microsoft Azure
10. 需要考虑的问题 数据标注价值 Ø 行情:标注一个目标¥0.20, 一张图¥1.00 数据敏感性 Ø 员工照片 Ø 尚未发布的新产品外观 Ø 特殊设施内部照片 内部定制平台 的必要性 训练所耗资源 Ø GPU难以并行化 Ø 图像识别模型复杂度通常超过常见 机器学习模型
11. 目录 Ø 图像识别的落地误区 Ø 图像识别从工具到平台 Ø 数据标注 Ø 模型训练 Ø 服务部署 Ø Demo
12. Age of Tools 图片存储 本地文件包 图片标注 开源工具(Labelme) 模型训练 采用同样的ML框架 重写算法(C++/Java) 自定义模型更新、版本控制等策略 生产部署 本地开发机+GPU+机器学习框架 (Keras/PyTorch/TF/MXNet) 好麻烦,每一步都是单独操 作,然后文件到处Copy
13. Age of Service 图片存储 图片标注 模型定义 模型训练 生产部署 分布式文件系统 (HDFS/Ceph/etc.) 在线图像标注 Ø Ø Ø Ø 算法研究人员根据训练服务要求定义模型 提交模型定义 专门训练服务开始training 根据结果调整修改 规定统一机器学习Inference框架 稍微现代化一点点,起码不用到 处Copy标注文件了。然而,有 必要每次都去定义新模型吗?
14. Age of Platform 图片存储 分布式文件系统(HDFS/Ceph/etc.) 查询/索引(Mysql/ES/etc.) 图片标注 选择模型 模型训练 生产部署 在线图像标注 多种标注格式 Ø Ø Ø Ø 选择预定义模型,而无需开发定义 提交到专门的训练服务 快速结果预览 根据结果调整修改 Ø Ø Ø Ø 统一机器学习Inference框架 分布式服务 负载均衡 On Demand Deployment 这看起来像样多了!
15. 基于Yolo的图像识别平台框架(Darknet Based) 选择模型及参数 Detection 采集图片 设置数据路径 本地标注 复制到训练用机器 设置网络模型参数 AI模型 开始训练(单机) Darknet框架 Darknet框架
16. 基于Yolo的图像识别平台框架(Tensorflow Based) 选择模型及参数 上传图片集 创建训练任务 标注系统 Task Queue 预览/测试 Trainer #1 Keras Detection Tensorflow Serving /models/model10 /models/model11 /models/… Trainer #2 Keras Scheduling Service Task Queue 标注数据 AI模型 TF Pb文件
17. What's the Benefit? Ø 无需Copy Ø 无需单独配置数据 01.可共享的文件数据 Ø 解决有限GPU资源问题 Ø 提高团队工作效率和方法 02.训练队列 Ø 遵循Tensorflow最佳实践 Ø 充分利用传统资源实现 Inference balance 03.Training/Inference 分离
18. 目录 Ø 图像识别的落地误区 Ø 图像识别从工具到平台 Ø 数据标注 Ø 模型训练 Ø 服务部署 Ø Demo
19. Labeling: 被忽视的一环 通常外包服务完成 开源工具:面向研究人员,使用门槛高,大多是单机工具 Opencv: cvat Segmentation Editor Ø 功能过多 Ø 界面复杂 Ø 单机工具
20. 可借鉴的工具 LabelMe LabelImg Ø 简化功能:只标注矩形框 Ø 支持自定义分类 ->快速定义分类 Ø Web服务(LabelMe) Ø 标注数据集导出->(上万张图片;会耗费较长时间) Ø 快速浏览 Ø 按照Collection组织图片(idea from LabelMe) Annotation_tools for coco
21. Labeling Workflow 图片预处理队列 上传图片 - 多张图片 - 打包上传 创建数据集 (collection) 第三方本地训练 标准库 storage 导出 10K+图片+标注 - PASCAL VOC - COCO 自定义的下一阶段 (模型训练) 10K+图片 - unzip - Resize - index 直接使用 开始标注 Web Client – 标注添加 – 标注修改 – 标注删除
22. 实践效果 图片快速选择 快速自定义标签 Before - 工具: LabelMe - 标注效率(单人):~500张/小时 * After - 工具: 在线平台 - 标注效率(单人):~1000张/小 时 * 每张图约4~5个目标 分色显示不同目标框
23. 目录 Ø 图像识别的落地误区 Ø 图像识别从工具到平台 Ø 数据标注 Ø 模型训练 Ø 服务部署 Ø Demo
24. Why Yolo? input CNN Ø Ø Ø Ø Ø One Stage Detection Fast Accurate Enough Easy to implement! 简单即是美 Feature map 7x7 grid YOLOv1, 2016 7 7 YOLO Layer Prediction for each cell – Anchor Box调整(k-means) – 不同尺度数据增强 YOLOv2, 2016 – Resnet – 3种尺度分别识别 YOLOv3, 2018
25. Why not Darknet? yolov3-tiny.cfg Darknet的优势 yolo source code Ø Ø Ø Ø 灵活 便于修改网络定义 利于设计新网络 C实现,单机速度远大 于Python Darknet的缺陷 实际需求: Ø 只需要稳定可靠的网络结构 Ø 网络模型不多变 Ø 毋需在线调试新网络 框架本身: Ø 无法使用其他框架中的大量资源 Ø 只适用于Yolo模型 Ø 无分布式训练支持
26. Rewrite YoloV3 in Keras 读入上一步生成的anchor数据 创建训练数据集 数据增强生成 创建模型 开始训练
27. Local Training vs Online Training Local Training Online Training 面向人员 算法研究人员 应用开发人员 启动训练 只能启动一个 可启动多个 训练过程中 等待(单机) 做其他工作 主要需求 最好的GPU(单机速度) 尽可能多的训练节点(任务并发) 效率瓶颈 单机训练速度 可用于训练的节点数量 原因 研究新模型,需要快速对比新旧模型的效果,并快速 只使用默认模型,模型训练一次可用较长时间, 修改再次训练 单个模型训练时长关系不大。
28. 训练架构设计 选择数据集 查看训练worker集群状态(负载) 查看训练任务进度(epoch, loss) 创建训练任务 最终模型mAP 测试图片识别可视化 Kubernetes 训练任务1 训练任务队列 (Task Queue) 训练任务2 训练worker1 训练worker2 训练任务3 训练worker3 - On Demand Pod Creating - Pre-allocated Pods 数据库 .h5模型文件
29. 目录 Ø 图像识别的落地误区 Ø 图像识别从工具到平台 Ø 数据标注 Ø 模型训练 Ø 服务部署 Ø Demo
30. 早期架构 对外服务(build on Flask or Django) 模型库 模型 模型更新服务 业务逻辑 下载服务 模型 模型更新服务 业务逻辑
31. 问题与需求 Tensorflow Serving Ø 如何对不同模型定义合适的Web接口? Ø 如何对模型服务接口做health check? Ø 高QPS时能处理吗? Ø 专注于Inference的高性能机器学习模型服务 Ø 负责训练完成后模型的整个生命周期 Ø Keras模型能直接用吗? Ø 版本管理 Ø 如何简单管理模型文件及版本? Ø 直接使用 Ø 可扩展
32. Tensorflow Serving and Above docker pull tensorflow/serving model_config_list { config { name: 'yolo3', base_path: '/models/yolo3/', model_platform: "tensorflow" }} docker run -p 8500:8500 -p 8501:8501 --mount type=bind,source="$(pwd)"/serving/yolo3,target=/models/yolo3 --mount type=bind,source="$(pwd)"/tfs_model.config,target=/models/models.config -t tensorflow/serving --model_config_file=/models/models.config 优点: – 简单易用, – 性能优秀 缺点: – 启动后无法动态加载模型 – 需要根据业务特点自行设计routing和balance机制 – 自身不提供水平扩展的工具 TO DO - 利用k8s动态创建/销毁Pod - 利用k8s进行弹性伸缩管理 - 设计类似微服务的routing机制
33. Scalable Model Serving: Kubernetes+Tensorflow Serving – 检查系统资源 – 服务创建(k8s)及配置 – 弹性伸缩(k8s) – Option1: 自动发布模型服务 – Option2: 人工创建模型服务 外部Web请求 Kubernetes Scheduling Service File Storage 模型训练服务 Task Queue 创建Pod Scheduler 1 TF Service Pod #1 TF Service Pod #2 .h5 模型文件 Scheduler 2 存储相关信息 – 读取模型文件 – 进行格式转换(.h5 -> .pb) – 创建config 数据库
34. 部署前后对比 Before (Flask + Keras) QPS ~2k(10 pods) 服务模型 3 发布流程 所有服务切换 After (Tensorflow Serving) ~10k(10 pods) >5 不影响其他服务
35. 目录 Ø 图像识别的落地误区 Ø 图像识别从工具到平台 Ø 数据标注 Ø 模型训练 Ø 服务部署 Ø Demo
36. DEMO