-
一、MindStudio 环境搭建MindStudio 是一套基于华为自研昇腾 AI 处理器开发的 AI 全栈开发工具平台,该 IDE 上功能很多,涵盖面广,可以进行包括网络模型训练、移植、应用开发、推理运行及自定义算 子开发等多种任务。MindStudio 除了具有工程管理、编译、调试、运行等功能外,还能进行性能分析,算子比对,可以有效提高工作人员的开发效率。除此之外,MindStudio 还具有远端环境,运行任务可在远端实现,对于近端的个人设备要求不高,用户交互体验很好,可以 让我们随时随地进行使用。Mindstudio 官网链接:cid:link_3如需在 Linux 安装昇腾套件包 ascend-cann-toolkit(以下简称 CANN),请在官网下载CANN。官网链接:cid:link_5用 户 手 册 :( 本 例 中 使 用 的 版 本 为 5.1.RC2) https://www.hiascend.com/document/detail/zh/canncommercial/51RC2/overview/index.html项目代码:cid:link_4将项目代码下载到本地并解压。MindStudio 安装完成后,第一次打开 MindStudio 会出现如图所示界面:如图所示的 Projects,用于工程打开、创建:1. 配置 ssh 连接.点击 Customize选择“All settings...”点开“Tools”选择“SSH Configurations”(4) 点击“+”填写 ssh 连接所需要的远端服务器信息点击“Test Connection”测试连接出现如图所示弹窗即为正确连接,点击“OK”本例使用 71 作为 GPU 服务器,同样的操作进行配置 NPU 服务器(113)的 SSH:2. 打开工程在“Projects”中选择“Open”,在弹出的文件选择框中选择上文提到的所下载的代码,点击“OK”,如图所示:选择“Trust Project”工程打开后如图所示.3. 导入 CANN 包选择“File”->“Settings”依次如图所示进行选择,点击“Change CANN”按钮,如图所示:点击 Remote Connection 后的“田”,如图所示,跳转下文配置 SSH 界面。第一节已配置 ssh,这里我们选择 NPU113 服务器的 SSH。上述步骤完成后,在 Remote CANN location 中选择远端服务器的 CANN 包,如图所示:点 击 “ Finish ” , 出 现 进 度 条 , 等 待 片 刻 后 即 可 完 成 安 装 。安装完成后,点击“OK”自动重启 MindStudio。4. 工程转换重启后的任务栏如图所示:点击菜单栏中的“Ascend”,选择“Convert To Ascend Project”:如图所示,在下拉框中做出如下选择,点击“ok”。第一个下拉框有“Ascend Operator”、“Ascend Training”和“Ascend APP”三个选项,我们是训练任务,故选择“Ascend Training”。当第一个下拉框确定为“Ascend Training”时,第二个下拉框可选框架为“Mindspore”、“Pytorch”和“Tensorflow”,这里我们选择“Pytorch”。转换成功后,菜单栏变成如图所示:二、基本介绍1. 任务流程GPU 精度对齐。在复现过程中,我们原则上需要保证模型结构与论文完全一致,loss,optim,前后处理等与论文基本一致。NPU 功能打通。主要包括 NPU 1p/8p 功能打通、保存数据。NPU 性能优化(非必须)。主要包括 NPU 性能问题定位、优化。2. 模型介绍CANINE:用于语言表示的高效预训练非标记化编码器。CANINE 架构如图所示,直接对字符序列进行操作的神经编码器,无需明确的标记化或词表,以及用软归纳偏差代替硬标记边界 的预训练策略。CANINE 可直接对长字符序列进行编码,速度可与 vanilla BERT 相媲美。为有效且高效地利用精细输入,CANINE 将减小输入序列长度的降采样与编码上下文的深度transformer 栈相结合。尽管 CANINE 模型参数少了 28%,但在 TYDI QA 这个具有挑战性的多语言基准上,CANINE 的表现却比同类 mBERT 模型 F1 好了≥1,超越了建立在启发式标记器之上的模型的质量。3. 数据集介绍SQuAD 是 Stanford Question Answering Dataset 的首字母缩写。这是一个阅读理解数据集,由众包工作者在一组维基百科文章上提出的问题组成,其中每个问题的答案都是相应 文章中的一段文本,某些问题可能无法回答。下载地址 https://rajpurkar.github.io/SQuAD-explorer/ 本模型采用 huggingface 自带的数据集。三、相关配置1. Deployment 配置选择“File”->“Settings”按图示标注选择,自定义名称:选择前文已配置好的 SSH 连接。点击“Mappings”,按图示顺序配置本地到远端服务器的映射。点击“OK”完成配置。2. 配置远端 python 解释器在菜单栏中选择“File”,点击“Project Structure”,如图所示:打开的 Project Structure 界面如图所示,在左侧选择 SDKs,点击箭头所指的“+”,选择“Add Python SDK”。点击“SSH Interpreter”,在“Deploy”中选择前文配置好的服务器,如需另选 python 环境, 在“Interpreter”中选择远端服务器上对应的 python 文件夹,“Name”会自动获取。如图所示:点击“OK”完成配置。点击“Project”,选择刚配置好的远端 SDK。如图所示。点击左侧“Modules”,在右侧选择“Dependencies”,在 Module SDK 下拉框中选择刚配置好的远端 SDK,点击“OK”,如图所示:此外,点击菜单栏中的“Tools”,选择“Deployment”,选择“Automatic Upload”,修改代码保存后可自动上传到远端服务器。四、代码介绍1. 模型代码介绍训练代码路径为 工程/examples/pytorch/question-answering 训练代码为 run_qa.py训练部分的代码在 run_qa 中实现,如数据集的加载:CanineForQuestionAnswering 继承自 CaninePreTrainedModel,重载了 forward 函数。CanineForQuestionAnswering 的 forward 包含以下输入:input_ids (torch.LongTensor of shape (batch_size, sequence_length))词汇表中输入序列标记的索引。可以使用 BertTokenizer 获得索引。attention_mask (torch.FloatTensor of shape (batch_size, sequence_length), optional)掩码以避免对填充标记索引进行关注。在[0,1]中选择的掩码值:1 表示未屏蔽的令牌,0 表示已屏蔽的令牌。token_type_ids (torch.LongTensor of shape (batch_size, sequence_length), optional)段标记索引表示输入的第一部分和第二部分。索引在[0,1]中选择: 0 对应一个句子 A 的标记,1 对应一个句子 B 的标记。position_ids位置嵌入中每个输入序列标记的位置索引。head_mask遮罩,使自我注意模块的选定头部无效。在[0,1]中选择的掩码值:1 表示头部未被遮蔽,0 表示头部被遮蔽。0 表示头部被遮蔽。inputs_embeds (torch.FloatTensor of shape (batch_size, sequence_length, hidden_size), optional)您可以选择直接传递嵌入式表示,而不是传递 input _ ids。如果您希望比模型的内部嵌入查找矩阵更好地控制如何将 input _ ids 索引转换为相关向量,那么这非常有用。start_positions (torch.LongTensor of shape (batch_size,), optional)标记范围开始的位置(索引)的标签,用于计算令牌分类丢失。位置被固定到序列的长度(序列 长度)。在计算损失时不考虑序列之外的位置。end_positions (torch.LongTensor of shape (batch_size,), optional)标记范围末尾的位置(索引)的标签,用于计算令牌分类丢失。位置被固定到序列的长度(序列 长度)。在计算损失时不考虑序列之外的位置。output_attentions (bool, optional)是否返回所有注意层的注意张量。output_hidden_states (bool, optional)是否返回所有层的隐藏状态。return_dict (bool, optional)是否返回 ModelOutput 而不是纯元组Forward 函数返回值:如果 return_dict=True,返回 QuestionAnsweringModelOutput,一组 torch.FloatTensor 包括取决于配置和输入的各种元素。包含下列几项:loss提取从开始到结束位置的 Cross-Entropy 总和。start_logitsSpan-start 结果(在 SoftMax 之前)。end_logitsSpan-end 结果(在 SoftMax 之前)。hidden_states模型在各层输出加上初始嵌入输出时的隐状态。attentions注意力 softmax 之后的注意力权重,用于计算自我注意力头部的加权平均值。2. 编写 NPU 训练脚本在 NPU 中,需要配置更多的环境变量,所以我们将 source 环境变量以及运行的代码集中写到一个 shell 脚本中,即“run.sh”。新建 test 文件夹,并将环境变量放到“env_npu.sh”中。输出会重定向到 train_0.log 此外,在 NPU 服务器使用 1.8 版本的 torch 需要在 run_qa.py 做出如下修改:五、使用命令行方式进行 GPU 训练1. 打开命令行在菜单栏中选择“Tools”->“Start SSH session...”选择配置好的 GPU 服务器的 SSH(71):打开后的终端如图所示:2. 使用 conda 配置环境使用 conda activate pt-1.8 命令,可以看到环境由 base 切换到 pt-1.8进入到 transformer 代码仓安装所需依赖(举例):transformers:datasets :执行训练命令,如图所示开始训练:部分参数介绍:----model_name_or_path 模型名--dataset_name 数据集名称,数据集会自动下载--do_train 执行训练--do_eval 执行推理--per_device_train_batch_size 每张卡的 batch_size--learning_rate 学习率--num_train_epochs 训练的总 epoch 数--output_dir 权重文件输出路径3. 训练结果训练结束后,查看日志得到结果: 其中精度为 76.10六、使用可视化配置进行 NPU 训练1. 执行训练选择“Edit Configurations”选择“Remote Run”,Deployment 一栏中选择配置好的 NPU SSH 即 113,在 Executable 中选择运行脚本,即上文编写好的训练脚本,点击“OK”。点击绿色三角形进行运行,MindStudio 会先将本地代码同步到远端服务器,再运行。2. 训练过程查看日志文件:七、问题与解答Q:运行脚本要指定 train_file 和 predict_file,这两个文件在哪里下载? A:可以从这个链接下载:https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v1.1.json cid:link_2Q:NPU 复现时偶尔会出现 torch.distributed.barrier()报错。A:是 load_and_cache_examples 函数首次保存 cache 时有几率出现这个错误,原因还没有定位到,重新启动运行脚本即可。八、社区推广开发过程中遇到的问题可以在昇腾论坛发帖提问,也可以查看其他案例的分享以熟悉流 程。除了参考官方指导文档外,帮助更多的还是开发者社区,如下图所示,推荐大家多看些 经验分享,写的很详细也很有帮助。MindStudio 论坛:cid:link_1
-
一、MindStudio 环境搭建MindStudio 是一套基于华为自研昇腾 AI 处理器开发的 AI 全栈开发工具平台,该 IDE 上功能很多,涵盖面广,可以进行包括网络模型训练、移植、应用开发、推理运行及自定义算 子开发等多种任务。MindStudio 除了具有工程管理、编译、调试、运行等功能外,还能进行性能分析,算子比对,可以有效提高工作人员的开发效率。除此之外,MindStudio 还具有远端环境,运行任务可在远端实现,对于近端的个人设备要求不高,用户交互体验很好,可以 让我们随时随地进行使用。Mindstudio 官网链接:cid:link_2如需在 Linux 安装昇腾套件包 ascend-cann-toolkit(以下简称 CANN),请在官网下载CANN。官网链接:cid:link_4用 户 手 册 :( 本 例 中 使 用 的 版 本 为 5.1.RC2) https://www.hiascend.com/document/detail/zh/canncommercial/51RC2/overview/index.html项目代码:cid:link_3将项目代码下载到本地并解压。MindStudio 安装完成后,第一次打开 MindStudio 会出现如图所示界面:如图所示的 Projects,用于工程打开、创建:1. 配置 ssh 连接点击 Customize,选择“All settings...”,点开“Tools”,选择“SSH Configurations”, 点击“+”,填写 ssh 连接所需要的远端服务器信息,点击“Test Connection”测试连接,出现如图所示弹窗即为正确连接,点击“OK”本例使用 192.168.88.71 作为GPU 服务器,同样的操作进行配置 NPU 服务器(192.168.99.113) 的 SSH:2. 打开工程在“Projects”中选择“Open”,在弹出的文件选择框中选择上文提到的所下载的代码,点击“OK”,如图所示:选择“Trust Project”工程打开后如图所示,点击“close”:将工程重命名为“camembert”。3. 导入 CANN 包选择“File”->“Settings”依次如图所示进行选择,点击“Change CANN”按钮,如图所示:点击 Remote Connection 后的“田”,如图所示,跳转下文配置 SSH 界面。第一节已配置 ssh,这里我们选择 NPU (192.168.99.113)服务器的 SSH。上述步骤完成后,在 Remote CANN location 中选择远端服务器的 CANN 包,如图所示:点击“Finish”,出现进度条,等待片刻后即可完成安装。安装完成后,点击“OK”自动重启 MindStudio。4. 工程转换重启后的任务栏如图所示:点击菜单栏中的“Ascend”,选择“Convert To Ascend Project”:如图所示,在下拉框中做出如下选择,点击“ok”。第一个下拉框有“Ascend Operator”、“Ascend Training”和“Ascend APP”三个选项,我们是训练任务,故选择“Ascend Training”。当第一个下拉框确定为“Ascend Training”时,第二个下拉框可选框架为“Mindspore”、“Pytorch”和“Tensorflow”,这里我们选择“Pytorch”。转换成功后,菜单栏变成如图所示:二、基本介绍1. 任务流程GPU 精度对齐。在复现过程中,我们原则上需要保证模型结构与论文完全一致,loss,optim,前后处理等与论文基本一致。NPU 功能打通。主要包括 NPU 1p/8p 功能打通、保存数据。NPU 性能优化(非必须)。主要包括 NPU 性能问题定位、优化。2. 模型介绍训练的语言模型现在在自然语言处理中无处不在。尽管它们很成功,但大多数可用的模 型要么是在英语数据上训练的,要么是在多种语言的数据串联上训练的。这使得这些模型在 除英语以外的所有语言中的实际应用非常有限。在本文中,作者研究了为其他语言训练基于Transformer 的单语语言模型的可行性。以法语为例,评估了该语言模型在语篇标记、依赖性语法分析、命名实体识别和自然语言推理语言推理任务。实验表明,使用网络抓取的数据 要比使用维基百科的数据更好。更令人惊讶的是,论文表明一个相对较小的网络抓取数据集 4GB 导致的结果与那些使用较大的数据集(130GB 以上)得到的结果一样好。表现最好的模型 CamemBERT 达到或改善了所有四个下游任务的技术水平。3. 数据集简介SQuAD 是 Stanford Question Answering Dataset 的缩写。这是一个阅读理解数据集,由众包工作者在一组维基百科文章上提出的问题组成,其中每个问题的答案都是相应文章中的一 段文本,某些问题可能无法回答。SQuAD2.0 组合了 SQuAD1.1 中的 10 万个问题,并增加了超过 5 万个无法回答的问题, 这些问题由众包工作者以对抗(adversarially)的方式设计,看起来与可回答的问题相似。为了在 SQuAD2.0 数据集上表现出色。系统不仅必须在可能的情况下回答问题,还必须确定篇章数据何时不支持回答,并避免回答。EM(Exact Match ) 和 F1 值是用于 SQuAD 的主要指标。Exact Match 是一种常见的评价标准,它用来评价预测中匹配到正确答案(ground truth answers)的百分比。三、相关配置1. Deployment 配置选择“File”->“Settings”按图示箭头标号依次选择,自定义名称:选择前文已配置好的 SSH 连接。点击“Mappings”,选择本地地址以及远端地址。同理,配置 GPU 服务器 71 的 Deployment。点击“OK”完成配置。2. 配置远端 python 解释器在菜单栏中选择“File”,点击“Project Structure”,如图所示:打开的 Project Structure 界面如图所示,在左侧选择 SDKs,点击箭头所指的“+”,选择“Add Python SDK”。点击“SSH Interpreter”,在“Deploy”中选择前文配置好的 gpu 服务器,如需另选 python 环境,在“Interpreter”中选择远端服务器上对应的 python 文件夹,“Name”会自动获取。如图所示:点击“OK”完成配置。点击“Project”,选择刚配置好的远端 SDK。如图所示。点击左侧“Modules”,在右侧选择“Dependencies”,在 Module SDK 下拉框中选择刚配置好的远端 SDK,点击“OK”,如图所示:四、代码介绍1. 模型代码介绍训练代码路径为 工程/examples/pytorch/question-answering 训练代码为 run_qa.py重点介绍训练部分:如图为提取训练数据集特征,NLP 的首要任务就是将文本内容做 Tokenization(标识化) 处理,也就是说我们将文本分割成一个小块一个小块的例如以一个英文单词为单位或者一个汉字为单位,这样子的操作主要是方便我们可以更集中的去分析文本信息的内容和文本想表达的含义。当然分割是一个大范围,不仅仅是文本分成不同的词,也可以将整个文本分成段落,进而分成句子,句子再细分到词。当然,我们一般所说的标识化就是将整句分割为单个标识符(tokens)。如图为后处理部分代码,其作用为测模型的精度以及性能数据。模型文件的路径为 工程/src/transformers/models/camembert 代码路径如图所示:Camembert 对数据的认知度明显高于传统的 transformer 网络。如下为 camembert 的模型定义, 可使用的模型名有如下三个,我们使用的是“camembert-base”.camembert 模型类继承于 roberta,我们可以再如下的模型定义中看出:2. 编写 NPU 训练脚本在 NPU 中,需要配置更多的环境变量,所以我们将 source 环境变量以及运行的代码集中写到一个 shell 脚本中,即“run.sh”。45-49 为 source 环境变量,55-73 为使用 8 卡并使用 nohup 训练注意:在 NPU 中,需要对 run_qa.py 做出如下更改:五、使用命令行方式进行 GPU 训练1. 打开命令行在菜单栏中选择“Tools”->“Start SSH session...”选择配置好的 GPU 服务器的 SSH(192.168.88.71):打开后的终端如图所示:2. 使用 conda 配置环境激活 conda 环境,并进入到工程下面的 transformer 界面,及 setup.py 所在的目录。配置环境变量:安装 Transformers在 setpup.py 文件所在的目录下执行下图所示命令安装成功后如图所示:安装其他依赖进入到 run_qa.py 所在的目录3. 开始训练执行训练命令,如图所示开始训练:部分参数介绍:----model_name_or_path 模型名--dataset_name 数据集名称,数据集会自动下载--do_train 执行训练--do_eval 执行推理--per_device_train_batch_size 每张卡的 batch_size--learning_rate 学习率--num_train_epochs 训练的总 epoch 数--output_dir 权重文件输出路径4. 训练结果在服务器上查看训练结果如下:精度为 81.4529,loss 为 2.1499,性能为 178.658FPS六、使用可视化配置进行 NPU 训练编辑配置选择“Remote Run”,选择已配置好的“113”deployment,以及 run.sh 所在路径配置好后,点击运行,本地开始与远端服务器同步文件。 训练结束后,查看训练结果:查看精度:七、问题与解答Question:打开命令行时出现如下界面,且无法进行操作。Answer:等待配置完成即可。Question:可视化配置时报错Answer:检查 Deployment 配置。八、分享开发过程中遇到的问题可以在昇腾论坛发帖提问,也可以查看其他案例的分享以熟悉流 程。除了参考官方指导文档外,帮助更多的还是开发者社区,如下图所示,推荐大家多看些 经验分享,写的很详细也很有帮助。MindStudio 论坛:cid:link_1
-
一、MindStudio 介绍MindStudio 提供您在 AI 开发所需的一站式开发环境,支持模型开发、算子开发以及应用开发三个主流程中的开发任务。依靠模型可视化、算力测试、IDE 本地仿真调试等功能, MindStudio 能够帮助您在一个工具上就能高效便捷地完成 AI 应用开发。MindStudio 采用了插件化扩展机制,开发者可以通过开发插件来扩展已有功能。MindStudio 具有如下功能:针对安装与部署,MindStudio 提供多种部署方式,支持多种主流操作系统,为开发者提供最大便利。针对网络模型的开发,MindStudio 支持 TensorFlow、Pytorch、MindSpore 框架的模型训练,支持多种主流框架的模型转换。集成了训练可视化、脚本转换、模型转换、精度 比对等工具,提升了网络模型移植、分析和优化的效率。针对算子开发,MindStudio 提供包含 UT 测试、ST 测试、TIK 算子调试等的全套算子开发流程。支持 TensorFlow、PyTorch、MindSpore 等多种主流框架的 TBE 和 AI CPU 自定义算子开发。针对应用开发,MindStudio 集成了 Profiling 性能调优、编译器、MindX SDK 的应用开发、可视化 pipeline 业务流编排等工具,为开发者提供了图形化的集成开发环境,通过 MindStudio 能够进行工程管理、编译、调试、性能分析等全流程开发,能够很大程度提高开发效率。Mindstudio 官网链接:cid:link_3如需在 Linux 安装昇腾套件包 ascend-cann-toolkit(以下简称 CANN),请在官网下载 CANN。官网链接:cid:link_4用 户 手 册 :( 本 例 中 使 用 的 版 本 为 5.1.RC2) https://www.hiascend.com/document/detail/zh/canncommercial/51RC2/overview/index.html二、迁移任务介绍NPU(Neural network Processing Unit), 即神经网络处理器。神经网络处理器(NPU) 采用“数据驱动并行计算”的架构,特别擅长处理视频、图像类的海量多媒体数据。NPU 处理器专门为物联网人工智能而设计,用于加速神经网络的运算,解决传统芯片在神经网络运算时效率低下的问题。NPU 是 AI 算力的发展趋势,但是目前训练和在线推理脚本大多还基于 GPU。由于 NPU 与 GPU 的架构差异,基于 GPU 的训练和在线推理脚本不能直接在 NPU 上使用,需要迁移为支持 NPU 的脚本后才能使用。为了能让这些脚本在 NPU 架构上进行训练和推理,我们需要做相应的适配,即将基于 GPU 的脚本经过转换后在华为昇腾系列(HUAWEI Ascend)AI 处理器上能进行训练和推理。三、模型与数据集介绍bigbird 介绍基于 Transformer 的模型已经被证明了在许多 NLP 任务中的价值,但这类模型的时间复杂度、内存使用复杂度都是n2 (n 为序列长度),因此当序列长度超过常规的 512 时,模型对算力的要求将会大幅提高。最近的一些文章 Longformer, Performer, Reformer, Clustered attention 都试图通过近似全主力机制改善该问题。例如这个帖子就是介绍这些模型的。BigBird 论文是处理这类问题最新模型的其中之一,它使用 block sparse attention 替换了原类似 Bert 一样的全注意力机制,在与 BERT 一样的计算力情况下,可以处理的序列长度达到 4096。它已经在很多长文本序列的任务上达到 SOTA 效果,例如长文本摘要、长文本问答。BigBird RoBERTa 模型现在已经可以在 Transformers 仓库中使用。我们需要知道,BigBird 的注意力机制是一个近似 BERT 的全注意力机制,因此它不是说比 BERT 的注意力机制效果更好, 而是运行效率更高。BERT 的注意力机制的存储与序列长度是二次方关系,在长文本情况下的存储需求就已经开始令人难以忍受,而 BigBird 的 block sparse attention 就是为了解决这个问题。也就是说,在∞ 长度序列上,计算& ∞ 次时,我们应该把 BERT 的全注意力机制换成 block sparse attention。数据集SQuAD 是 Stanford Question Answering Dataset 的缩写。这是一个阅读理解数据集, 由众包工作者在一组维基百科文章上提出的问题组成,其中每个问题的答案都是相应文章中的一段文本,某些问题可能无法回答。SQuAD2.0 组合了 SQuAD1.1 中的 10 万个问题,并增加了超过 5 万个无法回答的问题, 这些问题由众包工作者以对抗(adversarially)的方式设计,看起来与可回答的问题相似。 为了在 SQuAD2.0 数据集上表现出色。系统不仅必须在可能的情况下回答问题,还必须确定篇章数据何时不支持回答,并避免回答。EM(Exact Match ) 和 F1 值是用于 SQuAD 的主要指标。Exact Match 是一种常见的评价标准,它用来评价预测中匹配到正确答案(ground truth answers)的百分比。四、环境配置打开工程请下载 https://gitee.com/yaohaozhe/transformer 到本地,后续章节会介绍。安装完成后,第一次打开MindStudio 会出现如图所示界面:如图所示的 Projects,用于工程打开、创建:选择刚下载好的代码路径后,选择箭头所指的“Trust”,如图所示:进入工程界面后,如图所示:配置 ssh 连接选择“File”->“settings...”点开“Tools”选择“SSH Configurations”(3) 点击“+”填写 ssh 连接所需要的远端服务器信息点击“Test Connection”测试连接出现如图所示弹窗即为正确连接,点击“OK”本例使用 192.168.88.72 作为GPU 服务器,同样的操作进行配置 NPU 服务器(192.168.99.113) 的 SSH:导入 CANN 包选择“File”->“Settings”依次如图所示进行选择,点击“Change CANN”按钮,如图所示:点击 Remote Connection 后的“田”,如图所示,跳转下文配置 SSH 界面。第一节已配置 ssh,这里我们选择 NPU113 服务器的 SSH。上述步骤完成后,在 Remote CANN location 中选择远端服务器的 CANN 包,如图所示:点 击 “ Finish ” , 出 现 进 度 条 , 等 待 片 刻 后 即 可 完 成 安 装 。安装完成后,点击“OK”自动重启 MindStudio。工程转换重启后的任务栏如图所示:点击菜单栏中的“Ascend”,选择“Convert To Ascend Project”:如图所示,在下拉框中做出如下选择,点击“ok”。第一个下拉框有“Ascend Operator”、“Ascend Training”和“Ascend APP”三个选项, 我们是训练任务,故选择“Ascend Training”。当第一个下拉框确定为“Ascend Training”时,第二个下拉框可选框架为“Mindspore”、“Pytorch”和“Tensorflow”,这里我们选择“Pytorch”。转换成功后,菜单栏变成如图所示:deployment 配置选择“File”->“Settings”点击加号,自定义名称:选择前文已配置好的 SSH 连接。点击“Mappings”,按图示配置本地到远端服务器的映射。点击“OK”完成配置。配置远端 python 解释器在菜单栏中选择“File”,点击“Project Structure”,如图所示:打开的 Project Structure 界面如图所示,在左侧选择 SDKs,点击箭头所指的“+”,选择“Add Python SDK”。点击“SSH Interpreter”,在“Deploy”中选择前文配置好的 gpu 服务器,如需另选 python 环境,在“Interpreter”中选择远端服务器上对应的 python 文件夹,“Name”会自动获取。如图所示:点击“OK”完成配置。点击“Project”,选择刚配置好的远端 SDK。如图所示。点击左侧“Modules”,在右侧选择“Dependencies”,在 Module SDK 下拉框中选择刚配置好的远端 SDK,点击“OK”,如图所示:此外,点击菜单栏中的“Tools”,选择“Deployment”,选择“Automatic Upload”,修改代码保存后可自动上传到远端服务器。五、GPU 训练创建虚拟环境,并安装 transformer,安装 transformer 可以通过 pip 命令安装。例如:pip install transformers由于 Bigbird 后端使用慢速分词器,不支持 squad 数据集,这里安装 sentencepiece 库来来转成快速分词器,命令如下:pip install sentencepiece进入 transformer/examples/pytorch/question-answering 目录下,执行以下命令开启 8 卡训练:部分参数介绍:----model_name_or_path 模型名--dataset_name 数据集名称,数据集会自动下载--do_train 执行训练--do_eval 执行推理--per_device_train_batch_size 每张卡的 batch_size--learning_rate 学习率--num_train_epochs 训练的总 epoch 数--output_dir 权重文件输出路径4 训练结果如下:六、NPU 训练编写启动脚本在 run_qa.py 同级目录下,编写 run.sh 脚本如下执行训练选择“Edit Configurations”选择“Remote Run”,Deployment 一栏中选择配置好的NPU SSH 即配置好的与 192.168.99.113服务器的连接,在 Executable 中选择运行脚本,即上文编写好的训练脚本,点击“OK”。点击 ok 完成配置,点击如图所示绿色三角开始训练。开始训练时,本地文件会同步到远端服务器;训练结束后,远端服务器文件会同步到本地。训练结果记录:七、总结与分享本例详细讲解了使用 MindStudio 进行 big_bird 模型迁移的流程。结论如下:NPU 性能 251.963 FPS > GPU 性能 94.434FPS 性能达标。本例 GPU 无法复现精度,故无需对比精度,情况已做说明并通过审核。在使用 MindStudio 进行模型离线推理开发的过程中,还是比较容易上手的,大家可以按照官方用户手册进行操作,另外还在通过开发者社区学习一些技术干货和经典案例,以下 是相关链接。MindStudio 官 网 入 口 : cid:link_3MindStudio 用户手册入口:cid:link_0MindStudio 开发者社区入口:https://bbs.huaweicloud.com/forum/forum-945-1.html
-
一、MindStudio 环境搭建Mindstudio 官网链接:cid:link_3本次实验使用 MindStudio 开发,按照此教程配置环境,安装 MindStudio。MindStudio 是一套基于华为自研昇腾 AI 处理器开发的 AI 全栈开发工具平台,该 IDE 上功能很多,涵盖面广,可以进行包括网络模型训练、移植、应用开发、推理运行及自定义算子开发等多种任 务。MindStudio 除了具有工程管理、编译、调试、运行等功能外,还能进行性能分析,算子比对,可以有效提高工作人员的开发效率。除此之外,MindStudio 还具有远端环境,运行任务可在远端实现,对于近端的个人设备要求不高,用户交互体验很好,可以让我们随时随地 进行使用。如需在Linux 安装昇腾套件包ascend-cann-toolkit(以下简称 CANN),请在官网下载 CANN。官网链接:cid:link_4用户手册:(本例中使用的版本为 5.1.RC2) https://www.hiascend.com/document/detail/zh/canncommercial/51RC2/overview/index.html1. MindStudio 下载打开官网链接,在跳转的如图中点击“立即下载”。在如图的跳转页面中,选择配套的 MindStudio 版本,本例使用的 CANN 包版本为 5.1.RC2,故下载 MindStudio_5.0.RC2_win.exe。具体安装步骤请参考用户手册,此处不再赘述。安装完成后,请下载 https://gitee.com/yaohaozhe/transformer 到本地。2. 打开工程上述步骤完成后,第一次打开 MindStudio 会出现如图所示界面:如图所示的 Customize 可以进行颜色主题,字体等选择:可以安装所需要的插件,如图所示:点击界面中的 Help 可以跳转到 MindStudio 社区,如图所示:如图所示的 Projects,用于工程打开、创建:点击 Open,选择刚才下载并解压好的代码仓路径作为工程目录打开。选择箭头所指的“Trust”,如图所示:打开后,界面如图所示:3 同步 CANN 包选择“File”->“Settings”来配置 CANN 包,如图:依次如图所示进行选择,点击“Change CANN”按钮,如图所示:点击 Remote Connection 后的“田”,如图所示,跳转下文配置 SSH 界面。如图所示,点击“+”,增加 ssh 连接。如图所示,填写远端服务器的用户名,端口,密码等信息,点击“Test Connection”测试连接是否成功。出现如图所示“Successfully connected!”后表明连接成功,点击“OK”:注:成功连接的服务器会被保存,下文中会用到。在此处可继续添加其他服务器的 SSH 连接。上述步骤完成后,在 Remote CANN location 中选择远端服务器的 CANN 包,如图所示:点击“Finish”。4. 转换工程MindStudio 支持将工程转换为 Ascend 工程,方便模型在 NPU 上训练。第一步,点击菜单栏中的“Ascend”->“Convert To Ascend Project”第二步,选择如图所示配置模型转换成功后,界面如图所示:5. 配置本地到远端服务器的路径映射选择菜单栏中的“Tools”,点击“Deployment”,点击“Configuration”,如图所示:点击“+”,新建“deployment”二、代码介绍1. 模型介绍BART 是一种采用序列到序列模型构建的降噪自编码器,适用于各种最终任务。它使用基于标准 transformer 的神经机器翻译架构。BART 的预训练包括:使用噪声函数破坏文本;学习序列到序列模型以重建原始文本。这些预训练步骤的主要优势在于:该模型可以灵活处理原始输入文本,并学会有效地重 建文本。当为文本生成进行微调(fine-tuned)时,BART 提供了健壮的性能,并且在理解任务中也能很好地工作。BART 是一种降噪自编码器,可将损坏的文档映射到原始文档。它被实现为序列到序列模型,该模型具有在受损文本上的双向编码器和从左至右的自回归解码器。BART 架构由两个主要组件组成:编码器和解码器。他们使用 BERT 的编码器组件,该组件用于从两个方向对输入语句进行编码,以获得更多上下文信息。BART 使用了来自 GPT 的解码器组件,该解码器组件用于重构噪声输入。然而,单词只能在 leftward 上下文使用,所以它不能学习双向互动。然而,单词只能在 leftward 上下文使用,所以它不能学习双向互动。BART 的训练方法是先破坏文档,然后使用交叉熵损失(解码器的输出与原始文档之间的交叉熵)通过解码器恢复它们。BART 的训练方法是先破坏文档,然后使用交叉熵损失(解码器的输出与原始文档之间的交叉熵)通过解码器恢复它们。有几个技巧可以用来破坏文档。Token 屏蔽:像 BERT 一样,对随机 tokens 进行采样并替换为[MASK] tokenToken 删除:从输入中删除随机 tokens。与 token 屏蔽不同,该模型必须确定哪些位置缺少输入。文本填充:对几个文本范围进行采样,并用一个[MASK] token 替换(可以是 0 长度)。句子排列:根据句号将文档分为句子。这些句子会随机排列。文档 Rotation:随机选择一个 token,然后对文档进行转换,使其以该 token 开头。此任务训练模型以识别文档的开始。2. 数据集SQuAD 是 Stanford Question Answering Dataset 的首字母缩写。这是一个阅读理解数据集, 由众包工作者在一组维基百科文章上提出的问题组成,其中每个问题的答案都是相应文章中 的一段文本,某些问题可能无法回答。下载地址:https://rajpurkar.github.io/SQuAD-explorer/RACE benchmarks 数据集来自中国 12-18 岁之间的初中和高中英语考试阅读理解,包含28,000 个短文、接近 100,000 个问题。包含用于评估学生理解能力的多种多样的主题。该数据集中的问题中需要推理的比例比其他数据集更高,也就是说,精度更高、难度更大。下载地址:https://www.cs.cmu.edu/~glai1/data/race/ 本模型采用 huggingface 自带的数据集。3 代码介绍模型代码路径:src\transformers\models\bart\modeling_bart.pyInit 函数:embed_dim 是 attention 层的输入的维数num_heads 是多头注意力机制的头数head_dim 计算出来的是每一个头分得的 embedding 数is_decoder 标记 attention 是否是 decoder 用的 attentionforward 函数attention 一共有三种,第一种是 encoder 的 self attention,第二种是 decoder 的 self attention,第三种是 encoder 和 decoder 连接的 cross attention。(1)encoder 端的 self attention传进来 hidden state,计算 attention 结果。(2)decoder 端的 self attention 比 encoder 端多了一个 mask,attention 的步骤基本是一样的。(3)cross attention 在 attention 的维度上不一样, 但是 kv 的值是用 encoder 端计算,q 是用 decoder 端计算的。这一段代码就是初始化并计算并且得到 q 值,这里 hidden_states 的 size 就是 tgt_len,因为 hidden->q->hidden,hidden 和 q 是最终决定序列长度的,而 k、v 不一定和 q 一样长(比如 cross attention 或者有 cache 的 key values 传过来)。shape 函数的作用是为多头服务,首先将输入的向量转化成(bsz, seq_len, self.num_heads, self.head_dim)维数,然后交换 seq_len 和 self.attention_nums 的两维。交换维数的目的是使得 bsz 和 self.attention_nums 靠在一起,便于将这两维整合。这一段代码是分四种情况计算的 k 和 v 值的:如果是 cross attention 且传入 past_key_value:这是在 cross attention 的预测过程中使用 cache 的情况下的预测第二个词开始,因为使用 cache,第一次从 encoder 的最后一层输出的 hidden states 通过映射得到 kv,然后每次向右边传,不用重新映射了。如果是 cross attention 但是并没有传入 past_key_value:这种情况会在两种情况下出现,第一种情况是训练时候的 cross,得到 encoder 的最后一层的输出的 hidden states,重新起名为 key value states,这时候拿来需要进行 kv 映射得到kv,任何和 decoder 下面上来的 q 进行 attention;第二种情况是预测时候的 cross 的第一个词(使用 cache,第一次得到 kv,然后每次向右边传,不用重新映射了,也就是除了第一次之后就变成了第一种)和预测时候的 cross 的每一个词(不用 cache,key value state 算 n 多次,不往右边传)。encoder 或 decoder 的 attention,但是传入 past_key_value:将 robot 上去留下的所有 kv 拼接到之前的两列 kv 上,以后每一个右边新来的词每一次上去之后也要把自己的 cache 拼接到原来的 kv 上,以此类推每一次我们就可以在预测时候用到左边的 kv 了。encoder 或 decoder 的 attention,没有传入任何的 key 和 value: hidden state 通过 KV 矩阵映射得到 kv。后面就是计算 attentoin 的步骤了。三、GPU 运行1. 环境准备这里使用 MobaXterm 连接 GPU 服务器。根据模型需求,按需添加所需依赖。安装 transformers 框架,首先执行命令 pip list | grep transformers,查看 transformers 是否已安装,若已安装,执行 pip uninstall transformers 命令。再返回到项目的根目录,执行 pip install-e ./命令安装 transformers。2. 运行脚本进入 transformer/examples/pytorch/question-answering 目录下,执行python3.7 -m torch.distributed.launch --nproc_per_node 8 run_qa.py \--model_name_or_path facebook/bart-base \--dataset_name squad \--do_train \--do_eval \--per_device_train_batch_size 12 \--learning_rate 3e-5 \--num_train_epochs 2 \--max_seq_length 384 \--doc_stride 128 \--fp16 --fp16_opt_level O2 \--output_dir ./bart_base_8P/ --overwrite_output_dir命令,运行在 GPU 8P 服务器上的脚本。运行截图如下:直接运行会在进行 evaluation 的时候有“ValueError: `predictions` should be a tuple with two elements (start_logits, end_logits).”的报错修改 run_qa.py 第 542 行,重新执行上述命令,即可正确获得结果。四、NPU 运行请按照上文所提到的配置步骤,配好与 npu 服务器的连接。1. torch1.8 的使用在 run_qa.py 脚本中增加 torch_npu 的引入,如图所示:2. 运行脚本的更改增加的代码内容如图所示。按照如图所示的顺序进行操作:1.选择 Remote Run 2.选择配置好的 Deployment 或者点击“田”自行配置 3.选择可执行文件的路径,即上文提到的脚本 4.配置完成后点击 OK,点击三角运 行。可视化配置五、结果展示1. 结果如开启混合精度,结果如下图可见精度下降得非常厉害,关闭混合精度后结果如下图:精度正常NPU 训练结果如图所示,性能达标:六、分享本文介绍了 MindStudio 工具的下载安装,以及使用 MindStudio 工具完成与 GPU 服务器和 NPU 服务器的连接,并完成 bart 模型的训练。。开发过程中遇到的问题可以在昇腾论坛发帖提问,也可以查看其他案例的分享以熟悉流 程。除了参考官方指导文档外,帮助更多的还是开发者社区,如下图所示,推荐大家多看些 经验分享,写的很详细也很有帮助。MindStudio 论坛:cid:link_2
-
一、MindStudio 环境搭建Mindstudio 官网链接:cid:link_2本次实验使用 MindStudio 开发工具,按照此教程配置环境,安装 MindStudio。MindStudio 是一套基于华为自研昇腾 AI 处理器开发的 AI 全栈开发工具平台,该 IDE 上功能很多,涵盖面广,可以进行包括网络模型训练、移植、应用开发、推理运行及自定义算子开发等多种任 务。MindStudio 除了具有工程管理、编译、调试、运行等功能外,还能进行性能分析,算子比对,可以有效提高工作人员的开发效率。除此之外,MindStudio 还具有远端环境,运行任务可在远端实现,对于近端的个人设备要求不高,用户交互体验很好,可以让我们随时随地 进行使用。如需在Linux 安装昇腾套件包ascend-cann-toolkit(以下简称 CANN),请在官网下载 CANN。官网链接:cid:link_4用户手册:(本例中使用的版本为 5.1.RC2) https://www.hiascend.com/document/detail/zh/canncommercial/51RC2/overview/index.html代码链接为:cid:link_3需将代码仓下载到本地。MindStudio 下载打开官网链接,在跳转的如图 1-1 中点击“立即下载”。在如图 1-2 的跳转页面中,选择配套的 MindStudio 版本,本例使用的 CANN 包版本为 5.1.RC2, 故下载 MindStudio_5.0.RC2_win.exe。点击“软件包下载”后,跳出软件下载须知,阅读 MindStudio 软件许可协议,同意则勾选, 然后点击“立即下载”。如图 1-3 所示。软件安装下载完成后,在弹出的安装界面中点击“Next”。如图 1-4 所示:在接下来的界面中配置安装路径,点击“Browse...”选择安装的目的路径。完成后点击“Next>”。如图 1-5 所示在 Create Desktop Shortcut 中勾选 MindStudio,以在桌面创建 MindStudio 快捷方式。在 Update Context Menu 中勾选 Add “Open Folder as Project”以方便创建工程。接下来点击“Next >”。如图 1-6 所示:接下来点击“install”,如图 1-7 所示:待进度条结束后,点击“Next >”。如图 1-8 所示:勾选 Run MindStudio 可以立即打开 MindStudio。点击“Finish”完成安装。如图 1-9 所示:打开工程安装完成后,第一次打开 MindStudio 会出现如图 1-10 所示界面:如图 1-11 所示的 Projects,用于工程打开、创建:如图 1-12 所示的 Customize 可以进行颜色主题,字体等选择:图 1-12 Customize 界面可以安装所需要的插件,如图 1-13 所示:点击界面中的 Help 可以跳转到 MindStudio 社区,如图 1-14 所示:::图 1-14 Learn MindStudio 界面点击 Projects 中的 Open,如图 1-15 所示:选择刚下载好的代码仓文件,如图 1-16 所示:选择箭头所指的“Trust”,如图 1-17 所示:打开后,如图 1-18 所示:选择“File”->“Settings”来配置 CANN 包,如图 1-19:依次如图所示进行选择,点击“Change CANN”按钮,如图 1-20 所示:点击 Remote Connection 后的“田”,如图 1-21 所示,跳转到图 1-22 所示配置 SSH 界面。如图 1-22 所示,点击“+”,增加 ssh 连接。如图 1-23 所示,填写远端服务器的用户名,端口,密码等信息,点击“Test Connection”测试连接是否成功。出现如图 1-24 所示“Successfully connected!”后表明连接成功,点击“OK”:注:成功连接的服务器会被保存,下文中会用到。在此处可继续添加 GPU 服务器的 SSH:上述步骤完成后,在 Remote CANN location 中选择远端服务器的 CANN 包,如图 1-25 所示:点击“Finish”,等待片刻后即可完成安装。随后点击菜单栏中“Ascend”->“Convert to Ascend project”。如图 1-27 所示,在下拉框中做出如下选择,点击“ok”。转换成功后,菜单栏变成如图 1-28 所示:二.训练配置打开命令行选择菜单栏中的“Tools”,选择“Start SSH session”。选择所需要的服务器,如图 2-2 所示:配置本地到远端服务器的映射选择菜单栏中的“Tools”,点击“Deployment”,点击“Configuration”,如图 2-3 所示点击“+”,新建“deployment”,命名为“gpu”,点击“Connection”,选择配置好的 gpu 服务器的 ssh。点击右侧中间的“Mappings”,在左侧“Local Path”中选择需要在远端服务器运行的本地项目,在右侧“Deployment Path”中,配置服务器中的路径。如图 2-5 所示:同理可配置 NPU(192.168.99.113)服务器的 Deployment。在菜单栏中选择“File”,点击“Project Structure”,如图 2-6 所示:打开的 Project Structure 界面如图 2-7 所示,在左侧选择 SDKs,点击箭头所指的“+”,选择 “Add Python SDK”。点击“SSH Interpreter”,在“Deploy”中选择前文配置好的 gpu 服务器,在“Interpreter”中选择远端服务器上的 python 文件夹,“Name”会自动获取。如图 2-8 所示:配置好后,点击“OK”出现 python SDK,配置成功。如图 2-9 所示:点击“Project”,选择刚配置好的远端 SDK。如图 2-10 所示。点击左侧“Modules”,在右侧选择“Dependencies”,在 Module SDK 下拉框中选择刚配置好的远端 SDK,点击“OK”,如图 2-11 所示:点击菜单栏中的“Tools”,选择“Deployment”,选择“Automatic Upload”,修改代码保存后可自动上传到远端服务器。如图 2-12 所示:三、相关介绍模型概况ALBERT 架构的主干和 BERT 类似,都使用了基于 GELU 的非线性激活函数的 Transformer。但是其分别在两个地方减少了参数量。以下图为例可以看到模型的参数主要集中在两块,一块是 Token embedding projection block, 另一块是 Attention feed-forward block,前者占有 20% 的参数量,后者占有 80% 的参数量。数据集SQuAD 是 Stanford Question Answering Dataset 的缩写。这是一个阅读理解数据集,由众包工作者在一组维基百科文章上提出的问题组成,其中每个问题的答案都是相应文章中的一 段文本,某些问题可能无法回答。SQuAD2.0 组合了 SQuAD1.1 中的 10 万个问题,并增加了超过 5 万个无法回答的问题, 这些问题由众包工作者以对抗(adversarially)的方式设计,看起来与可回答的问题相似。为了在 SQuAD2.0 数据集上表现出色。系统不仅必须在可能的情况下回答问题,还必须确定篇章数据何时不支持回答,并避免回答。EM(Exact Match ) 和 F1 值是用于 SQuAD 的主要指标。Exact Match 是一种常见的评价标准,它用来评价预测中匹配到正确答案(ground truth answers)的百分比。代码介绍模型代码路径:src/transformers/models/mbart/modeling_albart.py主要类与函数介绍:Albert 源码整体和 bert 代码差异很小,为了实现灵活的参数共享,作者提出了一个Group 的概念。 源码中将每一层都分到一个指定 Group 之中,一个 Group 包含了多个相邻的层,同一个 Group 里面的层是参数共享的,这个 group 个数由 num_hidden_groups 参数决定,默认为 1。即所有的层 share 同一个 Transformer 权重。如 num_hidden_groups 为 2,num_hidden_layers 为 12,那么层分为两组。1~6 层是第一组,7~12 是第二组。如 num_hidden_groups 为 3,num_hidden_layers 为 12 ,那么层分为三组。1~4 为第一组 , 5~8 为 第 二 组 , 9~12 为 第 三 组 , 以 此 类 推 ...层索引 layer_idx 和组索引 group_idx 由代码计算得出:对于 group 编号较低的组,学习低抽象的知识,group 编号较高的组,学习相对较高抽象的知识,这个是 make sense 的。通过设定 num_hidden_groups 和 num_hidden_layers 可以灵活设定模型深度和共享的程度。可见 group 在源码中是一个比较重要的类型,其由 AlbertGroup 类实现。AlbertTransformer 在初始化之时,预先实例化了 num_hidden_groups 个 AlbertGroup,这个AlbertGroup 代表新的一层参数,里面还有一些细节,后文会描述。当 AlbertTransformer 计算到某一层时,直接在 group 列表中找到对应的 AlbertGroup 去forward,因此在梯度 backward 的时候,梯度的变化也会传递到对应的 AlbertGroup,这样就实现了多级参数共享的参数更新。AlbertTransformer 完整代码:AlbertGroup 完整代码:由此可见,假设一个 block 的参数量为 m。则实际的 encoder 的参数量 K 为:AlbertGroup 内部的层级由 inner_group_num 参数确定,默认为 1。其内部处理的逻辑也很简单,即 forward 多层的 AlbertLayer,这个 AlbertLayer 就代表着一个 block。K = m * inner_group_num * num_hidden_groupsinner_group_num 和 num_hidden_groups 默认均为 1。大多数预训练模型是基于默认参数训练的,所以这两个参数一般也不会改动。除非需要尝试调整共享程度进行重新预训练。除了Group 分组共享外 albert 还可以调整 block 内部的共享方式分为三种all : ffn 和 attention 都共享ffn :ffn 共享attention: attention 共享对于不同的内部共享,在初始化 Module 时将不共享组件实例化 inner_group_num * num_hidden_groups 个 保存在 ModuleList 之中,在 forward 时,按照索引定位到指定组件即可。四、GPU 训练首先要在 GPU 环境中安装 transformer 库,如已经安装,需要先通过 pip uninstall transfomer 命令卸载原版本之后然后在 transformer 路径下使用命令 pip install –e ./ 进行安装,如未安装,直接使用 pip install –e ./ 命令即可,如图 4-1 所示。安装完成之后方可进行模型训练,进入到 transformer/examples/pytorch/question- answering 路径下后输入如下启动代码后即可开始训练。下面将启动代码的参数进行说明model_name_or_path加载的模型权重dataset_name使用的数据集名称do_train是否执行训练,默认为 truedo_eval是否执行评估,默认为 trueper_device_train_batch_size训练批次大小fp16是否使用混合精度,默认为 falselearning_rate初始学习率pad_to_max_length是否把所有的输入 pad 到最大长度num_train_epochs训练轮数doc_stride将一个长文档拆分为块时,块之间要步数loss_scale混合精度的 scalefp16_opt_level混合精度的模式local_rank指定多卡训练的 id,默认值为-1(单卡训练)dataloader_drop_last是否覆盖之前下载的数据集,默认为 Trueoptim优化器选择output_dir重保存路径训练完成后得到如下结果,如图 4-2 所示。五、NPU 训练根据前文介绍的服务器连接,建立与 NPU 服务器的连接。打开终端如图 5-1 所示,点击“Start SSH session...”:选择已经成功连接的 192.168.99.113 服务器:打开成功后,依赖的安装同第四章 GPU 部分内容。本章介绍 NPU 服务器需要额外做的操作,如环境变量的配置,torch1.8 版本的使用,运行脚本的更改等。配置环境变量激活 conda 后,在任意路径执行 source /usr/local/Ascend/ascend-toolkit/set_env.shtorch1.8 的使用在 run_qa.py 脚本中增加 torch_npu 的引入,如图 5-5 所示:运行脚本的更改在 NPU 中使用 run_qa.py 脚本默认是单卡运算,如需多卡,需使用 ddp 进行指定,如图 5-6所示:点击配置可视化运行设置“Edit Configurations...”,运行如图 5-7 所示:配置好图中所圈画出来的地方,点击“OK运行后结果可在 train_0.log 中查看:六、总结与分享本文介绍了 MindStudio 工具的下载安装,以及使用 MindStudio 工具完成与 GPU 服务器和 NPU 服务器的连接,并完成 albert 模型的训练。训练过程中遇到的问题及解决方案: Question1:Loss 震荡不收敛Answer:调小 learning-rateQuestion2:模型训练精度 NPU 单 P 达标,8P 不达标:Answer: 混合精度使用 O1,将 O2 注释.开发过程中遇到的问题可以在昇腾论坛发帖提问,也可以查看其他案例的分享以熟悉流 程。除了参考官方指导文档外,帮助更多的还是开发者社区,如下图所示,推荐大家多看些 经验分享,写的很详细也很有帮助。MindStudio 论坛:cid:link_1
-
使用MindStudio进行Pytorch离线推理全流程1 MindStudio环境搭建本次实验在MindStudio上进行,请先按照教程配置环境,安装MindStudio。MindStudio的是一套基于华为自研昇腾AI处理器开发的AI全栈开发工具平台,该IDE上功能很多,涵盖面广,可以进行包括网络模型训练、移植、应用开发、推理运行及自定义算子开发等多种任务。MindStudio除了具有工程管理、编译、调试、运行等一般普通功能外,还能进行性能分析,算子比对,可以有效提高工作人员的开发效率。除此之外,MindStudio具有远端环境,运行任务在远端实现,对于近端的个人设备的要求不高,用户交互体验很好,可以让我们随时随地进行使用。2 VPN安装和配置安装好MindStudio后,需要配置远程环境。请按照教程进行VPN客户端的安装与配置。安装好VPN后,可以先在终端用ssh指令测试连接。(这一步是验证网络连接是否可用,也可以跳过)3 创建推理工程打开MindStudio,点击New Project,进入新建工程界面。选择Ascend APP。填入项目名spnasnet_100。首次新建训练工程时,需要配置CANN的版本。点击Change。点击 + 配置远程连接,然后根据选项填入自己服务器的ip地址、端口号、用户名和密码等。配置Remote CANN location。该参数需要填入ascend-toolkit在服务器上的路径地址。在这里,我们toolkit的路径如下:/usr/local/Ascend/ascend-toolkit/5.1.RC1。点击finishing进行配置。初次配置时时间稍长,请耐心等待。点击Next,选择Pytorch Project。点击Finish,完成工程创建,进入工程主界面。4 配置SSH和Deployment在MindStudio的远程服务中,定义了SSH 配置和Deployment两个概念。前者SSH 配置类似MobaxTerm中的Session的概念,用户可以保存多个远程服务器的连接配置。后者Deployment管理远程开发时的本地文件与远程文件的同步。配置好Deployment后,我们就可以像使用本地python环境一样去使用远程的python环境了。点击File -> Settings -> Tools,即可看到两个设置的入口,下面分别介绍如何配置他们。4.1 配置SSH首先点击SSH Configurations,再点击 + 配置远程连接,然后根据选项填入自己服务器的ip地址、端口号、用户名和密码等。测试成功点击Apply即可保存配置,以后就可以一键连接啦!4.2 配置DeploymentDeployment配置能够更精准地连接远程服务,它需要选择一个SSH连接定位远程主机,然后设置本地与远程项目目录的对应关系。如下图所示创建一个新的Deployment。如图310是我创建的Deployment名字,首先选择连接哪一个SSH服务,然后测试连接是否可用。下一步,设置项目目录映射关系,点击Mappings,然后选择本地的项目目录和远程的项目目录(最好是提前创建好文件夹),接下来跑代码的时候MindStudio会保证这两个目录文件的同步。配置好Mappings后,建议配置Excluded Paths,因为MindStudio的默认同步行为会把Mappings对应目录的文件保持完全相同,这意味着只存在于远程的数据集文件夹会被删除(如果本地没有数据集)。在此我配置了几个需要排除的文件夹目录。5 配置远程python解释器现在,SSH和Deployment的映射关系已经配置好了,但是MindStudio还不知道python解释器的位置。因此,下面将介绍如何配置python解释器。点击File -> Project Structure->SDKs可以看到如图所示的界面。点击+号,可以新增python SDK和JDK。这里只演示Python的添加方法。点击Add Python SDK后,将弹出下图所示的界面,点击左侧的SSH Interpreter,如下图所示,首先选择使用哪一个Deployment,这是刚刚我们配置过的。然后选择python解释器的路径。图中的路径是MindStudio自动检测出来的,但一般需要自己找自己的Python环境安装目录。如果是conda环境,可以使用which python找到python的安装路径。然后点击Project,选择刚才添加到MindStudio中的python解释器,将其作为本项目使用的解释器。6 数据集准备6.1 数据预处理上传好数据集以后,执行 preprocess_spnasnet_100_pytorch.py脚本,生成数据集预处理后的bin文件。第一个参数为原始数据验证集(.jpeg)所在路径,第二个参数为输出的二进制文件(.bin)所在路径。每个图像对应生成一个二进制文件。MindStudio会首先上传本地文件到远程服务器,将本地的文件同步到远程这个过程可能很慢,同步完成后开始运行Python代码,MindStudio会实时地在控制台打印输出:6.2 生成数据集info文件执行get_info.py脚本,生成数据集信息文件。第一个参数为模型输入的类型,第二个参数为生成的bin文件路径,第三个为输出的info文件,第四、第五个为宽高信息。执行结果:7 模型转换本模型基于开源框架PyTorch训练的spnasnet_100进行模型转换。先使用PyTorch将模型权重文件.pth转换为.onnx文件,再使用ATC工具将.onnx文件转为离线推理模型文件.om文件。首先获取权重文件。单击Link在PyTorch开源框架获中取经过训练的spnasnet_100权重文件model_best.pth.tar,源码中已提供下载权重文件。7.1 导出onnx文件使用pthtar2onnx.py脚本将.pth文件转换为.onnx文件7.2 导出om文件从onnx转为om需要用atc工具,MindStudio提供了atc工具的窗口化应用,它会根据用户选择自动生成atc指令。Model Converter的入口如图所示:选择onnx模型路径,模型输出名称,目标设备,输入格式和batchsize等信息。MindStudio自动生成如下atc指令,用户可以在此做最后的校验,点击Finish即可开始进行模型转换。模型转换成功:8 模型推理使用benchmark工具进行推理。这个和前面的python脚本不同,它在MindStudio中属于ACL应用,可以如图所示创建应用:点击 + 号,再点击Ascend App:然后进行如下配置:参数详情请参见《CANN推理benchmark工具用户指南》。推理后的输出默认在当前目录result下。执行结果:运行出错:error while loading shared libraries: libascendcl.so: cannot open shared object file: No such file or directory.这个错误是因为没有配置好环境变量。因为我们在终端运行它时,一般要先执行一下:source /usr/local/Ascend/ascend-toolkit/set_env.sh,这一步操作在MindStudio中可以通过如图所示的方法配置环境变量解决:变量内容就是/usr/local/Ascend/ascend-toolkit/set_env.sh的内容,读者可以直接复制使用。LD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/latest/lib64:/usr/local/Ascend/ascend-toolkit/latest/lib64/plugin/opskernel:/usr/local/Ascend/ascend-toolkit/latest/lib64/plugin/nnengine:$LD_LIBRARY_PATH;PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/python/site-packages:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:$PYTHONPATH;PATH=/usr/local/Ascend/ascend-toolkit/latest/bin:/usr/local/Ascend/ascend-toolkit/latest/compiler/ccec_compiler/bin:$PATH;ASCEND_AICPU_PATH=/usr/local/Ascend/ascend-toolkit/latest;ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp;TOOLCHAIN_HOME=/usr/local/Ascend/ascend-toolkit/latest/toolkit;ASCEND_HOME_PATH=/usr/local/Ascend/ascend-toolkit/latest设置变量后,再次启动运行,可以在控制台看到,在执行benchmark前,会首先export环境变量。修改后代码运行成功:可以获得batch16 310单卡吞吐率为1379.94×4 = 5519.76 fps9 精度验证调用vision_metric_ImageNet.py脚本与数据集标签val_label.txt比对,可以获得Accuracy Top5数据,结果保存在result.json中。第一个参数为生成推理结果所在路径,第二个参数为标签数据,第三个参数为生成结果文件路径,第四个参数为生成结果文件名称。获得精度数据如下:310 Top1 accuracy为74.2%,Top5 accuracy为91.94%。
-
Bilibili视频链接:https://www.bilibili.com/video/BV1zD4y187Pg/?vd_source=3c13d92bfc824135ee1784f59673e7d4一、 MindStudio 介绍与安装相关课程:昇腾全流程开发工具链(MindStudio)在线课程,提供了系统的、全面的MindStudio使用,可为初学者、一线工程师、经验丰富的开发者提供参考和帮助。本课程主要介绍MindStudio在昇腾AI开发中的使用,作为昇腾AI全栈中的全流程开发工具链,提供覆盖训练模型、推理应用和自定义算子开发三个场景下端到端工具,极大地提高开发效率。1、 MindStudio介绍MindStudio 提供您在AI开发所需的一站式开发环境,支持模型开发、算子开发以及应用开发三个主流程中的开发任务。依靠模型可视化、算力测试、IDE本地仿真调试等功能,MindStudio能够帮助您在一个工具上就能高效便捷地完成AI应用开发。MindStudio采用了插件化扩展机制,开发者可以通过开发插件来扩展已有功能。1.功能介绍●针对安装与部署,MindStudio提供多种部署方式,支持多种主流操作系统,为开发者提供最大便利。 ●针对网络模型的开发,MindStudio支持TensorFlow、PyTorch、MindSpore框架的模型训练,支持多种主流框架的模型转换。集成了训练可视化、脚本转换、模型转换、精度比对等工具,提升了网络模型移植、分析和优化的效率。 ●针对算子开发,MindStudio提供包含UT测试、ST测试、TIK 算子调试等的全套算子开发流程。支持 TensorFlow、PyTorch、MindSpore 等多种主流框架的TBE和AICPU自定义算子开发。 ●针对应用开发,MindStudio 集成了Profiling性能调优、编译器、MindX SDK的应用开发、可视化pipeline业务流编排等工具,为开发者提供了图形化的集成开发环境,通过 MindStudio能够进行工程管理、编译、调试、性能分析等全流程开发,能够很大程度提高开发效率。2.功能框架MindStudio功能框架如图1所示,目前含有的工具链包括:模型转换工具、模型训练工具、自定义算子开发工具、应用开发工具、工程管理工具、编译工具、流程编排工具、精度比对工具、日志管理工具、性能分析工具、设备管理工具等多种工具。图1工具链功能架构3.工具功能MindStudio工具中的主要几个功能特性如下:工程管理:为开发人员提供创建工程、打开工程、关闭工程、删除工程、新增工程文件目录和属性设置等功能。SSH管理:为开发人员提供新增SSH连接、删除SSH连接、修改SSH连接、加密SSH密码和修改SSH密码保存方式等功能。应用开发:针对业务流程开发人员,MindStudio工具提供基于AscendCL(Ascend Computing Language)和集成 MindX SDK 的应用开发编程方式,编程后的编译、运行、结果显示等一站式服务让流程开发更加智能化,可以让开发者快速上手。 自定义算子开发:提供了基于TBE和AICPU的算子编程开发的集成开发环境,让不同平台下的算子移植更加便捷,适配昇腾AI处理器的速度更快。 离线模型转换:训练好的第三方网络模型可以直接通过离线模型工具导入并转换成离线模型,并可一键式自动生成模型接口,方便开发者基于模型接口进行编程,同时也提供了离线模型的可视化功能。 日志管理:MindStudio为昇腾AI处理器提供了覆盖全系统的日志收集与日志分析解决方案,提升运行时算法问题的定位效率。提供了统一形式的跨平台日志可视化分析能力及运行时诊断能力,提升日志分析系统的易用性。 性能分析:MindStudio以图形界面呈现方式,实现针对主机和设备上多节点、多模块异构体系的高效、易用、可灵活扩展的系统化性能分析,以及针对昇腾AI处理器的性能和功耗的同步分析,满足算法优化对系统性能分析的需求。 设备管理:MindStudio提供设备管理工具,实现对连接到主机上的设备的管理功能。 精度比对:可以用来比对自有模型算子的运算结果与Caffe、TensorFlow、ONNX标准算子的运 算结果,以便用来确认神经网络运算误差发生的原因。 开发工具包的安装与管理:为开发者提供基于昇腾 AI处理器的相关算法开发套件包 Ascend-canntoolkit,旨在帮助开发者进行快速、高效的人工智能算法开发。开发者可以将开发套件包安装到MindStudio上,使用MindStudio进行快速开发。Ascend-cann-toolkit包含了基于昇腾AI处理器开发依赖的头文件和库文件、编译工具链、调优工具等。2、 MindStudio安装MindStudio安装:安装指南-5.0.RC1-MindStudio,昇腾社区 (hiascend.com)提供MindStudio环境搭建指导视频全流程讲解、实操演示助您轻松完成环境搭建。1. 场景介绍●纯开发场景(分部署形态):在非昇腾AI设备上安装MindStudio和Ascend-cann-toolkit开发套件包。可作为开发环境仅能用于代码开发、编译等不依赖于昇腾设备的开发活动(例如ATC模型转换、算子和推理应用程序的纯代码开发)。如果想运行应用程序或进行模型训练等,需要通过MindStudio远程连接功能连接已部署好运行环境所需软件包的昇腾AI设备。 ●开发运行场景(共部署形态):在昇腾AI设备上安装MindStudio、Ascend-cann-toolkit 开发套件包、npu-firmware安装包、npu-driver安装包和AI框架(进行模型训练时需要安装)。作为开发环境,开发人员可以进行普通的工程管理、代码编写、编译、模型转换等功能。同时可以作为运行环境,运行应用程序或进行模型训练。2. 软件包介绍MindStudio:提供图形化开发界面,支持应用开发、调试和模型转换功能,同时还支持网络移植、优化和分析等功能。 Ascend-cann-toolkit:开发套件包。为开发者提供基于昇腾AI处理器的相关算法开发工具包,旨在帮助开发者进行快速、高效的模型、算子和应用的开发。开发套件包只能安装在Linux服务器上,开发者可以在安装开发套件包后,使用MindStudio开发工具进行快速开发。二、MindX SDK介绍与安装1、MindX SDK介绍MindX SDK提供昇腾AI处理器加速的各类AI软件开发套件(SDK),提供极简易用的 API,加速AI应用的开发。 应用开发旨在使用华为提供的SDK和应用案例快速开发并部署人工智能应用,是基于现有模型、使用pyACL提供的Python语言API库开发深度神经网络应用,用于实现目标识别、图像分类等功能。通过MindStudio实现SDK应用开发分为基础开发与深入开发,通常情况下用户关注基础开发即可,基础开发主要包含如何通过现有的插件构建业务流并实现业务数据对接,采用模块化的设计理念,将业务流程中的各个功能单元封装成独立的插件,通过插件的串接快速构建推理业务。mxManufacture & mxVision关键特性:●配置文件快速构建AI推理业务。 ●插件化开发模式,将整个推理流程“插件化”,每个插件提供一种功能,通过组装不同的插件,灵活适配推理业务流程。 ●提供丰富的插件库,用户可根据业务需求组合JPEG解码、抠图、缩放、模型推理、数据序列化等插件。 ●基于Ascend Computing Language(ACL),提供常用功能的高级API,如模型推理、解码、预处理等,简化Ascend芯片应用开发。 ●支持自定义插件开发,用户可快速地将自己的业务逻辑封装成插件,打造自己的应用插件。2、MindX SDK 安装步骤1 Windows场景下基于MindStudio的SDK应用开发,请先确保远端环境上 MindX SDK软件包已安装完成,安装方式参见MindX SDK 2.0.4 mxManufacture用户指南和MindX SDK 2.0.4 mxVision用户指南的“使用命令行方式开发”>“安装 MindX SDK 开发套件”章节。步骤2 在Windows本地进入工程创建页面,工具栏点击 File > Settings > Appearance & Behavior > System Settings > MindX SDK 进入MindX SDK管理界面。界面中MindX SDK Location为软件包的默认安装路径,默认安装路径为 “C:\Users\用户名\Ascend\mindx_sdk”。 单击 Install SDK 进入 Installation settings 界面,如图2。图2 Installation settings 界面如图3所示,为MindX SDK的安装界面,各参数选择如下:Remote Connection:远程连接的用户及IP。 Remote CANN location:远端环境上CANN开发套件包的路径,需配置到版本号一级。Remote SDK location:远端环境上SDK的路径,请配置到版本号一级。IDE将同步该层级下的include、opensource、python、samples文件夹到本地Windows环境,层级选择错误将导致安装失败。 Local SDK location:同步远端环境上SDK文件夹到本地的路径。默认安装路径为“C:\Users\用户名\Ascend\mindx_sdk”。图3 MindX SDK 的安装界面步骤3 单击OK结束,返回SDK管理界面,可查看安装后的SDK的信息,可单击OK结束安装流程。三、基于CTC算法的语音热词唤醒模型介绍随着嵌入式设备、移动设备的快速发展,部署在嵌入式、移动设备的程序越来越多。语音处理应用已在机器人、汽车电子、ATM机等嵌入式、移动设备得到广泛应用。程序、系统在移动设备上运行,必须具有较小的内存占用和较低的计算能力。关键字检测KWS( Keyword Spotting ) 使用深度神经网络DNN训练音频,基于训练的模型对关键字唤醒、推理。基于CTC算法的语音热词唤醒模型基于TensorFlow框架。KWS模型每25ms计算40维log-mel特征,帧移位为10ms。每一帧左重复23帧,向右重复8帧,并将其输入DNN。四、运行基于CTC算法的语音热词唤醒模型步骤1、打开基于CTC算法的语音热词唤醒模型●基于CTC算法的语音热词唤醒模型代码连接:cid:link_5 ●通过SecoClient连接VPN,以确保MindStudio能够连接远程服务器。●双击MindStudio点击右上角Open按钮,选择事先准备好的KWS模型,点击Ok即可进入工程。如图4所示。图4 导入KeywordCTC项目●进入工程后显示如图5界面图5 项目打开界面●单击菜单栏 Ascend > Convert To Ascend Project,如图6所示。图6 工程转换界面●弹出如图7窗口。图7 转换晟腾功能配置对窗口参数介绍如下,用户请根据实际场景选择。Project Type:可选择三种工程类型,分别为Ascend Operator、Ascend Training和Ascend App。确定了Project Type后,再选择项目类型对应的Framework,Framework可选择框架如表1所示。Project TypeFrameworkAscend OperatorMindSporePyTorchTensorFlowONNXAscend TrainingMindSporePyTorchTensorFlowAscend AppAscend ACL AppAscend Python ACL AppAscend MindX SDK App表1 FrameWork可选框架Project Desc:项目描述。单击OK,工程目录以树状呈现。此时成功创建带有.project文件的昇腾工程如图8,请以实际创建结果为准。图8 转换晟腾功能成功界面2、 基于CTC算法的语音热词唤醒模型训练●在项目Project区的KeywordCTC项目目录树找到kws_train_2.py文件,双击打开,如图9所示。kws_train_2.py文件是基于CTC算法的语音热词唤醒模型的训练文件。图9打开kws_train2.py界面●Kws_train2中主要代码介绍:图10 主要代码介绍1图11 主要代码介绍2●在工具栏选择Run>Edit Configurations...进入运行配置界面。配置Deployment,点击Run,将代码同步到远程服务器如图12。图12 Deployment配置●在工具栏选择Tools>Start SSH session…如图13。图13 选择Strat SHH session●选择终端连接的服务器图14 选择服务器连接●远程终端开启后,在MindStudio底部状态栏目的Remote Terminal图标由之前的灰色变为蓝色,并展示欢迎界面如图15。图15 连接成功界面●输入 cd MindStudio-WorkSpace/KeywordCTC进入同步到服务器的代码,输入ll命令展示内容如图16。图16 服务器上的代码目录展示●输入python kws_train_2.py 命令进行模型训练如图17、图18。图17 开始训练图18 训练过程●kws_train_2.py文件开启模型训练结束如图19。图19 训练结束●训练结束后在在result_CTC_2下生成model_weights.h5文件如图20。图20 生成model_weights.h53、 基于CTC算法的语音热词唤醒模型转换●通过pip install 命令安装onnx和tf2onnx如图21、图22。图21 安装onnx图22 安装tf2onnx●输入python keras2onnx.py命令将model_weights.h5模型转换成pb模型如图23。图23 keras2onnx.py开始执行●模型转换成功在tmp_model下可以看到saved_model.pb模型如图24。图24 pb模型生成成功●输入python -m tf2onnx.convert --saved-model tmp_model --output model1.onnx --opset 11命令将pb模型转换为onnx模型如图25、图26。图25 pb模型开始转onnx模型图26 pb模型转onnx模型过程●模型转换成功输入ll命令查看,可以看到model.onnx模型如图27。图27 生成model1.onnx输入命令:Exportinstall_path=/usr/local/Ascend/ascend toolkit/latestexportPATH=/usr/local/python3.7.5/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATHexportPYTHONPATH=${install_path}/atc/python/site-packages:$PYTHONPATHexportLD_LIBRARY_PATH=${install_path}/atc/lib64:${install_path}/acllib/lib64:$LD_LIBRARY_PATHexportASCEND_OPP_PATH=${install_path}/oppexportASCEND_AICPU_PATH=/usr/local/Ascend/ascend-toolkit/latest/设置模型转换环境。●借助ACT工具将onnx模型转换为om模型。atc --framework=5 --model=model1.onnx --output=modelctc1 --input_format=ND --input_shape="input:1,958,13" --log=debug --soc_version=Ascend310输入这行命令,模型转换如图28。图28 onnx模型开始转换om模型图29 om模型转换成功生成modelctc1.om文件4、基于CTC算法的语音热词唤醒模型评估模型训练完成后,运行性能评估文件评估模型性能,判断模型是否正常以及达到训练精度。kws_evaluate.py文件是基于CTC算法的语音热词唤醒模型的模型性能评估文件。●kws_evaluate.py主要代码介绍如下图30、图31。图30 kws_evaluate.py代码介绍1图31 kws_evaluate.py代码介绍2●输入python kws_evaluate.py命令进行模型性能评估如图32、图33。图32 kws_evaluate.py开始运行图33 kws_evaluate.py运行过程●运行结束后在result_CTC_2下面生成performance.txt文件,输入more performance.txt命令查看结果如图34。图34 performance.txt内容●performanc.txt文件里给出性能评价数据,包括keywords、TP、FN、FP 等其中TP,TN,FP,FN的理解定义为:第一个字母T/F代表预测的结果是否和实际情况相符,即如果真实情况为正样本(P),预测为正样本(P),则为T;如果真实情况为负样本(N),预测为负样本(N),则为T;如果真实情况为P,预测为N,则为F;如果真实情况为N预测为P,则为F。第二个字母P/N代表预测结果的正负:如果预测为正样本,则为P;如果预测为负样本,则为N。TP:true positive,被判定为正样本,事实上也是正样本;TN:true negative,被判定为负样本,事实上也是负样本;FP:false positive,被判定为正样本,但事实上是负样本;FN:false negative,被判定为负样本,但事实上是正样本;5、基于CTC算法的语音热词唤醒预测●kws_predict.py主要代码介绍如下图35。图35 kws_predict.py主要代码介绍●kws_predict.py运用训练模型对指定的音频文件进行预测。●输入python kws_predict.py命令运行kws_predict.py文件如图36、图37。图36 kws_predict.py文件开始运行图37 kws_predict.py文件运行过程●基于CTC算法的语音热词唤醒预测结果,如图38、图39所示。图38是从音频文件预测“北京”热词的结果;图39是从含噪音的音频文件预测“北京”热词的结果。图38 推理结果1图39 推理结果2五、推广MindStudio提供图形化开发界面,支持应用开发、调试和模型转换功能,同时还支持网络移植、优化和分析等功能,功能强大。文档以图文说明用MindStudio IDE分析基于CTC算法的语音热词唤醒的训练、精度评估、推理的过程。六、从昇腾社区获取更多帮助开发者在使用 MindStudio 或进行算子开发过程中遇到任何问题,都可以来昇腾社区获得更多的帮助。昇腾官网:昇腾社区-官网丨昇腾万里 让智能无所不及 (hiascend.com)昇腾社区:昇腾众智计划-昇腾社区 (hiascend.com)昇腾论坛:昇腾论坛 (hiascend.com)
-
扫码进下方任一微信群,并报名CANN训练营可参与抽奖参与开发板领取规则①参与抽奖者需进群并报名CANN训练营,仅参与未报名无效②中奖后请及时联系小助手,公布后10个工作日内未提供具体信息视为无效报名链接:cid:link_1 直播链接: https://2b87aad812c94b3392d218f35fa6ca3f.shixizhi.huawei.com/live/viewer.htm?actId=7da1rk37&liveId=1579653306145419265&tenant_id=1493401497873534978
-
MindStudio是一套基于华为昇腾AI处理器开发的AI全栈开发平台,包括基于芯片的算子开发、以及自定义算子开发,同时还包括网络层的网络移植、优化和分析,另外在业务引擎层提供了一套可视化的AI引擎拖拽式编程服务,极大的降低了AI引擎的开发门槛,全平台通过Web的方式向开发者提供以下4项服务功能。针对安装与部署,MindStudio提供多种部署方式,支持多种主流操作系统,为开发者提供最大便利。针对算子开发,MindStudio提供包含UT测试、ST测试、TIK算子调试等的全套算子开发流程。支持TensorFlow、PyTorch、MindSpore等多种主流框架的TBE和AI CPU自定义算子开发。针对网络模型的开发,MindStudio支持TensorFlow、Pytorch、MindSpore框架的模型训练,支持多种主流框架的模型转换。集成了训练可视化、脚本转换、模型转换、精度比对等工具,提升了网络模型移植、分析和优化的效率。针对应用开发,MindStudio集成了Profiling性能调优、编译器、MindX SDK的应用开发、可视化pipeline业务流编排等工具,为开发者提供了图形化的集成开发环境,通过MindStudio能够进行工程管理、编译、调试、性能分析等全流程开发,能够很大程度提高开发效率。详细入门教程可以登录后通过附件下载 ↓↓↓
-
我在用点云的onnx模型向om模型转换的时候,转换报错:Input shape digit should be -1 or greater than 0。我看文档说onnx模型转换shape是NCHW,而我的onnx模型是(15000,5),因为是点云模型,不需要NCHW,请问这种情况该怎么处理?
-
详细情况如下:1、在SD卡模式下,RGMII网络能正常访问。2、在SD卡模式下,短接uart1,RGMII网络不通3、把硬件从SD卡模式切换到EMMC模式,并短接uart1 RGMII网络还是不通4、模组已升级(指定版本):https://support.huawei.com/enterprise/zh/software/252823273-ESW2000337766https://support.huawei.com/enterprise/zh/software/251857128-ESW2000262521
-
使用官方教程中的脚本,尝试MindSpore上云时,报错如图:
-
MindX SDK——Overlap-CRNN重叠文本识别设计案例1 案例概述本开发样例使用CRNN完成重叠文本的识别任务,供用户参考。 本系统基于昇腾Ascend310卡。本仓库是重叠文本任务的下游任务,即在完成对重叠文本还原后针对mask识别出文本。1.1 支持的产品本系统采用Atlas300-3010作为实验验证的硬件平台,并支持Atlas200RC以及Atlas500的硬件平台.具体产品实物图和硬件参数请参见《Atlas 300 AI加速卡 用户指南(型号 3010)》。由于采用的硬件平台为含有Atlas 300的Atlas 800 AI服务器 (型号3010),而服务器一般需要通过网络访问,因此需要通过笔记本或PC等客户端访问服务器,而且展示界面一般在客户端。1.2 支持的版本版本号查询方法,在Ascend产品环境下,运行命令:npu-smi info1.3 软件方案介绍软件方案主要为还原文本的识别系统,子系统功能具体描述请参考 表1.1 系统方案各子系统功能描述。重叠文本识别子系统可以实现识别还原后图像的mask的输入,然后通过等比例放缩等操作最后对图像进行识别,本方案选择使用crnn作为重叠文本识别模型。系统方案中各模块功能如表1.2 所示。表1.1 系统方案各子系统功能描述:序号子系统功能描述1重叠文本识别子系统重叠文本识别子系统将上一个子系统得到的结果,进行等比例放缩操作,放缩的大小与模型的输入大小有关,之后将结果送入到文字识别模型进行文字识别,并将识别结果进行输出。表1.2 系统方案中各模块功能:序号子系统功能描述1输入图像将图像(JPG格式)通过pillow库读入。2输入字典将字典(txt格式)通过本地代码输入到pipeline中。3图像解码通过PILLOW第三方库对图像解码。4图像放缩文字识别模型的输入为固定维度,所以需要放射变换的结果进行等比例放缩。5文字识别在图像放缩后,将缓存区数据送入文字识别模型。本方案选用crnn进行文本识别6结果可视化通过pillow库可视化单张图像的识别。1.4 代码目录结构与说明eg:本sample工程名称为Overlap-CRNN,工程目录如下图所示:├── crnn_single_infer.py #单张图片推理 ├── crnn_infer.py #精度测试 ├── README.md ├── ch_sim_en_digit_symble.txt #字典 ├── models #不同类型的模型文件 │ ├── air_model │ │ ├── crnn.air │ └── ckpt_model │ │ ├── crnn.ckpt │ └── om_model │ │ ├── crnn.om ├── dataset #测试数据集 │ ├── img │ ├── map_record.json │ └── annotation.json1.5 技术实现流程图实现流程图如下图所示:1.6 特性及适用场景本案例中的 CRNN模型适用于英文的灰度图像的识别,并可以返回测试图像的word-based的精度值。本模型在以下几种情况去噪效果良好:图像中文字清晰可见、排版工整、字符大小适中等。在以下几种情况去噪效果不太好:图像中文字模糊、排版随意、字符较小等。1.7 代码地址本项目的代码地址为:cid:link_32 环境依赖请列出环境依赖软件和版本。推荐系统为ubuntu 18.04或centos 7.6,环境依赖软件和版本如下表:软件名称版本mindspore1.8.1MindX SDK3.0RC2Ascend-CANN-toolkit5.1.RC2ubuntu18.04.1 LTSpython3.9.2cv24.5.5.64numpy1.23.1pillow9.1.0在编译运行项目前,需要设置环境变量:环境变量介绍. ${sdk_path}/set_env.sh . ${ascend_toolkit_path}/set_env.sh3 模型训练模型均在GPU下训练得到,如果需要使用本仓库提供的模型进行推理或模型转换,请务必参照GPU所需的参数设置,然后将模型按照提供的文件夹目录放至即可。相关模型的下载链接如下:[下载链接]cid:link_1)步骤1 从昇腾社区的modelzoo中下载官方CRNN模型代码,并按安装官方文档中的步骤完成训练:下载链接CRNN_for_MindSpore_1.2_code/default_config.yamlmodel_version: "V2" # V2可以在GPU和Ascend上训练 label_dict: "PATH/TO/ch_sim_en_digit_symble.txt" # 使用自己的字典的路径 max_text_length: 12 image_width: 112 class_num: 6703 blank: 6702 train_dataset_path: "" # 训练数据集路径 train_eval_dataset: "synth" # 名称使用synth train_eval_dataset_path: "" # 测试数据路径CRNN_for_MindSpore_1.2_code/src/dataset.py将第41行的:letters = [letter for letter in config1.label_dict]修改为:letters = [] with open(config1.label_dict, 'r') as f: for line in f: letter = line.strip('\n') letters.append(letter) f.close()将CaptchaDataset函数更换为:class CaptchaDataset: """ create train or evaluation dataset for crnn Args: img_root_dir(str): root path of images max_text_length(int): max number of digits in images. device_target(str): platform of training, support Ascend and GPU. """ def __init__(self, img_root_dir, is_training=True, config=config1): if not os.path.exists(img_root_dir): raise RuntimeError( "the input image dir {} is invalid!".format(img_root_dir)) self.img_root_dir = img_root_dir if is_training: self.imgslist = os.path.join(self.img_root_dir, 'annotation_train.txt') else: self.imgslist = os.path.join(self.img_root_dir, 'annotation_test.txt') self.img_names = {} self.img_list = [] with open(self.imgslist, 'r') as f: for line in f: img_name, img_label = line.strip('\n').split('\t') self.img_list.append(img_name) self.img_names[img_name] = str(img_label) f.close() self.max_text_length = config.max_text_length self.blank = config.blank self.class_num = config.class_num self.sample_num = len(self.img_list) self.batch_size = config.batch_size print("There are totally {} samples".format(self.sample_num)) def __len__(self): return self.sample_num def __getitem__(self, item): img_name = self.img_list[item] try: im = Image.open(os.path.join(self.img_root_dir, img_name)) except IOError: print("%s is a corrupted image" % img_name) return self[item + 1] im = im.convert("RGB") r, g, b = im.split() im = Image.merge("RGB", (b, g, r)) image = np.array(im) if not check_image_is_valid(image): print("%s is a corrupted image" % img_name) return self[item + 1] text = self.img_names[img_name] label_unexpanded = text_to_labels(text) label = np.full(self.max_text_length, self.blank) if self.max_text_length < len(label_unexpanded): label_len = self.max_text_length else: label_len = len(label_unexpanded) for j in range(label_len): label[j] = label_unexpanded[j] return image, labelCRNN_for_MindSpore_1.2_code/src/metric.py将第18行的字典label_dict = "abcdefghijklmnopqrstuvwxyz0123456789"修改为( dict_path 为自行准备的字典 ch_sim_en_digit_symble.txt ,可在本仓库下找到):label_dict = [] with open("[dict_path]", 'r') as f: for line in f: letter = line.strip('\n') label_dict.append(letter) f.close()步骤2 训练得到ckpt模型文件后,进入CRNN_for_MindSpore_1.2_code文件夹下执行命令(修改ckpt_file和air_file_name参数为自己的路径):python export.py --ckpt_file [ckpt_file] --file_name [air_file_name] --file_format AIR4 模型推理步骤1 将生成的AIR模型转移到推理服务器,放至在Overlap-CRNN/models/air_model路径下。cd ./Overlap-CRNN mkdir models cd models mkdir air_model步骤2 进入推理服务器执行命令(修改air_model_path和output_model_path参数为自己的路径):atc --model=[air_model_path] --framework=1 --output=[output_model_path] --soc_version=Ascend310 --output_type=FP32 --op_select_implmode=high_precision --input_shape="input:1,3,32,112"模型转换工具(ATC)相关介绍如下:ATC介绍相关模型的下载链接如下:模型下载步骤3 执行该命令会在当前目录下生成项目需要的模型文件[output_model].om。执行后终端输出为:ATC start working now, please wait for a moment. ATC run success, welcome to the next use.表示命令执行成功。步骤4 将任意一张jpg格式的图片存到当前目录下(./Overlap-CRNN),命名为test.jpg。步骤5 按照模型转换获取om模型,放置在Overlap-CRNN/models/om_model/路径下。若未自行转换模型,使用的是仓库提供的模型,则无需修改相关文件,否则修改crnn_single_infer.py中相关配置,将MODEL_PATH对象的路径改成实际的om模型的路径;IMAGE_PATH对象的路径改成实际的测试图片的路径;SAVE_PATH对象设置成需要保存可视化图像的路径。相关参数在Overlap-CRNN/crnn_single_infer.py下:MODEL_PATH = "./models/om_model/crnn.om" IMAGE_PATH = "./test.jpg" SAVE_PATH = "./show.jpg"步骤6 在命令行输入 如下命令运行整个工程:python crnn_single_infer.py步骤7 运行结束输出show.jpg5 测试精度步骤1 在Overlap-CRNN/dataset/路径下准备相同格式的数据集(已提供测试用的数据集,按照文件目录放至即可:下载链接)步骤2 在命令行输入 如下命令运行整个工程:python crnn_infer.py模型在测试集上的精度达标,最终模型的的acc为89.17%,满足精度要求(acc≥80%)。
-
使用的是mindspore1.7版本源代码为
-
bilibili视频链接:使用MindStudio开发基于MindX SDK的X射线图像缺陷检测应用9、本地编写python文件1、main.pymain.py主要进行一些推理前的操作和调用infer.py进行推理,以及调用postprocess.py进行推理结果后处理。步骤一:导入相关包,并定义相关函数步骤二:编写各个函数parser_args函数用于读入执行改文件时所需的一些参数def parser_args(): parser = argparse.ArgumentParser(description="FasterRcnn inference") parser.add_argument("--img_path", type=str, required=False, default="../data/test/crop/", help="image directory.") parser.add_argument( "--pipeline_path", type=str, required=False, default="../pipeline/fasterrcnn_ms_dvpp.pipeline", help="image file path. The default is 'config/maskrcnn_ms.pipeline'. ") parser.add_argument( "--model_type", type=str, required=False, default="dvpp", help= "rgb: high-precision, dvpp: high performance. The default is 'dvpp'.") parser.add_argument( "--infer_mode", type=str, required=False, default="infer", help= "infer:only infer, eval: accuracy evaluation. The default is 'infer'.") parser.add_argument( "--infer_result_dir", type=str, required=False, default="../data/test/infer_result", help= "cache dir of inference result. The default is '../data/test/infer_result'.") parser.add_argument("--ann_file", type=str, required=False, help="eval ann_file.") arg = parser.parse_args() return argget_img_metas函数用于记录图像缩放比例def get_img_metas(file_name): img = Image.open(file_name) img_size = img.size org_width, org_height = img_size resize_ratio = cfg.MODEL_WIDTH / org_width if resize_ratio > cfg.MODEL_HEIGHT / org_height: resize_ratio = cfg.MODEL_HEIGHT / org_height img_metas = np.array([img_size[1], img_size[0]] + [resize_ratio, resize_ratio]) return img_metasprocess_img函数用于对图像进行预处理def process_img(img_file): img = cv2.imread(img_file) model_img = mmcv.imrescale(img, (cfg.MODEL_WIDTH, cfg.MODEL_HEIGHT)) if model_img.shape[0] > cfg.MODEL_HEIGHT: model_img = mmcv.imrescale(model_img, (cfg.MODEL_HEIGHT, cfg.MODEL_HEIGHT)) pad_img = np.zeros( (cfg.MODEL_HEIGHT, cfg.MODEL_WIDTH, 3)).astype(model_img.dtype) pad_img[0:model_img.shape[0], 0:model_img.shape[1], :] = model_img pad_img.astype(np.float16) return pad_imgcrop_on_slide函数用于对图片进行滑窗裁剪,因为输入的图片尺寸大多都为4000*1000左右,不利于缺陷的识别和推理,对其进行滑窗裁剪后,得到的多张小图片更利于缺陷识别和推理def crop_on_slide(cut_path, crop_path, stride): if not os.path.exists(crop_path): os.mkdir(crop_path) else: remove_list = os.listdir(crop_path) for filename in remove_list: os.remove(os.path.join(crop_path, filename)) output_shape = 600 imgs = os.listdir(cut_path) for img in imgs: if img.split('.')[1] != "jpg" and img.split('.')[1] != "JPG": raise ValueError("The file {} is not jpg or JPG image!".format(img)) origin_image = cv2.imread(os.path.join(cut_path, img)) height = origin_image.shape[0] width = origin_image.shape[1] x = 0 newheight = output_shape newwidth = output_shape while x < width: y = 0 if x + newwidth <= width: while y < height: if y + newheight <= height: hmin = y hmax = y + newheight wmin = x wmax = x + newwidth else: hmin = height - newheight hmax = height wmin = x wmax = x + newwidth y = height # test crop_img = os.path.join(crop_path, ( img.split('.')[0] + '_' + str(wmax) + '_' + str(hmax) + '_' + str(output_shape) + '.jpg')) cv2.imwrite(crop_img, origin_image[hmin: hmax, wmin: wmax]) y = y + stride if y + output_shape == height: y = height else: while y < height: if y + newheight <= height: hmin = y hmax = y + newheight wmin = width - newwidth wmax = width else: hmin = height - newheight hmax = height wmin = width - newwidth wmax = width y = height # test crop_img = os.path.join(crop_path, ( img.split('.')[0] + '_' + str(wmax) + '_' + str(hmax) + '_' + str( output_shape) + '.jpg')) cv2.imwrite(crop_img, origin_image[hmin: hmax, wmin: wmax]) y = y + stride x = width x = x + stride if x + output_shape == width: x = widthimage_inference函数用于流的初始化,推理所需文件夹的创建、图片预处理、推理时间记录、推理后处理、推理结果可视化def image_inference(pipeline_path, s_name, img_dir, result_dir, rp_last, model_type): sdk_api = SdkApi(pipeline_path) if not sdk_api.init(): exit(-1) if not os.path.exists(result_dir): os.makedirs(result_dir) img_data_plugin_id = 0 img_metas_plugin_id = 1 logging.info("\nBegin to inference for {}.\n\n".format(img_dir)) file_list = os.listdir(img_dir) total_len = len(file_list) if total_len == 0: logging.info("ERROR\nThe input directory is EMPTY!\nPlease place the picture in '../data/test/cut'!") for img_id, file_name in enumerate(file_list): if not file_name.lower().endswith((".jpg", "jpeg")): continue file_path = os.path.join(img_dir, file_name) save_path = os.path.join(result_dir, f"{os.path.splitext(file_name)[0]}.json") if not rp_last and os.path.exists(save_path): logging.info("The infer result json({}) has existed, will be skip.".format(save_path)) continue try: if model_type == 'dvpp': with open(file_path, "rb") as fp: data = fp.read() sdk_api.send_data_input(s_name, img_data_plugin_id, data) else: img_np = process_img(file_path) sdk_api.send_img_input(s_name, img_data_plugin_id, "appsrc0", img_np.tobytes(), img_np.shape) # set image data img_metas = get_img_metas(file_path).astype(np.float32) sdk_api.send_tensor_input(s_name, img_metas_plugin_id, "appsrc1", img_metas.tobytes(), [1, 4], cfg.TENSOR_DTYPE_FLOAT32) start_time = time.time() result = sdk_api.get_result(s_name) end_time = time.time() - start_time if os.path.exists(save_path): os.remove(save_path) flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL modes = stat.S_IWUSR | stat.S_IRUSR with os.fdopen(os.open((save_path), flags, modes), 'w') as fp: fp.write(json.dumps(result)) logging.info( "End-2end inference, file_name: {}, {}/{}, elapsed_time: {}.\n".format(file_path, img_id + 1, total_len, end_time)) draw_label(save_path, file_path, result_dir) except Exception as ex: logging.exception("Unknown error, msg:{}.".format(ex)) post_process()步骤三:main方法编写if __name__ == "__main__": args = parser_args() REPLACE_LAST = True STREAM_NAME = cfg.STREAM_NAME.encode("utf-8") CUT_PATH = "../data/test/cut/" CROP_IMG_PATH = "../data/test/crop/" STRIDE = 450 crop_on_slide(CUT_PATH, CROP_IMG_PATH, STRIDE) image_inference(args.pipeline_path, STREAM_NAME, args.img_path, args.infer_result_dir, REPLACE_LAST, args.model_type) if args.infer_mode == "eval": logging.info("Infer end.\nBegin to eval...") get_eval_result(args.ann_file, args.infer_result_dir)2、infer.pyinfer.py中是主要的sdk推理步骤,包括流的初始化到流的销毁,编写完成后在main.py中调用。步骤一:导入相关包,并定义相关类和函数步骤二:编写各个函数init魔法属性用来构造sdk实例化对象def __init__(self, pipeline_cfg): self.pipeline_cfg = pipeline_cfg self._stream_api = None self._data_input = None self._device_id = Nonedel魔法属性用来销毁实例化对象def __del__(self): if not self._stream_api: return self._stream_api.DestroyAllStreams()_convert_infer_result函数用来将推理结果输出def _convert_infer_result(infer_result): data = infer_result.get('MxpiObject') if not data: logging.info("The result data is empty.") return infer_result for bbox in data: if 'imageMask' not in bbox: continue mask_info = json_format.ParseDict(bbox["imageMask"], MxpiDataType.MxpiImageMask()) mask_data = np.frombuffer(mask_info.dataStr, dtype=np.uint8) bbox['imageMask']['data'] = "".join([str(i) for i in mask_data]) bbox['imageMask'].pop("dataStr") return infer_resultinit函数用来stream manager的初始化def init(self): try: with open(self.pipeline_cfg, 'r') as fp: self._device_id = int( json.loads(fp.read())[self.STREAM_NAME]["stream_config"] ["deviceId"]) logging.info("The device id: {}.".format(self._device_id)) # create api self._stream_api = StreamManagerApi() # init stream mgr ret = self._stream_api.InitManager() if ret != 0: logging.info("Failed to init stream manager, ret={}.".format(ret)) return False # create streams with open(self.pipeline_cfg, 'rb') as fp: pipe_line = fp.read() ret = self._stream_api.CreateMultipleStreams(pipe_line) if ret != 0: logging.info("Failed to create stream, ret={}.".format(ret)) return False self._data_input = MxDataInput() except Exception as exe: logging.exception("Unknown error, msg:{}".format(exe)) return False return Truesend_data_input函数用来传输推理数据def send_data_input(self, stream_name, plugin_id, input_data): data_input = MxDataInput() data_input.data = input_data unique_id = self._stream_api.SendData(stream_name, plugin_id, data_input) if unique_id < 0: logging.error("Fail to send data to stream.") return False return Truesend_img_input函数用来传入图片def send_img_input(self, stream_name, plugin_id, element_name, input_data, img_size): vision_list = MxpiDataType.MxpiVisionList() vision_vec = vision_list.visionVec.add() vision_vec.visionInfo.format = 1 vision_vec.visionInfo.width = img_size[1] vision_vec.visionInfo.height = img_size[0] vision_vec.visionInfo.widthAligned = img_size[1] vision_vec.visionInfo.heightAligned = img_size[0] vision_vec.visionData.memType = 0 vision_vec.visionData.dataStr = input_data vision_vec.visionData.dataSize = len(input_data) buf_type = b"MxTools.MxpiVisionList" return self._send_protobuf(stream_name, plugin_id, element_name, buf_type, vision_list)send_tensor_input函数用来传入张量数据def send_tensor_input(self, stream_name, plugin_id, element_name, input_data, input_shape, data_type): tensor_list = MxpiDataType.MxpiTensorPackageList() tensor_pkg = tensor_list.tensorPackageVec.add() # init tensor vector tensor_vec = tensor_pkg.tensorVec.add() tensor_vec.deviceId = self._device_id tensor_vec.memType = 0 tensor_vec.tensorShape.extend(input_shape) tensor_vec.tensorDataType = data_type tensor_vec.dataStr = input_data tensor_vec.tensorDataSize = len(input_data) buf_type = b"MxTools.MxpiTensorPackageList" return self._send_protobuf(stream_name, plugin_id, element_name, buf_type, tensor_list)get_result函数用来获得推理结果def get_result(self, stream_name, out_plugin_id=0): infer_res = self._stream_api.GetResult(stream_name, out_plugin_id, self.INFER_TIMEOUT) if infer_res.errorCode != 0: logging.info("GetResultWithUniqueId error, errorCode={}, errMsg={}".format(infer_res.errorCode, infer_res.data.decode())) return None res_dict = json.loads(infer_res.data.decode()) return self._convert_infer_result(res_dict)_send_protobuf函数用来对目标检测结果进行序列化def _send_protobuf(self, stream_name, plugin_id, element_name, buf_type, pkg_list): protobuf = MxProtobufIn() protobuf.key = element_name.encode("utf-8") protobuf.type = buf_type protobuf.protobuf = pkg_list.SerializeToString() protobuf_vec = InProtobufVector() protobuf_vec.push_back(protobuf) err_code = self._stream_api.SendProtobuf(stream_name, plugin_id, protobuf_vec) if err_code != 0: logging.error( "Failed to send data to stream, stream_name:{}, plugin_id:{}, " "element_name:{}, buf_type:{}, err_code:{}.".format( stream_name, plugin_id, element_name, buf_type, err_code)) return False return True3、postprocess.py对经过滑窗裁剪后的小图片进行推理,最后得到的推理结果也是在小图片上,因此需要对推理结果进行后处理,将小图片上的推理结果还原到未经过滑窗裁剪的图片上。步骤一:导入相关包,并定义相关函数步骤二:编写各个函数json_to_txt函数用来将得到的json格式推理结果转为txt格式def json_to_txt(infer_result_path, savetxt_path): if os.path.exists(savetxt_path): shutil.rmtree(savetxt_path) os.mkdir(savetxt_path) files = os.listdir(infer_result_path) for file in files: if file.endswith(".json"): json_path = os.path.join(infer_result_path, file) with open(json_path, 'r') as fp: result = json.loads(fp.read()) if result: data = result.get("MxpiObject") txt_file = file.split(".")[0] + ".txt" flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL modes = stat.S_IWUSR | stat.S_IRUSR with os.fdopen(os.open(os.path.join(savetxt_path, txt_file), flags, modes), 'w') as f: if file.split('_')[0] == "W0003": temp = int(file.split("_")[2]) - 600 else: temp = int(file.split("_")[1]) - 600 for bbox in data: class_vec = bbox.get("classVec")[0] class_id = int(class_vec["classId"]) confidence = class_vec.get("confidence") xmin = bbox["x0"] ymin = bbox["y0"] xmax = bbox["x1"] ymax = bbox["y1"] if xmax - xmin >= 5 and ymax - ymin >= 5: f.write( str(xmin + temp) + ',' + str(ymin) + ',' + str(xmax + temp) + ',' + str( ymax) + ',' + str( round(confidence, 2)) + ',' + str(class_id) + '\n')hebing_txt函数用来将滑窗裁剪后的小图片推理结果还原到原始图片上def hebing_txt(txt_path, save_txt_path, remove_txt_path, cut_path): if not os.path.exists(save_txt_path): os.makedirs(save_txt_path) if not os.path.exists(remove_txt_path): os.makedirs(remove_txt_path) fileroot = os.listdir(save_txt_path) remove_list = os.listdir(remove_txt_path) for filename in remove_list: os.remove(os.path.join(remove_txt_path, filename)) for filename in fileroot: os.remove(os.path.join(save_txt_path, filename)) data = [] for file in os.listdir(cut_path): data.append(file.split(".")[0]) txt_list = os.listdir(txt_path) flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL modes = stat.S_IWUSR | stat.S_IRUSR for image in data: fw = os.fdopen(os.open(os.path.join(save_txt_path, image + '.txt'), flags, modes), 'w') for txtfile in txt_list: if image.split('_')[0] == "W0003": if image.split('_')[1] == txtfile.split('_')[1]: for line in open(os.path.join(txt_path, txtfile), "r"): fw.write(line) else: if image.split('_')[0] == txtfile.split('_')[0]: for line in open(os.path.join(txt_path, txtfile), "r"): fw.write(line) fw.close() fileroot = os.listdir(save_txt_path) for file in fileroot: oldname = os.path.join(save_txt_path, file) newname = os.path.join(remove_txt_path, file) shutil.copyfile(oldname, newname)py_cpu_nms、plot_bbox、nms_box函数用来对还原后的推理结果进行nms去重处理,在进行滑窗裁剪时,为了不在裁剪时将缺陷切断从而保留所有缺陷,所以设置的滑窗步长小于小图片尺寸,因此得到的推理结果会有重复,需进行nms去重处理def py_cpu_nms(dets, thresh): x1 = dets[:, 0] y1 = dets[:, 1] x2 = dets[:, 2] y2 = dets[:, 3] areas = (y2 - y1 + 1) * (x2 - x1 + 1) scores = dets[:, 4] keep = [] index = scores.argsort()[::-1] while index.size > 0: i = index[0] # every time the first is the biggst, and add it directly keep.append(i) x11 = np.maximum(x1[i], x1[index[1:]]) # calculate the points of overlap y11 = np.maximum(y1[i], y1[index[1:]]) x22 = np.minimum(x2[i], x2[index[1:]]) y22 = np.minimum(y2[i], y2[index[1:]]) w = np.maximum(0, x22 - x11 + 1) # the weights of overlap h = np.maximum(0, y22 - y11 + 1) # the height of overlap overlaps = w * h ious = overlaps / (areas[i] + areas[index[1:]] - overlaps) idx = np.where(ious <= thresh)[0] index = index[idx + 1] # because index start from 1 return keep def plot_bbox(dets, c='k'): x1 = dets[:, 0] y1 = dets[:, 1] x2 = dets[:, 2] y2 = dets[:, 3] plt.plot([x1, x2], [y1, y1], c) plt.plot([x1, x1], [y1, y2], c) plt.plot([x1, x2], [y2, y2], c) plt.plot([x2, x2], [y1, y2], c) plt.title(" nms") def nms_box(image_path, image_save_path, txt_path, thresh, obj_list): if not os.path.exists(image_save_path): os.makedirs(image_save_path) remove_list = os.listdir(image_save_path) for filename in remove_list: os.remove(os.path.join(image_save_path, filename)) txt_list = os.listdir(txt_path) for txtfile in tqdm.tqdm(txt_list): boxes = np.loadtxt(os.path.join(txt_path, txtfile), dtype=np.float32, delimiter=',') if boxes.size > 5: if os.path.exists(os.path.join(txt_path, txtfile)): os.remove(os.path.join(txt_path, txtfile)) flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL modes = stat.S_IWUSR | stat.S_IRUSR fw = os.fdopen(os.open(os.path.join(txt_path, txtfile), flags, modes), 'w') keep = py_cpu_nms(boxes, thresh=thresh) img = cv.imread(os.path.join(image_path, txtfile[:-3] + 'jpg'), 0) for label in boxes[keep]: fw.write(str(int(label[0])) + ',' + str(int(label[1])) + ',' + str(int(label[2])) + ',' + str( int(label[3])) + ',' + str(round((label[4]), 2)) + ',' + str(int(label[5])) + '\n') x_min = int(label[0]) y_min = int(label[1]) x_max = int(label[2]) y_max = int(label[3]) color = (0, 0, 255) if x_max - x_min >= 5 and y_max - y_min >= 5: cv.rectangle(img, (x_min, y_min), (x_max, y_max), color, 1) font = cv.FONT_HERSHEY_SIMPLEX cv.putText(img, (obj_list[int(label[5])] + str(round((label[4]), 2))), (x_min, y_min - 7), font, 0.4, (6, 230, 230), 1) cv.imwrite(os.path.join(image_save_path, txtfile[:-3] + 'jpg'), img) fw.close()post_process函数用来调用以上编写的函数,最后在main.py中被调用def post_process(): infer_result_path = "../data/test/infer_result" txt_save_path = "../data/test/img_txt" json_to_txt(infer_result_path, txt_save_path) txt_path = "../data/test/img_txt" all_txt_path = "../data/test/img_huizong_txt" nms_txt_path = "../data/test/img_huizong_txt_nms" cut_path = "../data/test/cut" hebing_txt(txt_path, all_txt_path, nms_txt_path, cut_path) cut_path = "../data/test/cut" image_save_path = "../data/test/draw_result" nms_txt_path = "../data/test/img_huizong_txt_nms" obj_lists = ['qikong', 'liewen'] nms_box(cut_path, image_save_path, nms_txt_path, thresh=0.1, obj_list=obj_lists)10、代码运行前面的步骤完成之后,我们就可以进行代码的运行了,本项目中,图片的输入输出位置都是用的相对路径,因此不需要修改路径参数,按以下步骤进行模型推理:步骤一:放置待检测图片本项目中,将图片放置在./python/data/test/cut目录下,例如我放的图片:步骤二:在main.py中设置好初始图片所在位置和结果图片保存位置。步骤三:设置运行脚本运行应用点击下图箭头所指,设置自己的运行脚本点击绿色箭头,开始运行运行成功,查看推理结果五、常见问题在使用 MindStudio 时,遇到问题,可以登陆华为云论坛云计算论坛开发者论坛技术论坛-华为云 (huaweicloud.com)进行互动,提出问题,会有专家老师为你解答。1、CANN 连接错误连接服务器 SSH 成功,但是连接 CANN 失败:点击OK,点击Show Error Details,查看报错信息:问题:权限不够,无法连接。解决方案:在远程环境自己的工作目录下重新下载CANN后,再连接CANN即可。2、后处理插件权限问题如图,运行时显示权限不够:两种解决方案:方案一:在远程终端中找到后处理插件所在位置,修改其权限为640,如图:修改完成后,需将改文件设置为不同步,如图:方案二:在远程终端环境中找到后处理插件所在位置,将其复制到MindX SDK自带的后处理插件库文件夹下,并修改其权限为640,然后修改pipeline文件中后处理插件所在位置。注:MindX SDK自带的后处理插件库文件夹一般为${MX_SDK_HOME}/lib/modelpostprocessors/
推荐直播
-
探秘仓颉编程语言:华为开发者空间的创新利器
2025/02/22 周六 15:00-16:30
华为云讲师团
本期直播将与您一起探秘颉编程语言上线华为开发者空间后,显著提升开发效率,在智能化开发支持、全场景跨平台适配能力、工具链与生态完备性、语言简洁与高性能特性等方面展现出的独特优势。直播看点: 1.java转仓颉的小工具 2.仓颉动画三方库lottie 3.开发者空间介绍及如何在空间用仓颉编程语言开发
回顾中 -
大模型Prompt工程深度实践
2025/02/24 周一 16:00-17:30
盖伦 华为云学堂技术讲师
如何让大模型精准理解开发需求并生成可靠输出?本期直播聚焦大模型Prompt工程核心技术:理解大模型推理基础原理,关键采样参数定义,提示词撰写关键策略及Prompt工程技巧分享。
去报名 -
华为云 x DeepSeek:AI驱动云上应用创新
2025/02/26 周三 16:00-18:00
华为云 AI专家大咖团
在 AI 技术飞速发展之际,DeepSeek 备受关注。它凭借哪些技术与理念脱颖而出?华为云与 DeepSeek 合作,将如何重塑产品与应用模式,助力企业数字化转型?在华为开发者空间,怎样高效部署 DeepSeek,搭建专属服务器?基于华为云平台,又该如何挖掘 DeepSeek 潜力,实现智能化升级?本期直播围绕DeepSeek在云上的应用案例,与DTSE布道师们一起探讨如何利用AI 驱动云上应用创新。
去报名
热门标签