CANN/ops-nn动态量化RMS归一化融合算子

news2026/5/11 3:35:13
aclnnAddRmsNormDynamicQuantV2【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-nn 查看源码产品支持情况产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atlas A3 推理系列产品√Atlas A2 训练系列产品/Atlas A2 推理系列产品√Atlas 200I/500 A2 推理产品×Atlas 推理系列产品×Atlas 训练系列产品×功能说明接口功能RmsNorm算子是大模型常用的归一化操作相比LayerNorm算子其去掉了减去均值的部分。DynamicQuant算子则是为输入张量进行对称动态量化的算子。AddRmsNormDynamicQuant算子将RmsNorm前的Add算子和RmsNorm归一化输出给到的1个或2个DynamicQuant算子融合起来减少搬入搬出操作。aclnnAddRmsNormDynamicQuantV2相较于aclnnAddRmsNormDynamicQuant在RmsNorm计算过程中增加了偏置项betaOptional参数即计算公式中的beta以及新增输出配置项outputMaskOptional参数用于配置是否输出对应位置的量化结果。计算公式$$ xx_{1}x_{2} $$$$ y \operatorname{RmsNorm}(x)\frac{x}{\operatorname{Rms}(\mathbf{x})}\cdot gammabeta, \quad \text { where } \operatorname{Rms}(\mathbf{x})\sqrt{\frac{1}{n} \sum_{i1}^n x_i^2epsilon} $$$$ input1 \begin{cases} y\cdot smoothScale1Optional \ \ smoothScale1Optional \ y !\ smoothScale1Optional \end{cases} $$$$ input2 \begin{cases} y\cdot smoothScale2Optional \ \ smoothScale2Optional \ y !\ smoothScale2Optional \end{cases} $$$$ scale1Out\begin{cases} row_max(abs(input1))/127 (outputMask[0]True\ ||\ !outputMask) y1Out为INT8 \ row_max(abs(input1))/7 (outputMask[0]True\ ||\ !outputMask) y1Out为INT4 \ 无效输出 outputMask[0]False \end{cases} $$$$ y1Out\begin{cases} round(input1/scale1Out) outputMask[0]True\ ||\ !outputMask \ 无效输出 outputMask[0]False \end{cases} $$$$ scale2Out\begin{cases} row_max(abs(input2))/127 (outputMask[1]True\ ||\ (!outputMask\ \ smoothScale1Optional\ \ smoothScale2Optional)) y2Out为INT8 \ row_max(abs(input2))/7 (outputMask[1]True\ ||\ (!outputMask\ \ smoothScale1Optional\ \ smoothScale2Optional)) y2Out为INT4 \ 无效输出 outputMask[1]False\ ||\ (!outputMask\ \ (!smoothScale1Optional\ ||\ !smoothScale2Optional)) \end{cases} $$$$ y2Out\begin{cases} round(input2/scale2Out) outputMask[1]True\ ||\ (!outputMask\ \ smoothScale1Optional\ \ smoothScale2Optional)\ 无效输出 outputMask[1]False\ ||\ (!outputMask\ \ (!smoothScale1Optional\ ||\ !smoothScale2Optional)) \end{cases} $$公式中的row_max代表每行求最大值。函数原型每个算子分为两段式接口必须先调用aclnnAddRmsNormDynamicQuantV2GetWorkspaceSize接口获取入参并根据计算流程所需workspace大小再调用aclnnAddRmsNormDynamicQuantV2接口执行计算。aclnnStatus aclnnAddRmsNormDynamicQuantV2GetWorkspaceSize( const aclTensor *x1, const aclTensor *x2, const aclTensor *gamma, const aclTensor *smoothScale1Optional, const aclTensor *smoothScale2Optional, const aclTensor *betaOptional, double epsilon, const aclBoolArray *outputMaskOptional, aclTensor *y1Out, aclTensor *y2Out, aclTensor *xOut, aclTensor *scale1Out, aclTensor *scale2Out, uint64_t *workspaceSize, aclOpExecutor **executor)aclnnStatus aclnnAddRmsNormDynamicQuantV2( void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream)aclnnAddRmsNormDynamicQuantV2GetWorkspaceSize参数说明参数名输入/输出描述使用说明数据类型数据格式维度(shape)非连续Tensorx1aclTensor*输入表示标准化过程中的源数据张量。对应公式中的x1。支持空Tensor。FLOAT16、BFLOAT16ND2-8√x2aclTensor*输入表示标准化过程中的源数据张量。对应公式中的x2。支持空Tensor。shape和数据类型需要与x1保持一致。FLOAT16、BFLOAT16ND2-8√gammaaclTensor*输入表示标准化过程中的权重张量。对应公式中的gamma。支持空Tensor。数据类型需要与x1保持一致。shape需要与x1最后一维一致。FLOAT16、BFLOAT16ND1√smoothScale1OptionalaclTensor*输入表示量化过程中得到y1Out使用的smoothScale张量。对应公式中的smoothScale1Optional。支持空Tensor。可选参数支持传入空指针。shape和数据类型需要与gamma保持一致。FLOAT16、BFLOAT16ND1√smoothScale2OptionalaclTensor*输入表示量化过程中得到y2Out使用的smoothScale张量。对应公式中的smoothScale2Optional。支持空Tensor。可选参数支持传入空指针。shape和数据类型需要与gamma保持一致。FLOAT16、BFLOAT16ND1√betaOptionalaclTensor*输入表示标准化过程中的偏置项。对应公式中的beta。支持空Tensor。可选参数支持传入空指针。shape和数据类型需要与gamma保持一致。FLOAT16、BFLOAT16ND1√epsilondouble输入表示用于防止除0错误对应公式中的epsilon。建议传入较小正数如1e-6。----outputMaskOptionalaclBoolArray*输入表示输出的掩码对应公式中的outputMask。支持传空指针或长度为2的数组。----y1OutaclTensor*输出表示量化输出Tensor对应公式中的y1Out。支持空Tensor。shape需要与输入x1保持一致。INT4、INT8、HIFLOAT8、FLOAT8_E5M2、FLOAT8_E4M3FNND2-8√y2OutaclTensor*输出表示量化输出Tensor对应公式中的y2Out。支持空Tensor。如果y2Out为有效输出时shape和数据类型需要与y1Out保持一致如果y2Out为无效输出时shape为[1]。INT4、INT8、HIFLOAT8、FLOAT8_E5M2、FLOAT8_E4M3FNND2-8√xOutaclTensor*输出表示x1和x2的和对应公式中的x。支持空Tensor。shape和数据类型需要与输入x1/x2一致。FLOAT16、BFLOAT16ND2-8√scale1OutaclTensor*输出表示第一路量化的输出对应公式中的scale1Out。支持空Tensor。shape需要与输入x1除了最后一维后的shape一致或者与x1除了最后一维的乘积一致。FLOAT32ND1-8√scale2OutaclTensor*输出表示第二路量化的输出对应公式中的scale2Out。支持空Tensor。当smoothScale2Optional不存在时此输出无意义。shape需要与scale1Out一致。FLOAT32ND1-8√workspaceSizeuint64_t*输出返回需要在Device侧申请的workspace大小。-----executoraclOpExecutor**输出返回op执行器包含了算子计算流程。-----返回值aclnnStatus返回状态码具体参见aclnn返回码。第一段接口完成入参校验出现以下场景时报错返回码错误码描述ACLNN_ERR_PARAM_NULLPTR161001如果传入参数是必选输入输出或者必选属性且是空指针则返回161001。ACLNN_ERR_PARAM_INVALID161002输入或输出的数据类型不在支持的范围之内。outputMaskOptional为空指针时输入smoothScale2Optional而没有输入smoothScale1Optional。aclnnAddRmsNormDynamicQuantV2参数说明参数名输入/输出描述workspace输入在Device侧申请的workspace内存地址。workspaceSize输入在Device侧申请的workspace大小由第一段接口aclnnAddRmsNormDynamicQuantV2GetWorkspaceSize获取。executor输入op执行器包含了算子计算流程。stream输入指定执行任务的Stream。返回值aclnnStatus返回状态码。具体参见aclnn返回码约束说明数据格式说明所有输入输出tensor的数据格式推荐使用ND格式其他数据格式会由框架默认转换成ND格式进行处理。当outputMaskOptional不为空时参数smoothScale1Optional有值时则outputMaskOptional[0]必须为True。参数smoothScale2Optional有值时则outputMaskOptional[1]必须为True。当outputMaskOptional不为空时outputMaskOptional[0]与outputMaskOptional[1]不能同时为False。当outputMaskOptional为空时参数smoothScale2Optional有值时参数smoothScale1Optional也必须有值。各产品型号支持数据类型说明Atlas A3 训练系列产品/Atlas A3 推理系列产品 、 Atlas A2 训练系列产品/Atlas A2 推理系列产品 参数y1Out和y2Out数据类型仅支持int4和int8。Ascend 950PR/Ascend 950DT 暂不支持可选属性output_mask的配置。参数y1Out和y2Out数据类型不支持int4。确定性计算aclnnAddRmsNormDynamicQuantV2默认确定性实现。调用示例示例代码如下仅供参考具体编译和执行过程请参考编译与运行样例。#include iostream #include vector #include acl/acl.h #include aclnnop/aclnn_add_rms_norm_dynamic_quant_v2.h #define CHECK_RET(cond, return_expr) \ do { \ if (!(cond)) { \ return_expr; \ } \ } while (0) #define LOG_PRINT(message, ...) \ do { \ printf(message, ##__VA_ARGS__); \ } while (0) int64_t GetShapeSize(const std::vectorint64_t shape) { int64_t shape_size 1; for (auto i : shape) { shape_size * i; } return shape_size; } int Init(int32_t deviceId, aclrtStream* stream) { // 固定写法资源初始化 auto ret aclInit(nullptr); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclInit failed. ERROR: %d\n, ret); return ret); ret aclrtSetDevice(deviceId); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtSetDevice failed. ERROR: %d\n, ret); return ret); ret aclrtCreateStream(stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtCreateStream failed. ERROR: %d\n, ret); return ret); return 0; } template typename T int CreateAclTensor( const std::vectorT hostData, const std::vectorint64_t shape, void** deviceAddr, aclDataType dataType, aclTensor** tensor) { auto size GetShapeSize(shape) * sizeof(T); // 调用aclrtMalloc申请device侧内存 auto ret aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtMalloc failed. ERROR: %d\n, ret); return ret); // 调用aclrtMemcpy将host侧数据拷贝到device侧内存上 ret aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtMemcpy failed. ERROR: %d\n, ret); return ret); // 计算连续tensor的strides std::vectorint64_t strides(shape.size(), 1); for (int64_t i shape.size() - 2; i 0; i--) { strides[i] shape[i 1] * strides[i 1]; } // 调用aclCreateTensor接口创建aclTensor *tensor aclCreateTensor( shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND, shape.data(), shape.size(), *deviceAddr); return 0; } int main() { // 1. 固定写法device/stream初始化参考acl API手册 // 根据自己的实际device填写deviceId int32_t deviceId 0; aclrtStream stream; auto ret Init(deviceId, stream); // check根据自己的需要处理 CHECK_RET(ret 0, LOG_PRINT(Init acl failed. ERROR: %d\n, ret); return ret); // 2. 构造输入与输出需要根据API的接口自定义构造 std::vectorint64_t xShape {2, 8}; std::vectorint64_t gammaShape {8}; std::vectorint64_t betaShape {8}; std::vectorint64_t reduceShape {2, 1}; void* x1DeviceAddr nullptr; void* x2DeviceAddr nullptr; void* gammaDeviceAddr nullptr; void* betaDeviceAddr nullptr; void* smooth1DeviceAddr nullptr; void* smooth2DeviceAddr nullptr; void* y1DeviceAddr nullptr; void* y2DeviceAddr nullptr; void* xDeviceAddr nullptr; void* scale1DeviceAddr nullptr; void* scale2DeviceAddr nullptr; aclTensor* x1 nullptr; aclTensor* x2 nullptr; aclTensor* gamma nullptr; aclTensor* beta nullptr; aclTensor* smooth1 nullptr; aclTensor* smooth2 nullptr; aclTensor* y1 nullptr; aclTensor* y2 nullptr; aclTensor* x nullptr; aclTensor* scale1 nullptr; aclTensor* scale2 nullptr; int64_t xShapeSize GetShapeSize(xShape); int64_t gammaShapeSize GetShapeSize(gammaShape); int64_t betaShapeSize GetShapeSize(betaShape); int64_t reduceShapeSize GetShapeSize(reduceShape); std::vectorshort x1HostData(xShapeSize, 0x3800); std::vectorshort x2HostData(xShapeSize, 0x3800); std::vectorshort gammaHostData(gammaShapeSize, 0x3e00); std::vectorshort betaHostData(betaShapeSize, 0x3e00); std::vectorshort smooth1HostData(gammaShapeSize, 0x3e00); std::vectorshort smooth2HostData(gammaShapeSize, 0x3e00); std::vectorshort y1HostData(xShapeSize, 0); std::vectorshort y2HostData(xShapeSize, 0); std::vectorshort xHostData(xShapeSize, 0); std::vectorshort scale1HostData(reduceShapeSize, 0); std::vectorshort scale2HostData(reduceShapeSize, 0); float epsilon 1e-6; // 创建x1 aclTensor ret CreateAclTensor(x1HostData, xShape, x1DeviceAddr, aclDataType::ACL_FLOAT16, x1); CHECK_RET(ret ACL_SUCCESS, return ret); // 创建x2 aclTensor ret CreateAclTensor(x2HostData, xShape, x2DeviceAddr, aclDataType::ACL_FLOAT16, x2); CHECK_RET(ret ACL_SUCCESS, return ret); // 创建gamma aclTensor ret CreateAclTensor(gammaHostData, gammaShape, gammaDeviceAddr, aclDataType::ACL_FLOAT16, gamma); CHECK_RET(ret ACL_SUCCESS, return ret); // 创建beta aclTensor ret CreateAclTensor(betaHostData, betaShape, betaDeviceAddr, aclDataType::ACL_FLOAT16, beta); CHECK_RET(ret ACL_SUCCESS, return ret); // 创建 smooth1 aclTensor ret CreateAclTensor(smooth1HostData, gammaShape, smooth1DeviceAddr, aclDataType::ACL_FLOAT16, smooth1); CHECK_RET(ret ACL_SUCCESS, return ret); // 创建 smooth2 aclTensor ret CreateAclTensor(smooth2HostData, gammaShape, smooth2DeviceAddr, aclDataType::ACL_FLOAT16, smooth2); CHECK_RET(ret ACL_SUCCESS, return ret); // 创建y1 aclTensor ret CreateAclTensor(y1HostData, xShape, y1DeviceAddr, aclDataType::ACL_INT8, y1); CHECK_RET(ret ACL_SUCCESS, return ret); // 创建y2 aclTensor ret CreateAclTensor(y2HostData, xShape, y2DeviceAddr, aclDataType::ACL_INT8, y2); CHECK_RET(ret ACL_SUCCESS, return ret); // 创建x aclTensor ret CreateAclTensor(xHostData, xShape, xDeviceAddr, aclDataType::ACL_FLOAT16, x); CHECK_RET(ret ACL_SUCCESS, return ret); // 创建outScale1 aclTensor ret CreateAclTensor(scale1HostData, reduceShape, scale1DeviceAddr, aclDataType::ACL_FLOAT, scale1); CHECK_RET(ret ACL_SUCCESS, return ret); // 创建outScale1 aclTensor ret CreateAclTensor(scale2HostData, reduceShape, scale2DeviceAddr, aclDataType::ACL_FLOAT, scale2); CHECK_RET(ret ACL_SUCCESS, return ret); // 3. 调用CANN算子库API需要修改为具体的API uint64_t workspaceSize 0; aclOpExecutor* executor; // 调用aclnnAddRmsNormDynamicQuantV2第一段接口 ret aclnnAddRmsNormDynamicQuantV2GetWorkspaceSize( x1, x2, gamma, smooth1, smooth2, beta, epsilon, nullptr, y1, y2, x, scale1, scale2, workspaceSize, executor); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclnnAddRmsNormDynamicQuantV2GetWorkspaceSize failed. ERROR: %d\n, ret); return ret); // 根据第一段接口计算出的workspaceSize申请device内存 void* workspaceAddr nullptr; if (workspaceSize 0) { ret aclrtMalloc(workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(allocate workspace failed. ERROR: %d\n, ret); return ret;); } // 调用aclnnAddRmsNormDynamicQuantV2第二段接口 ret aclnnAddRmsNormDynamicQuantV2(workspaceAddr, workspaceSize, executor, stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclnnAddRmsNormDynamicQuantV2 failed. ERROR: %d\n, ret); return ret); // 4. 固定写法同步等待任务执行结束 ret aclrtSynchronizeStream(stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtSynchronizeStream failed. ERROR: %d\n, ret); return ret); // 5. 获取输出的值将device侧内存上的结果拷贝至host侧需要根据具体API的接口定义修改 auto size GetShapeSize(xShape); std::vectorint8_t y1Ret(size, 0); ret aclrtMemcpy( y1Ret.data(), y1Ret.size() * sizeof(y1Ret[0]), y1DeviceAddr, size * sizeof(int8_t), ACL_MEMCPY_DEVICE_TO_HOST); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(copy result from device to host failed. ERROR: %d\n, ret); return ret); for (int64_t i 0; i size; i) { LOG_PRINT(result[%ld] is: %d\n, i, y1Ret[i]); } // 6. 释放aclTensor和aclScalar需要根据具体API的接口定义修改 aclDestroyTensor(x1); aclDestroyTensor(x2); aclDestroyTensor(gamma); aclDestroyTensor(beta); aclDestroyTensor(smooth1); aclDestroyTensor(smooth2); aclDestroyTensor(y1); aclDestroyTensor(y2); aclDestroyTensor(x); aclDestroyTensor(scale1); aclDestroyTensor(scale2); // 7. 释放device资源需要根据具体API的接口定义修改 aclrtFree(x1DeviceAddr); aclrtFree(x2DeviceAddr); aclrtFree(gammaDeviceAddr); aclrtFree(betaDeviceAddr); aclrtFree(smooth1DeviceAddr); aclrtFree(smooth2DeviceAddr); aclrtFree(y1DeviceAddr); aclrtFree(y2DeviceAddr); aclrtFree(xDeviceAddr); aclrtFree(scale1DeviceAddr); aclrtFree(scale2DeviceAddr); if (workspaceSize 0) { aclrtFree(workspaceAddr); } aclrtDestroyStream(stream); aclrtResetDevice(deviceId); aclFinalize(); return 0; }【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-nn创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…