AI模型部署落地综述(ONNX/NCNN/TensorRT等)

导读

费尽心血训练好的深度学习模型如何给别人展示?只在服务器上运行demo怎么吸引别人的目光?怎么才能让自己的成果落地?这篇文章带你进入模型部署的大门。

0 前言

模型部署的步骤:

  1. 训练一个深度学习模型;

  2. 使用不同的推理框架对模型进行推理转换;

  3. 在应用平台运行转换好的模型。

步骤看起来比较简单,但是牵扯的到的知识还是比较多。在实际应用过程中,我们使用的模型通常不会太简单,因为要确保模型的精度。但是,实际应用场景往往需要模型速度与精度能达到一个较好的平衡。因此这就需要在算法(剪枝,压缩等)与底层(手写加速算作)去优化模型。但是,我们现在可以站在巨人的肩膀上去眺望世界,因此,该文章会给大家介绍一些常用的开源推理框架,大家一起参考学习。毕竟大牛团队做出来的好用一些。

1 ONNX、NCNN、OpenVINO、 TensorRT、Mediapipe模型部署那家强?

1.1 ONNX

简介:

开放神经网络交换ONNX(Open Neural Network Exchange)是一套表示深度神经网络模型的开放格式,由微软和Facebook于2017推出,然后迅速得到了各大厂商和框架的支持。通过短短几年的发展,已经成为表示深度学习模型的实际标准,并且通过ONNX-ML,可以支持传统非神经网络机器学习模型,大有一统整个AI模型交换标准。ONNX定义了一组与环境和平台无关的标准格式,为AI模型的互操作性提供了基础,使AI模型可以在不同框架和环境下交互使用。硬件和软件厂商可以基于ONNX标准优化模型性能,让所有兼容ONNX标准的框架受益,简单来说,ONNX就是模型转换的中间人。

使用场景:

图片

无论你使用什么样的训练框架来训练模型(比如TensorFlow/Pytorch/OneFlow/Paddle),你都可以在训练后将这些框架的模型统一转为ONNX存储。ONNX文件不仅存储了神经网络模型的权重,还存储了模型的结构信息、网络中各层的输入输出等一些信息。目前,ONNX主要关注在模型预测方面(inferring),将转换后的ONNX模型,转换成我们需要使用不同框架部署的类型,可以很容易的部署在兼容ONNX的运行环境中。

使用方法:

[代码示例]在 ONNX 模型上运行形状推理:https://github.com/onnx/onnx

import onnx  
from onnx import helper, shape\_inference  
from onnx import TensorProto  
  
   \# 预处理:创建一个包含两个节点的模型,Y是未知的  
node1 = helper.make\_node\("Transpose", \["X"\], \["Y"\], perm=\[1, 0, 2\]\)  
node2 = helper.make\_node\("Trans  
                           
                           
                           
                         pose", \["Y"\], \["Z"\], perm=\[1, 0, 2\]\)  
  
graph = helper.make\_graph\(  
    \[node1, node2\],  
    "two-transposes",  
    \[helper.make\_tensor\_value\_info\("X", TensorProto.FLOAT, \(2, 3, 4\)\)\],  
    \[helper.make\_tensor\_value\_info\("Z", TensorProto.FLOAT, \(2, 3, 4\)\)\],  
\)  
  
original\_model = helper.make\_model\(graph, producer\_name="onnx-examples"\)  
   \# 检查模型并打印Y的信息  
onnx.checker.check\_model\(original\_model\)  
print\(f"Before shape inference, the shape info of Y is:\\n\{original\_model.graph.value\_info\}"\)  
   \# 在模型上进行推理  
inferred\_model = shape\_inference.infer\_shapes\(original\_model\)  
   \# 检查模型并打印Y的信息  
onnx.checker.check\_model\(inferred\_model\)  
print\(f"After shape inference, the shape info of Y is:\\n\{inferred\_model.graph.value\_info\}"\) 

1.2 NCNN

简介:

ncnn 是一个为手机端极致优化的高性能神经网络前向计算框架,也是腾讯优图实验室成立以来的第一个开源项目。ncnn 从设计之初深刻考虑手机端的部署和使用,无第三方依赖,跨平台,手机端 CPU 的速度快于目前所有已知的开源框架。基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行,开发出人工智能 App。ncnn 目前已在腾讯多款应用中使用,如 QQ、Qzone、微信、天天P图等。

使用场景:

图片

从NCNN的发展矩阵可以看出,NCNN覆盖了几乎所有常用的系统平台,尤其是在移动平台上的适用性更好,在Linux、Windows和Android、以及iOS、macOS平台上都可以使用GPU来部署模型。

框架特点:
  • 支持卷积神经网络,支持多输入和多分支结构,可计算部分分支

  • 无任何第三方库依赖,不依赖 BLAS/NNPACK 等计算框架

  • 纯 C++ 实现,跨平台,支持 Android / iOS 等

  • ARM Neon 汇编级良心优化,计算速度极快

  • 精细的内存管理和数据结构设计,内存占用极低

  • 支持多核并行计算加速,ARM big.LITTLE CPU 调度优化

  • 支持基于全新低消耗的 Vulkan API GPU 加速

  • 可扩展的模型设计,支持 8bit 量化和半精度浮点存储,可导入 caffe/pytorch/mxnet/onnx/darknet/keras/tensorflow(mlir) 模型

  • 支持直接内存零拷贝引用加载网络模型

  • 可注册自定义层实现并扩展

使用方法:

[代码示例]输入数据并推理输出:https://github.com/Tencent/ncnn/wiki

 \#include \<opencv2/core/core.hpp>   \#include \<opencv2/highgui/highgui.hpp>   \#include "net.h"  
  
int main\(\)  
\{  
 // opencv读取输入图片  
    cv::Mat img = cv::imread\("image.ppm", CV\_LOAD\_IMAGE\_GRAYSCALE\);  
    int w = img.cols;  
    int h = img.rows;  
  
    // 减均值以及缩放操作,最后输入数据的值域为\[-1,1\]  
    ncnn::Mat in = ncnn::Mat::from\_pixels\_resize\(img.data, ncnn::Mat::PIXEL\_GRAY, w, h, 60, 60\);  
    float mean\[1\] = \{ 128.f \};  
    float norm\[1\] = \{ 1/128.f \};  
    in.substract\_mean\_normalize\(mean, norm\);  
   
 // 构建NCNN的net,并加载转换好的模型  
    ncnn::Net net;  
    net.load\_param\("model.param"\);  
    net.load\_model\("model.bin"\);  
  
 // 创建网络提取器,设置网络输入,线程数,light模式等等  
    ncnn::Extractor ex = net.create\_extractor\(\);  
    ex.set\_light\_mode\(true\);  
    ex.set\_num\_threads\(4\);  
    ex.input\("data", in\);  
 // 调用extract接口,完成网络推理,获得输出结果  
    ncnn::Mat feat;  
    ex.extract\("output", feat\);  
  
    return 0;  

1.3 OpenVINO

简介:

OpenVINO是一种可以加快高性能计算机视觉和深度学习视觉应用开发速度的工具套件,支持各种英特尔平台的硬件加速器上进行深度学习,并且允许直接异构执行。OpenVINO™工具包是用于快速开发应用程序和解决方案的综合工具包,可解决各种任务,包括模拟人类视觉,自动语音识别,自然语言处理,推荐系统等。该工具包基于最新一代的人工神经网络,包括卷积神经网络(CNN),循环和基于注意力的网络,可在英特尔®硬件上扩展计算机视觉和非视觉工作负载,从而最大限度地提高性能。它通过从边缘到云的高性能,人工智能和深度学习推理来加速应用程序。

使用场景:

图片

框架特点:

OpenVINO在模型部署前,首先会对模型进行优化,模型优化器会对模型的拓扑结构进行优化,去掉不需要的层,对相同的运算进行融合、合并以加快运算效率,减少内存拷贝;FP16、INT8量化也可以在保证精度损失很小的前提下减小模型体积,提高模型的性能。在部署方面,OpenVIVO的开发也是相对比较简单的,提供了C、C++和python3种语言编程接口。它最大的优势呢,其实还是在Intel的不同硬件平台上进行部署的时候,移植会很方便。推理引擎对不同的硬件提供统一的接口,底层实现直接调用硬件指令集的加速库,应用程序开发人员不需要关心底层的硬件实现,即可在不同的硬件平台上加速模型推理。

  • 在边缘启用基于CNN的深度学习推理

  • 支持通过英特尔®Movidius™VPU在英特尔®CPU,英特尔®集成显卡,英特尔®神经计算棒2和英特尔®视觉加速器设计之间进行异构执行

  • 通过易于使用的计算机视觉功能库和预先优化的内核加快上市时间

  • 包括对计算机视觉标准(包括OpenCV *和OpenCL™)的优化调用

使用方法:

[代码示例]在应用程序中实现典型的 OpenVINO™ 运行推理:https://docs.openvino.ai/latest/openvino_docs_OV_UG_Integrate_OV_with_your_application.html

 \#include \<openvino/openvino.hpp>  
// 1.创建 OpenVINO™ 核心以管理可用设备和读取模型对象  
ov::Core core;  
// 2.为特定设备编译模型  
ov::CompiledModel compiled\_model = core.compile\_model\("model.onnx", "AUTO"\);  
// 3.创建推理请求  
ov::InferRequest infer\_request = compiled\_model.create\_infer\_request\(\);  
// 4.设置输入  
// 获取模型的输入端口  
auto input\_port = compiled\_model.input\(\);  
// 从外部存储器创建张量  
ov::Tensor input\_tensor\(input\_port.get\_element\_type\(\), input\_port.get\_shape\(\), memory\_ptr\);  
// 为模型设置一个输入张量  
infer\_request.set\_input\_tensor\(input\_tensor\);  
// 5.开始推理  
infer\_request.start\_async\(\);  
infer\_request.wait\(\);  
// 6.处理推理结果  
// 通过tensor\_name获取输出张量  
auto output = infer\_request.get\_tensor\("tensor\_name"\);  
const float \\\*output\_buffer = output.data\<const float\>\(\);  
// output\_buffer\[\] - 访问输出张量数据  
// 7.释放分配的对象(仅适用于C)  
ov\_shape\_free\(\&input\_shape\);  
ov\_tensor\_free\(output\_tensor\);  
ov\_output\_const\_port\_free\(input\_port\);  
ov\_tensor\_free\(tensor\);  
ov\_infer\_request\_free\(infer\_request\);  
ov\_compiled\_model\_free\(compiled\_model\);  
ov\_model\_free\(model\);  
ov\_core\_free\(core\);  
// 为项目创建结构  
project/  
   ├── CMakeLists.txt  - CMake file to build  
   ├── ...             - Additional folders like includes/  
   └── src/            - source folder  
       └── main.cpp  
build/                  - build directory  
   ...  
// 创建 Cmake 脚本  
cmake\_minimum\_required\(VERSION 3.10\)  
set\(CMAKE\_CXX\_STANDARD 11\)  
  
find\_package\(OpenVINO REQUIRED\)  
  
add\_executable\(\$\{TARGET\_NAME\} src/main.cpp\)  
  
target\_link\_libraries\(\$\{TARGET\_NAME\} PRIVATE openvino::runtime\)  
// 构建项目  
cd build/  
cmake ../project  
cmake --build . 

1.4 TensorRT

简介:

NVIDIA TensorRT™ 是用于高性能深度学习推理的 SDK。此 SDK 包含深度学习推理优化器和运行时环境,可为深度学习推理应用提供低延迟和高吞吐量。

在推理过程中,基于 TensorRT 的应用程序的执行速度可比 CPU 平台的速度快 40 倍。借助 TensorRT,您可以优化在所有主要框架中训练的神经网络模型,精确校正低精度,并最终将模型部署到超大规模数据中心、嵌入式或汽车产品平台中。

TensorRT 以 NVIDIA 的并行编程模型 CUDA 为基础构建而成,可帮助您利用 CUDA-X 中的库、开发工具和技术,针对人工智能、自主机器、高性能计算和图形优化所有深度学习框架中的推理。

TensorRT 针对多种深度学习推理应用的生产部署提供 INT8 和 FP16 优化,例如视频流式传输、语音识别、推荐和自然语言处理。推理精度降低后可显著减少应用延迟,这恰巧满足了许多实时服务、自动和嵌入式应用的要求。

使用场景:

图片

框架特点:

1. 权重与激活精度校准

通过将模型量化为 INT8 来更大限度地提高吞吐量,同时保持高准确度

2. 层与张量融合

通过融合内核中的节点,优化 GPU 显存和带宽的使用

3. 内核自动调整

基于目标 GPU 平台选择最佳数据层和算法

4. 动态张量显存

更大限度减少显存占用,并高效地为张量重复利用内存

5. 多流执行

用于并行处理多个输入流的可扩展设计

图片

图片取自TensorRT的官网,里面列出了TensorRT使用的一些技术。可以看到模型量化、动态内存优化、层的融合等技术均已经在TensorRT中集成了,这也是它能够极大提高模型推断速度的原因。总体来说TensorRT将训练好的模型通过一系列的优化技术转化为了能够在特定平台(GPU)上以高性能运行的代码,也就是最后图中生成的Inference Engine。

使用方法:

1.导出模型

2.选择批次大小

3.选择精度

4.转换模型:

  • 使用 TF-TRT

  • 从文件自动转换 ONNX

  • 使用 TensorRT API 手动构建网络(C++或python)

5.部署模型:

  • 在 TensorFlow 中部署

  • 使用独立的 TensorRT 运行时 API

  • 使用 NVIDIA Triton 推理服务器

具体模型转换部署方法详见:[Quick Start Guide :: NVIDIA Deep Learning TensorRT Documentation]:https://docs.nvidia.com/deeplearning/tensorrt/quick-start-guide/index.html

1.5 Mediapipe

简介:

MediaPipe是一款由 Google Research 开发并开源的多媒体机器学习模型应用框架。在谷歌,一系列重要产品,如 YouTube、Google Lens、ARCore、Google Home 以及 Nest,都已深度整合了 MediaPipe。作为一款跨平台框架,MediaPipe 不仅可以被部署在服务器端,更可以在多个移动端 (安卓和苹果 iOS)和嵌入式平台(Google Coral 和树莓派)中作为设备端机器学习推理 (On-device Machine Learning Inference)框架。

除了上述的特性,MediaPipe 还支持 TensorFlow 和 TF Lite 的推理引擎(Inference Engine),任何 TensorFlow 和 TF Lite 的模型都可以在 MediaPipe 上使用。同时,在移动端和嵌入式平台,MediaPipe 也支持设备本身的 GPU 加速。

使用场景:

图片

框架特点:
  1. 端到端加速:内置快速 ML 推理和处理,即使在普通硬件上也能加速

  2. 一次构建,随处部署:统一解决方案适用于安卓、iOS、桌面/云、Web 和物联网

  3. 即用型解决方案:展示框架全部功能的尖端 ML 解决方案

  4. 免费和开源:Apache 2.0下的框架和解决方案,完全可扩展和可定制

使用方法:

[代码示例]以人脸检测为例:https://google.github.io/mediapipe/solutions/face_detection

import cv2  
import mediapipe as mp  
mp\_face\_detection = mp.solutions.face\_detection  
mp\_drawing = mp.solutions.drawing\_utils  
   \# 对于静态图像:  
IMAGE\_FILES = \[\]  
with mp\_face\_detection.FaceDetection\(  
    model\_selection=1, min\_detection\_confidence=0.5\) as face\_detection:  
  for idx, file in enumerate\(IMAGE\_FILES\):  
    image = cv2.imread\(file\)  
    \# 将BGR图像转换为RGB并使用MediaPipe人脸检测对其进行处理.  
    results = face\_detection.process\(cv2.cvtColor\(image, cv2.COLOR\_BGR2RGB\)\)  
  
    \# 绘制每张人脸的人脸检测.  
    if not results.detections:  
      continue  
    annotated\_image = image.copy\(\)  
    for detection in results.detections:  
      print\('Nose tip:'\)  
      print\(mp\_face\_detection.get\_key\_point\(  
          detection, mp\_face\_detection.FaceKeyPoint.NOSE\_TIP\)\)  
      mp\_drawing.draw\_detection\(annotated\_image, detection\)  
    cv2.imwrite\('/tmp/annotated\_image' + str\(idx\) + '.png', annotated\_image\)  
   \# 用于网络摄像头输入:  
cap = cv2.VideoCapture\(0\)  
with mp\_face\_detection.FaceDetection\(  
    model\_selection=0, min\_detection\_confidence=0.5\) as face\_detection:  
  while cap.isOpened\(\):  
    success, image = cap.read\(\)  
    if not success:  
      print\("Ignoring empty camera frame."\)  
      \# 如果加载视频,请使用“中断”而不是“继续”.  
      continue  
  
    \# 若要提高性能,可以选择将图像标记为不可写以通过引用传递.  
    image.flags.writeable = False  
    image = cv2.cvtColor\(image, cv2.COLOR\_BGR2RGB\)  
    results = face\_detection.process\(image\)  
  
    \# 在图像上绘制人脸检测注释.  
    image.flags.writeable = True  
    image = cv2.cvtColor\(image, cv2.COLOR\_RGB2BGR\)  
    if results.detections:  
      for detection in results.detections:  
        mp\_drawing.draw\_detection\(image, detection\)  
    \# 水平翻转图像以获得自拍视图显示.  
    cv2.imshow\('MediaPipe Face Detection', cv2.flip\(image, 1\)\)  
    if cv2.waitKey\(5\) \& 0xFF == 27:  
      break  
cap.release\(\) 

2.框架对比

应用平台:

模型推理部署框架应用平台
NCNN移动端
OpenVINOCPU,GPU,嵌入式平台都可以使用,尤其是在CPU上首选OPenVINO。DepthAI嵌入式空间AI平台。
TensorRT只能用在NIVDIA的GPU上的推理框架。NIVDIA的Jetson平台。
Mediapipe服务端,移动端,嵌入式平台,TPU。

研发单位:

  • 腾讯公司开发的移动端平台部署工具——NCNN;

  • Intel公司针对自家设备开开发的部署工具——OpenVINO;

  • NVIDIA公司针对自家GPU开发的部署工具——TensorRT;

  • Google针对自家硬件设备和深度学习框架开发的部署工具——Mediapipe;

  • 由微软、亚马逊 、Facebook 和 IBM 等公司共同开发的开放神经网络交换格式——ONNX;

如何选择:

  • ONNXRuntime 是可以运行在多平台 (Windows,Linux,Mac,Android,iOS) 上的一款推理框架,它接受 ONNX 格式的模型输入,支持 GPU 和 CPU 的推理。唯一不足就是 ONNX 节点粒度较细,推理速度有时候比其他推理框架如 TensorRT 较低。

  • NCNN是针对手机端的部署。优势是开源较早,有非常稳定的社区,开源影响力也较高。

  • OpenVINO 是 Intel 家出的针对 Intel 出品的 CPU 和 GPU 友好的一款推理框架,同时它也是对接不同训练框架如 TensorFlow,Pytorch,Caffe 等。不足之处可能是只支持 Intel 家的硬件产品。

  • TensorRT 针对 NVIDIA 系列显卡具有其他框架都不具备的优势,如果运行在 NVIDIA 显卡上, TensorRT 一般是所有框架中推理最快的。一般的主流的训练框架如TensorFlow 和 Pytorch 都能转换成 TensorRT 可运行的模型。当然了,TensorRT 的限制就是只能运行在 NVIDIA 显卡上,同时不开源 kernel。

  • MediaPipe 不支持除了tensorflow之外的其他深度学习框架。MediaPipe 的主要用例是使用推理模型和其他可重用组件对应用机器学习管道进行快速原型设计。MediaPipe 还有助于将机器学习技术部署到各种不同硬件平台上的演示和应用程序中,为移动、桌面/云、web和物联网设备构建世界级ML解决方案和应用程序。

3.小结

本文主要介绍了5种推理框架,目的是使大家更加直观的了解这几种框架的特点,应用场景以及如何选择,为大家之后的学习提供有限的帮助,不足之处请大家多多指正。

参考资料

  1. https://learn.microsoft.com/zh-cn/windows/ai/

  2. https://github.com/Tencent/ncnn

  3. https://zhuanlan.zhihu.com/p/344442534

  4. https://github.com/google/mediapipe

  5. https://www.zhihu.com/question/346965029/answer/2395418101

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NNDL总结

第四章 前馈神经网络 4.1 神经元 人工神经元&#xff0c;简称神经元&#xff0c;是构成神经网络的基本单元。 当>0时&#xff0c;为1&#xff0c;兴奋&#xff1b; 当<0时&#xff0c;为0&#xff0c;抑制。 激活函数的性质 1、连续可导的非线性函数。 2、激活函数及其导…

C语言 B树的分析与实现

本文主要说明了B树的概念、应用以及如何用C语言实现B树。 概述 有使用过数据库的朋友都知道&#xff0c;数据库需要存储大量的数据&#xff0c;并且查询数据的性能也需要一定的保证。那么数据库的底层数据结构是如何实现的呢&#xff0c;就是我们要讨论的B树和B树&#xff0c…

【电源专题】电池充放电中常说的0.2C是什么概念

在工作中我们时常会听到老员工说拿这个电池去做一下充放电,以0.2C充,0.2C放。那么这个0.2C到底是啥? 这就要说到电池C-rate概念。在《GB 31241:便携式电子产品用锂离子电池和电池安全要求》中我们可以看到3.7中写了额定容量为C,也就是制造商标明的电池或电池组容量。 那么…

src refspec master does not match any

新项目推送至 Git 空仓库时抛出如下异常 src refspec master does not match any 初始化 init 都做了但反复尝试 git push -u origin master 均无果 后发现权限不够 .... 起初设置为开发者,后变更为了主程序员再次尝试 push 成功 .... 以上便是此次分享的全部内容&#xff0c;…

MyBatisPlus学习二:常用注解、条件构造器、自定义sql

常用注解 基本约定 MybatisPlus通过扫描实体类&#xff0c;并基于反射获取实体类信息作为数据库表信息。可以理解为在继承BaseMapper 要指定对应的泛型 public interface UserMapper extends BaseMapper<User> 实体类中&#xff0c;类名驼峰转下划线作为表名、名为id的…

etcd储存安装

目录 etcd介绍: etcd工作原理 选举 复制日志 安全性 etcd工作场景 服务发现 etcd基本术语 etcd安装(centos) 设置&#xff1a;etcd后台运行 etcd 是云原生架构中重要的基础组件&#xff0c;由 CNCF 孵化托管。etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册…

单片机大小端模式

单片机大小端模式 参考链接 单片机干货-什么是大小端_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Ju4y1M7Tx/?spm_id_from333.337.search-card.all.click&vd_sourcee821a225c7ba4a7b85e5aa6d013ac92e 特此记录 anlog 2024年1月2日

C语言——内存函数【memcpy,memmove,memset,memcmp】

&#x1f4dd;前言&#xff1a; 在之前的文章C语言——字符函数和字符串函数&#xff08;一&#xff09;中我们学习过strcpy和strcat等用来实现字符串赋值和追加的函数&#xff0c;那么除了字符内容&#xff0c;其他的数据&#xff08;例如整型&#xff09;能否被复制或者移动呢…

IDEA2023 最新版详细图文安装教程(Java环境搭建+IDEA安装+运行测试+汉化+背景图设置)

IDEA2023 最新版详细图文安装教程 名人说&#xff1a;工欲善其事&#xff0c;必先利其器。——《论语》 作者&#xff1a;Code_流苏(CSDN) o(‐&#xff3e;▽&#xff3e;‐)o很高兴你打开了这篇博客&#xff0c;跟着教程去一步步尝试安装吧。 目录 IDEA2023 最新版详细图文安…

Linux第15步_安装FTP客户端

安装完FTP服务器后&#xff0c;还需要安装FTP客户端&#xff0c;才可以实现Ubuntu系统和Windows系统进行文件互传。 1、在STM32MP157开发板A盘基础资料\03软件中&#xff0c;找到“FileZilla_3.51.0_win64-setup.exe”&#xff0c;双击它&#xff0c;就可以安装。 2、点击“I …

吉他打谱软件Guitar Pro8苹果Mac电脑简体中文特别版

Guitar Pro 8 Mac是一款吉他编曲学习软件&#xff0c;用于吉他、贝和其他弦乐器的制谱和演奏&#xff0c;这是一个多轨编辑器&#xff0c;具有集成的 MIDI 编辑器、合唱绘图仪、吉他、节拍器和其他音乐家工具。它使您能够编辑吉他、贝司和尤克里里、乐谱、指法谱&#xff0c;并…

浅谈云可观测性的关键组件及重要性

在云计算时代&#xff0c;企业和开发团队不仅需要关注应用程序的功能性&#xff0c;还需要关心系统在生产环境中的性能、可用性和可靠性。云可观测性成为一项关键的技术实践&#xff0c;它涵盖了日志、指标、追踪等多个方面&#xff0c;为系统监控和故障诊断提供了全方位的支持…

二手买卖、废品回收小程序 在app.json中声明permission scope.userLocation字段 教程说明

处理二手买卖、废品回收小程序 在app.json中声明permission scope.userLocation字段 教程说明 sitemapLocation 指明 sitemap.json 的位置&#xff1b;默认为 ‘sitemap.json’ 即在 app.json 同级目录下名字的 sitemap.json 文件 找到app.json这个文件 把这段代码加进去&…

分解质因数算法总结

知识概览 n中最多只包含一个大于的质因子。 例题展示 题目链接 活动 - AcWing 系统讲解常用算法与数据结构&#xff0c;给出相应代码模板&#xff0c;并会布置、讲解相应的基础算法题目。https://www.acwing.com/problem/content/869/ 题解 分解质因数可以用试除法解决&…

Zoho SalesIQ:构建客户服务知识库的实用工具与指南

客服人员每天都有很多事情要做&#xff0c;包括在线聊天、音频通话、屏幕共享和发送电子邮件。为什么要将搜索常用信息添加到他们列表中呢&#xff1f;因为客户在遇到问题的同时想快速解决问题。所以&#xff0c;我们要使用Zoho SalesIQ客服系统构建客户服务知识库。 一、什么…

根据MySql的表名,自动生成实体类,模仿ORM框架

ORM框架可以根据数据库的表自动生成实体类&#xff0c;以及相应CRUD操作 本文是一个自动生成实体类的工具&#xff0c;用于生成Mysql表对应的实体类。 新建Winform窗体应用程序AutoGenerateForm&#xff0c;框架(.net framework 4.5)&#xff0c; 添加对System.Configuration的…

【经验】VSCode连接远程服务器(可以使用git管理、方便查看和编辑Linux源码)

1、查看OpenSSH Windows10通常自带OpenSSH不需要安装。 Windows10下检查是否已经安装OpenSSH的方法: 1)按下快捷键Win + X,选择Windows PoweShell(管理员) 2)输入以下指令: Get-WindowsCapability -Online | ? Name -like ‘OpenSSH*’ 3)如果电脑未安装OpenSSH,…

RFID标签在汽车监管方面的应用与实施方案

RFID技术在汽车工业领域得到了广泛应用&#xff0c;主要体现在汽车资质证书远程监管系统的普及化&#xff0c;系统包括OBD接口监视器、车证监管箱、超高频读写设备、应用系统软件以及大数据采集与处理等组成部分。 在汽车物流监管方面&#xff0c;系统利用OBD接口监控车辆并实时…

JavaWeb 期末考--复盘

Javaweb 期末复习题目 1 单选 2 多选 3 问答与分析 4 程序填空 5 程序设计&#xff08;该部分无&#xff09; 需要word版资料详见文章末尾&#xff0c;免费自提 0、学期知识点回顾 一、注释和注解 1、Java的三种注释&#xff1a;单行、多行和文档注释。 2、常用…

深入理解神经网络训练与反向传播

目录 前言1 损失函数1.1 交叉熵&#xff08;Cross Entropy&#xff09;&#xff1a;1.2 均方差&#xff08;Mean Squared Error&#xff09;&#xff1a; 2 梯度下降与学习率2.1 梯度下降2.2 学习率 3 正向传播与反向传播3.1 正向传播3.2 反向传播 4 链式法则和计算图4.1 链式法…