当前位置: 首页 > news >正文

昇思25天学习打卡营第9天|MindSpore使用静态图加速(基于context的开启方式)

在Graph模式下,Python代码并不是由Python解释器去执行,而是将代码编译成静态计算图,然后执行静态计算图。

在静态图模式下,MindSpore通过源码转换的方式,将Python的源码转换成中间表达IR(Intermediate Representation),并在此基础上对IR图进行优化,最终在硬件设备上执行优化后的图。MindSpore使用基于图表示的函数式IR,称为MindIR,详情可参考中间表示MindIR。

MindSpore的静态图执行过程实际包含两步,对应静态图的Define和Run阶段,但在实际使用中,在实例化的Cell对象被调用时用户并不会分别感知到这两阶段,MindSpore将两阶段均封装在Cell的__call__方法中,因此实际调用过程为:

model(inputs) = model.compile(inputs) + model.construct(inputs),其中model为实例化Cell对象。

使用Graph模式有两种方式:一是调用@jit装饰器修饰函数或者类的成员方法,所修饰的函数或方法将会被编译成静态计算图。jit使用规则详见jit API文档。二是设置ms.set_context(mode=ms.GRAPH_MODE),使用Cell类并且在construct函数中编写执行代码,此时construct函数的代码将会被编译成静态计算图。Cell定义详见Cell API文档。

由于语法解析的限制,当前在编译构图时,支持的数据类型、语法以及相关操作并没有完全与Python语法保持一致,部分使用受限。借鉴传统JIT编译的思路,从图模式的角度考虑动静图的统一,扩展图模式的语法能力,使得静态图提供接近动态图的语法使用体验,从而实现动静统一。为了便于用户选择是否扩展静态图语法,提供了JIT语法支持级别选项jit_syntax_level,其值必须在[STRICT,LAX]范围内,选择STRICT则认为使用基础语法,不扩展静态图语法。默认值为LAX,更多请参考本文的扩展语法(LAX级别)章节。全部级别都支持所有后端。

  • STRICT: 仅支持基础语法,且执行性能最佳。可用于MindIR导入导出。

  • LAX: 支持更多复杂语法,最大程度地兼容Python所有语法。由于存在可能无法导出的语法,不能用于MindIR导入导出。

本文主要介绍,在编译静态图时,支持的数据类型、语法以及相关操作,这些规则仅适用于Graph模式。


使用静态图加速

背景介绍
AI编译框架分为两种运行模式,分别是动态图模式以及静态图模式。MindSpore默认情况下是以动态图模式运行,但也支持手工切换为静态图模式。两种运行模式的详细介绍如下:

动态图模式

动态图的特点是计算图的构建和计算同时发生(Define by run),其符合Python的解释执行方式,在计算图中定义一个Tensor时,其值就已经被计算且确定,因此在调试模型时较为方便,能够实时得到中间结果的值,但由于所有节点都需要被保存,导致难以对整个计算图进行优化。

在MindSpore中,动态图模式又被称为PyNative模式。由于动态图的解释执行特性,在脚本开发和网络流程调试过程中,推荐使用动态图模式进行调试。 如需要手动控制框架采用PyNative模式,可以通过以下代码进行网络构建:

%%capture captured_output
# 实验环境已经预装了mindspore==2.2.14,如需更换mindspore版本,可更改下面mindspore的版本号
!pip uninstall mindspore -y
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.2.14
import numpy as np
import mindspore as ms
from mindspore import nn, Tensor
ms.set_context(mode=ms.PYNATIVE_MODE)  # 使用set_context进行动态图模式的配置class Network(nn.Cell):def __init__(self):super().__init__()self.flatten = nn.Flatten()self.dense_relu_sequential = nn.SequentialCell(nn.Dense(28*28, 512),nn.ReLU(),nn.Dense(512, 512),nn.ReLU(),nn.Dense(512, 10))
​def construct(self, x):x = self.flatten(x)logits = self.dense_relu_sequential(x)return logits
​
model = Network()
input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))
output = model(input)
print(output)

[[-0.00134926 -0.13563682 -0.02863023 -0.05452826 0.03290743 -0.12423715
-0.0582641 -0.10854103 -0.08558805 0.06099342]
[-0.00134926 -0.13563682 -0.02863023 -0.05452826 0.03290743 -0.12423715
-0.0582641 -0.10854103 -0.08558805 0.06099342]
[-0.00134926 -0.13563682 -0.02863023 -0.05452826 0.03290743 -0.12423715
-0.0582641 -0.10854103 -0.08558805 0.06099342]
[-0.00134926 -0.13563682 -0.02863023 -0.05452826 0.03290743 -0.12423715
-0.0582641 -0.10854103 -0.08558805 0.06099342]
[-0.00134926 -0.13563682 -0.02863023 -0.05452826 0.03290743 -0.12423715
-0.0582641 -0.10854103 -0.08558805 0.06099342]

[-0.00134926 -0.13563682 -0.02863023 -0.05452826 0.03290743 -0.12423715
-0.0582641 -0.10854103 -0.08558805 0.06099342]
[-0.00134926 -0.13563682 -0.02863023 -0.05452826 0.03290743 -0.12423715
-0.0582641 -0.10854103 -0.08558805 0.06099342]
[-0.00134926 -0.13563682 -0.02863023 -0.05452826 0.03290743 -0.12423715
-0.0582641 -0.10854103 -0.08558805 0.06099342]
[-0.00134926 -0.13563682 -0.02863023 -0.05452826 0.03290743 -0.12423715
-0.0582641 -0.10854103 -0.08558805 0.06099342]]

在这里插入图片描述

静态图模式

相较于动态图而言,静态图的特点是将计算图的构建和实际计算分开(Define and run)。有关静态图模式的运行原理,可以参考静态图语法支持。

在MindSpore中,静态图模式又被称为Graph模式,在Graph模式下,基于图优化、计算图整图下沉等技术,编译器可以针对图进行全局的优化,获得较好的性能,因此比较适合网络固定且需要高性能的场景。

如需要手动控制框架采用静态图模式,可以通过以下代码进行网络构建:

import numpy as np
import mindspore as ms
from mindspore import nn, Tensor
ms.set_context(mode=ms.GRAPH_MODE)  # 使用set_context进行运行静态图模式的配置
​
class Network(nn.Cell):def __init__(self):super().__init__()self.flatten = nn.Flatten()self.dense_relu_sequential = nn.SequentialCell(nn.Dense(28*28, 512),nn.ReLU(),nn.Dense(512, 512),nn.ReLU(),nn.Dense(512, 10))
​def construct(self, x):x = self.flatten(x)logits = self.dense_relu_sequential(x)return logits
​
model = Network()
input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))
output = model(input)
print(output)

[[ 0.05363735 0.05117104 -0.03343301 0.06347139 0.07546629 0.03263091
0.02790363 0.06269836 0.01838502 0.04387159]
[ 0.05363735 0.05117104 -0.03343301 0.06347139 0.07546629 0.03263091
0.02790363 0.06269836 0.01838502 0.04387159]
[ 0.05363735 0.05117104 -0.03343301 0.06347139 0.07546629 0.03263091
0.02790363 0.06269836 0.01838502 0.04387159]
[ 0.05363735 0.05117104 -0.03343301 0.06347139 0.07546629 0.03263091
0.02790363 0.06269836 0.01838502 0.04387159]

[ 0.05363735 0.05117104 -0.03343301 0.06347139 0.07546629 0.03263091
0.02790363 0.06269836 0.01838502 0.04387159]
[ 0.05363735 0.05117104 -0.03343301 0.06347139 0.07546629 0.03263091
0.02790363 0.06269836 0.01838502 0.04387159]
[ 0.05363735 0.05117104 -0.03343301 0.06347139 0.07546629 0.03263091
0.02790363 0.06269836 0.01838502 0.04387159]
[ 0.05363735 0.05117104 -0.03343301 0.06347139 0.07546629 0.03263091
0.02790363 0.06269836 0.01838502 0.04387159]]

在这里插入图片描述

静态图模式的使用场景

MindSpore编译器重点面向Tensor数据的计算以及其微分处理。因此使用MindSpore API以及基于Tensor对象的操作更适合使用静态图编译优化。其他操作虽然可以部分入图编译,但实际优化作用有限。另外,静态图模式先编译后执行的模式导致其存在编译耗时。因此,如果函数无需反复执行,那么使用静态图加速也可能没有价值。

有关使用静态图来进行网络编译的示例,请参考网络构建。

静态图模式开启方式

通常情况下,由于动态图的灵活性,我们会选择使用PyNative模式来进行自由的神经网络构建,以实现模型的创新和优化。但是当需要进行性能加速时,我们需要对神经网络部分或整体进行加速。MindSpore提供了两种切换为图模式的方式,分别是基于装饰器的开启方式以及基于全局context的开启方式。

基于装饰器的开启方式

MindSpore提供了jit装饰器,可以通过修饰Python函数或者Python类的成员函数使其被编译成计算图,通过图优化等技术提高运行速度。此时我们可以简单的对想要进行性能优化的模块进行图编译加速,而模型其他部分,仍旧使用解释执行方式,不丢失动态图的灵活性。无论全局context是设置成静态图模式还是动态图模式,被jit修饰的部分始终会以静态图模式进行运行。

在需要对Tensor的某些运算进行编译加速时,可以在其定义的函数上使用jit修饰器,在调用该函数时,该模块自动被编译为静态图。需要注意的是,jit装饰器只能用来修饰函数,无法对类进行修饰。jit的使用示例如下:

import numpy as np
import mindspore as ms
from mindspore import nn, Tensor
​
class Network(nn.Cell):def __init__(self):super().__init__()self.flatten = nn.Flatten()self.dense_relu_sequential = nn.SequentialCell(nn.Dense(28*28, 512),nn.ReLU(),nn.Dense(512, 512),nn.ReLU(),nn.Dense(512, 10))
​def construct(self, x):x = self.flatten(x)logits = self.dense_relu_sequential(x)return logits
​
input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))
​
@ms.jit  # 使用ms.jit装饰器,使被装饰的函数以静态图模式运行
def run(x):model = Network()return model(x)
​
output = run(input)
print(output)

[[-0.12126954 0.06986676 -0.2230821 -0.07087803 -0.01003947 0.01063392
0.10143848 -0.0200909 -0.09724037 0.0114444 ]
[-0.12126954 0.06986676 -0.2230821 -0.07087803 -0.01003947 0.01063392
0.10143848 -0.0200909 -0.09724037 0.0114444 ]
[-0.12126954 0.06986676 -0.2230821 -0.07087803 -0.01003947 0.01063392
0.10143848 -0.0200909 -0.09724037 0.0114444 ]
[-0.12126954 0.06986676 -0.2230821 -0.07087803 -0.01003947 0.01063392
0.10143848 -0.0200909 -0.09724037 0.0114444 ]

[-0.12126954 0.06986676 -0.2230821 -0.07087803 -0.01003947 0.01063392
0.10143848 -0.0200909 -0.09724037 0.0114444 ]
[-0.12126954 0.06986676 -0.2230821 -0.07087803 -0.01003947 0.01063392
0.10143848 -0.0200909 -0.09724037 0.0114444 ]
[-0.12126954 0.06986676 -0.2230821 -0.07087803 -0.01003947 0.01063392
0.10143848 -0.0200909 -0.09724037 0.0114444 ]
[-0.12126954 0.06986676 -0.2230821 -0.07087803 -0.01003947 0.01063392
0.10143848 -0.0200909 -0.09724037 0.0114444 ]]

在这里插入图片描述

除使用修饰器外,也可使用函数变换方式调用jit方法,示例如下:

import numpy as np
import mindspore as ms
from mindspore import nn, Tensor
​
class Network(nn.Cell):def __init__(self):super().__init__()self.flatten = nn.Flatten()self.dense_relu_sequential = nn.SequentialCell(nn.Dense(28*28, 512),nn.ReLU(),nn.Dense(512, 512),nn.ReLU(),nn.Dense(512, 10))
​def construct(self, x):x = self.flatten(x)logits = self.dense_relu_sequential(x)return logits
​
input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))
​
def run(x):model = Network()return model(x)
​
run_with_jit = ms.jit(run)  # 通过调用jit将函数转换为以静态图方式执行
output = run(input)
print(output)

[[ 0.11027216 -0.09628229 0.0457969 0.05396656 -0.06958974 0.0428197
-0.1572069 -0.14151613 -0.04531277 0.07521383]
[ 0.11027216 -0.09628229 0.0457969 0.05396656 -0.06958974 0.0428197
-0.1572069 -0.14151613 -0.04531277 0.07521383]
[ 0.11027216 -0.09628229 0.0457969 0.05396656 -0.06958974 0.0428197
-0.1572069 -0.14151613 -0.04531277 0.07521383]
[ 0.11027216 -0.09628229 0.0457969 0.05396656 -0.06958974 0.0428197
-0.1572069 -0.14151613 -0.04531277 0.07521383]

[ 0.11027216 -0.09628229 0.0457969 0.05396656 -0.06958974 0.0428197
-0.1572069 -0.14151613 -0.04531277 0.07521383]
[ 0.11027216 -0.09628229 0.0457969 0.05396656 -0.06958974 0.0428197
-0.1572069 -0.14151613 -0.04531277 0.07521383]
[ 0.11027216 -0.09628229 0.0457969 0.05396656 -0.06958974 0.0428197
-0.1572069 -0.14151613 -0.04531277 0.07521383]
[ 0.11027216 -0.09628229 0.0457969 0.05396656 -0.06958974 0.0428197
-0.1572069 -0.14151613 -0.04531277 0.07521383]]

在这里插入图片描述

当我们需要对神经网络的某部分进行加速时,可以直接在construct方法上使用jit修饰器,在调用实例化对象时,该模块自动被编译为静态图。示例如下:

import numpy as np
import mindspore as ms
from mindspore import nn, Tensor
​
class Network(nn.Cell):def __init__(self):super().__init__()self.flatten = nn.Flatten()self.dense_relu_sequential = nn.SequentialCell(nn.Dense(28*28, 512),nn.ReLU(),nn.Dense(512, 512),nn.ReLU(),nn.Dense(512, 10))
​@ms.jit  # 使用ms.jit装饰器,使被装饰的函数以静态图模式运行def construct(self, x):x = self.flatten(x)logits = self.dense_relu_sequential(x)return logits
​
input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))
model = Network()
output = model(input)
print(output)

[[ 0.10522258 0.06597593 -0.09440921 -0.04883489 0.07194916 0.1343117
-0.06813788 0.01986085 0.0216996 -0.05345828]
[ 0.10522258 0.06597593 -0.09440921 -0.04883489 0.07194916 0.1343117
-0.06813788 0.01986085 0.0216996 -0.05345828]
[ 0.10522258 0.06597593 -0.09440921 -0.04883489 0.07194916 0.1343117
-0.06813788 0.01986085 0.0216996 -0.05345828]
[ 0.10522258 0.06597593 -0.09440921 -0.04883489 0.07194916 0.1343117
-0.06813788 0.01986085 0.0216996 -0.05345828]

[ 0.10522258 0.06597593 -0.09440921 -0.04883489 0.07194916 0.1343117
-0.06813788 0.01986085 0.0216996 -0.05345828]
[ 0.10522258 0.06597593 -0.09440921 -0.04883489 0.07194916 0.1343117
-0.06813788 0.01986085 0.0216996 -0.05345828]
[ 0.10522258 0.06597593 -0.09440921 -0.04883489 0.07194916 0.1343117
-0.06813788 0.01986085 0.0216996 -0.05345828]
[ 0.10522258 0.06597593 -0.09440921 -0.04883489 0.07194916 0.1343117
-0.06813788 0.01986085 0.0216996 -0.05345828]]

在这里插入图片描述

基于context的开启方式

context模式是一种全局的设置模式。代码示例如下:

import numpy as np
import mindspore as ms
from mindspore import nn, Tensor
ms.set_context(mode=ms.GRAPH_MODE)  # 使用set_context进行运行静态图模式的配置
​
class Network(nn.Cell):def __init__(self):super().__init__()self.flatten = nn.Flatten()self.dense_relu_sequential = nn.SequentialCell(nn.Dense(28*28, 512),nn.ReLU(),nn.Dense(512, 512),nn.ReLU(),nn.Dense(512, 10))
​def construct(self, x):x = self.flatten(x)logits = self.dense_relu_sequential(x)return logits
​
model = Network()
input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))
output = model(input)
print(output)

[[ 0.08501796 -0.04404321 -0.05165704 0.00357929 0.00051521 0.00946456
0.02748473 -0.19415936 -0.00278988 0.04024826]
[ 0.08501796 -0.04404321 -0.05165704 0.00357929 0.00051521 0.00946456
0.02748473 -0.19415936 -0.00278988 0.04024826]
[ 0.08501796 -0.04404321 -0.05165704 0.00357929 0.00051521 0.00946456
0.02748473 -0.19415936 -0.00278988 0.04024826]
[ 0.08501796 -0.04404321 -0.05165704 0.00357929 0.00051521 0.00946456
0.02748473 -0.19415936 -0.00278988 0.04024826]

[ 0.08501796 -0.04404321 -0.05165704 0.00357929 0.00051521 0.00946456
0.02748473 -0.19415936 -0.00278988 0.04024826]
[ 0.08501796 -0.04404321 -0.05165704 0.00357929 0.00051521 0.00946456
0.02748473 -0.19415936 -0.00278988 0.04024826]
[ 0.08501796 -0.04404321 -0.05165704 0.00357929 0.00051521 0.00946456
0.02748473 -0.19415936 -0.00278988 0.04024826]
[ 0.08501796 -0.04404321 -0.05165704 0.00357929 0.00051521 0.00946456
0.02748473 -0.19415936 -0.00278988 0.04024826]]

在这里插入图片描述

静态图的语法约束

在Graph模式下,Python代码并不是由Python解释器去执行,而是将代码编译成静态计算图,然后执行静态计算图。因此,编译器无法支持全量的Python语法。MindSpore的静态图编译器维护了Python常用语法子集,以支持神经网络的构建及训练。详情可参考静态图语法支持。

JitConfig配置选项

在图模式下,可以通过使用JitConfig配置选项来一定程度的自定义编译流程,目前JitConfig支持的配置参数如下:

  • jit_level: 用于控制优化等级。
  • exec_mode: 用于控制模型执行方式。
  • jit_syntax_level: 设置静态图语法支持级别,详细介绍请见静态图语法支持。

静态图高级编程技巧

使用静态图高级编程技巧可以有效地提高编译效率以及执行效率,并可以使程序运行的更加稳定。

在这里插入图片描述

相关文章:

昇思25天学习打卡营第9天|MindSpore使用静态图加速(基于context的开启方式)

在Graph模式下,Python代码并不是由Python解释器去执行,而是将代码编译成静态计算图,然后执行静态计算图。 在静态图模式下,MindSpore通过源码转换的方式,将Python的源码转换成中间表达IR(Intermediate Repr…...

class类和style内联样式的绑定

这里的绑定其实就是v-bind的绑定,如代码所示,div后面的引号就是v-bind绑定,然后大括号将整个对象括起来,对象内先是属性,属性后接的是变量,这个变量是定义在script中的,后通过这个变量&#xff…...

3033.力扣每日一题7/5 Java

博客主页:音符犹如代码系列专栏:算法练习关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 目录 思路 解题方法 时间复杂度 空间复杂度 Code 思路 首先创建一个与…...

GPT-5:下一代AI如何彻底改变我们的未来

GPT-5 发布前瞻:技术突破与未来展望 随着科技的飞速发展,人工智能领域不断迎来新的突破。根据最新消息,OpenAI 的首席技术官米拉穆拉蒂在一次采访中确认,GPT-5 将在一年半后发布,并描述了其从 GPT-4 到 GPT-5 的飞跃如…...

重载一元运算符

自增运算符 #include<iostream> using namespace std; class CGirl { public:string name;int ranking;CGirl() { name "zhongge"; ranking 5; }void show() const{ cout << "name : "<<name << " , ranking : " <…...

10元 DIY 一个柔性灯丝氛围灯

之前TikTok上特别火的线性氛围灯Augelight刚出来的时候一度卖到80多美金&#xff0c;国内1688也能到400多人民币。 随着各路国内厂商和DIY创客的跟进&#xff0c;功能变多的同时价格一路下滑&#xff0c;虽然有的质感的确感人&#xff0c;但是便宜啊。 甚至关注的up有把成本搞到…...

表单自定义组件 - 可选择卡片SelectCard

import React from react; import styles from ./index.module.less;type OptionsType {/*** 每个item渲染一行&#xff0c;第0项为标题*/labels?: any[];/*** 自定义渲染内容*/label?: string | React.ReactNode;value: any; }; interface IProps {value?: any;onChange?…...

Ubuntu / Debian安装FTP服务

本章教程,记录在Ubuntu中安装FTP服务的具体步骤。FTP默认端口:21 1、安装 pure-ftpd sudo apt-get install pure-ftpd2、修改默认配置 # 与 centos 不同,这里需要在 /etc/pure-ftpd/conf 文件夹下执行下列命令,增加对应配置文件: # 创建 /etc/pure-ftpd/conf/PureDB 文件…...

若依 Vue 前端分离 3.8.8 版中生成的前端代码中关于下拉框只有下拉箭头的问题

生成代码修改前 <el-form-item label"课程学科" prop"subject"><el-select v-model"queryParams.subject" placeholder"请选择课程学科" clearable><el-optionv-for"dict in course_subject":key"dict…...

C++把一个类封装成动态链接库

一、步骤 1. 创建类头文件 首先&#xff0c;定义你要封装的类。例如&#xff0c;创建一个名为MyClass的类&#xff1a; // MyClass.h #pragma once#ifdef MYCLASS_EXPORTS #define MYCLASS_API __declspec(dllexport) #else #define MYCLASS_API __declspec(dllimport) #end…...

每天一个项目管理概念之项目章程

项目管理中&#xff0c;项目章程扮演着至关重要的角色。它是项目正式启动的标志&#xff0c;为项目的执行提供法律和组织上的认可。项目章程是项目管理知识体系&#xff08;PMBOK&#xff09;中定义的关键文档之一&#xff0c;对于确保项目的顺利进行具有决定性的影响。 定义与…...

c++11新特性-4-返回类型后置

文章目录 返回类型后置1.基本语法 返回类型后置 1.基本语法 auto func(参数1&#xff0c;参数2&#xff0c;参数3&#xff0c;...)->decltype(参数表达式) {...... }例如&#xff1a; template<typename T,typename U> auto add(T t,U u)->decltype(t u) {retu…...

Linux-C语言实现一个进度条小项目

如何在linux中用C语言写一个项目来实现进度条&#xff1f;&#xff08;如下图所示&#xff09; 我们知道\r是回车&#xff0c;\n是换行&#xff08;且会刷新&#xff09; 我们可以用 \r 将光标移回行首&#xff0c;重新打印一样格式的内容&#xff0c;覆盖旧的内容&#xff0c;…...

vue使用glide.js实现轮播图(可直接复制使用)

效果图 可以实现自动轮播&#xff0c;3种切换方式&#xff1a;直接滑动图片、点击两侧按钮、点击底部按钮 体验链接:http://website.livequeen.top 实现 一、引入依赖 1、控制台引入依赖 npm install glidejs/glide 2、在css中引用 <style scoped> import glidejs/g…...

TK养号工具开发会用上的源代码科普!

在当今数字化时代&#xff0c;社交媒体平台的崛起使得网络账号的维护与管理变得日益重要&#xff0c;其中&#xff0c;TK作为一款备受欢迎的社交媒体平台&#xff0c;吸引了大量用户。 在TK上进行账号养护&#xff0c;即通过各种方式提升账号权重、增加曝光量&#xff0c;已成…...

信创-办公软件应用工程师认证

随着国家对信息技术自主创新的战略重视程度不断提升&#xff0c;信创产业迎来前所未有的发展机遇。未来几年内&#xff0c;信创产业将呈现市场规模扩大、技术创新加速、产业链完善和国产化替代加速的趋势。信创人才培养对于推动产业发展具有重要意义。应加强高校教育、建立人才…...

数组操作forEach和map

forEach和map的相同点 1、都是循环遍历数组中的每一项 2、入参匿名函数都支持三个参数&#xff0c;当前项item&#xff0c;当前项索引index&#xff0c;原始数组arr&#xff1b;匿名函数中的this都指向window 3、都可以通过return跳过本次循环 4、都无法通过使用 break 语句来中…...

流式处理应用场景与流式计算处理框架选择建议

文章目录 前言使用场景如何选择流式处理框架 前言 在之前的文章中我们介绍了如何进行流式处理——从一般性的概念和模式说起&#xff0c;并列举了一些Streams的例子&#xff1a; 流式处理相关概念总结说明流式处理设计模式总结说明Kafka Streams 架构概览 接下来的文章将介绍…...

2024年软件测试岗必问的100+个面试题【含答案】

一、基础理论 1、开场介绍 介绍要领&#xff1a;个人基本信息、工作经历、之前所做过的工作及个人专长或者技能优势。扬长避短&#xff0c;一定要口语化&#xff0c;语速适中。沟通好的就多说几句&#xff0c;沟通不好的话就尽量少说两句。举例如下&#xff1a; 面试官你好&…...

A4-C四驱高防轮式巡检机器人

在当今数字化和智能化迅速发展的时代&#xff0c;旗晟智能带来了一款革命性的创新产品——A4-C四驱高防轮式巡检机器人。这款机器人以其卓越的性能和多功能性&#xff0c;为工业巡检领域带来了全新的解决方案。 一、产品亮点 1、四驱动力与高防护设计 四驱高防轮式巡检机器人…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...