MO干货 | shuffle执行计划解析(下篇)

分布式和集群有什么区别 分布式和集群的区别 阅读详情

作者:倪涛 MO产品布道师

目录

Part 1.如何处理不均匀数据?

Part 2.Hybrid shuffle

Part 3.Shuffle resue

Part 4.Join reorder

Part 5.总结


在《MO干货|shuffle执行计划解析(上篇)》中,我们分享了shuffle的背景、实现原理等,感兴趣的读者可以通过传送门阅读;今天继续围绕shuffle进行细节解读

Part 1 如何处理不均匀数据?

之前一直用tpch数据集进行举例,但是tpch是一个比较理想的场景,所有数据都是比较均匀分布的。实际生产环境中,很多数据是不均匀分布的。对于不均匀数据,比较简单的做法是使用hash shuffle来保证分桶后的数据是均匀的。由于hash shuffle无法开启colocate优化,因此优化器还是尽可能使用range shuffle,这就需要对数据的分布有比较好的掌握,从而给出更好的分桶算法。

MO的优化器,在计算stats阶段,同时也会根据数据的zonemap来计算数据的分布情况。具体做法是每访问一个zonemap,就假定这个object中的数据在这个zonemap内均匀分布。通过遍历所有的zonemap来计算数据分布,并将计算结果保存在ShuffleRange这个数据结构中。

这里有个细节是对数值类型,假设每个zonemap在自己的min-max区间内数据均匀分布,直接按max从小到大排序。对字符类型,由于每个字符占一个字节,但一个字节的大部分值不会出现在字符串中,对每个zonemap数据均匀分布的假设不成立,所以对每种出现过的字符映射到数字,重新计算每个字符串对应的新值后再按max从小到大排序。

ShuffleRange这个结构里有几个关键的值:

ShuffleRange.Overlap

是一个0到1之间的float64类型变量,表示zonemap之间的重叠度,Overlap越大重叠的部分越多,具体定义为:任意两个zonemap之间重叠的比例的平均值的平方根,取平方根是为了更方便区分重叠度较低的部分数据集。

ShuffleRange.Uniform

是一个0到1之间的float64类型变量,表示数据的平均度,Uniform越大,数据更平均,具体定义为:数据整体平均的密度除以数据最密集处的密度。Uniform接近于1时,考虑直接对整体最大最小值平均划分值来分桶。

ShuffleRange.Result

是一个[]float64,长度为默认分桶数1024,表示相邻两个桶之间的划分值。Result的计算方法为:假设每个zonemap在自己的min-max区间内数据均匀分布,将zonemap排序后计算每一小段的密度并计算划分值。

计算完ShuffleRange之后,优化器会根据overlap,uniform等指标决定是否采用range shuffle。如果数据分布不是很理想,算法无法给出合适的分桶方法,那么只能使用hash shuffle。如果指标合适,说明可以给出合理的分桶方案,则会默认保留1024个桶的分布方法。之后在编译pipeline时,再根据运行时信息,决定实际的分桶数后,重新分出N个桶。限于篇幅具体的算法细节也不再做进一步介绍,感兴趣的同学可以通过MO的源码直接查看相关细节。

Part 2 Hybrid shuffle

对于某些query来说,不满足colocate shuffle join的条件,此时无论使用broadcast join,还是使用shuffle join都达不到很好的性能。例如tpch1T的q9,查询中有个join是(lineitem.l_suppkey = supplier.s_suppkey), (lineitem.l_partkey = part.p_partkey),其中左边lineitem表输出60亿行数据,右边是一个join子树,输出大约四千万行数据。优化器选择l_suppkey这一列作为shuffle列,由于这一列没有排序,所以必然会有大部分数据需要跨CN进行传输。同样以3CN10核为例,需要跨CN传输的数据量为40亿行。会导致性能非常差。此时可以观察到build端只有四千万行数据,传输四千万行的代价远远小于40亿行。

在这种情况下优化器对shuffle策略做了一个优化。首先保证probe端所有数据一定shuffle到本地,其次需要让build端数据shuffle到每个CN,以保证每个CN都能访问到完整的hash表。

具体算法如下:

  1. 首先对每个pipeline,包括build端和probe端都有一个shuffle编号,从0到30,并且一定要保证一一对应。
  2. 对于probe端,例如shuffle算子告诉dispatch算子某个batch需要发送到18号。18%10=8,则8号、18号以及28号算子中,找到哪一个在本地,就发送给对应算子。对应dispatch算子的策略2。
  3. 对于build端,仍然以18号为例,则dispatch算子会将数据发送给8、18以及28这三个算子,确保3个CN都有完整的hash表。对应dispatch算子的策略

这样probe端60亿行全部发往本地,build端四千万行需要复制到3个CN上,发送代价仅有八千万行,远远小于40亿。与普通shuffle join相比,大大减少了跨网络数据传输。而与broadcast join相比,跨网络传输代价相同,但是每个hash表的大小只有broadcast join的十分之一。此时可以得到最佳的性能。由于兼顾了shuffle join和broadcast join的有点,所以这种执行计划叫做hybrid shuffle join。

但是这种策略下,每个CN都有完整的hash表,所以如果单CN内存不够大,不足以存放完整hash表时,可能需要spill,此时hybrid shuffle join就未必比普通shuffle join更优。另外如果probe端比build端并没有大很多,而CN数量又很多,hybrid shuffle同样也未必由于普通shuffle join。需要优化器和pipeline综合考虑得到最优计划。在explain结果中,通过查看是否存在HYBRID关键字,可以看到优化器是否为当前的shuffle join开启这一策略。例如tpch1T q3、orders join customer就采用了hybrid shuffle。

QUERY PLAN
Project
  ->  Sort
        Sort Key: sum(lineitem.l_extendedprice * (1 - lineitem.l_discount)) DESC, orders.o_orderdate INTERNAL
        Limit: 10
        ->  Aggregate
              Group Key: lineitem.l_orderkey, orders.o_orderdate, orders.o_shippriority shuffle: REUSE 
              Aggregate Functions: sum((cast(lineitem.l_extendedprice AS DECIMAL128(38, 2)) * (1 - cast(lineitem.l_discount AS DECIMAL128(38, 2)))))
              ->  Join
                    Join Type: INNER   hashOnPK
                    Join Cond: (lineitem.l_orderkey = orders.o_orderkey) shuffle: range(lineitem.l_orderkey)
                    ->  Table Scan on tpch_1000g.lineitem
                          Filter Cond: (lineitem.l_shipdate > 1995-03-29)
                          Block Filter Cond: (lineitem.l_shipdate > 1995-03-29)
                    ->  Join
                          Join Type: INNER   hashOnPK
                          Join Cond: (orders.o_custkey = customer.c_custkey) shuffle: range(orders.o_custkey) HYBRID 
                          ->  Table Scan on tpch_1000g.orders
                                Filter Cond: (orders.o_orderdate < 1995-03-29)
                                Block Filter Cond: (orders.o_orderdate < 1995-03-29)
                          ->  Table Scan on tpch_1000g.customer
                                Filter Cond: (customer.c_mktsegment = 'HOUSEHOLD')

Part 3 Shuffle reuse

某些场景下,shuffle join的结果又需要进行shuffle group。如果选择的shuffle列相同,shuffle策略也相同,那么shuffle group实际不需要再进行一次shuffle,直接在pipeline中让join的结果输出给group算子,group算子再输出结果即可。此时性能最佳。

以tpch1T,q13为例,right join和group使用了相同的分组策略,优化器也选择了相同的shuffle策略。此时probe结果可以直接给group算子,避免重复的shuffle。可以在explain语句中查看是否存在REUSE关键字,来查看优化器是否开启这一优化。

QUERY PLAN
Project
  ->  Sort
        Sort Key: count(*) DESC, c_orders.c_count DESC
        ->  Aggregate
              Group Key: count(orders.o_orderkey)
              Aggregate Functions: starcount(1)
              ->  Aggregate
                    Group Key: customer.c_custkey shuffle: REUSE 
                    Aggregate Functions: count(orders.o_orderkey)
                    ->  Join
                          Join Type: RIGHT   hashOnPK
                          Join Cond: (orders.o_custkey = customer.c_custkey) shuffle: range(orders.o_custkey)
                          ->  Table Scan on tpch_10g.orders
                                Filter Cond: (not (orders.o_comment like '%pending%accounts%'))
                          ->  Table Scan on tpch_10g.customer

在优化器中,考虑到shuffle reuse之后,搜索空间会变得很大,策略会变得非常复杂。例如某个join原本不适合走shuffle,但是考虑到子节点或者父节点走了shuffle,当前节点可以直接reuse,就应该走shuffle的执行计划。即使对于确定了应该走shuffle的执行计划,也要考虑是否支持colocate,是否应该使用hybrid shuffle,应该选择range shuffle还是hash shuffle。这里对优化器是非常大的挑战。目前MO优化器通过多遍搜索的方式来寻找最优执行计划,具体细节限于篇幅不在这里介绍,感兴趣的同学可以通过MO的源码直接查看相关细节。

Part 4 Join reorder

在查询优化中,代价是衡量一个执行计划好坏的标准,通常代价代表了一个执行计划的执行时间或者对数据库系统资源的占用量,包括 CPU 资源、IO 资源、网络资源等。在单机执行中,代价模型通常只需要考虑 CPU 和 IO 就可以。但是在分布式的场景中,除了考虑 CPU 和 IO 的代价之外,还需要考虑网络传输代价、查询的并行度以及一些分布式特定优化场景的代价,比如 bloom filter 的代价计算等。这些因素从根本上提升了分布式代价模型设计和拟合的复杂性,也从一定程度上增加了整个分布式查询优化的复杂性。

从本质上来说,一个单机最优的join order,在分布式状态下未必是最优。为了解决分布式查询优化带来的复杂性,跟业界的大部分解决方案类似,MO的优化器采用二阶段的分布式查询优化方法。首先使用单机的join order算法,求解出一个单机最优的执行计划。然后对执行计划进行二次扫描,为每个算子确定其分布式执行计划,是应该使用merge group还是shuffle group,是应该用broadcast join还是shuffle join。在这个过程中,还会经历多次递归扫描,判断是否可以开启colocate shuffle,是否需要使用hybrid shuffle,是否满足shuffle reuse的条件等等。

以tpch1T Q10为例,在单机环境下得到的最优执行计划,和加入shuffle执行计划后,分布式场景下搜索到的执行计划分别为:

左边是单机场景下最优的执行计划。关键是lineitem最大的表,其他表全部join好之后最后再和lineitem表做join,可以最大程度降低lineitem数据量,避免先做大表的join。但是加入shuffle的搜索空间后,右边才是更优的执行计划。一是直接让lineitem和orders 做join,这个join可以对两侧同时启用colocate shuffle join,性能达到最好。二是让customer和nation的join结果集出现在父节点join的左边,输出结果可以保留customer的排序。这时group节点可以直接reuse join节点的shuffle,避免了重复shuffle。实际测试新的执行计划在分布式场景下比原执行计划性能提升一倍左右。

QUERY PLAN
Project
  ->  Sort
        Sort Key: sum(lineitem.l_extendedprice * (1 - lineitem.l_discount)) DESC
        Limit: 20
        ->  Aggregate
              Group Key: customer.c_custkey, customer.c_name, customer.c_acctbal, customer.c_phone, nation.n_name, customer.c_address, customer.c_comment shuffle: REUSE 
              Aggregate Functions: sum((cast(lineitem.l_extendedprice AS DECIMAL128(38, 2)) * (1 - cast(lineitem.l_discount AS DECIMAL128(38, 2)))))
              ->  Join
                    Join Type: INNER
                    Join Cond: (customer.c_custkey = orders.o_custkey) shuffle: range(customer.c_custkey)
                    ->  Join
                          Join Type: INNER   hashOnPK
                          Join Cond: (customer.c_nationkey = nation.n_nationkey)
                          ->  Table Scan on tpch_10g.customer
                          ->  Table Scan on tpch_10g.nation
                    ->  Join
                          Join Type: INNER   hashOnPK
                          Join Cond: (lineitem.l_orderkey = orders.o_orderkey) shuffle: range(lineitem.l_orderkey)
                          ->  Table Scan on tpch_10g.lineitem
                                Filter Cond: (lineitem.l_returnflag = 'R')
                          ->  Table Scan on tpch_10g.orders
                                Filter Cond: (orders.o_orderdate < 1993-06-01), (orders.o_orderdate >= 1993-03-01)
                                Block Filter Cond: (orders.o_orderdate < 1993-06-01), (orders.o_orderdate >= 1993-03-01)

Part 5 总结

Shuffle的执行计划在优化器中是非常重要的一块,限于篇幅这里只介绍了其中比较重要的一部分,更多细节和相关实现代码欢迎直接查看MO源代码。

About MatrixOne

MatrixOne 是一款基于云原生技术,可同时在公有云和私有云部署的多模数据库。该产品使用存算分离、读写分离、冷热分离的原创技术架构,能够在一套存储和计算系统下同时支持事务、分析、流、时序和向量等多种负载,并能够实时、按需的隔离或共享存储和计算资源。 云原生数据库MatrixOne能够帮助用户大幅简化日益复杂的IT架构,提供极简、极灵活、高性价比和高性能的数据服务。

MatrixOne企业版和MatrixOne云服务自发布以来,已经在互联网、金融、能源、制造、教育、医疗等多个行业得到应用。得益于其独特的架构设计,用户可以降低多达70%的硬件和运维成本,增加3-5倍的开发效率,同时更加灵活的响应市场需求变化和更加高效的抓住创新机会。在相同硬件投入时,MatrixOne可获得数倍以上的性能提升

关键词:超融合数据库、多模数据库、云原生数据库、国产数据库。

手把手教你学simulink(8.39)--基于Simulink的步进电机(Stepper Motor)仿真实例 通过这个仿真实例,你可以学习如何使用Simulink构建和仿真步进电机(Stepper Motor)系统。你可以根据实际需求调整模型和参数,进行更复杂的仿真和分析。希望这个例子对你有所帮助,祝你学习愉快! 阅读详情

相关推荐

uniapp+openlayers集成天地图实战:renderjs通信陷阱与性能优化避坑指南

本文深入探讨了uniapp与openlayers集成天地图时的renderjs通信陷阱与性能优化策略。通过实战案例解析了renderjs的特殊通信机制、地图实例生命周期管理、图层懒加载等关键技巧,帮助开发者避免常见坑点,提升应用流畅度。特别针对多语言切换、热重载偏移等疑难问题提供了解决方案,是uniapp+openlayers开发者的实用避坑指南。

weixin_30872157的博客 362

MO干货 | shuffle执行计划解析(上篇)

在这个例子中,优化器会告诉scan算子,block zonemap处于1-20亿之间的数据在CN1上读取,20亿-40亿之间的数据在CN2上读取,40亿到60亿之间的数据在CN3上读取。同时优化器会告诉shuffle join,1-20亿之间的数据需要shuffle到CN1上进行计算,20亿-40亿之间的数据shuffle到CN2上计算,40亿到60亿之间的数据在CN3上计算。对scan算子的shuffle,是在编译pipeline的阶段,将所有需要读的block分发到多个CN上。,并且输出分桶后的数据。

MatrixOrigin的博客 963

【低空经济】多源异构数据融合的低空智能感知系统设计与实现

本文探讨了低空智能感知系统在多源异构数据融合中的设计与实现,重点解决无人机等低空飞行器的安全监测问题。通过雷达、光学和红外传感器的数据融合,系统识别准确率提升至92%,并实现120ms的低延迟处理。文章详细介绍了时空对齐、特征级融合和动态权重自适应等关键技术,为低空经济发展提供可靠技术支持。

weixin_29065659的博客 344

AI分布式Token中转站网关底层实现-东方仙盟

在终端优先同步架构下,所有终端智能体请求不再直连上游 MaaS 平台(千帆、百炼、DeepSeek 等),全部经由分布式 Token 中转站网关统一中继。网关承担虚拟客户密钥签发、上游子账号路由、前置内容安全审计、事务路由调度、可控网络震荡多上游链路容灾、SSE 流式透传、用量记账、封禁熔断、原始 IP 封包签名溯源等核心职责。本文基于 Go 实现分布式网关核心底座,复用架构原有无状态 Token 穿透、事务 ID 幂等、链路探活、多节点中继能力;区分两层密钥体系:面向终端客户的虚拟 Key。

cybersnow精通 28 门计算机语言,凭借其超凡的技术能力,成功开发过上万个应用,广泛涉及政府、商业、个人等众多领域,甚至在检察院、环保局、公安局等专业场景中也大放异彩。不仅熟练掌握单片机和物联网开发,在软件架构设计方面更是独树一帜,自创了跨平台软件 261

WPS中VBA支持库安装全攻略:从报错到一键解决

VBA作为Office生态中广泛使用的宏语言,是办公自动化的重要基础。WPS表格虽然兼容Excel文件格式,但出于技术路线与授权原因,默认并未集成完整的VBA引擎与开发环境,导致用户打开含宏文件时频繁遇到“找不到工程或库”“未找到VBA支持库”等报错。理解VBA支持库包含引擎与IDE两层结构,并掌握系统位数、版本匹配、安全软件拦截等前置条件,是成功部署的关键。通过可靠的安装源与规范流程完成配置后,即可实现在WPS中运行Excel宏、批量处理数据、自定义函数等自动化场景,显著提升报表处理效率。本文围绕WPS中

weixin_31102231的博客 314

用友U8库龄分析避坑指南:物料出入库日期计算的5个常见错误

本文深入剖析了在用友U8系统中进行库龄分析时,物料出入库日期计算的五个常见陷阱。从数据源选择、业务类型过滤、计价方式逻辑、期初数据处理到查询性能优化,逐一解析错误根源并提供避坑指南,帮助企业获得准确的库龄数据,有效管理库存与资金风险。

weixin_29209801的博客 456

HarmonyOS 分布式深度:跨端迁移、数据对象与多设备协同

本文深入解析鸿蒙分布式能力实战,聚焦跨端迁移、协同与共享三大形态,详解权限配置、设备发现、onContinue状态管理及分布式数据对象、KV同步机制。强调“先分清场景”“前置条件必全”“数据需重验”,揭示迁移失败、同步失效等七大常见坑,指导开发者规避陷阱,实现真实可用的多设备协同。

信息安全领域优质创作者|操作系统领域专家 131

基于PI双闭环解耦控制的三相SVPWM电压型逆变器(1)--数学模型

三相电压型逆变器、双PI控制、SVPWM、解耦

weixin_58670090的博客 1万+

从单机到分布式:定时任务如何处理大量数据与执行失败?

所有子任务执行后,可以进入汇总阶段。统计成功数量。统计失败数量。汇总处理结果。判断是否需要触发后续任务。Reduce 不只是简单地把所有结果加起来。它还可以承担任务完成判断和后续流程衔接。另外,是否执行 Reduce、如何处理失败子任务,需要根据框架配置和业务逻辑设计。如果不需要汇总,可以使用只负责 Map 分发的模式。能力解决的问题任务调度什么时候执行任务分片工作如何分配批量处理如何控制单次处理的数据量失败恢复出错之后如何继续结果校验如何确认业务真正完成。

dshizixu的博客 187

Qt C++ 串口调试助手

1. **串口配置**:支持自动检测可用串口,可配置波特率(9600~921600)、数据位(5~8)、校验位(无/奇/偶/标记/空格)、停止位(1/1.5/2)。- HEX 模式发送时,输入格式需为十六进制字符(0-9、A-F),可带空格(如 `01 A3 FF`)或不带空格(如 `01A3FF`)。// 发送模式:true=HEX,false=ASCII。// 字符串转HEX字节数组。ui->parity->addItems({"无", "奇校验", "偶校验", "标记校验", "空格校验"});

寒寒豆豆软件公司的博客 148

《QGIS快速入门与应用基础》161:面要素顶点编辑与形状调整

本文系统讲解了QGIS中面要素顶点编辑与形状调整的核心操作。首先明确了顶点编辑的适用场景与核心概念,强调需满足图层类型、编辑模式、要素选择等六大前提。详细介绍了编辑顶点工具(F2键)的激活路径及配套辅助工具,通过耕地地块修正案例,分步骤演示顶点移动、添加(双击/工具栏)、删除(Delete键)三大基础操作。同时提供捕捉工具开启、画布缩放等实用技巧,帮助用户高效完成面要素的精细化调整,解决实际工作中的形状偏差问题。全文图文结合,步骤清晰,适合GIS新手快速掌握面要素编辑的核心技能。

LuckyHanMo的博客 492

EtherCAT从站实现(三):DC同步机制与分布式时钟实现

本文详解EtherCAT伺服从站DC同步机制,解决高精度控制中因主站抖动与传播延迟导致的相位偏差问题。通过ESC硬件维护1ns分辨率全局时间,实现从站自主同步,确保PDO更新与控制环采样精准对齐。核心流程包括传播延迟测量、时钟初始化、漂移补偿及SYNC0/SYNC1信号生成。从站需正确配置DC能力与同步模式,主站则通过DCM机制保障发送周期稳定。调试建议结合示波器与寄存器监控,分阶段验证时序关系,确保多轴协同无误。

yangmu3203的博客 142

【OS】AUTOSAR OS Alarm实现原理

AUTOSAR OS Alarm实现原理

qq_36056498的博客 1025

分布式管控系统技术架构深度拆解:从编解码协议到SM4硬件级安全

支持音视频同步及异步切换、最大16路混音输出这些能力,在方案阶段是参数,在调试阶段是测试项。具备工程替代价值的节点应集成4路IR红外、2路RS232、4路I/O、2路继电器及1路RS485,这一档配置使节点具备直接驱动声、光、电及环境控制回路的能力,在中小型会议室场景中可以替代独立中控主机。H.265/H.264双标准支持是基础,每路视频的主码流与双码流独立控制(VBR/CBR)才是影响带宽规划的关键——双码流的意义在于将本地存储与远端预览的码率策略解耦,全局单一码率在多路并发场景下很难兼顾画质和带宽。

2603_95485477的博客 184

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

集中式与分布式怎么选:从订单读写看 KingbaseES 的架构边界

以订单系统为例,一笔付款会扣账户余额、写一条流水、更新订单状态;月末报表则可能按日期统计所有租户的订单。前者要求几项变更一起提交,后者关心查询会覆盖多大范围。讨论集中式与分布式,先把读写请求分开,比先数数据库节点更容易看清问题。KingbaseES 核心数据库是集中式关系数据库。KES RAC 和 KES TDC 也都可以部署为多节点形态,但它们的数据组织方式并不相同。

todoitbo的博客 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

粮库分布式温湿度采集系统,基于环境数据的粮食霉变预警开发实战

本方案构建基于分布式温湿度采集的粮食霉变预警系统,针对传统粮库监测滞后、误报率高等痛点,通过分层布设传感节点、边缘计算网关与时序数据平台,融合温升速率、露点判别、多因子耦合等算法,实现从“静态监测”到“动态预警”的升级。系统支持平房仓、浅圆仓等多场景部署,具备国产化适配、断网续传、联动通风互锁等功能,结合工单闭环与模型迭代机制,显著提升储粮安全水平,为智慧粮库建设提供可复制的工程范式。

348

动环监控落地:多台以太网温湿度传感器分布式部署、IP 规划、告警配置

本文详解以太网温湿度传感器(H-THRJ45)在机房、库房等场景的动环监控落地实践,对比传统RS485方案,突出其PoE供电、分布式部署、免采集网关优势。重点分享架构设计、点位布设、静态IP规划、网络隔离、Zabbix告警配置及故障排查全流程,强调IP台账、命名规范与分级防抖告警策略,实现多点位高效管理。适用于运维、弱电工程及物联网开发者,助力构建稳定可扩展的环境监控系统。

weixin_41865733的博客 288

基于分布式软总线的鸿蒙跨端数据同步与冲突合并机制

更恐怖的是,有时候平板上修改的记录,连带把手机上的最新数据给直接抹除了。这就导致了灾难性的数据覆盖。假设用户的手机系统时间比平板快了五分钟,那么在这五分钟的窗口期内,用户在平板上做出的任何修改,在同步时都会被手机上的老旧数据无情覆盖。版本号相同但内容不同时,通过业务层的自定义策略进行合并,这才是分布式应用应有的数据一致性保障。痛定思痛,我们放弃了最粗暴的覆盖式同步,全面重构了基于底层分布式数据管理的冲突解决机制。),这样不仅同步极快,发生冲突时,也只会影响单条记录,而不会导致全局覆写。

2502_91284977的博客 274

分布式设备列表拿到了,数据通道选错照样传不过去

分布式协作的设计顺序应该是:先确定数据的一致性语义(状态最终一致 vs 操作恰好一次),再选通道(DDO / KV / RPC / 文件),最后把标识和内容分开。离线期间手机加了三个附件,平板重连后 DDO 会把最终的字段列表对齐,中间某一条“附件关联”的副作用如果涉及独立写入,不会因为 DDO 对齐而自动补执行。的 RPC 通道,这四条路解决的是不同的问题。的场景(扣库存、审批、附件关联),DDO 只能承载最终状态,操作序列需要应用层自己的 outbox 和确认水位来兜底。

2602_97267507的博客 399

从零搭建一个 AI Infra 实验室㉒:KubeRay + Ray Serve——另一条分布式 AI Serving 路线

本篇探索 KubeRay + Ray Serve 这条分布式 AI Serving 路线,介绍 Ray、Task、Actor、RayService 与 vLLM on Ray 的核心原理,并在单节点 Kubernetes 上部署 Ray 集群,通过双 Worker、12 个分布式任务和 20 次 HTTP 请求,验证任务调度与服务分发机制。

mosespaul的博客 581

LabVIEW 加以太网:凹版彩印自动套色的分布式改造

凹版印刷机多色套印,张力波动和材料伸缩会让套色偏差持续漂移。手动对版靠老师傅,模拟电路精度差。把每色一个智能节点挂上以太网、上位机用 LabVIEW 做人机界面,套色偏差实时检测、自动修正,还能经互联网远程监控。

bjcyck的博客 278

【分布式训练①】总论:大模型为什么必须分布式?训练显存分析与并行策略全景

本文是分布式训练系列的第一篇。我们将从最基础的问题出发——为什么大模型必须用分布式训练?单卡到底差在哪?搞懂显存构成,才能真正理解各种并行策略的设计初衷。

Dawson Zhu的博客 423

集中式与分布式怎么选?聊聊KingbaseES的架构取舍

KingbaseES采用集中式架构,强调事务一致性与SQL完整性,适用于对数据关系紧密、复杂查询和强一致性要求高的场景。其支持单机、主备、读写分离及共享存储集群等多种部署模式,在不拆分数据的前提下实现高可用与扩展性。分布式并非万能解药,仅当面临真实容量与吞吐瓶颈时才应考虑。选型应基于业务实际需求,而非概念偏好,避免过早引入复杂度。

稻草人 1万+

优雅草10个开源鸿蒙工业软件项目一详解:鸿蒙星闪无线分布式挤出机温控系统

优雅草开源鸿蒙工业软件项目——星闪无线分布式挤出机温控系统,解决传统有线温控布线难、抗干扰差问题。基于海思WS63模组与SLE低功耗通信,实现4节点无线温控,精度达±1℃,上报周期100ms,指令时延中位数<15ms。采用MAX31855冷端补偿芯片,支持OpenHarmony轻量系统,打样交付4节点+网关样机及完整文档。可广泛应用于混凝土水化热监测、管道伴热等场景,替代复杂有线布线,推动工业物联网智能化升级。开源地址:GitCode | GitHub

一颗优雅草科技-央千澈的优快云博客~只想无穷无尽的学习~作息早8-晚8 670

用势函数做分布式网络优化

首先是方向一致,玩家想让自己代价变小,一定会让势函数变小,玩家代价变大,势函数也一定变大,其次是收敛性,只要势函数有下界,则所有玩家持续优化自身代价的过程,就是势函数持续下降过程,最终一定会停在一个极小值点,最后,纳什均衡等价于势函数极值,势函数的极小值点即纳什均衡,没任何玩家愿单方改策略,因为自己代价不会再降低,势函数也不会再降。这类博弈属势博弈,即存在一个全局的势函数,每个玩家降低自身代价的动作,都会同步让全局势函数下降,个体自私优化的过程,等价于全局势函数的自动优化,最终一定会收敛到纯策略纳什均衡。

TCP/IP 437

跨园区分布式环境监控:以太网温湿度传感器云边协同组网方案

很多企业拥有多个独立园区、异地机房、分散库房,传统方案痛点很明显:每个园区单独一套监控平台,数据孤岛;直接把传感器端口映射公网,安全风险高;广域网链路不稳定,断网之后完全丢失本地数据、告警失效;如果用 RS485 总线,跨园区布线完全不现实。以太网温湿度传感器(H-THRJ45)原生 IP 化、支持 PoE 供电、ModbusTCP/SNMP,天然适合分布式点位采集。但多园区场景,不能简单把所有传感器直接上云,最佳落地方式是云边协同:边缘网关负责本地自治采集、缓存、本地告警;

weixin_41865733的博客 300

拉格朗日函数和分布式传输优化

由于整个网络带宽为各个端到端流的线性叠加,当价格固定,全局拉格朗日函数可拆成各个子问题的和,全局最优即每个子问题分别最优,于是各留便可以价格为共识,各自局部优化。拉格朗日函数的构造,将一个全局控制问题转化为一个分布式控制问题,而这正是网络端到端传输的要旨,给带宽定个价,大家自己买。初涉分布式网络优化的工人接触拉格朗日函数,以为它是个原点,但它只是一个几何直觉的结果,而非原因。,交换机只负责调价,如果总带宽还有剩余,则各取所需,最后供需平衡。为瓶颈排队时延,由总流入速率与链路容量的差积累,

TCP/IP 526
上一篇: MO干货 | shuffle执行计划解析(上篇)
下一篇: 矩阵起源新一年喜报连连!
MatrixOrigin
博客等级 码龄5年 708粉丝 230原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值