• [其他] 边打麻将边养牛?多吃肉
    “边打麻将边在手机上看护养殖场”,这将是怎样的体验?AI摄像头正是开启智慧养殖的第一步。华为云为天视通提供的智能摄像头自定义算法定制部署一体工作流解决方案,基于华为云企业级AI应用开发套件ModelArts Pro与端云协同多模态AI应用开发平台HiLens,不需要高阶AI能力就能覆盖大部分的零散AI定制需求,并能零代码迭代部署AI算法到端侧设备。以牲畜健康监管为例子,天视通利用摄像头从养殖场实际采集到的健康牛和生病牛的一些体态及日常行为特征图片数据,通过ModelArts对监控视频中的牛进行标注,之后再启动模型训练,确认模型的效果后,将该技能一键发布到华为云的AI算法市场AI Gallery。天视通在华为云AI Gallery上,下载新的牛生病行为检测技能到天视通技能管理APP。工作流的算法后装功能,可以通过天视通技能管理APP一键部署到牛场已安装的摄像头里,在家里的监控屏前就能实时看到牛场里每一头牛的状态。天视通技术负责人这样谈到他对AI赋能智慧养殖的理解:“畜牧业是一个智能化启动较晚的行业,但实际上却非常重要,关系到每个家庭的日常生活。这些年食品安全一直处在风口浪尖,产业的规模化和IT技术的应用精准管理成为可能,从养殖过程自动化管理到全流程溯源就是大家如今看到的热门应用。带有AI技能的摄像头不仅在工具层面解决了养殖场的人力问题,通过智能化还能解决禽畜的健康问题。正是得益于华为云AI技术所积累的场景化行业工作流能力,帮助天视通快速完成面向特殊场景算法的开发和一键式远程部署。此次华为云所提供的方案分为四个部分:数据标注:通集摄像头场景需求和少    量数据,华为云利用ModelArts标注工具完成对图片标注;算法训练:工作流内置行业主流标准算法,一键启动即可进行训练,生成算法并能直接查看模型性能;算法优化:训练完之后在平台上就能生成针对具体摄像头硬件的优化过的高性能算法。针对客户的硬件平台,优化适配模型与技能,实现一键技能发布;算法部署:生成的算法部署到实际应用的摄像头中,再结合HiLens的端云部署能力,完成对算法授权管理,上架到手机端的算法市场APP。作为解决方案的核心,华为云EI工作流以业务场景为中心,以“定义场景→分布实施→持续迭代→形成闭环”的模式,通过聚焦各行业可落地的AI开发方式,为服务客户提供基于场景化的工作流,完成全流程的AI开发及迭代。- 降低AI开发门槛:零AI知识、特殊场景,算法定制化开发不在话下借助AI开发低门槛的华为云EI工作流,无需AI知识,天视通员工可基于摄像头产品,无论客户的需求场景是否存在行业特殊性,都能快速定制出符合实际场景应用的算法,从而让天视通快速且准确的提供合作伙伴所需的方案。- 端云协同:零代码部署、后装算法,无惧芯片性能结合华为云的ModelArts Pro和HiLens平台,通过端云协同开发,可将算法零代码迭代部署到端侧的摄像头模组上,操作灵活、迭代迅速,不用投入大量人力手动开发。天视通利用华为云EI工作流的一键式远程部署,实现了算法的快速迭代更新。针对天视通的低端芯片产品,华为云可通过HiLens平台部署算法,让低端芯片硬件运行AI算法也都能毫无压力。同时打通天视通手机侧算法APP市场与华为云AI Gallery,为天视通产品提供可选后装的算法,提升天视通产品在应用场景中的更多可能性。转发自:https://mp.weixin.qq.com/s/cK4p83AXT6_LkZBcw0lgLw
  • [技术干货] 编译器优化那些事儿(2):常量传播
    ## 0.基础知识盘点 * 基本块 (Basic Block) 一个基本块内的指令,处理器会从基本块的第一条指令顺序执行到基本块的最后一条指令,中间不会跳转到其它地方去,也不会有其它地方跳转到基本块的非首条指令上来。 * 控制流图 (Control Flow Graph) 控制流图的节点是基本块,边代表基本块之间的跳转。基本块A到基本块B有一条边,表示基本块A的最后一条指令是一个跳转指令,跳转到了基本块B的第一条指令;或者基本块A的最后一条指令执行完可以顺序的走向基本块B的第一条指令。 * SSA (Static Single Assignment) 静态单赋值,指程序的一种表示形式,在该形式中变量只被赋值一次,如果变量需要更新,会使用一个新的变量。决定使用哪个分支处的变量,会使用Φ函数。 例如 ```c min = a; if(min > b) min = b; return min; ``` 转换为SSA形式为: ```c min = a; if(min > b) min2 = b; return Φ(min, min2) ``` * 局部优化 指基本块内,跨指令的优化。 * 全局优化 过程(函数)内的,跨基本块的优化。 * 过程间的优化 跨过程(函数),编译单元的优化。 ## 1.什么是常量传播 首先来认识一下什么是常量传播,常量传播也叫常量折叠,但有些资料中对它们的定义又是区分开来的。下面来看看它们分别是什么? 常量传播,顾名思义,就是把常量传播到使用了这个常量的地方去,用常量替换原来的变量。 ``` x = 3; y = 4; z = x + y; ``` -> ``` x = 3; y = 4; z = 3 + 4; ``` 什么是常量折叠?常量折叠就是当运算符左右两边都是常数时,把结果计算出来替代原来的那部分表达式。 ``` z = 3 + 4; ``` --> ``` z = 7; ``` 现在的常量传播优化技术能同时实现上面介绍的传播和折叠的功能,所以现在通常不对它们加以区分,本文后续就把常量传播和折叠统称为常量传播了。 **为什么会有常量?** 程序中的常量来源有3种 1. 程序员书写的,比如magic number 1. 宏定义展开后带来的,这种情况在大型工程文件中非常普遍 1. 在程序优化过程中由其它的优化技术带来的常数 **为什么要进行常量传播优化?** 从上面简单的例子中可以看到,常量传播可以把原本在运行时的计算转移到编译时进行,减小了程序运行时的开销。同时常量传播还有助于实现其它的优化,比如死代码消除。 **如何实现?** 前面介绍的常量传播的例子非常简单而且直观。如果程序的控制逻辑比较复杂时,判断一个变量是否是常数,就不是一件简单的事了,需要借助数据流的分析才能判断某个变量是否是常量。而且这个判断是保守的,即不能充分证明某个变量是常量的话就认为它是变量。这种保守的分析结果是可以接受的,因为我们优化程序的时候在性能提升与程序语义保证时优先选择保证程序语义不变。 下面我们先初步学习一下数据流分析。 ## 2.数据流分析 数据流分析常常是为了实现全局优化、过程间优化,或者程序静态分析而进行的分析技术。分析得到的信息可以支撑各种优化技术的落实。 考虑下面这条指令,我们能对它做什么优化呢? ```c z = x + y; ``` `+` 代表各种有效的运算符, 比如+-*/等 最基本的,有下面3种假设: 1. 如果`x`或者`y`是常量,我们可以做常量传播, 用常量值替代变量`x`, `y`。 如果`x`和`y`都是常量,可以在编译时刻把`x+y`计算出来,并赋值给`z`,这样就不会在运行时做这样的计算了。 2. 如果`x+y`在前面已经被计算过了,而且`x`和`y`再没有被赋值过(是一个可用表达式),那么此处就可以将上次计算过的值直接赋值给`z`, 省去再次计算的代价,这样的优化称为公共子表达式的消除。 3. 如果`z`从这里开始到程序结尾再没有被使用(`z`是不活跃变量),或者是有使用,但使用前被重新赋值了(`z`是不活跃变量),那么这个赋值语句是没用的,可以删除掉这条语句。 可以看到对每一种可能的优化,都需要一定的依据。这些依据就需要进行数据流的分析来获取。 下面我们介绍一下非常基础的3种数据流模式。 1. 到达定值 告诉我们在一个程序点上,过程(函数)里的变量分别是在什么位置被定值(赋值)的。常用在常量传播,复制传播上。 2. 可用表达式 告诉我们在一个程序点上,可用的表达式有哪些。常用在公共子表达式消除。 3. 活跃变量 告诉我们在一个程序点上,活跃变量(将来还会用到的变量)有哪些。常用于优化寄存器分配,删除死代码。 ### 2.1 到达定值 #### 2.1.1 转移函数 程序中的每一条语句都会对程序的状态产生影响,程序的状态包括了寄存器的值、内存的值、读写的文件等。对于特定的数据流分析,我们只关心对我们分析或者程序优化有用的那部分内容。比如对到达定值分析,我们只跟踪变量的定值情况,对可用表达式的分析,我们跟踪表达式的生成以及表达式分量的赋值情况,对于活跃变量我们关心变量的赋值和使用情况。 我们用转移函数来表示程序语句对程序状态的影响: $$ OUT=f_d(IN) $$ $f_d$ 是语句d的转移函数。`IN`是语句d前面的程序状态,`OUT`是语句d之后的程序状态。 同样的,基本块对程序状态也有影响,基本块也有转移函数: $$ OUT = f_B(IN) $$ $f_B$ 是基本块B的转移函数,`IN`是基本块B之前的程序状态(也可表示为`IN[B]`),`OUT`是基本块B结束后的程序状态(也可表示为`OUT[B]`)。 不同的分析目的,转移函数不同,对于到达定值分析,如果遇到下面的一条语句 ``` d: u = v + w ``` 我们说这个语句生成了一个对变量`u`的定值`d`,同时杀死了其它对变量`u`的定值。记为:$gen = \{d\}$, $kill = \{其它对u的所有定值\}$ 。 对上面的赋值语句来说,它的转移函数就是: $f_d(x) = gen_d∪(x-kill_d)$ 其中$gen_d= \{d\}$, $kill_d = \{其它对u的所有定值\}$。 基本块的转移函数由基本块的每一个语句的转移函数组合构成。比如2个语句组成的基本块的到达定值转移函数是 $$ \begin{array}{l} f_B(x) &=& f_2(f_1(x)) \\ &=& gen_2∪(gen_1∪(x - kill_1)-kill_2) \\ &=& (gen_2∪(gen_1-kill_2))∪(x-(kill_1∪kill_2)) \\ \end{array} $$ 扩展开来,含有n条语句的基本块的到达定值转移函数是 $$ f_B(x) = f_n(f_{n-1}(..(f_2(f_1(x))..)) = gen_B∪(x-kill_B) $$ 其中 $gen_B = gen_n∪(gen_{n-1}-kill_n)∪(gen_{n-2}-kill_{n-1}-kill_n)∪…∪(gen_1-kill_2-kill_3-…-kill_n)$; $kill_B = kill_1∪kill_2∪…∪kill_n$ 下面我们看一个具体的例子,在下面的这个流图中,每一个基本块生成的定值和杀死的定值已标记在图右侧。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/11/1652233669819777141.png) <center>图1 基本块的生成定值和杀死定值集合</center> #### 2.1.2 数据流分析的基本思想 对每个基本块,根据输入状态,应用转移函数,求解输出状态,循环进行此操作,直到所有的基本块的输出状态不再变化为止。 #### 2.1.3 交汇运算(meet operator) ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/11/1652233699437267531.png) <center>图2 数据流分析-交汇运算符的意义</center> 对于上面的控制流图,B2前驱节点包括B1和B2自身。B2的输入状态需要汇合B1结束后的状态`OUT[B1]` 和 B2结束后的状态`OUT[B2]`, 如何汇合呢?这取决于我们的分析目的,对于到达定值分析,我们要汇集所有路径上过来的定值集合,所以对前驱节点的输出做并集运算`OUT[B1]∪OUT[B2]`;而对于可用表达式分析,只有每一条通往此基本块的路径上都有这个表达式的生成时我们才说这个表达式在此基本块上是可用的,所以交汇运算是求交集`OUT[B1]∩OUT[B2]`。交汇运算用符号`∧`表示。 对上面的这个控制流图中的B2基本块,在第一次分析时,它自身的输出是初始化的值`∅`, 第二次分析时,它的输出就是上一次分析后得到输出了,就可能不再是`∅`了。这样迭代多次后,它的输出不再变化。当所有的基本块的输出都不再变化时,我们说这个时候到了一个定点(**fix point**)。 当分析达到定点时,数据流分析的结果也就得到了。 #### 2.1.4 到达定值分析的迭代算法 $$ \begin{array} {l} OUT[ENTRY] = ∅; \\ for (除ENTRY之外的每个基本块B) \\ \qquad OUT[B] = ∅; \\ while (某个OUT值发生了变化) \{ \\ \qquad for (除ENTRY之外的每个基本块B) \{ \\ \qquad \qquad IN[B] = \cup_{p是B的一个前驱}OUT[P]; \\ \qquad \qquad OUT[B] = gen_B∪(IN[B] - kill_B); \\ \qquad \} \\ \} \\ \end{array} $$ 说明:此算法是非SSA表示上的到达定值分析的算法,这里用这个相对来说比较原始的算法旨在介绍它最基本的思路;如果要在SSA形式上进行到达定值分析会更加高效,前提条件是需要把程序转换为SSA形式的表示。后续介绍的活跃变量分析,可用表达式分析也是如此。 **程序示例** 下面我们用真实的程序对上“图1”表示的程序做到达定值分析,(这里仅列出主要的程序片段) ```c++ // 定义一个基本块的属性结构 struct N{ string name; // 基本块名称 bitset7> gen {}; // 生成的定值 bitset7> kill {}; // 杀死的定值 bitset7> in {}; // 输入定值集合 bitset7> out {}; // 输出定值集合 vector> pre{}; // 前驱基本块 }; ``` ```c++ // 基本块的属性和初始化 shared_ptr entry, b1, b2, b3, b4, exit{}; entry = make_shared(N{"entry", 0, 0, 0, 0, {}}); b1 = make_shared(N{"b1", 0B0000111, 0B1111000, 0, 0, {}}); b2 = make_shared(N{"b2", 0B0011000, 0B1000011, 0, 0, {}}); b3 = make_shared(N{"b3", 0B0100000, 0B0000100, 0, 0, {}}); b4 = make_shared(N{"b4", 0B1000000, 0B0001001, 0, 0, {}}); exit = make_shared(N{"exit", 0, 0, 0, 0, {}}); // 构建基本块的前驱,形成CFG entry->pre = {nullptr}; b1->pre = {entry}; b2->pre = {b1, b4}; b3->pre = {b2}; b4->pre = {b2, b3}; exit->pre = {b4}; // 到达定值分析过程 bool anyChange{}; vector> BBs{b1, b2, b3, b4, exit}; do { anyChange = false; for (auto B : BBs) { for (auto p : B->pre) { B->in |= p->out; } auto new_out = B->gen | B->in & ~B->kill; if (new_out != B->out) { anyChange = true; } B->out = new_out; } } while (anyChange); // 输出每个基本块的输入定值,和输出定值 for (auto B : BBs) { cout *B endl; } ``` 输出结果: ``` b1 0000000 1110000 b2 1110111 0011110 b3 0011110 0001110 b4 0011110 0010111 exit 0010111 0010111 ``` 第一列是基本块名称,第二列是输入定值集合的位向量,第三列是输出集合的位向量。 这样我们就得到了每一个基本块的输入定值集合和输出定值集合。例如对于基本块B4, 位向量<`0011110`>代表`{d3,d4,d5,d6}`,是基本块开始处的到达定值集合,位向量<`0010111`>代表`{d3,d5,d6,d7}`,是基本块结尾处的到达定值集合。有了这些信息就能很容易的得到在某一个程序点处p, 有哪些变量在何处被定值了。 把结果反馈到流图中如下: ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/11/1652253233393281839.png) <center>图3 数据流分析-到达定值结果示例</center> 类似的,我们用相似的方法可以进行活跃变量,可用表达式的分析。 ### 2.2 活跃变量 一个变量x在程序点p上活跃,是说这个变量x从程序点p到程序结尾的路径上被使用,且在使用前没有对它进行新的赋值(没有被杀死)。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/11/1652253397749567645.png) <center>图4 数据流分析-活跃变量示例1</center> B1出口处的活跃变量只有`b`, 这是因为变量`a`再未被使用过,变量`c`被B2中的赋值杀死了。 B2出口处的活跃变量有`b`和`c`。因为只有`b`和`c`在后面的路径中被使用,且使用前未被重新赋值。 **活跃变量分析的迭代算法** 活跃变量分析是一种后向分析,基本块的出口作为输入,入口作为输出。 $$ \begin{array} {l} IN&=f_B(OUT) \\ &= Use[B] ∪(OUT[B] - Def[B]) \end{array} $$ 其中`Use[B]`表示基本块B使用了的变量, `Def[B]`表示基本块B赋值的变量。 迭代算法如下: $$ \begin{array}{l} IN[EXIT] = ∅; \\ for(除EXIT之外的每个基本块B) \; IN[B] = ∅; \\ while(某个IN值发生了变化)\{ \\ for(除EXIT之外的每个基本块B)\{ \\ \qquad OUT[B]=\cup_{S是B的一个后继}IN[S]; \\ \qquad IN[B] = use_{B}∪(OUT[B]-def_{B}); \\ \qquad \} \\ \} \\ \end{array} $$ **示例** ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/11/1652253458263587946.png) <center>图5 数据流分析-活跃变量示例2</center> 上面的程序流图中,基本块B2, B3, B4的Use和Def为: ``` Use[B2] = ∅, Def[B2] = {b} Use[B3] = {a}, Def[B3] = {a} Use[B4] = {b}, Def[B4] = ∅ ``` $OUT[B4]=∅$,B4使用了`b`, 所以$IN[B4] = Use[B4] ∪(OUT[B4] - Def[B4]) = \{b\}$; B3和B2只有一个后继B4, 所以他们的OUT值为`IN[B4]`,即 $OUT[B2] = OUT[B3] = IN[B4] = \{b\}$; B2中对变量`b`重新进行了赋值,即杀死了变量`b`,$Def[B2] = \{b\}$,没有使用原有的变量,$Use[B2]= ∅$,$IN[B2]=Use[B2] ∪ (OUT[B2] - Def[B2]) = ∅$; B3使用了`a`, 同时也对`a`重赋值, $Def[B3]=\{a\}, kill[B3]=\{a\}$, $IN[B3] = Use[B3] ∪ (OUT[B3] - Def[B3]) =\{a,b\}$; $OUT[B1] = IN[B2] ∪IN[B3]∪ IN[B4] = \{a,b\}$。 ### 2.3 可用表达式 一个表达式是可用的,是说在通往程序点p的所有路径上都对那个表达式进行过计算,且计算后再未对表达式的分量进行赋值过。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/11/1652253486410107289.png) <center>图6 数据流分析-可用表达式示例1</center> B1生成表达式`a+b`,$OUT[B1] = \{a + b\}$。B2中对a重新赋值了,把`a+b`杀死了,所以$OUT[B2]=∅$。$IN[B3] = OUT[B1]∩OUT[B2]=∅$。因此B3中的`a+b`需要重新计算,不能消除。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/11/1652253508431954071.png) <center>图7 数据流分析-可用表达式示例2</center> B2对`a`重新进行了赋值,但又生成了表达式`a + b`, 所以在B3的入口处 $IN[B3]=OUT[B1]∩OUT[B2] = \{a+b\}$。此处B3中的表达式可以使用`t`或者`x`, 不需要重新计算。 **可用表达式分析的迭代算法** $$ \begin{array} {l} OUT[ENTRY] = ∅; \\ for(除ENTRY之外的每个基本块B) \; IN[B] = U; \\ while(某个OUT值发生了变化)\{ \\ \qquad for(除ENTRY之外的每个基本块B)\{ \\ \qquad \qquad IN[B]=\cap_{P是B的一个前驱}OUT[P]; \\ \qquad \qquad OUT[B] = e\_gen_B∪(IN[B]-e\_kill_B); \\ \qquad \} \\ \} \\ \end{array} $$ ## 3.常量传播的数据流分析方法 前面介绍了到达定值分析,活跃变量分析,可用表达式分析。它们都是非常基础的数据流分析,在很多优化过程中会使用到这些数据流分析的结果。现在我们再次回到常量传播的优化上来。常量传播也是需要进行数据流的分析。它非常类似于到达定值,但因为常数的性质,又有所不同。 ### 3.1 常量传播使用的半格 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/11/1652253532632154532.png) <center>图8 常量传播-半格</center> 过程(函数)中的每一个变量都这样的一个半格,变量的值就是半格中的元素。在常量传播分析的初始阶段,所有的变量的值是不确定的,我们用`UNDEF`表示(对应格论中的最大值`⊤`); 随着我们的分析,有些变量的值是常数,它的值就可以对应到半格的中间那一行的某一个元素,比如常数2。随着分析的进行,一些变量的值不是常数时(比如定值来自不同的前驱,每个前驱中对该变量的定值不同),用半格最底下的`NAC`(Not a Constant)表示(对应格论中的最小值`⊥`)。 前面提到过,交汇运算是对不同集合的合并。对于常量传播,每个变量的交运算(Meet Operator) 是它的不同取值在半格中的最大下界。交汇运算的规则如下: * UNDEF ∧ C = C (C表示一个具体的常数) * UNDEF ∧ NAC = NAC * C ∧ NAC = NAC * NAC ∧ NAC = NAC * C ∧ C = C * C1 ∧ C2 = NAC (C1≠C2) 例子: ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/11/1652253568691819188.png) <center>图9 常量传播-变量映射到半格的值</center> B2对`x`的定值为常数`-2`,B3对x定值为常数`3`,`-2 ∧ 3`就是在`x`变量的半格上取**它们俩的最大下界**,为`NAC`。 ### 3.2 常量传播的转移函数 对语句 z = x + y,转移函数如下: | x | y | z | | ----- | ----- | ------- | | undef | undef | undef | | undef | Cb | undef | | undef | NAC | NAC | | Ca | undef | undef | | Ca | Cb | Ca + Cb | | Ca | NAC | NAC | | NAC | undef | NAC | | NAC | Cb | NAC | | NAC | NAC | NAC | 例如下面的一个流图,黄色标记表示因为程序语句的影响而发生变化的变量状态。变量`x`在基本块B2中的值是`3`, 在B3中的值是`undef`, 他们汇合后(最大下界)是常数`3`。 在B4中,`x`是常数`3`, `x + 3` 就是常数`6`,所以B4中的指令就可以优化为 `y = 6`了。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/11/1652253599804918666.png) <center>图10 常量传播-转移函数的示例</center> ### 3.3 常量传播的一个简易算法 ``` M[entry] == init do change = false worklist - all BBs; ∀B visisted(B) = false while worklist not empty do B = worklist.remove visited(B) = true m' = fB(m) ∀B' ∈ successors of B if visited(B') then continue end else m[B'] ∧= m' if m[B'] change then change = true end worklist.add(B') end end while(change == true) ``` **示例** 下面的程序代码 ```c j = 1; x = 10; y = 1; while(myRead()!=0){ x = x * y; y = y * y; j = j + y; } p = j + x + y; printf("%d\n", p); ``` 它的控制流图 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/11/1652253636080702161.png)图11 常量传播-示例的控制流图对此控制流图应用上面的算法 | | 第一轮| 第二轮| 第三轮| | --------- | -------------------------------- | -------------------------------- | -------------------------------- | | Entry | ⊤,⊤,⊤,⊤> | ⊤,⊤,⊤,⊤> | ⊤,⊤,⊤,⊤> | | B1 | 1,10,1,⊤> | 1,10,1,⊤> | 1,10,1,⊤> | | B2 | 1,10,1,⊤> | ⊥,10,1,⊤> | ⊥,10,1,⊤> | | B3 | 2,10,1,⊤> | ⊥,10,1,⊤> | ⊥,10,1,⊤> | | B4 | ⊥,10,1,⊥> | ⊥,10,1,⊥> | ⊥,10,1,⊥> | | anyChange | True | True | False | `⊤`表示undef, `⊥`表示NAC (not a constant) 在第三轮迭代时每一个基本块的输出不再变化,到达定点。可以看出在基本块B3出口处,只有`x`和`y`是常量,分别是`10`和`1`,`j`和`p`是非常量。 基于上面的分析,上述程序可以做出如下优化 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/11/1652253660317403931.png)图12 常量传播-程序优化的效果## 4.毕昇和LLVM中的常量传播 毕昇和LLVM的SCCP是一个比较高级的常量传播的pass, 它使用的算法是 Sparse Conditional Constant Propagation。 它的原理和上述的简易算法类似,有2点区别: 1. SCCP是在SSA的表示上进行的分析。在SSA的表示上进行常量传播分析,比非SSA表示的分析要快,但得到的结果是一致的。 2. SCCP会对条件分支中的条件进行判断,区分哪些基本块是可执行的,哪些是不可执行的,这样能够去除不可执行分支的影响,使常量传播更加准确(减少能传播但没有传播的情况)。 好了,常量传播就为大家介绍到这里。常量传播涉及到数据流的分析,所以这篇文章在介绍常量传播时也介绍了一下数据流分析,以及常见的三种数据流分析的思路。 ## 5.参考文献 1. Compilers Principles, Techniques, & Tools 2. http://www.cse.iitm.ac.in/~rupesh/teaching/pa/jan17/scribes/0-cp.pdf 3. Constant propagation with conditional branches https://dl.acm.org/doi/pdf/10.1145/103135.103136 4. https://www.youtube.com/watch?v=S1s4WYABiq0 --------- ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/11/1652253691899637472.png) 原文转载自毕昇编译-[编译器优化那些事儿(2):常量传播](https://mp.weixin.qq.com/s?__biz=MzkyNTMwMjI2Mw==&mid=2247484806&idx=1&sn=20eecb71c56960c3e2aeeb9e611838c6&chksm=c1c9e91ef6be60085081cc5fe1c2ef22117b04b74224a860075e0106befc044bd42d77744f9b&token=533395568〈=zh_CN#rd)
  • [其他] 浅谈人工智能研究价值
    例如繁重的科学和工程计算本来是要人脑来承担的,如今计算机不但能完成这种计算,而且能够比人脑做得更快、更准确,因此当代人已不再把这种计算看作是“需要人类智能才能完成的复杂任务”,可见复杂工作的定义是随着时代的发展和技术的进步而变化的,人工智能这门科学的具体目标也自然随着时代的变化而发展。它一方面不断获得新的进展,另一方面又转向更有意义、更加困难的目标。通常,“机器学习”的数学基础是“统计学”、“信息论”和“控制论”。还包括其他非数学学科。这类“机器学习”对“经验”的依赖性很强。计算机需要不断从解决一类问题的经验中获取知识,学习策略,在遇到类似的问题时,运用经验知识解决问题并积累新的经验,就像普通人一样。我们可以将这样的学习方式称之为“连续型学习”。但人类除了会从经验中学习之外,还会创造,即“跳跃型学习”。这在某些情形下被称为“灵感”或“顿悟”。一直以来,计算机最难学会的就是“顿悟”。或者再严格一些来说,计算机在学习和“实践”方面难以学会“不依赖于量变的质变”,很难从一种“质”直接到另一种“质”,或者从一个“概念”直接到另一个“概念”。正因为如此,这里的“实践”并非同人类一样的实践。人类的实践过程同时包括经验和创造。这是智能化研究者梦寐以求的东西。潘伟明表示,帮助人类完成无趣的重复性工作人工智能的快速发展对人类社会带来的最大冲击可能就是,它将代替大量的传统劳动力,很多生产线上的工人会因此而失去工作,全球大部分国家的失业率会因此上升。虽然人工智能使很多新兴产业崛起,但也有很多产业因人工智能的兴起而消亡。  在现实生活里,人工智能对社会传统劳动力形成的就业威胁,远超过很多社会学家的预期,不仅生产线上的工人会被影响,很多蓝领和白领也都被卷入这场威胁的浪潮。  著名企业家曾经预测,在二十年内,人工智能与自动化设备将取代社会各个行业将近一半的技术岗位,主要集中在文档分类、图书管理、理财产品的电话销售、会计、分拣、装配等方面。因为人工智能在做这种相对简单的数据分类且不需要大量交流的工作时,相比人工更高效且准确。潘伟明强调,事实上,他的预测已经在全球个别行业逐渐有了端倪。上海就有一家无人银行,也是我国唯一一家完全取代人工、全部用机器来办理业务的银行。国外也有案例,在 2017 年,世界四大会计事务所之一的德勤,就将人工智能应用在会计、税务等多项工作中,代替人类阅读合同和文件。人工智能正不断渗透到全球的社会工作,面对人工智能时代的全面来临,人们应该正视它并且要有足够的把握来控制它。人们需要理解的一点就是,人工智能代替的只是无趣的、重复性的工作。  人们应该用积极的态度来面对人工智能,充分了解自身的技能特点与人工智能的关系,运用人工智能技术提升人类劳动力的价值。并且,人们也应该接受那些工作内容冗杂、重复的工作岗位正在被人工智能替代的现实。在潘伟明看来,人工智能将作为分析工具与人类共事,人类也同样在思考能力方面有着人工智能不可比拟的优势,二者应共同创造人工智能与人类协作的蓝图。       2013年,帝金数据普数中心数据研究员S.C WANG开发了一种新的数据分析方法,该方法导出了研究函数性质的新方法。作者发现,新数据分析方法给计算机学会“创造”提供了一种方法。本质上,这种方法为人的“创造力”的模式化提供了一种相当有效的途径。这种途径是数学赋予的,是普通人无法拥有但计算机可以拥有的“能力”。从此,计算机不仅精于算,还会因精于算而精于创造。计算机学家们应该斩钉截铁地剥夺“精于创造”的计算机过于全面的操作能力,否则计算机真的有一天会“反捕”人类。当回头审视新方法的推演过程和数学的时候,作者拓展了对思维和数学的认识。数学简洁,清晰,可靠性、模式化强。在数学的发展史上,处处闪耀着数学大师们创造力的光辉。这些创造力以各种数学定理或结论的方式呈现出来,而数学定理最大的特点就是:建立在一些基本的概念和公理上,以模式化的语言方式表达出来的包含丰富信息的逻辑结构。应该说,数学是最单纯、最直白地反映着(至少一类)创造力模式的学科。
  • [AI类] 【ModelArts产品】【AI应用功能】MOX命令行应用将OBS文件传输给MODELARTS AI部署
    【功能模块】ModelArts产品AI应用功能模块服务ID 536afc85-d5ee-4ee5-8200-4ed6e1bc4ba0【操作步骤&问题现象】1、在使用ultralytics和yolov5,在modelarts平台做AI部署,报错,已经聚焦到问题是原代码中font(Arial.ttf)需要从网页下载2、已经将ttf文件手动下载放入obs中,地址:obs://overunderwater对象/ma-competitions-bj4/chuanbo/model/utilitiesma-competitions-bj4/chuanbo/model/utilities/Arial.ttf3、问题报错是找不到tff文件,请问如何在python文件中用mox命令,将该文件告诉python进行后续操作,麻烦写完整命令行,折腾好久了。import yaml from utilities.downloads import gsutil_getsize from utilities.metrics import box_iou, fitness # Settings FILE = Path(__file__).resolve() ROOT = FILE.parents[1] # YOLOv5 root directory DATASETS_DIR = ROOT.parent / 'datasets' # YOLOv5 datasets directory NUM_THREADS = min(8, max(1, os.cpu_count() - 1)) # number of YOLOv5 multiprocessing threads VERBOSE = str(os.getenv('YOLOv5_VERBOSE', True)).lower() == 'true' # global verbose mode FONT = 'Arial.ttf' # https://ultralytics.com/assets/Arial.ttf torch.set_printoptions(linewidth=320, precision=5, profile='long')【截图信息】【日志信息】(可选,上传日志内容或者附件)[2022-05-05 05:13:04 +0000] [18] [INFO] Using worker: sync [2022-05-05 05:13:04 +0000] [21] [INFO] Booting worker with pid: 21 Traceback (most recent call last): File "/home/mind/model/utilities/plots.py", line 57, in check_pil_font return ImageFont.truetype(str(font) if font.exists() else font.name, size) File "/root/.local/lib/python3.6/site-packages/PIL/ImageFont.py", line 836, in truetype return freetype(font) File "/root/.local/lib/python3.6/site-packages/PIL/ImageFont.py", line 833, in freetype return FreeTypeFont(font, size, index, encoding, layout_engine) File "/root/.local/lib/python3.6/site-packages/PIL/ImageFont.py", line 194, in __init__ font, size, index, encoding, layout_engine=layout_engine OSError: unknown file format During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/mind/model_service/model_service.py", line 179, in load_service spec.loader.exec_module(module) File "", line 678, in exec_module File "", line 219, in _call_with_frames_removed File "/home/mind/model/customize_service.py", line 34, in from models.common import DetectMultiBackend File "/home/mind/model/models/common.py", line 27, in from utilities.plots import Annotator, colors, save_one_box File "/home/mind/model/utilities/plots.py", line 68, in class Annotator: File "/home/mind/model/utilities/plots.py", line 70, in Annotator check_pil_font() # download TTF if necessary File "/home/mind/model/utilities/plots.py", line 61, in check_pil_font return ImageFont.truetype(str(font), size) File "/root/.local/lib/python3.6/site-packages/PIL/ImageFont.py", line 836, in truetype return freetype(font) File "/root/.local/lib/python3.6/site-packages/PIL/ImageFont.py", line 833, in freetype return FreeTypeFont(font, size, index, encoding, layout_engine) File "/root/.local/lib/python3.6/site-packages/PIL/ImageFont.py", line 194, in __init__ font, size, index, encoding, layout_engine=layout_engine OSError: unknown file format [2022-05-05 05:13:15 +0000] [21] [ERROR] Exception in worker process Traceback (most recent call last): File "/home/mind/model/utilities/plots.py", line 57, in check_pil_font return ImageFont.truetype(str(font) if font.exists() else font.name, size) File "/root/.local/lib/python3.6/site-packages/PIL/ImageFont.py", line 836, in truetype return freetype(font) File "/root/.local/lib/python3.6/site-packages/PIL/ImageFont.py", line 833, in freetype return FreeTypeFont(font, size, index, encoding, layout_engine) File "/root/.local/lib/python3.6/site-packages/PIL/ImageFont.py", line 194, in __init__ font, size, index, encoding, layout_engine=layout_engine OSError: unknown file format During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/mind/model_service/model_service.py", line 179, in load_service spec.loader.exec_module(module) File "", line 678, in exec_module File "", line 219, in _call_with_frames_removed File "/home/mind/model/customize_service.py", line 34, in from models.common import DetectMultiBackend File "/home/mind/model/models/common.py", line 27, in from utilities.plots import Annotator, colors, save_one_box File "/home/mind/model/utilities/plots.py", line 68, in class Annotator: File "/home/mind/model/utilities/plots.py", line 70, in Annotator check_pil_font() # download TTF if necessary File "/home/mind/model/utilities/plots.py", line 61, in check_pil_font return ImageFont.truetype(str(font), size) File "/root/.local/lib/python3.6/site-packages/PIL/ImageFont.py", line 836, in truetype return freetype(font) File "/root/.local/lib/python3.6/site-packages/PIL/ImageFont.py", line 833, in freetype return FreeTypeFont(font, size, index, encoding, layout_engine) File "/root/.local/lib/python3.6/site-packages/PIL/ImageFont.py", line 194, in __init__ font, size, index, encoding, layout_engine=layout_engine OSError: unknown file format During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/lib/python3.6/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker worker.init_process() File "/usr/local/lib/python3.6/site-packages/gunicorn/workers/base.py", line 129, in init_process self.load_wsgi() File "/usr/local/lib/python3.6/site-packages/gunicorn/workers/base.py", line 138, in load_wsgi self.wsgi = self.app.wsgi() File "/usr/local/lib/python3.6/site-packages/gunicorn/app/base.py", line 67, in wsgi self.callable = self.load() File "/usr/local/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 52, in load return self.load_wsgiapp() File "/usr/local/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 41, in load_wsgiapp return util.import_app(self.app_uri) File "/usr/local/lib/python3.6/site-packages/gunicorn/util.py", line 350, in import_app __import__(module) File "/home/mind/app.py", line 132, in module = load_service(model_service_file) if model_service_file else pytorch_vision_service File "/home/mind/model_service/model_service.py", line 188, in load_service raise Exception('Incorrect or missing service file: ' + path) Exception: Incorrect or missing service file: /home/mind/model/customize_service.py [2022-05-05 05:13:15 +0000] [21] [INFO] Worker exiting (pid: 21) Namespace(model_name='serve', model_path='/home/mind/model/yolov5l.pt', pt_server_name='127.0.0.1', service_file='/home/mind/model/customize_service.py') [2022-05-05 05:13:16 +0000] [18] [INFO] Shutting down: Master [2022-05-05 05:13:16 +0000] [18] [INFO] Reason: Worker failed to boot.
  • [热门活动] 【华为云AI证书和手机待领取】DevRun AI应用开发Python实战营
    【报名福利】报名后即可参与抽奖,超5%中奖概率,抽华为畅享10 Plus手机、华为路由器、华为nova mini蓝牙音箱、华为云AI定制衣服、定制保温杯!【活动亮点】0门槛入门Python,华为名师从环境搭建开始带您走进Python的世界,了解Python独特的语法,同时结合实践操作,增强您的编程能力。>>> 点击报名链接<<<【活动流程】①报名加入学习群,②在线课程,③实践案例直播课,④结业颁奖 ①【加入学习群】扫码添加小助手,加入学习群↓↓↓↓↓②【在线课程】总分500分开发者完成以下三门课程的进度和测试,可获得对应的分数。· 华为名师揭秘编程界“网红”Python:· Python入门篇:· Python进阶篇: ③【实践案例直播课】总分100分老师保姆式教学,完成实践案例可获得对应的分数:④【结业颁奖】获得满分600分的开发者,活动结束后将获得由华为云AI颁发的【DevRun AI应用开发-Python实战营结业证书】【邀请报名奖励】>>> 点击报名链接<<<>>> 点击报名链接<<<【活动说明】①请务必使用个人实名账号参与活动(IAM、企业账号等账号参与无效)。②为保证活动的公平公正,华为云有权对恶意刷活动资源(“恶意”是指为获取资源而异常注册账号等**活动公平性的行为,黑产用户不计入活动统计),利用资源从事违法违规行为的用户收回奖励资格,本次活动一个实名认证账号只能对应一个收件人(只能参加一次),如同一账号填写多个不同收件人,不予发放奖励,且每个账号只记录最早的一次回帖,多发无效。排名奖项若有并列,按照完成时间先后顺序排列。③本活动规则由华为云在法律规定范围内进行解释。华为云保留不时更新、修改或删除本活动规则的权利。上述更新、修改或删除于公布时即时生效,用户应当主动查阅本活动规则的最新内容。④所有参加本活动的用户,均视为认可并同意遵守《华为云用户协议》,包括以援引方式纳入《华为云用户协议》的《可接受的使用政策》、《法律声明》、《隐私政策声明》、相关服务等级协议(华为ModelArts服务声明、SLA等),以及华为云服务网站规定的其他协议和政策(统称为“云服务协议”)的约束。如果您不同意本活动规则和云服务协议的条款,请勿参加本活动。
  • [技术干货] openGauss AI能力升级,打造全新的AI-Native数据库
    数据库与AI结合起来会迸发出什么样的火花?不同的数据库厂商、开源社区、高校师生们的理解也都不尽相同。虽然在精确的概念上难以形成统一的标准,但是在总体的演进思路上却是一致的。对于openGauss来说,自从在社区开源第一个版本开始,openGauss便不断地在该领域演进并贡献代码,对于此次开源的openGauss 3.0.0 版本来说也不例外。在3.0.0版本中,openGauss的AI领域将在多个方向演进:1. 整合现有AI4DB功能,开源openGauss数据库自治平台;2. 重构现有AI4DB能力,实现插件化、支持服务式的运行模式;3. 支持Prometheus 生态;4. 新增慢SQL根因分析、时序预测等新特性,优化现有的AI能力;5. DB4AI功能支持更多算法。DB4AI原生引擎进一步升级在openGauss 3.0.0中,DB4AI原生引擎支持更多机器学习算法,例如支持SVM的非线性核函数,支持XGBoost等等。同时,openGauss还提供了Explain接口,可以观察到模型的信息。AI4DB支持服务化、插件化原有的openGauss AI4DB 能力是离线工具形态,不能在后台对数据库进行完整的监控,也不能定期地对数据库进行问题发现。最新版本,openGauss实现了后台监控服务,并在后台定期地检查数据库系统的状态,从而形成了自治数据库平台DBMind。通过离线计算的形式,将诊断结果保存,用户可以通过Grafana等软件进行可视化,从而第一时间发现问题并获知问题的根因。由于需要在后台定期监控openGauss数据库系统的运行状态,因此,需要对接监控平台以便采集数据库监控指标并进行离线计算。故而,在3.0.0版本中,openGauss实现了两款exporter用于与Prometheus平台进行对接,其架构形态为:其中,openGauss-exporter 用于获取数据库系统的监控指标(metric),reprocessing-exporter用于对存储在Prometheus中的数据进行二次加工。上述两个exporter的数据,可以通过Prometheus定期采集获取。DBMind系统定期从Prometheus中获取时序数据,并在DBMind部署机上进行并行计算。待计算完成后,将计算结果存储在元数据库(meta-database)中。之后,用户可以从元数据库中获取诊断结果,更进一步地,可以通过配置Grafana等进行可视化。如上图所示,是一种基于元数据库中的数据,采用Grafana进行可视化的示例。与此同时,openGauss还全面整合了现有的AI能力,并重新设计了一种插件化的模式。例如,用户希望调用参数调优功能,基于强化学习来调试数据库的参数,可以通过下述命令来实现:gs_dbmind component xtuner tune …通过上述gs_dbmind 命令,可以调用所有的AI功能,通过component 子命令,可以调用具体的AI功能。用户可以通过下述命令来查看帮助详情:gs_dbmind component --help通过上述设计,openGauss社区开发者如果希望贡献某种数据库AI功能,则只需要保证接口能被gs_dbmind获取到即可。同时,开发的插件还可以调用DBMind提供的全部API,例如从Prometheus 中获取数据的dai (data access interface)接口,向元数据库(meta database)中插入数据的 dao (database access object)接口等。AI4DB 现有AI能力全面提升在此次发布的3.0.0版本中,openGauss 对现有的索引推荐、时序预测等功能也进行了全面升级。补充了以往版本中的疏漏场景。同时,提供慢SQL根因分析与推荐功能,帮助DBA迅速识别出慢SQL,并依据监控到的数据库运行指标,通过AI特征库识别算法创新地给出慢SQL产生的原因和置信度,同时还给出优化建议。为下一步开发全面的数据库AI自治平台打下基础如上文所述,在openGauss 3.0.0版本中,创新性地完成了对历史AI能力的整合,丢弃历史研发过程中遗留下的包袱,轻装上阵,创新性地实现了可服务化、可离线式、插件式、自由组装的DBMind平台,并跟随数据库安装包一同发布。对于诊断后的结果,用户可以自行采用Grafana等工具进行自定义地可视化(当然,我们也会提供Grafana示例)。这为我们未来更进一步地将DBMind平台升级打下基础,预计本年度openGauss会将更多AI功能丰富到该平台中,同时将该平台从现有代码仓库中独立出来,并提供原生的Web前后端展示平台,同时支持自修复功能,让用户真正体会到一键式、开箱即用的数据库自动驾驶。
  • [其他] 将AI应用发布到ModelArts模型管理
    AI应用开发并调试完成后,开发者可以将AI应用服务到ModelArts AI应用管理模块,然后在ModelArts的推理平台进行应用的生产部署。发布AI应用包含了应用打包、构建镜像和发布这三个步骤。打包AI应用构建镜像发布和部署AI应用打包AI应用鼠标右键工程列表中当前工程,点击“Package”将会打包当前工程,生成该工程的rpm包。构建镜像将AI应用打好的rpm包和基础镜像打成新的应用镜像,用于部署。生产部署时,Dockerfile中配置的基础镜像需要选择runtime镜像。鼠标右键工程列表中的当前工程,点击“Build Image”,输入镜像名称、镜像版本、OBS地址。图1 构建镜像镜像构建首次执行大约耗时5~8min,执行成功后镜像将被推送到华为云SWR服务的组织中,SWR地址会打印在terminal控制台。命令执行结束后,镜像构建的日志会在下载至工程log目录下docker-build.log文件中,可通过日志查看构建过程信息。发布和部署AI应用发布AI应用鼠标右键工程列表中当前工程,点击“Public”,输入应用名称、应用版本、请求方式以及镜像地址。点击高级选项可以配置更加丰富的选项。图2 发布AI应用部署AI应用AI应用发布成功后,进入“部署上线>在线服务”模块进行部署操作,部署时选择发布的AI应用进行部署即可。控制台上提供了比开发环境的命令行更为丰富的部署选项,例如服务流量限制、服务自动停止等,用户可以根据需要进行配置,具体可参考部署为在线服务。
  • [云实验室] 基于昇腾AI处理器的目标检测应用(ACL)-连不上弹性公网IP
    实验到这个步骤的时候,连不上弹性公网IPfailed to connect the device
  • [问题求助] 【GaussDB】【AI数据挖掘】对个人开发者免费么?
    【功能模块】想利用GaussDB 存储5-40万条 数据,为天线的结构尺寸和天线全频段的S参数,并通过ModelArts做正向、逆向天线设计。类似ANTENNA MAGUS主要是研究探索用,想问HW是有免费的存储方案么?穷人一个。GaussDB 连接应该顺畅吧?之前试过OBS没问题。【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] 【历史上的今天】4 月 23 日:YouTube 上传第一个视频;网易云音乐正式上线;数字音频播放器的发明者出生【转载】
    透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。今天是 2022 年 4 月 23 日,世界读书日。在 1564 年的这一天,全世界最卓越的文学家之一莎士比亚出生;1616 年的这一天,莎士比亚与西班牙最伟大的作家塞万提斯辞世。还有其他一些伟大作家的生卒日也在这一天,如诺贝尔文学奖得主拉克斯内斯、俄国作家纳博科夫。1995 年,联合国教科文组织规定 4 月 23 日为世界图书与版权日,简称“世界读书日”。回顾计算机历史上的 4 月 23 日,这一天又发生过哪些关键事件呢?1956 年 4 月 23 日:数字音频播放器的发明者 Kane Kramer 出生凯恩·克雷默(Kane Kramer)出生于 1956 年 4 月 23 日,他是英国的一位发明家。在 1979 年,也就是他 23 岁的时候,他发明了一种名为 IXI 的音乐播放器;这枚播放器只有信用卡大小,其上方有一个长方形的屏幕,下方有四个方向的按钮,音乐则储存在一个可更换的芯片之中。不仅如此,克雷默在当时就提出了用电话线传播音乐的想法。他为这个发明注册了全球专利,但是在 1988 年,因为没有足够的钱给专利延期,专利进入了公有领域。在 2007 年,Burst.com 声称苹果公司的 iPod 侵犯了自己的专利权,苹果请克雷默到美国说明他的发明早于 Burst.com 的专利。之后两家公司达成了和解。不过,作为 iPod 的概念的发明人,克莱默并没有从中获得许多经济利益。他自称买不起 iPod,而苹果公司送给他的 iPod 也被他用坏了。如今,克雷默仍在便携式数据处理和存储系统等技术领域工作,他是英国发明家协会主席和英国发明展和世界发明奖的组织者,业余时间他会拍拍电影、组织音乐会,陶冶情操。2005 年 4 月 23 日:YouTube 上传第一个视频YouTube 成立于 2005 年 2 月,由三名前 PayPal 雇员:查得·贺利、陈士骏、贾德·卡林姆创办;同年 4 月 23 日,YouTube 第一部上传视频,标题为“我在动物园”。在为 PayPal 工作前,查德于宾州印第安那大学学习设计,陈士骏则共同在伊利诺伊大学厄巴纳-尚佩恩分校学习计算机科学。YouTube 创办的原意是为了方便朋友之间分享录视频段,后来逐渐成为网友的回忆存储库和作品发布场所。就像许多以新技术创业的公司,YouTube 开始时亦是靠天使投资者注资创立,办公室也只是在一间简陋的车库内。2006 年 11 月,Google 公司以 16.5 亿美元收购 YouTube,并把其当作一间子公司来经营。Google 最初对于如何透过 YouTube 盈利,一直保持着谨慎的态度。收购后的 YouTube 依然风靡全球网络用户。花旗银行分析师认为,以 2012 年计算,Google 从 YouTube 获得 24 亿美元的收入。无 Google 账号的用户仍可以观看 YouTube 中的视频,但无法上传视频及留言。注册用户可以无限量上传视频。如今,YouTube 已经成为影音网站的翘楚,不单在娱乐音乐市场上吸引观众,又成功把庞大流量转变为社区平台,并激发网上创作产业,例如每年 YouTube 名人的演出 YouTube FanFest 等收看人数与收入都相当惊人,同时企业则申请官方账号用作广告与在线传媒、NGO 的推广公关等等,成为又一段硅谷文化新创成功的经营典范,当然也是因为硬件支持,才能承受庞大的信息量而发展起来,还有恰好的创业时机换来的知名度与其爆红效应。尽管有大量用户支持,但同类型网站激烈竞争下内容更变得重要,因此,近几年 YouTube 的眼光开始投向网络知名制作者;YouTube 对这些拥有百万订阅的人十分器重,会给予他们奖杯反馈与官方聚会活动邀请、以及更高的薪资分红等等(这类职业化的视频创作者被称为 YouTuber)。追求高点击率,已经成为世界上许多人获取财富的方式之一。2013 年 4 月 23 日:网易云音乐正式上线网易云音乐(NetEase Cloud Music)是中国网易公司自 2013 年 4 月 23 日基于网易云服务推出的一个音乐平台,除了提供主要的音乐播放、下载与查找服务外,还提供音乐社交功能,如歌曲评论、声学指纹(听歌识曲)、根据历史播放记录的歌单推荐、地理位置识别等。网易云音乐以其个性化推荐(包括每日推荐、私人FM、心动模式)为卖点,一经推出便在当年的应用市场走红。网易云音乐现支持 iOS、Android、Windows、 Linux 在内的多个操作系统。截至 2017 年 11 月,网易云音乐用户数量超过 4 亿,用户创建歌单达 4 亿个,用户评论数达 4 亿个。由于许多唱片公司(如 King Records)要求向用户收取数字专辑的费用,网易云音乐上越来越多的音乐开始转变为付费收听和下载的模式,无损格式的音乐则全部收费,还有一部分音乐由于网易暂未获取授权而不能播放;在 2018 年 3 月移动端的 5.0.0 更新后,网易云重构了移动端的用户界面,将原本不太引人注意的视频模块放置到了首页。这意味着网易开始重视云音乐的短视频功能。原文链接:https://blog.csdn.net/Byeweiyang/article/details/124361554
  • [资料文档] MDC300AI推理sample问题
    【功能模块】【操作步骤&问题现象】1、按照sample示例工程使用指南完成AI推理sample的前面步骤;2、将其拷贝到MDC300mini0 HwHiAiUser用户下执行,出现sudo: unable to resolve host mini0: Resource temporarily unavailable,能完成推理,请问是什么原因?【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [其他] AI助力社会管理
    看这是一个垃圾箱不上盖,垃圾极有可能落地的: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/17/1650193828868858112.png) 这是一个骑电动车,不带头盔的: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/17/1650193843513178281.png) 这是隧道下道路上有积水的: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/17/1650193904128858983.png) 这些AI科技运用于社会的日常管理,那是可以大大的提高管理效率啊。
  • [技术干货] 论文解读:Database Meets AI
    本文对清华大学李国良教授团队论文《Database Meets AI:A Survey》进行解读。一、概述随着数据库近年来的不断发展,数据库开始与各项新兴技术结合,如人工智能、区块链、密态计算等。本篇论文所涉及的是数据库与人工智能结合的探索,二者的结合是一种双赢,数据库和人工智能都能从这次结合中受益:一方面,人工智能可以使数据库更加智能化(AI4DB)。传统的经验数据库优化技术难以满足大规模数据库实例、各种应用程序和多样化用户的高性能要求,尤其是在云上。而幸运的是,人工智能基于学习的技术可以缓解这个问题。另一方面,数据库技术可以优化AI模型(DB4AI)。例如,人工智能很难在实际应用中部署,因为它需要开发人员编写复杂的代码和训练复杂的模型。数据库技术可用于降低使用人工智能模型的复杂性,加速人工智能算法,并在数据库中提供人工智能功能。下图所示,为论文关于两种模型的主要研究内容:对于AI4DB,文章研究了基于学习的配置调优、优化器、索引/视图顾问和安全性方面的技术;对于DB4AI,文章研究了面向AI的声明性语言、面向AI的数据治理、训练加速和推理加速。二、AI4DB传统的数据库设计基于经验方法和规范,需要人工参与(例如DBA)来调整和维护数据库。人工智能技术被用来缓解这些限制,下图所示为机器学习能为数据库带来的一些技术突破:我们从上图中选取一些AI优化DB的现有技术进行介绍:1)基于学习的数据库配置(1) 旋钮调节数据库旋钮的数量庞大且关系复杂。DBA通常擅长于特定的数据库,并且需要相对较长的时间。显然,DBA无法扩展到云数据库上的数百万个数据库实例。但是通过基于学习的技术自动调整旋钮,可以探索更多旋钮组合空间并推荐高质量旋钮值,从而获得比DBA更好的结果。(2) 索引/视图顾问数据库索引和视图对于实现高性能非常重要。然而,传统数据库高度依赖DBA来构建和维护索引和视图。由于存在大量列/表组合,因此推荐和构建适当的索引/视图的成本很高。最近,有一些基于学习的工作可以自动推荐和维护索引和视图。(3) SQL重写器许多SQL程序员无法编写高质量的SQL,因此需要重写SQL查询以提高性能。例如,嵌套查询会被重写为连接查询来使一些SQL优化可用。现有方法采用基于规则的策略,使用一些预定义的规则重写SQL查询。然而,这些基于规则的方法依赖于高质量的规则,这些规则过多。因此,深度强化学习可用于明智地选择适当的规则,并以良好的顺序应用规则。2)基于学习的数据库优化(1)基数/成本估算数据库选择优化策略需要依靠成本和技术估计,但传统技术无法有效捕获不同列/表之间的相关性,因此无法提供高质量的估计。这时候通过使用深度神经网络捕捉相关性来估计成本和基数,从而获得更好的结果。(2)连接顺序选择。一个SQL查询可能有数百万甚至数十亿个可能的计划,高效地找到一个好的计划非常重要。传统的优化器并不能在数以万计的表里找到合适的连接顺序,因为探索巨大的计划空间成本相当高,这时我们可以利用深度强化学习去自动选择好的计划。(3)端到端优化器。一个成熟的优化器不仅要有好的代价估计和连接顺序,而且还需要考虑索引和视图,并且设计端到端优化器是很重要的。因此可以通过使用深度神经网络优化SQL查询。3)基于学习的数据库设计(1)学习索引。不仅可以减少索引大小,还可以提高索引性能。(2)学习数据结构设计。不同的数据结构可能适用于不同的环境,很难为每个场景设计合适的结构。哈佛大学的论文阐述了一种旨在为不同的数据结构创建一个数据推理的引擎,用于推荐和设计数据结构。(3)基于学习的事务管理。传统的事务管理技术侧重于事务协议,而人工智能技术能够从现有的数据模式中学习,有效地预测未来的工作负载趋势,并通过平衡冲突率和并发性有效地调度它们,从而实现预测并安排事务。4)基于学习的数据库监控数据库监控可以捕获数据库运行时指标,如读/写延迟、CPU/内存使用情况,从而在出现异常时提醒数据库管理员。然而,传统的监视方法依赖于数据库管理员来监视大多数数据库活动并报告问题,效率较为低下。而通过基于机器学习的技术来优化数据库监控,可以较为高效地确定何时以及如何监控哪些数据库指标。5)基于学习的数据库安全传统的数据库安全技术依赖于用户定义的规则,但无法自动检测未知的安全漏洞。通过基于AI的算法来自动识别发现敏感数据,监视数据库活动并检测漏洞,通过自动估计不同的数据访问操作来避免数据泄漏,通过深入学习挖掘用户行为和识别并避免SQL注入攻击。三、DB4AI人工智能在当今逐渐普及用于解决许多现实问题,但由于人工智能现存系统复制性较差,很难被普通用户使用。为了解决这个问题,数据库技术可以用来降低人工智能的使用门槛,如下图所示:下面基于上图中部分内容进行介绍:1)声明式查询范例SQL相对容易使用并在数据库系统中广为接受。然而,与其他高级机器学习语言相比,SQL相较于其它高级机器学习语言缺少一些复杂的处理模式(例如,迭代训练)。但是,SQL可以被延伸至以支持AI模型,可以通过设计用户友好的工具在SQL语句中支持AI模型。2)数据治理数据质量对于机器学习非常重要,数据治理可以提高数据质量,包括数据发现、数据清理、数据集成、数据标记和数据血缘。(1)数据发现。基于学习的数据发现增强了查找相关数据的能力,能够自动且有效发现海量数据之间的关系。(2)数据清理。脏数据或不一致数据会严重影响训练效果。数据清洗和数据集成技术可以对脏数据和未持久化数据进行检测和清理修复,并集成多个数据源的数据,以生成高质量数据。(3)数据标签。借助领域专家、众包和知识库,可以适当利用人力或现有知识为ML算法标记大量训练数据。(4)数据血缘。数据血缘描绘了输入和输出之间的关系,对于确保ML模型正常工作很重要。通过连接和图映射等数据库技术,可以跟踪数据前后关系。3)模型训练模型训练旨在训练一个用于在线推理的好模型,是一个耗时且复杂的过程,因此需要特征选择、模型选择、模型管理和硬件加速这些优化技术。(1)特征选择。需要从大量可能的特征中选择合适的特征。通过批处理模型、物化模型等技术来解决选择和评估非常耗时这一问题。(2)模型选择。需要从大量可能的模型中选择合适的模型(和参数值)。通过一些并行技术来加速这一步,包括任务并行、批量同步并行、参数服务器和模型并行计算。(3)模型管理。由于模型训练是一个反复试验的过程,需要维护许多已经尝试过的模型和参数,因此有必要设计一个模型管理系统来跟踪、存储和搜索ML模型。本文采用基于GUI的和基于命令的模型管理系统。(4)硬件加速。硬件如GPU和FPGA也被用来加速模型训练。硬件加速技术被应用在行存储和列存储数据库中。4)模型推理。模型推理旨在使用经过训练的模型有效地推断结果,数据库中的优化技术包括算子支持、算子选择和执行加速。(1)算子支持。ML模型可能包含不同类型的算子,它们具有不同的优化要求。因此,提出了一些数据库内技术来支持AI算子,包括标量运算、张量运算和张量分区。(2)算子选择。相同的ML模型转换为不同的物理算子可能会带来显著的性能差异。因此在数据库中,算子选择可以估计资源消耗并做出正确的调度。(3)执行加速。加速推理提高效率。一方面,内存数据库将模型数据压缩到内存中进行内存优化。另一方面,分布式数据库通过将任务发送到不同节点提高整体效率。四、挑战1)利用人工智能技术优化数据库仍然存在一些挑战。(1)大规模、高质量、多样化的训练数据获取困难。例如,在数据库旋钮调优中,训练样本需要基于DBA经验获得,因此很难获取非常大数量的样本。此外,为了构建有效的模型,训练数据需要涵盖不同场景、不同硬件环境和不同工作负载,因此迫切需要一个新的方法用小型的训练数据集去获得高质量模型。(2)适应性是一个巨大的挑战。如何使数据集上经过训练的模型适应其他数据集?如何使硬件环境中经过训练的模型适应其他硬件环境?如何使经过训练的数据库模型适应其他数据库?如何使经过训练的模型支持动态数据更新?(3)数据治理。学习模型能否收敛至关重要,如果模型不能被收敛,需要用其它方式规避延迟和不准确的决策。例如,在旋钮调优中,如果模型不收敛,就不能利用模型提供在线旋钮建议。(4)OLAP学习。传统OLAP任务聚焦关系型数据分析,然而大数据时代,图数据、时序数据、空间数据层出不穷,需要新的数据分析技术去分析这些多模数据。(5)OLTP学习。事务模型和调度对OLTP系统很重要,因为不同事务间可能存在冲突。利用学习技术优化OLTP查询是很有希望的,例如一致性快照等。2)利用数据库优化AI模型也存在部分挑战(1) 库内训练方面。在数据库中支持人工智能训练是一项挑战,包括模型存储、模型更新和并行训练。首先,在多租户可以训练和使用模型时,库内存储模型的安全和隐私问题是一个挑战;其次,数据动态更新时区更新模型也是一大挑战。(2) 利用数据库技术加速AI训练。目前大多数研究都集中在人工智能算法的有效性上,而对算法的效率关注不多,需要利用数据库技术提高算法的表现性能。(3) AI优化器。当前研究主要利用用户定义函数(UDF)来支持AI模型,但这些模型没有得到有效优化。需要将AI模型作为算子在库内执行,同时还需要为每个算子设计物理算子,最重要的是,需要将AI算子下推并预估cost/cardinality值,AI优化器应支持优化AI训练和推理,此外,对于分布式环境下AI算子的有效支持也非常重要。(4) 容错学习。现有的学习模式训练不考虑容错度。一个分布式训练执行中穿一个进程崩溃,整个任务就会失败,需要将现有的容错技术以提高库内训练的健壮性。为了确保在可预测和不可预测的灾难下的业务连续性,数据库系统必须保证容错和灾难恢复能力。五、总结该论文综述了AI4DB和DB4AI的最新技术。前者侧重于利用人工智能技术解决计算复杂度高的数据处理问题,例如旋钮调整、成本估算、连接顺序选择、索引顾问和视图顾问。后者侧重于使用数据库技术来降低使用人工智能的复杂性和加速人工智能模型,例如,声明式AI,以及加速AI训练和推理。数据库和人工智能都能从对方那里获得各方面的提升,数据库与人工智能结合势必成为未来二者发展的一大趋势。文章来源:数据库应用创新实验室
  • [技术干货] 企业数字化转型方式方法的探讨[转载]
    1. 数字经济和数字化转型1.1. 数字经济成为未来竞争的主战场数字经济是未来世界经济竞争格局的战略高地。国家十四五规划与 2035远景目标纲要已发布,其中数字中国建设对未来中国数字化转型及其数字中国建设的一系列重大方针政策都做出了相关的规定。1.2. 疫情加速数字经济的发展1.3. 数字化使企业的工作流程更加高效敏捷1.4. 数字化转型的核心价值1.5. 数字技术全面融入社会交往和日常生活在国家十四五规划里,对数字社会建设做出了一系列重要部署。比如数字技术全面融入社会交往和日常生活,提供智慧便捷的公共服务,促进公共服务和社会运行方式创新,建设新型智慧城市,构建国民美好数字生活新图景,推进全民美好数字生活等,这在一定意义上为未来的数字社会建设指明了方向。未来的趋势是通过数字化转型,数字驱动生活方式的变革。趋势一:社会数字化将在未来五年进一步上升。目前我国的数字化普及率刚刚超过 70%,与发达国家还有一定差距、存在较大提升空间;趋势二:民生相关的医疗、教育、社保、养老、就业等数字化水平将大幅提高;趋势三:数字孪生技术与城市的结合,智慧城市建设将得到快速发展;趋势四:数据经济时代,数字消费者对数字化转型将产生更大的影响。2. 新技术对行业应用场景的影响2.1. 2021年Gartner数字商务技术成熟度据 Gartner发布的 2021年数字商务技术成熟度曲线,虚拟客户助理、数字钱包、可视化配置、客户身份和访问管理等数字商务技术已到了稳步爬升期,并有望在 2年内到达生产成熟期。数字体验平台、客户主数据管理、产品主数据管理等技术,也将在 2-5年内到达生产成熟期。2.2. ICT技术与经济社会深度融合2.3. 5G技术在各行业的应用场景2.4. 大数据技术在各行业中应用的深度和广度从应用的功能和成效来看,大数据技术应用的价值主要体现在降本增效、精准营销、决策支持三个方面,其应用的深度和广度,在不同行业呈现不同的侧重点。2.5. 人工智能技术中重点领域应用场景从产业链来看人工智能产业链主要有三个核心层:基础层、技术层及应用层。计算机能力和平台的发展,是人工智能技术和应用实现的基础,计算机视觉、语音识别、自然语言处理、机器学习、大数据服务等技术的实现,是人工智能应用落地的保障。从应用层看人工智能产业主要有智慧城市、智慧生产、智慧生活三大类应用领域,在制造业、电力电网、交通运输三大行业已形成规模应用,主要落地应用有以下十大场景:无人驾驶汽车、人脸识别、机器翻译、声纹识别、智能客服机器人、智能外呼机器人、智能音箱、个性化推荐、医学图像处理、图像搜索等。3. 企业数字化转型通过数字化转型,实现跨层级、跨地域、跨系统、跨部门、跨业务的协同管理,打造组件化、松耦合的中台能力,将数字技术与企业需求相融合,释放数字化转型的真正价值。3.1. 企业数字化阶段企业数字化阶段,可以划分成以下四个阶段:基础信息化应用数字化全面系统化智慧生态化数字化转型各阶段的基本特征和典型应用3.2. 数字化实施策略企业在实施数字化阶段的过程中,可以基于以下实施策略:3.2.1. 基于单个业务场景基于单个业务场景数字化为启动点的方法,以点带面,逐步实施,反复迭代,最终带动企业的整体转型。通过单点突破 -> 局部扩散 —> 复制推广 -> 全面融合 —> 优化创新的路径,推动研发、产品、装备、生产、管理、服务等业务场景数字化、网络化、智能化转型,逐步搭建和完善企业内部数字化管理平台。3.2.2. 基于新技术的应用场景基于工业互联网,通过人工智能、5G、物联网、云计算、大数据、数字孪生、精益制造等数字技术创新应用手段,建设具有“柔性化、智能化、数字化”特征的智能工厂。3.2.3. 基于供应链协同服务场景基于资源对接、协同生产等供应链协同模式新业态,打造行业供应链协同服务平台,推动行业上下游分散资源的有效汇聚与广泛共享。3.3. 数字化转型场景落地线路图企业数字化转型场景企业数字化转型场景指的是在特定时间、空间/地点、人物对象,以生产经营活动为中心使用各类数字化手段,将业务活动的各动作,按照相关的关联关系,完成特定的业务流程,面向生产经营活动中特定的活动问题对应的解决方案构成的相关过程,构建起的碎片化流程及流程对象构成的各类关系。围绕场景的转变所带来的价值,逐步汇集转变中需要的技术、平台、运营、组织管理的需求,通过迭代的方式,逐步的完成数字化的转型。场景要素数字化首先将场景的基本信息进行收集及结构化,即填写背景及目标,深入总结场景建设的背景、痛点问题和建设的目标,通过场景要素的构成性描述场景企业可以深入的了解在特定的时间空间、组织角色、场景活动及其相关的应用、设备、信息等多维度的相关信息。通过场景描述澄清场景对应的需求及场景活动等细节将围绕场景活动及产生相应的数字应用、机器设备、数据信息、数字技术等场景对象的协作关系完整表述出来。数字化场景是不断迭代的,随着新技术、新设备不断涌现,新技术和原有场景可以多次形成新的组合,从而不断向全感知、全联接、全智能的数字化场景发展,所以场景要素是迭代优化的基础,需要完成全面的场景要素清单。场景资源数字化将场景涉及的平台、场景节点等通过数字化的手段进行相关的系统平台支撑的方式承载相关功能及其相关流程,通过数字化智能化系统的建设、业务能力承载。将各场景节点相关的标准业务服务、场景节点业务流程进行自动化、智能化的能力升级、从而将传统由不同的业务角色及其相关组织中的人完成的业务动作转变成部分或全部由自动化、数字化、智能化的系统承载完成。并将相关的业务流程中设计的标准动作以系统功能点的形式落地到对应应用系统建设过程中。完成对应的系统建设后形成对应的标准化应用服务。场景设备数字化将场景涉及的设备、基础设施等通过数据自豪的手段进行相关的设备互通互联建设,通过将设备进行数字孪生的建设,进行设备及基础设施的数字化改造升级及现实世界的数字化同构模型的建设。3.3.1. 数字化转型场景建设五步设计法步骤一: 场景的价值按照场景价值发现法,通过各类调研发现企业场景现状与问题、将相关场景下的业务需求进行需求分析。并针对各类需求制定对应的转型目标。步骤二:场景的技术创新将场景涉及的业务流程进行业务融合新型技术的创新设计,将对应的场景进行技术改造和业务升级形成创新场景。步骤三:场景的生态通过场景生态构建以场景为核心的多维度、供需能力结合的场景生态供给侧与需求侧的拉通,形成特色的生态解决能力提供场景服务。步骤四:场景的长效机制将场景设计建设成效及其未来的运营机制进行相关设计,通过场景运营建立场景的长效培育机制,解决场景相关能力上线后的目标效果评估、目标场景的迭代等相关问题。形成场景能力的长效运营使场景节点目标更好的得到能力升级及产品迭代。步骤五:场景的组织建设将场景涉及的角色、组织、平台装备等一系列相关方进行组织变革、平台能力中心建设设计。形成场景能力建设完成后的组织文化保障,更好的通过组织能力长效服务及建设相关场景能力。3.4. 企业数字化转型场景案例3.4.1. 智能制造数字化转型及重要场景路线图智能制造行业数字化发展路线总结为管理数字化、生产数字化、生产智能化、产业数字化四个阶段总路线,数字化文化和能力的培养贯穿整个数字化发展进程,在每个阶段具有代表性的重点场景.3.4.2. 能源行业数字化转型及重要场景路线图能源行业数字化发展路线总结为业务数字化、数据资产化、海外赋能、数字化生态四个阶段路线,数字化文化和能力的培养贯穿整个数字化发展进程,在每个阶段具有代表性的重点场景。4. 参考华为:数字化转型,从战略到执行华为:华为行业数字化转型方法论白皮书2019[中央企业数字化发展研究院:2021年国有企业数字化转型场景示范和线路图研究白皮书]http://siab.org.cn/2021/12/28/guoqishuzihuazhuanxing/
  • [公告] 华为与达尔文圈发起“维也纳科技向绿倡议”
    在今年华为奥地利和国际数字化论坛达尔文圈共同举办的活动中,华为重点讨论了如何利用科技促进可持续发展,并和达尔文圈联合呼吁来自各行各业的企业加入“维也纳科技向绿倡议”。奥地利环境部副部长Christian Holzer表示:“数字化和利用电子手段获取和处理环境数据有助于制定必要的措施,同时极大地促进了联合国可持续发展目标的实现。”华为奥地利于2021年发起奥地利TECH4ALL 倡议,与维也纳大学和新锡德尔湖国家公园、NGO组织RFCx合作推出“科技守护自然”计划,利用人工智能等新技术开展为期两年的生物多样性研究。该项目在不同时间段内对芦苇带的鸟类、蝙蝠和两栖动物进行声音监测。监测结果将被用于制定和改善保护计划,以保护新锡德尔湖芦苇带的可持续发展和生物多样性。项目覆盖面积为12平方公里,共安装了72个设备,目前已记录了4000 GB的声音数据,长达1.16万小时。在活动中,达尔文圈与华为呼吁各方联合行动,共建绿色未来,呼吁来自各行各业的企业加入“维也纳科技向绿”倡议。ICT技术在自然保护中扮演着关键的使能角色,为人们提供与自然和谐共处的解决方案。该倡议将联合伙伴制定一份白皮书,探讨行业洞察和最佳实践,共建绿色未来。联合国工业发展组织创新与数字化司司长Marco Kamiya表示:“数字化转型和创新是实现发展的重要条件。”在此次活动中,达尔文圈创始人Nikolaus Pelinka,微软奥地利总经理Hermann Erlach、新锡德尔湖国家公园研究员Harald Grabenhofer、联合国亚太可持续发展副主席David Morris、维也纳科技大学系主任Michael Drmota等人出席并现场发言。现场嘉宾与华为一起讨论科技向绿的议题
总条数:7896 到第 页
上滑加载中