Ascend基于自定义算子工程的算子开发

环境准备

见https://gitee.com/zaj1414904389/ascend-tutorial.git

工程创建

CANN软件包中提供了工程创建工具msopgen,开发者可以输入算子原型定义文件生成Ascend C算子开发工程

[{"op": "AddCustom","input_desc": [{"name": "x","param_type": "required","format": ["ND"],"type": ["fp16"]},{"name": "y","param_type": "required","format": ["ND"],"type": ["fp16"]}],"output_desc": [{"name": "z","param_type": "required","format": ["ND"],"type": ["fp16"]}]}
]

使用msopgen工具生成AddCustom算子的开发工程。
执行以下命令

/usr/local/Ascend/ascend-toolkit/8.0.RC1.alpha002/python/site-packages/bin/msopgen gen -i /home/ma-user/add_custom.json -c ai_core-Ascend910A -lan cpp -out  /home/ma-user/AddCustom

生成代码目录

(MindSpore) [root@edbdd54b26c74c17b9ddfb1308c88382-task0-0 AddCustom]# tree -L 2
.
AddCustom
├── build.sh         // 编译入口脚本
├── cmake 
│   ├── config.cmake
│   ├── util        // 算子工程编译所需脚本及公共编译文件存放目录
├── CMakeLists.txt   // 算子工程的CMakeLists.txt
├── CMakePresets.json // 编译配置项
├── framework        // 算子插件实现文件目录,单算子模型文件的生成不依赖算子适配插件,无需关注
├── op_host                      // host侧实现文件
│   ├── add_custom_tiling.h    // 算子tiling定义文件
│   ├── add_custom.cpp         // 算子原型注册、shape推导、信息库、tiling实现等内容文件
│   ├── CMakeLists.txt
├── op_kernel                   // kernel侧实现文件
│   ├── CMakeLists.txt   
│   ├── add_custom.cpp        // 算子核函数实现文件 
├── scripts                     // 自定义算子工程打包相关脚本所在目录

算子核函数实现

算子核函数实现代码的内部调用关系
在这里插入图片描述
AddCustom/op_kernel/add_custom.cpp完整代码

#include "kernel_operator.h"
using namespace AscendC;
constexpr int32_t BUFFER_NUM = 2;
class KernelAdd {
public:
__aicore__ inline KernelAdd() {}
// 初始化函数,完成内存初始化相关操作
__aicore__ inline void Init(GM_ADDR x, GM_ADDR y, GM_ADDR z, uint32_t totalLength, uint32_t tileNum)
{// 使用获取到的TilingData计算得到singleCoreSize(每个核上总计算数据大小)、tileNum(每个核上分块个数)、singleTileLength(每个分块大小)等变量ASSERT(GetBlockNum() != 0 && "block dim can not be zero!");this->blockLength = totalLength / GetBlockNum();this->tileNum = tileNum;ASSERT(tileNum != 0 && "tile num can not be zero!");this->tileLength = this->blockLength / tileNum / BUFFER_NUM;// 获取当前核的起始索引xGm.SetGlobalBuffer((__gm__ DTYPE_X*)x + this->blockLength * GetBlockIdx(), this->blockLength);yGm.SetGlobalBuffer((__gm__ DTYPE_Y*)y + this->blockLength * GetBlockIdx(), this->blockLength);zGm.SetGlobalBuffer((__gm__ DTYPE_Z*)z + this->blockLength * GetBlockIdx(), this->blockLength);// 通过Pipe内存管理对象为输入输出Queue分配内存pipe.InitBuffer(inQueueX, BUFFER_NUM, this->tileLength * sizeof(DTYPE_X));pipe.InitBuffer(inQueueY, BUFFER_NUM, this->tileLength * sizeof(DTYPE_Y));pipe.InitBuffer(outQueueZ, BUFFER_NUM, this->tileLength * sizeof(DTYPE_Z));
}
// 核心处理函数,实现算子逻辑,调用私有成员函数CopyIn、Compute、CopyOut完成矢量算子的三级流水操作
__aicore__ inline void Process()
{int32_t loopCount = this->tileNum * BUFFER_NUM;for (int32_t i = 0; i < loopCount; i++) {CopyIn(i);Compute(i);CopyOut(i);}
}private:
// 搬入函数,完成CopyIn阶段的处理,被核心Process函数调用
__aicore__ inline void CopyIn(int32_t progress)
{// 从Queue中分配输入TensorLocalTensor<DTYPE_X> xLocal = inQueueX.AllocTensor<DTYPE_X>();LocalTensor<DTYPE_Y> yLocal = inQueueY.AllocTensor<DTYPE_Y>();// 将GlobalTensor数据拷贝到LocalTensorDataCopy(xLocal, xGm[progress * this->tileLength], this->tileLength);DataCopy(yLocal, yGm[progress * this->tileLength], this->tileLength);// 将LocalTesor放入VECIN(代表矢量编程中搬入数据的逻辑存放位置)的Queue中inQueueX.EnQue(xLocal);inQueueY.EnQue(yLocal);
}
// 计算函数,完成Compute阶段的处理,被核心Process函数调用
__aicore__ inline void Compute(int32_t progress)
{// 将Tensor从队列中取出,用于后续计算LocalTensor<DTYPE_X> xLocal = inQueueX.DeQue<DTYPE_X>();LocalTensor<DTYPE_Y> yLocal = inQueueY.DeQue<DTYPE_Y>();// 从Queue中分配输出TensorLocalTensor<DTYPE_Z> zLocal = outQueueZ.AllocTensor<DTYPE_Z>();// 调用Add接口进行计算Add(zLocal, xLocal, yLocal, this->tileLength);// 将计算结果LocalTensor放入到VecOut的Queue中outQueueZ.EnQue<DTYPE_Z>(zLocal);// 释放输入TensorinQueueX.FreeTensor(xLocal);inQueueY.FreeTensor(yLocal);
}
// 搬出函数,完成CopyOut阶段的处理,被核心Process函数调用
__aicore__ inline void CopyOut(int32_t progress)
{
// 从VecOut的Queue中取出输出Tensor
LocalTensor<DTYPE_Z> zLocal = outQueueZ.DeQue<DTYPE_Z>();// 将输出Tensor拷贝到GlobalTensor中DataCopy(zGm[progress * this->tileLength], zLocal, this->tileLength);// 将不再使用的LocalTensor释放outQueueZ.FreeTensor(zLocal);}private://Pipe内存管理对象TPipe pipe;//输入数据Queue队列管理对象,QuePosition为VECINTQue<QuePosition::VECIN, BUFFER_NUM> inQueueX, inQueueY; //输出数据Queue队列管理对象,QuePosition为VECOUTTQue<QuePosition::VECOUT, BUFFER_NUM> outQueueZ;//管理输入输出Global Memory内存地址的对象,其中xGm, yGm为输入,zGm为输出GlobalTensor<DTYPE_X> xGm;GlobalTensor<DTYPE_Y> yGm;GlobalTensor<DTYPE_Z> zGm;// 每个核上总计算数据大小uint32_t blockLength;// 每个核上总计算数据分块个数uint32_t tileNum;// 每个分块大小uint32_t tileLength;
};extern "C" __global__ __aicore__ void add_custom(GM_ADDR x, GM_ADDR y, GM_ADDR z, GM_ADDR workspace, GM_ADDR tiling)
{// 获取Host侧传入的Tiling参数GET_TILING_DATA(tilingData, tiling);// 初始化算子类KernelAdd op;// 算子类的初始化函数,完成内存初始化相关工作op.Init(x, y, z, tilingData.totalLength, tilingData.tileNum);if (TILING_KEY_IS(1)) {// 完成算子实现的核心逻辑op.Process();}
}

Host侧算子实现

核函数开发并验证完成后,下一步就是进行Host侧的实现,对应“AddCustom/op_host”目录下的add_custom_tiling.h文件与add_custom.cpp文件。
修改“add_custom_tiling.h”文件,在此文件中增加粗体部分的代码,进行Tiling参数的定义。

#ifndef ADD_CUSTOM_TILING_H
#define ADD_CUSTOM_TILING_H
#include "register/tilingdata_base.h"
namespace optiling {
BEGIN_TILING_DATA_DEF(TilingData)// AddCustom算子使用了2个tiling参数:totalLength与tileNumTILING_DATA_FIELD_DEF(uint32_t, totalLength);     // 总计算数据量TILING_DATA_FIELD_DEF(uint32_t, tileNum);         // 每个核上总计算数据分块个数
END_TILING_DATA_DEF;// 注册tiling数据到对应的算子
REGISTER_TILING_DATA_CLASS(AddCustom, TilingData)
}
#endif // ADD_CUSTOM_TILING_H

修改“add_custom.cpp”文件,进行Tiling的实现。
修改“TilingFunc”函数,实现Tiling上下文的获取,并通过上下文获取输入输出shape信息,并根据shape信息设置TilingData、序列化保存TilingData,并设置TilingKey。

namespace optiling {
const uint32_t BLOCK_DIM = 8;
const uint32_t TILE_NUM = 8;
static ge::graphStatus TilingFunc(gert::TilingContext* context)
{TilingData tiling;uint32_t totalLength = context->GetInputTensor(0)->GetShapeSize();context->SetBlockDim(BLOCK_DIM);tiling.set_totalLength(totalLength);tiling.set_tileNum(TILE_NUM);tiling.SaveToBuffer(context->GetRawTilingData()->GetData(), context->GetRawTilingData()->GetCapacity());context->GetRawTilingData()->SetDataSize(tiling.GetDataSize());context->SetTilingKey(1);size_t *currentWorkspace = context->GetWorkspaceSizes(1);currentWorkspace[0] = 0;return ge::GRAPH_SUCCESS;
}
} // namespace optiling

修改“add_custom.cpp”文件中的算子原型注册,此函数为入口函数。

namespace ops {
class AddCustom : public OpDef {
public:explicit AddCustom(const char* name) : OpDef(name){ // Add算子的第一个输入this->Input("x").ParamType(REQUIRED)    // 代表输入必选.DataType({ ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32 })   // 输入支持的数据类型.Format({ ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND })    // 输入支持的数据格式.UnknownShapeFormat({ ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND });  // 未知Shape情况下的Format的默认值// Add算子的第二个输入this->Input("y").ParamType(REQUIRED).DataType({ ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32 }).Format({ ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND }).UnknownShapeFormat({ ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND });this->Output("z").ParamType(REQUIRED).DataType({ ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32 }).Format({ ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND }).UnknownShapeFormat({ ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND });// 关联InferShape函数this->SetInferShape(ge::InferShape);// 关联Tiling函数this->AICore().SetTiling(optiling::TilingFunc);// 注册算子支持的AI处理器型号,请替换为实际支持的AI处理器型号this->AICore().AddConfig("ascend910");}
};
// 结束算子注册
OP_ADD(AddCustom);
} // namespace ops

算子工程编译部署

译AddCustom工程,生成自定义算子安装包,并将其安装到算子库中。
修改CMakePresets.json中ASCEND_CANN_PACKAGE_PATH为CANN软件包安装路径。

{……"configurePresets": [{……"ASCEND_CANN_PACKAGE_PATH": {"type": "PATH","value": "/usr/local/Ascend/ascend-toolkit/latest"        //请替换为CANN软件包安装后的实际路径},……}]
}

在算子工程AddCustom目录下执行如下命令,进行算子工程编译。

./build.sh

编译成功

start compile Ascend C operator AddCustom. kernel name is AddCustom_402e355eb717124771cfc7dbebfe946c
start compile Ascend C operator AddCustom. kernel name is AddCustom_ccd748392d99d04b8205210970fde2b9
start compile Ascend C operator AddCustom. kernel name is AddCustom_1e04ee05ab491cc5ae9c3d5c9ee8950b
compile Ascend C operator: AddCustom success!
compile Ascend C operator: AddCustom success!
compile Ascend C operator: AddCustom success!
[Ascend910A] Generating AddCustom_402e355eb717124771cfc7dbebfe946c Done
/usr/bin/gmake
[100%] Built target ascendc_bin_ascend910_add_custom_2
[Ascend910A] Generating AddCustom_ccd748392d99d04b8205210970fde2b9 Done
/usr/bin/gmake
[100%] Built target ascendc_bin_ascend910_add_custom_1
[Ascend910A] Generating AddCustom_1e04ee05ab491cc5ae9c3d5c9ee8950b Done
/usr/bin/gmake
[100%] Built target ascendc_bin_ascend910_add_custom_0
[100%] Built target ascendc_bin_ascend910_gen_ops_config
[100%] Built target binary
[  7%] Built target modify_vendor
[ 15%] Built target ascendc_impl_gen
[ 38%] Built target cust_op_proto
[ 46%] Built target npu_supported_ops
[ 61%] Built target cust_tf_parsers
[ 76%] Built target cust_opapi
[ 84%] Built target ops_info_gen_ascend910
[100%] Built target cust_optiling
[100%] Built target gen_version_info
[100%] Built target optiling_compat
Run CPack packaging tool...
CPack: Create package using External
CPack: Install projects
CPack: - Run preinstall target for: opp
CPack: - Install project: opp []
CPack: Create package

定义算子安装包部署。
编译成功后,会在当前目录下创建build_out目录,并在build_out目录下生成自定义算子安装包custom_opp__.run,例如“custom_opp_ubuntu_x86_64.run”。

cd /home/ma-user/AddCustom/build_out
./custom_opp_euleros_aarch64.run

命令执行成功后,自定义算子包中的相关文件将部署至当前环境的OPP算子库的vendors/customize目录中。

(MindSpore) [root@edbdd54b26c74c17b9ddfb1308c88382-task0-0 AddCustom]# ll /home/ma-user/AddCustom/build_out/_CPack_Packages/Linux/External/custom_opp_euleros_aarch64.run/packages/vendors/customize/
total 20
drwxr-x--- 3 root root 4096 Jun 21 07:20 framework
drwxr-x--- 4 root root 4096 Jun 21 07:20 op_api
drwxr-x--- 3 root root 4096 Jun 21 07:20 op_impl
drwxr-x--- 4 root root 4096 Jun 21 07:20 op_proto
-rw-r--r-- 1 root root   42 Jun 21 07:20 version.info

算子ST测试

CANN开发套件包中提供了ST测试工具“msopst”,用于生成算子的ST测试用例并在硬件环境中执行。
创建算子ST测试用例定义文件“AddCustom_case.json”,例如存储到跟算子工程目录“AddCustom”同级别的“AddCustom_st”路径下。
“AddCustom_case.json”文件的样例如下,开发者可基于此文件定制修改。
/home/ma-user/AddCustom_st/AddCustom_case.json

[{"case_name": "Test_AddCustom_001", "op": "AddCustom", "input_desc": [ {"format": ["ND"],"type": ["float16"],"shape": [8,2048],"data_distribute": [ "uniform"],"value_range": [ [0.1,1.0]],"name": "x"},{"format": ["ND"],"type": ["float16"],"shape": [8,2048],"data_distribute": ["uniform"],"value_range": [[0.1,1.0]],"name": "y"}],"output_desc": [{"format": ["ND"],"type": ["float16"],"shape": [8,2048],"name": "z"}]}
]

配置ST测试用例执行时依赖的环境变量。

export DDK_PATH=/usr/local/Ascend/ascend-toolkit/latest
export NPU_HOST_LIB=/usr/local/Ascend/ascend-toolkit/latest/runtime/lib64/stub

进入msopst工具所在目录,执行如下命令生成并执行测试用例。
● 进入msopst工具所在目录。

cd /usr/local/Ascend/ascend-toolkit/latest/python/site-packages/bin

● 生成测试用例文件并执行。

./msopst run -i /home/ma-user/AddCustom_st/AddCustom_case.json -soc Ascend910A -out /home/ma-user/AddCustom_st

输出结果

b'Result file append successfully.'
b'[      OK ] AddCustom.Test_AddCustom_001_case_001_ND_float16 ( 800.668 ms )'
b'[=========] Ran 1 tests. ( 800.73 ms total )'
b'[PASSED] 1 tests.'
b'[FAILED] 0 tests.'
2024-06-21 07:56:48 (99241) - [INFO] Testcase execute in Ascend910A, cost time: 1.817183 s.
2024-06-21 07:56:48 (99241) - [INFO] Finish to run /home/ma-user/AddCustom_st/20240621075616/AddCustom/run/out/main.
2024-06-21 07:56:48 (99241) - [INFO] Step:------>>>>>> Start to get result <<<<<<------ 
2024-06-21 07:56:48 (99241) - [INFO] Find result.txt in /home/ma-user/AddCustom_st/20240621075616/AddCustom/run/out/result_files/result.txt.
2024-06-21 07:56:48 (99241) - [INFO] Case 'Test_AddCustom_001_case_001_ND_float16' run successfully.
2024-06-21 07:56:48 (99241) - [INFO] Get result data in AiHost execute time: 0.000810 s
========================================================================
run command: ./msopst run -i /home/ma-user/AddCustom_st/AddCustom_case.json -soc Ascend910A -out /home/ma-user/AddCustom_st
------------------------------------------------------------------------
- test case count: 1
- success count: 1
- failed count: 0
------------------------------------------------------------------------
========================================================================2024-06-21 07:56:48 (99241) - [INFO] Process finished!
2024-06-21 07:56:48 (99241) - [INFO] The st report saved in: /home/ma-user/AddCustom_st/20240621075616/st_report.json.

附录

AddCustom/op_host/add_custom.cpp完整代码

#include "add_custom_tiling.h"
#include "register/op_def_registry.h"namespace optiling {
const uint32_t BLOCK_DIM = 8;
const uint32_t TILE_NUM = 8;
static ge::graphStatus TilingFunc(gert::TilingContext* context)
{TilingData tiling;uint32_t totalLength = context->GetInputTensor(0)->GetShapeSize();context->SetBlockDim(BLOCK_DIM);tiling.set_totalLength(totalLength);tiling.set_tileNum(TILE_NUM);tiling.SaveToBuffer(context->GetRawTilingData()->GetData(), context->GetRawTilingData()->GetCapacity());context->GetRawTilingData()->SetDataSize(tiling.GetDataSize());context->SetTilingKey(1);size_t *currentWorkspace = context->GetWorkspaceSizes(1);currentWorkspace[0] = 0;return ge::GRAPH_SUCCESS;
}
}namespace ge {
static ge::graphStatus InferShape(gert::InferShapeContext* context)
{const gert::Shape* x1_shape = context->GetInputShape(0);gert::Shape* y_shape = context->GetOutputShape(0);*y_shape = *x1_shape;return GRAPH_SUCCESS;
}
}namespace ops {
class AddCustom : public OpDef {
public:explicit AddCustom(const char* name) : OpDef(name){// Add算子的第一个输入this->Input("x").ParamType(REQUIRED)    // 代表输入必选.DataType({ ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32 })   // 输入支持的数据类型.Format({ ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND })    // 输入支持的数据格式.UnknownShapeFormat({ ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND });  // 未知Shape情况下的Format的默认值// Add算子的第二个输入this->Input("y").ParamType(REQUIRED).DataType({ ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32 }).Format({ ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND }).UnknownShapeFormat({ ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND });this->Output("z").ParamType(REQUIRED).DataType({ ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32 }).Format({ ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND }).UnknownShapeFormat({ ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND });// 关联InferShape函数this->SetInferShape(ge::InferShape);// 关联Tiling函数this->AICore().SetTiling(optiling::TilingFunc);// 注册算子支持的AI处理器型号,请替换为实际支持的AI处理器型号this->AICore().AddConfig("ascend910");}
};OP_ADD(AddCustom);
}

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

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

相关文章

CVPR2024 轨迹预测系列(一)

CVPR2024 轨迹预测系列&#xff08;一&#xff09; 文章目录 CVPR2024 轨迹预测系列&#xff08;一&#xff09;一、Adapting to Length Shift: FlexiLength Network for Trajectory Prediction.1、Abstract2、FlexiLength Network3、Datasets4、Experiments5、Implementation …

分类预测 | PSO-PNN基于粒子群算法优化概率神经网络的数据分类预测(Matlab)

分类预测 | ZOA-PCNN-AT-SVM斑马优化并行卷积-支持向量机融合注意力机制的故障识别 目录 分类预测 | ZOA-PCNN-AT-SVM斑马优化并行卷积-支持向量机融合注意力机制的故障识别分类效果基本描述程序设计参考资料 分类效果 基本描述 1.PSO-PNN基于粒子群算法优化概率神经网络的数据…

长鑫存储母公司斥资24亿美元发展国产HBM

国产DRAM厂商长鑫存储母公司睿力集成计划投资24亿美元在上海建一座高端封装工厂。据报道&#xff0c;该工厂将专注于高带宽存储器&#xff08;HBM&#xff09;芯片的封装&#xff0c;预计到2026年中开始投入生产。长鑫存储将利用来自多方投资者的资金进行建设&#xff0c;其中包…

鼠尾草(洋苏草)

鼠尾草&#xff08;Salvia japonica Thunb.&#xff09;&#xff0c;又名洋苏草、普通鼠尾草、庭院鼠尾草&#xff0c;属于唇形科鼠尾草属多年生草本植物。鼠尾草以其独特的蓝紫色花序和长而细密的叶片为特点&#xff0c;常用于花坛、庭院和药用植物栽培。 鼠尾草的名字源自于…

江科大笔记—读写内部闪存FLASH读取芯片ID

读写内部闪存FLASH 右下角是OLED&#xff0c;然后左上角在PB1和PB11两个引脚&#xff0c;插上两个按键用于控制。下一个代码读取芯片ID&#xff0c;这个也是接上一个OLED&#xff0c;能显示测试数据就可以了。 STM32-STLINK Utility 本节的代码调试&#xff0c;使用辅助软件…

Langchain-实战篇-搭建本地问答机器人-01

项目背景 在这个快节奏的职场世界里&#xff0c;我们每个人都可能在某个时刻&#xff0c;化身为一头辛勤的牛或一匹奔腾的马&#xff0c;面对入职签合同时的迷茫&#xff0c;或是离职时的纠纷&#xff0c;心中难免会涌现出各种疑问。比如&#xff1a; "这份合同里的条款…

Python在Excel中设置数字格式和获取应用数字格式后的值

目录 安装Python Excel库 Python在Excel中设置数字格式 Python获取Excel中应用数字格式的单元格的显示值 总结 Excel 数字格式是用于控制单元格中数字显示方式的一组规则或代码。通过设置不同的数字格式&#xff0c;可以定义数字的显示方式&#xff0c;如小数位数、货币符号…

Java对应C++ STL的用法

sort&#xff1a; 1&#xff1a;java.util.Arrays中的静态方法Arrays.sort()方法&#xff0c;针对基本数据类型和引用对象类型的数组元素排序 2&#xff1a;java.util.Collections中的静态方法的Collections.sort()方法&#xff0c;针对集合框架中的动态数组&#xff0c;链表&…

iOS17系统适配

iOS17 新功能 文章目录 iOS17 新功能iOS17支持哪几款机型Xcode15新特性iOS17-开发适配指南 横屏待机 在iOS 17中&#xff0c;还带来了横屏待机功能&#xff0c;苹果将这个新功能命名为“Standby”模式&#xff0c;为 iPhone 带来了全新的玩法。iPhone启用之后&#xff0c;默认情…

1-Pandas是什么

Pandas是什么 Pandas 是一个开源的第三方 Python 库&#xff0c;从 Numpy 和 Matplotlib 的基础上构建而来&#xff0c;享有数据分析“三剑客之一”的盛名&#xff08;NumPy、Matplotlib、Pandas&#xff09;。Pandas 已经成为 Python 数据分析的必备高级工具&#xff0c;它的…

PyTorch Tensor进阶操作指南(二):深度学习中的关键技巧

本文主要讲tensor的裁剪、索引、降维和增维 Tensor与numpy互转、Tensor运算等&#xff0c;请看这篇文章 目录 9.1、首先看torch.squeeze()函数&#xff1a; 示例9.1&#xff1a;&#xff08;基本的使用&#xff09; 小技巧1&#xff1a;如何看维数 示例9.2&#xff1a;&a…

安全架构概述_1.信息安全面临的威胁

在当今以计算机、网络和软件为载体的数字化服务几乎成为人类赖以生存的手段。与之而来的计算机犯罪呈现指数上升趋势&#xff0c;因此&#xff0c;信息的可用性、完整性、机密性、可控性和不可抵赖性等安全保障显得尤为重要&#xff0c;而满足这些诉求&#xff0c;离不开好的安…

Vulnhub-AdmX

主机发现 靶机 &#xff1a; 192.168.145.131131 这台主机 存活 端口扫描 nmap -sV -O -p 1-65535 192.168.145.131 存在 80 端口 &#xff0c;这里连ssh 端口都没了 80 端口存在 Apache httpd 2.4.1 存在 Apache 默认页面 像这种页面 &#xff0c;没有什么具体的价值 扫描一…

嵌入式Linux系统编程 — 4.6 atoi、strtol等函数实现字符串与数字转换

目录 1 字符串转整形数据 1.1 函数功能 1.2 示例程序 2 字符串转浮点型数据 2.1 函数介绍 2.2 示例程序 3 数字转字符串 3.1 函数介绍 3.2 函数原型 在编程中&#xff0c;经常会需要将数字组成的字符串转换为相应的数字、或者将数字转换为字符串&#xff0c;在 C 函数…

连环计 | 第6集 | 百姓有倒悬之危,君臣有累卵之急 | 貂蝉 | 三国演义 | 逐鹿群雄

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f4cc;这篇博客分享的是《三国演义》文学剧本第Ⅰ部分《群雄逐鹿》的第6️⃣集《连环计》的经典语句和文学剧本全集台词 文章目录 1.经典语句2.文学剧本台词 …

LabVIEW材料样本结构缺陷检测

本文介绍了一种基于LabVIEW的实验室振动特性分析测试装置&#xff0c;通过分析振动特性来检测结构缺陷。文章详细描述了具体案例、硬件型号、工作原理、软件功能以及注意事项。 硬件型号 振动传感器&#xff1a;PCB Piezotronics 352C33加速度计 数据采集卡&#xff1a;NI PXI…

python(基础语法,pandas,numpy,正则表达式,数据预处理)

python学习推荐网址&#xff1a; 白月黑羽 一、语法基础 目标&#xff1a; • list、tuple、set、dict的基本用法 • 内置函数 len&#xff08;&#xff09;&#xff0c; eval&#xff08;&#xff09;&#xff0c;range&#xff08;&#xff09;&#xff0c;sort&#xff08;…

Linux自动化交互脚本expect开发

在日常开发任务中&#xff0c;运行shell脚本有时候会提示输入密码的操作&#xff0c;如何让脚本自动输入密码呢&#xff1f;这时使用expect帮我们输入&#xff0c;Expect是基于Tcl发展而来的&#xff0c;它不仅可以进行交互&#xff0c;还可以根据程序的提示模拟标准输入&#…

西安高校大学智能制造实验室数字孪生可视化系统平台建设项目验收

随着工业4.0时代的到来&#xff0c;智能制造成为推动制造业转型升级的关键。为了培养学生的创新能力和实践能力&#xff0c;西安高校大学决定建设智能制造实验室&#xff0c;并引入数字孪生技术&#xff0c;构建可视化系统平台。项目旨在通过数字孪生技术&#xff0c;实现对制造…

微信小程序毕业设计-线上教育商城系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…