昇思25天学习打卡营第9天|静态图模式的深度剖析与应用指南

目录

背景介绍

动态图模式

静态图模式

静态图模式的使用场景

静态图模式开启方式

基于装饰器的开启方式

基于context的开启方式

静态图的语法约束

JitConfig配置选项

静态图高级编程技巧


背景介绍


        AI 编译框架主要包含两种运行模式,即动态图模式与静态图模式。在默认状况下,MindSpore 是以动态图模式进行运行的,不过同时也支持通过人工操作切换为静态图模式。

动态图模式

        动态图的显著特点在于计算图的构建和计算同步进行(Define by run),这与 Python 的解释执行方式相契合。当在计算图中定义一个 Tensor 时,其值会即刻被计算并确定,所以在调试模型时颇为便捷,能够实时获取中间结果的值。然而,由于所有节点都需保存,致使难以对整个计算图予以优化。

        在 MindSpore 里,动态图模式又称作 PyNative 模式。鉴于动态图的解释执行特性,在脚本开发以及网络流程调试阶段,建议使用动态图模式进行调试。若需手动控制框架采用 PyNative 模式,可通过以下代码来构建网络。

        使用 MindSpore 框架构建了一个简单的神经网络模型,并对输入数据进行了前向传播计算,最后打印输出结果。

        代码如下:

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) 

        分析:首先,成功导入了所需的相关库,这里面有 numpy 以及 mindspore ,还有 mindspore 中的部分重要模块。

        紧接着,定义了一个被命名为 Network 的类,此类别继承自 nn.Cell 。在该类的初始化方法 init 当中,精心定义了一系列的神经网络层,其中涵盖了展平层 Flatten ,以及一个由多层全连接和激活函数所构成的序列 nn.SequentialCell 。

        在 construct 方法里,清晰地定义了前向传播的计算逻辑。具体来说,先是对输入数据实施展平操作,随后通过先前定义好的序列层来进行计算,从而获取到预测的 logits 。

        随后,创建了 Network 类的实例 model ,并且成功生成了一个输入张量 input 。

        最后,将这个输入张量传递进模型展开计算,进而得到输出 output ,并把这一结果予以打印输出

        运行结果:

[[ 0.16246006 -0.11432456  0.04079182  0.16045687  0.01581723  0.00070624  0.05681457 -0.02252093 -0.05198406 -0.02421071]  [ 0.16246006 -0.11432456  0.04079182  0.16045687  0.01581723  0.00070624  0.05681457 -0.02252093 -0.05198406 -0.02421071]  [ 0.16246006 -0.11432456  0.04079182  0.16045687  0.01581723  0.00070624  0.05681457 -0.02252093 -0.05198406 -0.02421071]  [ 0.16246006 -0.11432456  0.04079182  0.16045687  0.01581723  0.00070624  0.05681457 -0.02252093 -0.05198406 -0.02421071]  [ 0.16246006 -0.11432456  0.04079182  0.16045687  0.01581723  0.00070624  0.05681457 -0.02252093 -0.05198406 -0.02421071]  
...  [ 0.16246006 -0.11432456  0.04079182  0.16045687  0.01581723  0.00070624  0.05681457 -0.02252093 -0.05198406 -0.02421071]  [ 0.16246006 -0.11432456  0.04079182  0.16045687  0.01581723  0.00070624  0.05681457 -0.02252093 -0.05198406 -0.02421071]  [ 0.16246006 -0.11432456  0.04079182  0.16045687  0.01581723  0.00070624  0.05681457 -0.02252093 -0.05198406 -0.02421071]  [ 0.16246006 -0.11432456  0.04079182  0.16045687  0.01581723  0.00070624  0.05681457 -0.02252093 -0.05198406 -0.02421071]  [ 0.16246006 -0.11432456  0.04079182  0.16045687  0.01581723  0.00070624  0.05681457 -0.02252093 -0.05198406 -0.02421071]] 

静态图模式

        相较于动态图来说,静态图具有一个显著的特点,那便是将计算图的构建与实际的计算过程相互分离(Define and run)。至于静态图模式的运行原理,大家可以参考静态图语法支持的相关内容。

        在 MindSpore 当中,静态图模式还被称作 Graph 模式。处于 Graph 模式之下,借助于图优化、计算图整图下沉等一系列技术,编译器能够针对整个计算图展开全局性的优化操作,进而获取较为出色的性能表现。所以,这种模式相对而言更适合网络结构固定并且对性能要求较高的场景。

        倘若需要手动把控框架采用静态图模式,能够通过如下代码来进行网络的构建:成功定义了一个神经网络模型 Network ,并针对输入数据实施了前向传播以计算输出。接下来,将介绍运用 mindspore 框架构建并运行一个简易神经网络模型的具体方法。

        代码如下:

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)  

        分析:首先导入了必要的库,如 numpy 、mindspore 等,并配置为静态图模式。

        然后定义了一个名为 Network 的类,它继承自 nn.Cell 。在 __init__ 方法中,初始化了一些网络层,包括展平层 nn.Flatten 和一个包含多个全连接层及激活函数的序列 nn.SequentialCell 。

        在 construct 方法中定义了前向传播的计算逻辑,先对输入进行展平操作,然后通过定义的序列层进行计算得到 logits 。

        接着创建了 Network 类的实例 model ,并生成一个输入张量 input 。

        最后将输入通过模型进行计算得到输出 output 并打印。

        运行结果:

[[ 0.08111228 -0.06155853 -0.16565546  0.05599653 -0.10597651 -0.13046513  0.05319815  0.13381606  0.15450898 -0.04248318]  [ 0.08111228 -0.06155853 -0.16565546  0.05599653 -0.10597651 -0.13046513  0.05319815  0.13381606  0.15450898 -0.04248318]  [ 0.08111228 -0.06155853 -0.16565546  0.05599653 -0.10597651 -0.13046513  0.05319815  0.13381606  0.15450898 -0.04248318]  [ 0.08111228 -0.06155853 -0.16565546  0.05599653 -0.10597651 -0.13046513  0.05319815  0.13381606  0.15450898 -0.04248318]  [ 0.08111228 -0.06155853 -0.16565546  0.05599653 -0.10597651 -0.13046513  0.05319815  0.13381606  0.15450898 -0.04248318]  
...  [ 0.08111228 -0.06155853 -0.16565546  0.05599653 -0.10597651 -0.13046513  0.05319815  0.13381606  0.15450898 -0.04248318]  [ 0.08111228 -0.06155853 -0.16565546  0.05599653 -0.10597651 -0.13046513  0.05319815  0.13381606  0.15450898 -0.04248318]  [ 0.08111228 -0.06155853 -0.16565546  0.05599653 -0.10597651 -0.13046513  0.05319815  0.13381606  0.15450898 -0.04248318]  [ 0.08111228 -0.06155853 -0.16565546  0.05599653 -0.10597651 -0.13046513  0.05319815  0.13381606  0.15450898 -0.04248318]  [ 0.08111228 -0.06155853 -0.16565546  0.05599653 -0.10597651 -0.13046513  0.05319815  0.13381606  0.15450898 -0.04248318]]  

        

静态图模式的使用场景


        MindSpore 编译器主要聚焦于 Tensor 数据的计算及其微分处理。故而,运用 MindSpore API 以及基于 Tensor 对象的操作,采用静态图编译优化会更为适宜。其他操作虽说能够部分纳入图编译,然而实际的优化效果却较为有限。再者,静态图模式所具有的先编译后执行的特性,致使其存在编译耗时的情况。所以,倘若函数无需多次执行,那么利用静态图来加速或许并无太大意义。

静态图模式开启方式


基于装饰器的开启方式

        MindSpore 提供了 jit 装饰器,能够通过对 Python 函数或者 Python 类的成员函数进行修饰,使其被编译为计算图,借由图优化等技术来提升运行速度。此时,我们能够简便地针对期望进行性能优化的模块实施图编译加速,而模型的其他部分,依旧采用解释执行的方式,从而不会丧失动态图的灵活性。不管全局 context 是设定为静态图模式还是动态图模式,被 jit 修饰的部分始终会以静态图模式运行。

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

        即使用 MindSpore 框架构建了一个神经网络 Network ,然后使用 ms.jit 装饰器定义了一个名为 run 的函数,在这个函数中创建了 Network 模型实例,并将输入数据 input 传入模型进行计算,最后打印输出结果。

        代码如下:

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)  

        分析:首先,定义了一个名为 Network 的类,继承自 nn.Cell ,在类中初始化了一些层,包括 Flatten 和一系列的 Dense 与 ReLU 层。

        然后,定义了一个输入 input ,它是一个 Tensor 类型的数据。

        接着,使用 ms.jit 装饰器修饰 run 函数,这意味着在运行 run 函数时,其中的操作会以静态图模式进行优化和执行。

        在 run 函数内部,创建了 Network 模型的实例 model ,并将 input 传入模型计算得到结果并返回。

        最后,将 run 函数的输出打印出来。

        运行结果:

[[ 0.0252679   0.0036834   0.08489509  0.07125469  0.19286017 -0.01487035  -0.04551143  0.1177191  -0.00667884  0.02147292]  [ 0.0252679   0.0036834   0.08489509  0.07125469  0.19286017 -0.01487035  -0.04551143  0.1177191  -0.00667884  0.02147292]  [ 0.0252679   0.0036834   0.08489509  0.07125469  0.19286017 -0.01487035  -0.04551143  0.1177191  -0.00667884  0.02147292]  [ 0.0252679   0.0036834   0.08489509  0.07125469  0.19286017 -0.01487035  -0.04551143  0.1177191  -0.00667884  0.02147292]  [ 0.0252679   0.0036834   0.08489509  0.07125469  0.19286017 -0.01487035  -0.04551143  0.1177191  -0.00667884  0.02147292]  
...  [ 0.0252679   0.0036834   0.08489509  0.07125469  0.19286017 -0.01487035  -0.04551143  0.1177191  -0.00667884  0.02147292]  [ 0.0252679   0.0036834   0.08489509  0.07125469  0.19286017 -0.01487035  -0.04551143  0.1177191  -0.00667884  0.02147292]  [ 0.0252679   0.0036834   0.08489509  0.07125469  0.19286017 -0.01487035  -0.04551143  0.1177191  -0.00667884  0.02147292]  [ 0.0252679   0.0036834   0.08489509  0.07125469  0.19286017 -0.01487035  -0.04551143  0.1177191  -0.00667884  0.02147292]  [ 0.0252679   0.0036834   0.08489509  0.07125469  0.19286017 -0.01487035  -0.04551143  0.1177191  -0.00667884  0.02147292]]  

        除使用修饰器外,也可使用函数变换方式调用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)  

        分析:首先导入了所需的库和模块。然后定义了一个名为 Network 的类,它继承自 nn.Cell ,在类的初始化方法 __init__ 中定义了一些层,包括展平层 Flatten 和一个由全连接层 Dense 与激活函数 ReLU 组成的序列 dense_relu_sequential 。

        接着创建了一个输入数据 input 。

        之后定义了一个名为 run 的函数,在函数内部创建了 Network 类的实例 model ,并将输入 x 传入模型进行计算并返回结果。

        然后通过 ms.jit(run) 将 run 函数转换为以静态图方式执行,并将其结果赋值给 run_with_jit 。

        最后调用 run 函数并将输入 input 传入,得到输出并打印。

        总的来说,这段代码构建了一个神经网络模型,并尝试以不同的方式(普通函数和静态图)来运行模型进行计算和输出结果。

        运行结果:

[[-0.26886722 -0.01613193 -0.02503425 -0.06268327  0.1372346   0.08339559  -0.05737131 -0.03662169  0.09235285 -0.12165849]  [-0.26886722 -0.01613193 -0.02503425 -0.06268327  0.1372346   0.08339559  -0.05737131 -0.03662169  0.09235285 -0.12165849]  [-0.26886722 -0.01613193 -0.02503425 -0.06268327  0.1372346   0.08339559  -0.05737131 -0.03662169  0.09235285 -0.12165849]  [-0.26886722 -0.01613193 -0.02503425 -0.06268327  0.1372346   0.08339559  -0.05737131 -0.03662169  0.09235285 -0.12165849]  [-0.26886722 -0.01613193 -0.02503425 -0.06268327  0.1372346   0.08339559  -0.05737131 -0.03662169  0.09235285 -0.12165849]  
...  [-0.26886722 -0.01613193 -0.02503425 -0.06268327  0.1372346   0.08339559  -0.05737131 -0.03662169  0.09235285 -0.12165849]  [-0.26886722 -0.01613193 -0.02503425 -0.06268327  0.1372346   0.08339559  -0.05737131 -0.03662169  0.09235285 -0.12165849]  [-0.26886722 -0.01613193 -0.02503425 -0.06268327  0.1372346   0.08339559  -0.05737131 -0.03662169  0.09235285 -0.12165849]  [-0.26886722 -0.01613193 -0.02503425 -0.06268327  0.1372346   0.08339559  -0.05737131 -0.03662169  0.09235285 -0.12165849]  [-0.26886722 -0.01613193 -0.02503425 -0.06268327  0.1372346   0.08339559  -0.05737131 -0.03662169  0.09235285 -0.12165849]]  

        当我们需要对神经网络的某部分进行加速时,可以直接在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)

        分析:首先,导入了 numpy 库并命名为 np ,导入了 mindspore 库并命名为 ms ,还从 mindspore 库中导入了 nn 和 Tensor 。

        然后,定义了一个名为 Network 的类,它继承自 nn.Cell 。在类的初始化方法 __init__ 中进行了一些基础设置。

        接着,使用 ms.jit 装饰器修饰了 Network 类的 construct 方法,这意味着该方法在运行时会以静态图模式进行优化。

        之后,创建了一个输入数据 input ,它是一个 Tensor 类型。

        再然后,创建了 Network 类的实例 model 。

        最后,将 input 传入 model 进行计算,得到输出 output 并打印出来。

        总的来说,这段代码构建了一个基于 MindSpore 的神经网络模型,并对给定的输入数据进行计算和输出结果。

        运行结果:

[[-0.01447779 -0.02491043 -0.06172827 -0.12281439  0.05957274 -0.28446954  0.17217562  0.14563462  0.08131266 -0.02172118]  [-0.01447779 -0.02491043 -0.06172827 -0.12281439  0.05957274 -0.28446954  0.17217562  0.14563462  0.08131266 -0.02172118]  [-0.01447779 -0.02491043 -0.06172827 -0.12281439  0.05957274 -0.28446954  0.17217562  0.14563462  0.08131266 -0.02172118]  [-0.01447779 -0.02491043 -0.06172827 -0.12281439  0.05957274 -0.28446954  0.17217562  0.14563462  0.08131266 -0.02172118]  [-0.01447779 -0.02491043 -0.06172827 -0.12281439  0.05957274 -0.28446954  0.17217562  0.14563462  0.08131266 -0.02172118]  
...  [-0.01447779 -0.02491043 -0.06172827 -0.12281439  0.05957274 -0.28446954  0.17217562  0.14563462  0.08131266 -0.02172118]  [-0.01447779 -0.02491043 -0.06172827 -0.12281439  0.05957274 -0.28446954  0.17217562  0.14563462  0.08131266 -0.02172118]  [-0.01447779 -0.02491043 -0.06172827 -0.12281439  0.05957274 -0.28446954  0.17217562  0.14563462  0.08131266 -0.02172118]  [-0.01447779 -0.02491043 -0.06172827 -0.12281439  0.05957274 -0.28446954  0.17217562  0.14563462  0.08131266 -0.02172118]  [-0.01447779 -0.02491043 -0.06172827 -0.12281439  0.05957274 -0.28446954  0.17217562  0.14563462  0.08131266 -0.02172118]]  

基于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)  

        分析:首先导入了 numpy 库并简称为 np ,导入了 mindspore 库并简称为 ms ,还从 mindspore 中导入了 nn 和 Tensor 。

        然后使用 ms.set_context(mode=ms.GRAPH_MODE) 配置了 mindspore 的运行环境为静态图模式。

        接着定义了一个名为 Network 的类,继承自 nn.Cell 。在类的初始化方法 __init__ 中进行了一些层的定义,包括展平层和一系列全连接层与激活函数层的组合。

        之后创建了 Network 类的实例 model ,并创建了输入数据 input 。

        最后将 input 传入 model 进行计算得到输出 output ,并将其打印出来。

        总的来说,这段代码构建了一个神经网络模型,并在静态图模式下对输入数据进行处理和得到输出。

        运行结果:

[[ 0.11365249 -0.186111   -0.28579414  0.13091658  0.02833005 -0.17373694  0.28168008  0.04766882  0.0583384   0.0371065 ]  [ 0.11365249 -0.186111   -0.28579414  0.13091658  0.02833005 -0.17373694  0.28168008  0.04766882  0.0583384   0.0371065 ]  [ 0.11365249 -0.186111   -0.28579414  0.13091658  0.02833005 -0.17373694  0.28168008  0.04766882  0.0583384   0.0371065 ]  [ 0.11365249 -0.186111   -0.28579414  0.13091658  0.02833005 -0.17373694  0.28168008  0.04766882  0.0583384   0.0371065 ]  [ 0.11365249 -0.186111   -0.28579414  0.13091658  0.02833005 -0.17373694  0.28168008  0.04766882  0.0583384   0.0371065 ]  
...  [ 0.11365249 -0.186111   -0.28579414  0.13091658  0.02833005 -0.17373694  0.28168008  0.04766882  0.0583384   0.0371065 ]  [ 0.11365249 -0.186111   -0.28579414  0.13091658  0.02833005 -0.17373694  0.28168008  0.04766882  0.0583384   0.0371065 ]  [ 0.11365249 -0.186111   -0.28579414  0.13091658  0.02833005 -0.17373694  0.28168008  0.04766882  0.0583384   0.0371065 ]  [ 0.11365249 -0.186111   -0.28579414  0.13091658  0.02833005 -0.17373694  0.28168008  0.04766882  0.0583384   0.0371065 ]  [ 0.11365249 -0.186111   -0.28579414  0.13091658  0.02833005 -0.17373694  0.28168008  0.04766882  0.0583384   0.0371065 ]]  

静态图的语法约束


        在 Graph 模式中,Python 代码并非交由 Python 解释器来执行,而是会先将其编译为静态计算图,后续再对静态计算图予以执行。正因如此,编译器难以对全部的 Python 语法提供支持。MindSpore 的静态图编译器精心维护了 Python 常用语法的子集部分,旨在为神经网络的构建以及训练提供有力支撑。

JitConfig配置选项


        在图模式之下,能够通过运用 JitConfig 配置选项来在一定程度上对编译流程进行自定义。当下,JitConfig 所支持的配置参数具体如下:

        jit_level:其作用是把控优化的等级。

        exec_mode:用于掌控模型的执行方式。

        jit_syntax_level:设定静态图语法的支持级别。

静态图高级编程技巧


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

  运行截图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/367776.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker(八)-Docker运行mysql8容器实例

1.运行mysql8容器实例并挂载数据卷 -e:配置环境变量 --lower_case_table_names1 设置忽略表名大小写一定要放在镜像之后运行mysql8容器实例之前,先查看是否存在mysql8镜像以及是否存在已运行的mysql实例docker run -d -p 3306:3306 --privilegedtrue -v 【宿主机日…

【windows】电脑如何关闭Bitlocker硬盘锁

如果你的硬盘显示这样的一把锁,说明开启了Bitlocker硬盘加密。 Bitlocker硬盘锁,可以保护硬盘被盗,加密防止打开查看数据。 方法一:进入“控制面板->BitLocker 驱动器加密”进行设置。或者“控制面板\系统和安全->BitLocke…

数据库对比脚本,java如何对比两个数据库的表字段的不同

因为有时候开发环境和 测试环境,有时候会有不同的数据库表,比如有些加字段了,所以这个脚本就实现了对比两个数据库连接的数据库到底哪里不一样,输出到控制台 package com.junfun.pms;import lombok.extern.slf4j.Slf4j;import ja…

SQL执行慢排查以及优化思路

数据库服务器的优化步骤 当我们遇到数据库调优问题的时候,该如何思考呢?我把思考的流程整理成了下面这张图。 整个流程划分成了观察(Show status)和行动(Action)两个部分。字母 S 的部分代表观察&#xf…

Android常用加解密算法总结

Android开发中对于数据的传输和保存一定会使用加密技术,加密算法是最普遍的安保手段,多数情况数据加密后在需要使用源数据时需要再进行解密,但凡是都有例外。下面从可逆加密、不可逆、不纯粹加密三种方式记录一下常见的加解密算法。 加密技术…

HDFS学习

3.5 HDFS存储原理 3.5.1 冗余数据保存 作为一个分布式文件系统,为了保证系统的容错性和可用性,HDFS采用了多副本方式对数据进行冗余存储,通常一个数据块的多个副本会被分布到不同的数据节点上。 如图所示,数据块1被分别存放到…

Eslint与Prettier搭配使用

目录 前置准备 Eslint配置 Prettier配置 解决冲突 前置准备 首先需要安装对应的插件 然后配置settings.json 点开之后就会进入settings.json文件里,加上这两个配置 // 保存的时候自动格式化 "editor.formatOnSave": true, // 保存的时候使用prettier进…

【Qt之·类QTableWidget】

系列文章目录 文章目录 前言一、常用属性二、成员函数2.1 左上角空白区域 三、实例演示总结 前言 一、常用属性 二、成员函数 方法描述selectRow选中行removeRow移除行insertRow插入行rowCount总行数 2.1 左上角空白区域 QTableCornerButton即不属于列表头,也不…

像学Excel 一样学 Pandas系列-创建数据分析维度

嗨,小伙伴们。又到喜闻乐见的Python 数据分析王牌库 Pandas 的学习时间。按照数据分析处理过程,这次轮到了新增维度的部分了。 老样子,我们先来回忆一下,一个完整数据分析的过程,包含哪些部分内容。 其中&#xff0c…

【Python】成功解决TypeError: ‘float‘ object cannot be interpreted as an integer

【Python】成功解决TypeError: ‘float’ object cannot be interpreted as an integer 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主…

【Web3项目案例】Ethers.js极简入门+实战案例:实现ERC20协议代币查询、交易

苏泽 大家好 这里是苏泽 一个钟爱区块链技术的后端开发者 本篇专栏 ←持续记录本人自学智能合约学习笔记和经验总结 如果喜欢拜托三连支持~ 目录 简介 前景科普-ERC20 Ethers极简入门教程:HelloVitalik(非小白可跳) 教程概览 开发工具 V…

vue3开发过程中遇到的一些问题记录

问题: vue3在使用 defineProps、defineEmits、defineExpose 时不需要import,但是 eslint会报错error defineProps is not defined no-undef 解决方法: 安装 vue-eslint-parser 插件,在 .eslintrc.js 文件中添加配置 parser: vue-e…

开发者聊科学作息时间表

非常有幸对科学作息时间表app的开发者做一次采访。 问:你对科学作息时间表app满意么? 答:非常不满意,我们的设想是让他更智能,更多的提醒方式,更好的交互体验。如果作为一个闹钟他是非常不合格的&#xff0…

DataX数据迁移

DataX数据迁移 访问DataX Web管理页面: http://ip:9527/index.html 用户名:admin,密码:123456 本文中示例将SqlServer数据增量同步到MySql中。 增量同步同步时,MySql中的新字段设置默认值 1. 查看执行器是否注册成…

平衡二叉查找树和多路查找树

平衡二叉查找树 普通平衡二叉查找树 平衡二叉树定义是按照有序排列成树状,左子树数据大于右子树,任意节点的左右子树高度不能大于1 优点:可以保证绝对的平衡 缺点:当进行删除节点和新增节点,树进行自平衡的时候&…

jenkins 发布服务到linux服务器

1.环境准备 1.1 需要一台已经部署了jenkins的服务器,上面已经集成好了,jdk、maven、nodejs、git等基础的服务。 1.2 需要安装插件 pusblish over ssh 1.3 准备一台额外的linux服务器,安装好jdk 2.流程描述 2.1 配置jenkins,包括p…

[leetcode hot 150]第四百五十二题,用最少数量的箭引爆气球

题目: 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。…

《昇思25天学习打卡营第6天 | 函数式自动微分》

《昇思25天学习打卡营第6天 | 函数式自动微分》 目录 《昇思25天学习打卡营第6天 | 函数式自动微分》函数式自动微分简单的单层线性变换模型函数与计算图微分函数与梯度计算Stop Gradient 函数式自动微分 神经网络的训练主要使用反向传播算法,模型预测值&#xff0…

JAVA每日作业day7.1-7.3小总结

ok了家人们前几天学了一些知识,接下来一起看看吧 一.API Java 的 API ( API: Application( 应用 ) Programming( 程序 ) Interface(接口 ) ) Java API 就是 JDK 中提供给我们使用的类,这些类将底层 的代码实现封装了起来&#x…

Linux多进程和多线程(四)进程间通讯-定时器信号和子进程退出信号

多进程(四) 定时器信号alarm()函数示例alarm()函数的限制定时器信号的实现原理setitimer()函数setitimer()和alarm()函数的区别 setitimer() old_value参数的示例 对比alarm()区别总结: 子进程退出信号 示例: 多进程(四) 定时器信号 SIGALRM 信号是用来通知进程…