01 概述

MindSpore Insight是昇思MindSpore的可视化调试调优工具。作为开发者,我参与了MindSpore Insight工具部分功能的开发。本文将对MindSpore Insight进行简要介绍、其次介绍在开发中所用开发框架Vue的响应式原理。

02 MindSpore Insight介绍

MindSpore Insight为昇思MindSpore提供了简单易用的调优调试能力。在训练过程中,可以将标量、张量、图像、计算图、模型超参、训练耗时等数据记录到文件中,通过MindSpore Insight可视化页面进行查看及分析。MindSpore Insight的宏观上的架构如下图所示。其中Summary log是使用昇思MindSpore训练的模型日志,通过python进行对日志进行解码,将数据处理为json格式的API,前端通过请求该API进行相应功能的展示。详细的介绍可查看官网(https://www.mindspore.cn/mindinsight/docs/zh-CN/master/index.html)或点击下方“阅读原文”

03 浅谈Vue2响应式原理

Vue是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。它的核心功能有声明式渲染和响应式,Vue 会自动跟踪 JavaScript 状态并在其发生变化时响应式地更新 DOM。如下图所示,当data属性中的数据发生变化时,其视图就会更新,不需要用户操作DOM就可让视图更新。那么Vue是如何知道更新的是这些数据呢?这就涉及到Vue响应式的实现原理。

Vue的响应式是指以数据驱动视图的,也就是数据发生变化,会重新渲染页面。该过程实现要考虑的有以下三点:

● 数据劫持:追踪数据的变化

● 依赖收集:收集视图依赖的数据

● 通知视图:数据变化时,通知视图部分更新

3.1 数据劫持和依赖收集

数据劫持:指的是在访问或者修改对象的某个属性时,通过一段代码拦截这个行为,进行额外的操作或者修改返回结果。在下面的代码很好地诠释了数据劫持。当给obj中的name属性赋值的时候,会触发defineProperty方法中的set函数,而访问obj中的name属性值的时候会触发get函数,在这里set函数和get函数就拦截了访问和修改对象属性的这个行为,在get中和set中可以写上额外的操作,这就是数据劫持。

/*Object.defineProperty(obj,prop,descriptor)obj 要定义属性的对象prop 要定义或修改的属性的名称descriptor 要定义或修改的属性描述符输出结果:数据劫持 set name : 张三数据劫持 get name : 张三张三
*/
const obj={}
Object.defineProperty(obj,"name",{get(){console.log("数据劫持 get name :",nameVal);return nameVal;},set(newVal){console.log("数据劫持 set name :",newVal)nameVal = newVal}
});
obj.name="张三";
console.log(obj.name)

依赖收集:视图中用到了哪个数据,视图就依赖哪个数据,把变化的数据收集起来,这个过程就是依赖收集。

3.2实现原理介绍

上图(参考:https://blog.csdn.net/Mikon_0703/article/details/111367773)是Vue实现响应式原理的流程图,主要有三个重要部分:

监听器(Observer):对数据对象进行遍历,利用Object.defineProperty()给属性都加上 setter和getter。这样的话,给这个对象的某个值赋值,就会触发setter,那么就能监听到了数据变化。

事件中心(Dep ):用来收集依赖和通知订阅者。如果属性发生变化,需要通知订阅者Watcher,看是否需要更新。因为订阅者有多个,所以需要一个消息订阅器(发布者)Dep(订阅者集合的管理数组)来专门收集这些订阅者,在Observer和Watcher之间进行统一管理。每个Observer实例都有一个Dep实例。

订阅者(Watcher): 将View的相关指令初始化为一个订阅者Watcher,并替换模板数据或绑定相应的函数,此时当订阅者Watcher接收到相应属性的变化,就会执行对应的更新函数,从而更新视图。

3.3 Vue源码中的体现

Vue2中响应式实现的源码链接:https://github.com/vuejs/vue/blob/v2.6.14/src/core/observer

监听器(Observer)的实现

//https://github.com/vuejs/vue/blob/v2.6.14/src/core/observer/index.js
walk (obj: Object) {const keys = Object.keys(obj) // 遍历数据对象利用 Object.defineProperty()给属性都加上 setter和getter。for (let i = 0; i < keys.length; i++) {defineReactive(obj, keys[i])}}export function defineReactive (obj: Object,key: string,val: any,customSetter?: ?Function,shallow?: boolean
) {const dep = new Dep()const property = Object.getOwnPropertyDescriptor(obj, key)if (property && property.configurable === false) {return}// cater for pre-defined getter/settersconst getter = property && property.getconst setter = property && property.setif ((!getter || setter) && arguments.length === 2) {val = obj[key]}let childOb = !shallow && observe(val)Object.defineProperty(obj, key, {enumerable: true,configurable: true,get: function reactiveGetter () {const value = getter ? getter.call(obj) : valif (Dep.target) {dep.depend() // 收集依赖if (childOb) {childOb.dep.depend()if (Array.isArray(value)) {dependArray(value)}}}return value},set: function reactiveSetter (newVal) {const value = getter ? getter.call(obj) : val/* eslint-disable no-self-compare */if (newVal === value || (newVal !== newVal && value !== value){return}/* eslint-enable no-self-compare */if (process.env.NODE_ENV !== 'production' && customSetter) {customSetter()}// #7981: for accessor properties without setterif (getter && !setter) returnif (setter) {setter.call(obj, newVal)} else {val = newVal}childOb = !shallow && observe(newVal)dep.notify() // 当数据发生变化时,事件中心Dep通知订阅者}})
}

Dep的实现

//https://github.com/vuejs/vue/blob/v2.6.14/src/core/observer/dep.js
export default class Dep {static target: ?Watcher;id: number;subs: Array<Watcher>;constructor () {this.id = uid++this.subs = []}addSub (sub: Watcher) {this.subs.push(sub)}removeSub (sub: Watcher) {remove(this.subs, sub)}depend () {if (Dep.target) {Dep.target.addDep(this)}}notify () {// stabilize the subscriber list firstconst subs = this.subs.slice()if (process.env.NODE_ENV !== 'production' && !config.async) {// subs aren't sorted in scheduler if not running async// we need to sort them now to make sure they fire in correct// ordersubs.sort((a, b) => a.id - b.id)}for (let i = 0, l = subs.length; i < l; i++) {subs[i].update() //当数据发生变化时,通知订阅者更新视图}}
}

Watcher的实现

//https://github.com/vuejs/vue/blob/v2.6.14/src/core/observer/watcher.js
/*** Subscriber interface.* Will be called when a dependency changes.*/update () { // 订阅者更新视图方法/* istanbul ignore else */if (this.lazy) {this.dirty = true} else if (this.sync) {this.run()} else {queueWatcher(this)}}

04 总结

首先感谢昇思MindSpore社区提供的这次开源机会,这是我第一次参加开源项目,从这次开源经历中让我掌握了项目的开发流程,以及开源社区中的成员如何协同开发维护一个项目,另外此次开源经历,让我了解了小白如何参与开源、如何正确的提交PR。最后,我引用Apache APISIX PMC成员王院生的一句话:”参与开源,让我觉得自己终于与这个世界融为一体,不再是孤立的个体“ ,我也会继续参与开源,持续为开源贡献自己的一份力量。

项目分享 | MindSpore Insight AI可视化工具开发心得相关推荐

  1. 【PBL项目实战】户外智慧农场项目实战系列——3.云端可视化页面开发及设备数据源的配置与调试

    [PBL项目实战]户外智慧农场项目实战系列--3.云端可视化页面开发及设备数据源的配置与调试 原文链接  https://mp.weixin.qq.com/s/5OT57-_QlN7lwRMWvey4 ...

  2. java 安卓界面 可视化_Monkey可视化工具开发(android篇)

    前几天分享了pc端的monkey可视化工具,今天来分享一下如何用android实现monkey的运行,原理是执行shell命令,各种传参,该工具需要root授权 先附上两个效果图: image.png ...

  3. 【PinkCAx】可视化工具开发记录与总结

    -----------PinkCAx----------- 仅以此篇,记录我的一次可视化软件开发尝试点滴. 简介 PinkCAx是一款采用Python语言编写的,基于QT5+VTK架构的三维可视化工具 ...

  4. 电商项目_使用Quick BI 可视化工具进行展示

    五.使用阿里云产品进行数据可视化(Quick BI) 结果看板 https://bi.aliyuncs.com/token3rd/dashboard/view/pc.htm?pageId=404598 ...

  5. VsCode工具开发vue项目必装插件

    VsCode工具开发vue项目必装插件 目录 VsCode工具开发vue项目必装插件 1.概述 2.VsCode插件清单 2.1.Vetur插件让vue文件代码高亮 2.2.Vue VSCode Sn ...

  6. processing文本可视化_推荐7个数据可视化工具,让你的信息快速生成可视化

    现在我们对可视化信息的需求越来越高,可视化信息比传统的文本信息更吸引眼球,方便阅读,加深记忆,因此也可以更快地被人们传播出去.近年来涌现出了许多数据可视化工具.有哪些值得使用呢?下面与大家分享九大数据 ...

  7. 主流的数据可视化工具介绍

    作为一个自诩对全球分析平台了如执掌的资深数据从业人员,给各位分享分享主流的数据可视化工具. 一.可视化平台 1.FineBI 虽作一个BI工具,但是可视化效果很好,可制作Dashboard.优势在于一 ...

  8. pytorch学习笔记(八):PytTorch可视化工具 visdom

    Visdom PyTorch可视化工具 本文翻译的时候把 略去了 Torch部分. 项目地址 一个灵活的可视化工具,可用来对于 实时,富数据的 创建,组织和共享.支持Torch和Numpy. 总览 基 ...

  9. 推荐九个数据可视化工具,快速生成可视化信息

    现在我们对可视化信息的需求越来越高,可视化信息比传统的文本信息更吸引眼球,方便阅读,加深记忆,因此也可以更快地被人们传播出去.近年来涌现出了许多数据可视化工具.有哪些值得使用呢?下面与大家分享九大数据 ...

最新文章

  1. 在python中定义类时、运算符重载_自定义 Python 类中的运算符和函数重载(上)...
  2. 用姓名字段统计人数_2019年度全国各地姓名报告分析汇总(全国、深圳、佛山、杭州)...
  3. 今天就唠叨唠叨吧……
  4. php连接函数config,smarty内置函数config_load用法实例
  5. GMF 教程 Mindmap 6
  6. python爬取天气数据的header_[python爬虫]爬取天气网全国所有县市的天气数据
  7. 【机器学习】隐马尔可夫模型及其三个基本问题(三)模型参数学习算法及python实现
  8. spring事件监听器系列三:通过ApplicationListener接口方式实现监听器源码
  9. linux如何跳到命令行开端,Linux快捷键大全
  10. 进化算法之粒子群算法介绍附代码——PSO
  11. 数据结构基础之基础(数据、计算机结构)
  12. 每日一问-ChapGPT-20230416-中医基础-经络
  13. 【Java】LeetCode 174. 地下城游戏 —— 困难
  14. 2017 ACM Arabella Collegiate Programming Contest(solved 11/13)
  15. 深入理解矩阵的特征值和特征向量
  16. 一季度全国主要城市交通分析报告 高德发布
  17. 孩子近视为什么不让立马配眼镜?近视还有真假之分?
  18. 图像处理课设(奇怪版)
  19. 人脸专集5 | 最新的图像质量评价
  20. 基于OpenCV的车辆计数(一)

热门文章

  1. 嵌入式 - 晶振频率的来源和UART波特率的选择
  2. 常用标签以及文本标签(下)
  3. 三重优化,用实践解读电商平台 GMV 增长背后的故事
  4. 微信小程序云开发---vant组件 van-uploader 实现视频文件上传到云存储,发动态功能
  5. HDU 跑跑卡丁车
  6. win10添加网络打印机_安装网络、无线、蓝牙、共享打印机,在win10上这样操作...
  7. Word - 你不知道的『熟能生巧』(持续更新中...)
  8. WordPress PHP版本:2023年用于WordPress的最佳PHP版本
  9. 苹果手机怎么清理内存垃圾?收藏好这些方法!
  10. 六维力传感器的温度特性和温度补偿