• [经验分享] 使用MindStudio进行mbart模型训练
    一.下载并安装 MindStudio1. MindStudio 简介MindStudio 是一套基于 IntelliJ 框架的开发工具链平台,提供了算子开发、调试、调优以及第三方算子开发的功能,同时还提供了网络移植、优化和分析功能,可以为我们开发   昇腾相关项目提供极大的便利。MindStudio 的 安 装 过 程 可 以 参 考 官 方 指 导 手 册 , 链 接 为 : https://www.hiascend.com/document/detail/zh/mindstudio/50RC3/progressiveknowledge/index.html所 配 套 的 CANN 包 下 载 地 址 : cid:link_42. 打开工程并同步 CANN 包在打开工程前,应首先确保项目代码已下载到本地并解压。项目代码仓为: cid:link_3第一次启动 MindStudio 提示是否导入配置,如下图,选择不导入配置,点击 OK。可以安装所需要的插件,如图所示:点击界面中的 Help 可以跳转到 MindStudio 社区,如图所示:选择 Customize 选择,配置色彩主题为 IntelliJ Light,如下图。选择“All settings”,如下图所示进行同步 CANN 包。.配置ssh点击 change CANN 后弹出的远程连接中,点击“田”配置 SSH配置成功后如图所示:同理,可配置与其他服务器的 ssh 连接。选择CANN 包配置完 ssh 后,选择好 CANN 路径,如下图所示:安装完成后自动重启 MindStudio。选择刚下载并解压好的项目文件。打开后如图所示二.环境配置1. 部署点击 File->Project Structure,如下图。点击 SDKs->加号->Add Python SDK,如下图。点击 SSH Interpreter,配置 Python 环境信息,如下图。配置 Deployment。点击“+”,填写相应信息。选择“Mappings”,点击“+”,添加映射路径信息。点击 ok 后,自行选择 python 路径。点击“Project”,选择刚配置好的远端 SDK。如图所示。点击左侧“Modules”,在右侧选择“Dependencies”,在 Module SDK 下拉框中选择刚配置好的远端 SDK,点击“OK”,如图所示:此外,点击菜单栏中的“Tools”,选择“Deployment”,选择“Automatic Upload”,修改代码保存后可自动上传到远端服务器。转换原任务栏如图所示:点击菜单栏中的“Ascend”,选择“Convert To Ascend Project”:如图所示,在下拉框中做出如下选择,点击“ok”。第一个下拉框有“Ascend Operator”、“Ascend Training”和“Ascend APP”三个选项,我们是训练任务,故选择“Ascend Training”。当第一个下拉框确定为“Ascend Training”时,第二个下拉框可选框架为“Mindspore”、“Pytorch”和“Tensorflow”,这里我们选择“Pytorch”。转换后,界面如图所示:三.代码展示及所作修改1. mbart 模型介绍最近的工作证明了多语言预训练的潜力,创建一个模型可以用于不同语言的各种任务。以前的多语言预训练工作表明,机器翻译系统可以通过在咬文嚼字上进行微调来创建。在这项工作中,作者表明,多语言翻译模型可以通过多语言微调。而不是在一个方向上进行微调,   一个预训练的模型同时在许多方向上进行微调。与从头开始训练的多语言模型相比,从预训练的模型开始与从头开始训练的多语言模型相比,从预训练的模型开始,包含了大量未标记的单语言数据的好处,这对资源少的语言特别重要。这对于没有咬文嚼字的低资源语言尤其重要。bitext 是不可用的。作者证明预训练的模型可以被扩展以纳入更多的语言而不损失性能。作者将 mBART 的语言数量增加了一倍,支持 50 种语言的多语言机器翻译模型。最后。作者创建了 ML50 基准,涵盖低、中、高资源语言。以通过标准化训练和评估数据促进可重复的研究。在 ML50 上,作者证明了多语言微调比最强基线平均提高了比最强基准线平均提高 1 BLEU(多语言微调比最强基线(从零开始的多语言或双语微调)平均提高了 1 个 BLEU,而比从零开始的双语基线平均提高了 9.3 个 BLEU。而比从头开始的双语基线平均提高 9.3 BLEU。2. 数据集介绍SQuAD 是 Stanford Question Answering Dataset 的缩写。这是一个阅读理解数据集,由众包工作者在一组维基百科文章上提出的问题组成,其中每个问题的答案都是相应文章中的一段文   本,某些问题可能无法回答。SQuAD2.0 组合了 SQuAD1.1 中的 10 万个问题,并增加了超过 5 万个无法回答的问题, 这些问题由众包工作者以对抗(adversarially)的方式设计,看起来与可回答的问题相似。为了在 SQuAD2.0 数据集上表现出色。系统不仅必须在可能的情况下回答问题,还必须确定篇章数据何时不支持回答,并避免回答。EM(Exact Match ) 和 F1 值是用于 SQuAD 的主要指标。Exact Match 是一种常见的评价标准,它用来评价预测中匹配到正确答案(ground truth answers)的百分比。3. mbart 代码展示Mbart 和其他 bart 类模型不一样的是,mbart 并没有单一的“decoder_start_token_id”,将输入的序号进行转换,并将最后一个非 pad 标记,也就是 LID 标记的输入包裹。将位置序列映射到最大值的区间内编码器的参数包括隐层、注意力掩码、尖端注意力掩码以及输出的注意力,如下图所示:4. 训练脚本修改本模型的训练脚本是 run_qa.py,因在 tokenizer 进行 tokenize 的过程中,会将输入的序号映射为 0,而在 input_ids 中并没有 0,所以会导致报错。这里使用了 input_ids 中的最小值来替换 0,就不会出现报错,并且符合逻辑,因为 qa 任务中的错误答案的下标开始点就是最小值。经验证,该改动并不影响精度。四.命令行远程连接 GPU 服务器1. 命令行打开服务器在菜单栏中选择“Tools”->“Start SSH session...”请优先配置 GPU 服务器的 ssh 连接,然后选择配置好的 GPU 服务器的 SSH(normal728):打开后的终端如图所示:2. 配置环境进入到 transformer 代码仓安装所需依赖:transformers:其他依赖:执行训练命令,如图所示开始训练: 部分参数介绍:----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 权重文件输出路径开始训练后,查看日志:五.可视化远程连接 NPU 服务器编写执行脚本与 GPU 相比做出改动:增加了分布式训练。在 GPU 中默认使用 8 卡启动,而在 NPU 中默认使用单卡,故需要在命令中额外声明。执行训练选择“Edit Configurations”选择 Deployment,选择写好的脚本文件,点击 ok。配置完成后,点击此处三角运行。稍等片刻,同步完成后,开始运行,运行过程中会生成日志文件,可通过查看日志文件来查   看运行过程。六.结果对比GPU 结果:注:GPU eval 过程报 Out of memory 错,经排查,并非验证时 batch size 过大,而是有个别较大的测试用例,故 gpu 只展示 train 过程结果。性能:94.434FPS Loss:0.8663NPU 结果:性能:251.963 FPS Loss:0.86精度: 80.7822七.总结分享本例详细讲解了使用 MindStudio 进行 mbart 模型迁移的流程。结论如下:NPU 性能 251.963 FPS > GPU 性能 94.434FPS 性能达标。本例 GPU 无法复现精度,故无需对比精度,情况已做说明并通过审核。在使用 MindStudio 进行模型离线推理开发的过程中,还是比较容易上手的,大家可以按照官方用户手册进行操作,另外还在通过开发者社区学习一些技术干货和经典案例,以下   是相关链接。MindStudio 官 网 入 口 : cid:link_2MindStudio 用户手册入口:cid:link_0MindStudio 开发者社区入口:https://bbs.huaweicloud.com/forum/forum-945-1.html
  • [经验分享] 使用MindStudio进行longformer模型训练
    1 介绍1.1 MindStudio 简介MindStudio 提供在 AI 开发所需的一站式开发环境,支持模型开发、算子开发以及应用开发三个主流程中的开发任务。依靠模型可视化、算力测试、IDE 本地仿真调试等功能, MindStudio 能够帮助使用者在一个工具上就能高效便捷地完成 AI 应用开发。MindStudio 采用了插件化扩展机制,开发者可以通过开发插件来扩展已有功能。场景介绍纯 开 发 场 景 ( 分 部 署 形 态 ) : 在 非 昇 腾 AI 设 备 上 安 装 MindStudio 和Ascend-cann-toolkit 开发套件包。可作为开发环境仅能用于代码开发、编译等不依赖于昇腾设备的开发活动(例如 ATC 模型转换、算子和推理应用程序的纯代码开发)。如果想运行应用程序或进行模型训练等,需要通过 MindStudio 远程连接功能连接已部署好运行环境所需软件包的昇腾 AI 设备。开发运行场景(共部署形态):在昇腾 AI 设备上安装 MindStudio、Ascend-cann-toolkit 开发套件包、npu-firmware 安装包、npu-driver 安装包和 AI 框架(进行模型训练时需要安装)。作为开发环境,开发人员可以进行普通的工程管理、代码编写、编译、模型转换等功 能。同时可以作为运行环境,运行应用程序或进行模型训练。软件包介绍MindStudio:提供图形化开发界面,支持应用开发、调试和模型转换功能,同时还支持 网络移植、优化和分析等功能。Ascend-cann-toolkit:开发套件包。为开发者提供基于昇腾 AI 处理器的相关算法开发工具包,旨在帮助开发者进行快速、高效的模型、算子和应用的开发。开发套件包只能安装 在 Linux 服务器上,开发者可以在安装开发套件包后,使用 MindStudio 开发工具进行快速开发。1.2 模型迁移任务介绍GPU 精度对齐。在复现过程中,我们原则上需要保证模型结构与论文完全一致,loss,optim,前后处理等与论文基本一致。NPU 功能打通。主要包括 NPU 1p/8p 功能打通、保存数据。NPU 性能优化(非必须)。主要包括 NPU 性能问题定位、优化。1.3 Longformer 模型介绍基于 Transformer 的模型无法处理长序列,因为它们的自注意力操作,它的序列长度是之前的四倍。为了解决这一限制。作者引入了带有注意力的 Longformer,该模型与序列长度成线性,使得它可以很容易地处理数以千计的符号或更长的文件。Longformer 的注意力机制是对标准自我注意力的直接替代替换了标准的自我注意,并结合了局部窗口式注意力和 任务驱动的全局注意力。根据之前的工作,作者对长序列转换器进行了评估。Longformer 在字符级语言建模上取得了很好的结果,在 text8 和 enwik8 上效果也很好。作者还对Longformer 进行了预训练,并在各种下游工作中对其进行微调。作者预训练的 Longformer 在长文档任务上的表现一直优于 RoBERTa。并在 WikiHop 和 TriviaQA 上创造了新的最先进的结果。作者还提出了 Longformer-Encoder-Decoder (LED),一个支持长文档的 Longformer 变体。参 考 实 现 : https://github.com/allenai/longformer通过 Git 获取代码方法如下:git clone {repository_url} # 克隆仓库的代码cd {repository_name} # 切换到模型的代码仓目录git checkout {branch/tag} # 切换到对应分支git reset --hard {commit_id} # 代码设置到对应的 commit_id(可选)cd {code_path} # 切换到模型代码所在路径,若仓库下只有该模型,则无需切换1.4 数据集介绍SQuAD 是 Stanford Question Answering Dataset 的缩写。这是一个阅读理解数据集, 由众包工作者在一组维基百科文章上提出的问题组成,其中每个问题的答案都是相应文章中的一段文本,某些问题可能无法回答。SQuAD2.0 组合了 SQuAD1.1 中的 10 万个问题,并增加了超过 5 万个无法回答的问题, 这些问题由众包工作者以对抗(adversarially)的方式设计,看起来与可回答的问题相似。 为了在 SQuAD2.0 数据集上表现出色。系统不仅必须在可能的情况下回答问题,还必须确定篇章数据何时不支持回答,并避免回答。EM(Exact Match ) 和 F1 值是用于 SQuAD 的主要指标。Exact Match 是一种常见的评价标准,它用来评价预测中匹配到正确答案(ground truth answers)的百分比。2. 准备工作2.1 VPN 安装和配置遵循以下链接完成 VPN 的安装与配置:https://gitee.com/ascend/docs-openmind/blob/master/guide/common/tutorials/昇腾生态%E4¼—智实验室网络连接指导.md2.2 MindStudio 下载与安装Mindstudio 官网链接:cid:link_4如需在 Linux 安装昇腾套件包 ascend-cann-toolkit(以下简称 CANN),请在官网下载CANN。官网链接:cid:link_6用 户 手 册 :( 本 例 中 使 用 的 版 本 为 5.1.RC2) https://www.hiascend.com/document/detail/zh/canncommercial/51RC2/overview/index.html项目代码:cid:link_5 将项目代码下载到本地并解压。3. 相关环境配置3.1 配置 ssh点击 Customize,选择“All settings...”,点开“Tools”,选择“SSH Configurations”, 点击“+”,填写 ssh 连接所需要的远端服务器信息,点击“Test Connection”测试连接,出现如图所示弹窗即为正确连接,点击“OK”本例使用 192.168.88.72 作为 GPU 服务器,同样的操作进行配置其他服务器的 SSH:3.2 打开工程在“Projects”中选择“Open”,在弹出的文件选择框中选择上文提到的所下载的代码,点击“OK”,如图所示:选择“Trust Project”工程打开后如图所示:3.3 导入 CANN 包选择“File”->“Settings”依次如图所示进行选择,点击“Change CANN”按钮,如图所示:点击 Remote Connection 后的“田”,如图所示,跳转下文配置 SSH 界面。第一节已配置 ssh,这里我们选择 NPU (192.168.99.113)服务器的 SSH。上述步骤完成后,在 Remote CANN location 中选择远端服务器的 CANN 包,如图所示:点击“Finish”,出现进度条,等待片刻后即可完成安装。安装完成后,点击“OK”自动重启 MindStudio。3.4 Deployment 配置选择“File”->“Settings”点击加号,自定义名称:选择前文已配置好的 SSH 连接。点击“Mappings”,选择本地地址以及远端地址。同理,配置 GPU 服务器 71 的 Deployment。点击“OK”完成配置。3.5 配置远端 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”,如图所示:3.6 训练环境安装请参照以下链接,进行训练环境安装:https://www.hiascend.com/document/detail/zh/canncommercial/51RC1/envdeployment/instg/i nstg_000002.html注意,python 版本为 3.7.0 或以上的版本,所有训练服务器的 python 版本需要保持一致。pip 源可用,确保 pip3 install --user --upgrade pip 能执行成功。在各个训练服务器上的~/.bashrc 文件中配置如下环境变量: source {Driver 包安装路径}/driver/bin/setenv.bashsource {CANN 包安装路径}/ascend-toolkit/set_env.sh source {CANN 包安装路径}/tfplugin/set_env.shexport install_path={CANN 包安装路径}/ascend-toolkit/latestexport LD_LIBRARY_PATH=${install_path}/compiler/lib64/:$LD_LIBRARY_PATH export TBE_IMPL_PATH=${install_path}/opp/op_impl/built-in/ai_core/tbeexport JOB_ID=10087 #该项不建议改动export DEVICE_ID=0 #单卡训练使用的 device_id#以下 6 项为多卡训练时的配置,请根据实际环境和需求改动export RANK_ID=0 export RANK_SIZE=8export BATCH_TASK_INDEX=0export RANK_TABLE_FILE=多卡环境组网信息 json 文件所在路径 #从多卡环境组网信息 json文件中选择要使用的 device_idexport NPU_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 #从多卡环境组网信息 json 文件中选择要使用的device_idexport TF_CPP_MIN_LOG_LEVEL=3 #该项可控制 TF 框架本身日志级别的打印,0-DEBUG,1-INFO,2-WARNING,3-ERROR如果训练服务器中没有多卡环境组网信息 json 文件,请参见下方链接,在训练服务器上生成多卡环境组网信息 json 文件。当运行任务的用户为普通用户时,需要保证普通用户对该文件有可读权限。https://www.mindspore.cn/tutorial/training/zh-CN/r1.2/advanced_use/distributed_training_asc end.html4. 工程转换原任务栏如图所示:点击菜单栏中的“Ascend”,选择“Convert To Ascend Project”:如图所示,在下拉框中做出如下选择,点击“ok”。第一个下拉框有“Ascend Operator”、“Ascend Training”和“Ascend APP”三个选项,我们是训练任务,故选择“Ascend Training”。当第一个下拉框确定为“Ascend Training”时,第二个下拉框可选框架为“Mindspore”、“Pytorch”和“Tensorflow”,这里我们选择“Pytorch”。转换成功后,菜单栏变成如图所示:5 精度复现5.1 命令行打开服务器在菜单栏中选择“Tools”->“Start SSH session...”请优先配置 GPU 服务器的 ssh 连接,然后选择配置好的 GPU 服务器的 SSH(normal728):打开后的终端如图所示:5.2 配置环境进入到 transformer 代码仓安装所需依赖:transformers:其他依赖:5.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 权重文件输出路径训练完成后查看结果:精度为 92.126. 模型迁移6.1 所作修改在 NPU 中,需要配置更多的环境变量,所以我们将 source 环境变量以及运行的代码集中写到一个 shell 脚本中,即“run.sh”。77-84 为 source 环境变量,87-103 为使用 8 卡并使用 nohup 训练注意:在 NPU 中,需要对 run_qa.py 做出如下更改:6.2 可视化配置选择“Edit Configurations”选择 Deployment,选择写好的脚本文件,点击 ok。配置完成后 MindStudio 会与远端服务器进行代码同步,然后开始训练。训练完成后,通过日志查看结果: Loss 为 0.944,性能为 143.88精度为 92.027. 分享与求助如果在项目进展过程中,不论是分享还遇到问题寻求答案,都可以登陆MindStudio 昇腾论坛寻求帮助:https://gitee.com/link?target=https://bbs.huaweicloud.com/forum/forum-945-1.html
  • [经验分享] 使用MindStudio进行ibert模型训练
    1. 任务介绍1.1 模型介绍iBERT 模型是 RoBERTaibert-roberta-base 的仅整数量化版本,并在本文中进行了介绍。I-BERT 以 INT8 表示存储所有参数,并使用仅整数算术执行整个推理。特别是,I-BERT 将Transformer 架构(例如,MatMul、GELU、Softmax 和 LayerNorm)中的所有浮点运算替换为非常近似的整数运算。在 Nvidia T4 GPU 上进行测试时,与浮点对应物相比,这可以将推理速度提高 4 倍。然后可以将通过量化感知微调搜索的最佳模型参数导出(例如,到TensorRT),用于模型的仅整数部署。整个模型的结构还是依照了 BERT 的骨架,采用了 Transformer 以及 GELU 激活函数。1.2 数据集介绍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.3 任务流程介绍GPU 精度对齐。在复现过程中,我们原则上需要保证模型结构与论文完全一致,loss, optim,前后处理等与论文基本一致。NPU 功能打通。主要包括 NPU 1p/8p 功能打通、保存数据。NPU 性能优化(非必须)。主要包括 NPU 性能问题定位、优化。1.4 MindStudio 介绍MindStudio 是一套基于华为自研昇腾 AI 处理器开发的 AI 全栈开发工具平台,其功能涵盖面广,可以进行网络模型训练、移植、应用开发、推理运行及自定义算子开发等多种任务。   就使用而言,整体界面风格和 python 开发常用的 PyCharm 相似。熟悉 PyCharm 工具的开发者使用 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 将项目代码下载到本地并解压。2. 代码讲解2.1 ibert 代码讲解模 型 代 码 路 径 : src/transformers/models/ibert/modeling_ibert.py 主要类与函数介绍:与 BertEmbeddings 相同,只是对位置嵌入索引做了细微调整。BERT 的 Embedding 层总共由 3 个 embedding 层组合而成,分别是 token embedding,segment embedding,position embedding。token embedding 层是要将各个词转换成固定维度的向量。segment embeddings 用来区分一个句子对中的两个句子前一个向量是把 0 赋给第一个句子中的各个 token, 后一个向量是把 1 赋给第二个句子中的各个 token。position Embedding Transformers 无法编码输入的序列的顺序性, 加入 position embeddings 会让 BERT 理解下面下面这种情况, I think, therefore I am,第一个 “I” 和第二个 “I”应该有着不同的向量表示。处理权重初始化的抽象类和下载和加载预训练模型的简单接口。该模型既可以作为编码器(只有自我注意),也可以作为解码器,在这种情况下,在自我注意   层之间添加交叉注意层。Self attention 机制首先从每个 Encoder 的每个词输入向量的创建三个向量。具体来说,对每个词创建一个 Query 向量、一个 Key 向量和一个 Value 向量。这些向量是通过将嵌入向量乘以我们在训练过程中训练的三个矩阵来创建的。注意,这些新向量的维度比嵌入向量要   小。这是一种架构选择,可以使多头注意力的计算(大部分)保持不变。然后计算得分。假设正在计算此示例中第一个单词“Thinking”的 self-attention。需要根据这个词对输入句子的每个词进行评分。当在某个位置对单词进行编码时,分数决定了将多少   注意力放在输入句子的其他部分上。分数是通过 Query 向量与正在评分的各个单词的 Key 向量的点积来计算的。因此,如果正在处理位置#1 中单词“Thinking”的自注意力,第一个分数将是 q1 和 k1 的点积。第二个分数是 q1 和 k2 的点积。2.2 NPU 所需修改在 NPU 中,需要配置更多的环境变量,所以我们将 source 环境变量以及运行的代码集中写到一个 shell 脚本中,即“run.sh”。77-84 为 source 环境变量,87-103 为使用 8 卡并使用 nohup 训练注意:在 NPU 中,需要对 run_qa.py 做出如下更改:3. 环境搭建打开安装好的 MindStudio,选择下载好的代码路径,此处不再赘述,打开工程。3.1 ssh 配置选择“File”->“Settings”->“Tools”->“SSH configurations”,配置所需 SSH 连接。本例所需的 Npu 服务器 SSH 连接对应的服务器为 192.168.99.113,如下图所示。3.2 CANN 包同步选择“File”->“Settings”依次如图所示进行选择,点击“Change CANN”按钮,如图所示:点击 Remote Connection 后的“田”,如图所示,跳转下文配置 SSH 界面。第一节已配置 ssh,这里我们选择 NPU (192.168.99.113)服务器的 SSH。上述步骤完成后,在 Remote CANN location 中选择远端服务器的 CANN 包,如图所示:点击“Finish”,出现进度条,等待片刻后即可完成安装。安装完成后,点击“OK”自动重启 MindStudio。3.3 Deployment 配置选择“File”->“Settings”选择“Tools”,选择“Deployment”,点击加号,自定义名称:选择前文已配置好的 SSH 连接。点击“Mappings”,选择本地地址以及远端地址。点击“OK”完成配置。3.4 Python SDK 配置在菜单栏中选择“File”,点击“Project Structure”,如图所示:打开的 Project Structure 界面如图所示,在左侧选择 SDKs,点击箭头所指的“+”,选择“Add Python SDK”。点击“OK”完成配置。点击“Project”,选择刚配置好的远端 SDK。如图所示。点击左侧“Modules”,在右侧选择“Dependencies”,在 Module SDK 下拉框中选择刚配置好的远端 SDK,点击“OK”,如图所示:4. GPU 复现首 先 Transformer 安装其他依赖安装安装完成后,执行训练命令最后,结果展示如下可以看到训练模型 fps 为 270.927训练总时长 10min53s训练 epoch 为 2,训练样本数为 88568训练后模型精度 eval_f1 为 92.0521测试样本数为 107905. NPU 迁移选择“Edit Configurations”,进行如下图所示配置。点击 ok 完成配置,点击如图所示绿色三角开始训练。训练结束后,查看日志:6. 问题与总结Question1:8 卡性能不达标Answer:新定义函数 Npulinear 替换原有的 nn.linear 并且重写 Matmul_transpose 方法Question2: 模型训练精度极低Answer: 由于使用了 O2 level 导致结果溢出,将 O2 level 替换为 O1 level7. 分享与提升如果遇到其他上述步骤中未能出现的错误,欢迎大家到昇腾论坛(进入昇腾论坛_开发者论坛-华为云论坛 (huaweicloud.com),选择开发者选项,点击进入昇腾论坛或者昇腾)中提出自己的问题在这里有很多技术大拿可以解决你的问题。或者也可以访问昇腾博客,搜索   他人的独到见解。论坛链接:cid:link_1
  • [经验分享] 使用MindStudio进行funnel模型训练
    一、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 会出现如图所示界面:如图所示的 Projects,用于工程打开、创建:如图所示的 Customize 可以进行颜色主题,字体等选择:可以安装所需要的插件,如图所示:点击界面中的 Help 可以跳转到 MindStudio 社区,如图所示:点击 Projects 中的 Open,如图所示:选择箭头所指的“Trust”,如图所示:进入工程界面后,如图所示:配置 SSH 以及远程CANN 包选择“File”->“Settings”来配置 CANN 包,如图:依次如图所示进行选择,点击“Change CANN”按钮,如图所示:点击 Remote Connection 后的“田”,如图所示,跳转下文配置 SSH 界面。如图所示,点击“+”,增加 ssh 连接。如图所示,填写远端服务器的用户名,端口,密码等信息,点击“Test Connection”测试连接是否成功。出现如图所示“Successfully connected!”后表明连接成功,点击“OK”:注:成功连接的服务器会被保存,下文中会用到。在此处可继续添加其他服务器的 SSH 连接。上述步骤完成后,在 Remote CANN location 中选择远端服务器的 CANN 包,如图所示:点击“Finish”。转换工程MindStudio 支持将工程转换为 Ascend 工程,方便模型在 NPU 上训练。第一步,点击菜单栏中的“Ascend”->“Convert To Ascend Project”第二步,选择如图所示配置模型转换成功后,界面如图所示:工程重命名将工程重命名为对应的模型名:“funnel”。二.训练配置打开命令行选择菜单栏中的“Tools”,选择“Start SSH session”。选择所需要的服务器,如图所示:配置本地到远端服务器的路径映射选择菜单栏中的“Tools”,点击“Deployment”,点击“Configuration”,如图所示:点击“+”,新建“deployment”,命名为“113”,点击“Connection”,选择已配置好的192.168.99.113 服务器的 ssh。点击右侧中间的“Mappings”,在左侧“Local Path”中选择需要在远端服务器运行的本地项目,在右侧“Deployment Path”中,配置服务器中的路径。如图所示:配置远端 python 解释器在菜单栏中选择“File”,点击“Project Structure”,如图所示:打开的 Project Structure 界面如图所示,在左侧选择 SDKs,点击箭头所指的“+”,选择“Add Python SDK”。点击“SSH Interpreter”,在“Deploy”中选择前文配置好的 deployment(此处为先前配置好的命名为 gpu 的 deployment,同上文配置的 113),在“Interpreter”中选择远端服务器上的 python 文件夹,“Name”会自动获取。如图所示:配置好后,点击“OK”出现 python SDK,配置成功。如图所示:点击“Project”,选择刚配置好的远端 SDK。如图所示。点击左侧“Modules”,在右侧选择“Dependencies”,在 Module SDK 下拉框中选择刚配置好的远端 SDK,点击“OK”,如图所示:点击菜单栏中的“Tools”,选择“Deployment”,选择“Automatic Upload”,修改代码保存后可自动上传到远端服务器。三、模型介绍模型概况Funnel-Transformer 提出另一种简单但有效的提高 Transformer 处理长序列效率的方法: 随着模型加深,使用池化操作压缩在序列方向上的长度,让模型变窄,从而节约高层的参数量,直到最后得到单个向量(或几个,取决于任务)。于是,这单个向量就可以直接用于句子级别的任务,如文本分类。但是,这样的模型就不能用于 token 级别的任务了,比如问答等。为此,本文又在最后加上一个 Decoder,将最后得到的单个向量上采样,从而恢复到原来的序列长度。这样一来,将相当于压缩了整个模型的中间部分,而保持开始和结束层的长度不变,也就可以像原始 Transformer 一样用于各类任务了。Funnel-Transformer 模型整体架构如图所示。Funnel-Transformer 模型整体架构数据集SQuAD 是 Stanford Question Answering Dataset 的首字母缩写。这是一个阅读理解数据集, 由众包工作者在一组维基百科文章上提出的问题组成,其中每个问题的答案都是相应文章中 的一段文本,某些问题可能无法回答。下载地址 https://rajpurkar.github.io/SQuAD-explorer/本模型采用 huggingface 自带的数据集。代码介绍代码链接为:cid:link_3代码结构:需要关注的两个文件: 训练入口文件:run_qa.py 模 型 定 义 文 件 : Modeling_funnel.pyModeling_funnel.py 核心内容介绍:Funnel Transformer 模型,顶部有跨度分类头,用于提取问题回答任务,如 SQuAD (隐藏状态输出之上的线性层,用于计算跨度起始逻辑和跨度结束逻辑)。Funnel Transformer 模型在论文 Funnel-Transformer: Filtering out Sequential Redundancy for Efficient Language Processing 中提出。FunnelForQuestionAnswering 继承自 PreTrainedModel,也是 torch.nn.Module 的子类。可以将其作为常规的 PyTorch 模块使用,并参考 PyTorch 文档。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 的标记。inputs_embeds (torch.FloatTensor of shape (batch_size, sequence_length,hidden_size), optional)您可以选择直接传递嵌入式表示,而不是传递 input _ ids。如果您希望比模型的内部嵌入查找矩阵更好地控制如何将 input _ ids 索引转换为相关向量,那么这非常有用。output_attentions (bool, optional) 是否返回所有注意层的注意张量。output_hidden_states (bool, optional) 是否返回所有层的隐藏状态。return_dict (bool, optional)是否返回 ModelOutput 而不是纯元组start_positions (torch.LongTensor of shape (batch_size,), optional)标记范围开始的位置(索引)的标签,用于计算令牌分类丢失。位置被固定到序列的长度   (序列长度)。在计算损失时不考虑序列之外的位置。end_positions (torch.LongTensor of shape (batch_size,), optional)标记范围末尾的位置(索引)的标签,用于计算令牌分类丢失。位置被固定到序列的长度(序列   长度)。在计算损失时不考虑序列之外的位置。Forward 函数返回值:如果 return_dict=True,返回 QuestionAnsweringModelOutput,一组 torch.FloatTensor 包括取决于配置(FunnelConfig)和输入的各种元素。包含下列几项:loss提取从开始到结束位置的 Cross-Entropy 总和。start_logitsSpan-start 结果(在 SoftMax 之前)。end_logitsSpan-end 结果(在 SoftMax 之前)。hidden_states模型在各层输出加上初始嵌入输出时的隐状态。attentions注意力 softmax 之后的注意力权重,用于计算自我注意力头部的加权平均值。下面是使用 FunnelForQuestionAnswering 的一个例子:>>> from transformers import FunnelTokenizer, FunnelForQuestionAnswering>>> import torch>>> tokenizer = FunnelTokenizer.from_pretrained('funnel-transformer/small')>>> model = FunnelForQuestionAnswering.from_pretrained('funnel-transformer/small', return_dict=True)>>> question, text = "Who was Jim Henson?", "Jim Henson was a nice puppet">>> inputs = tokenizer(question, text, return_tensors='pt')>>> start_positions = torch.tensor([1])>>> end_positions = torch.tensor([3])>>> outputs = model(**inputs, start_positions=start_positions, end_positions=end_positions)>>> loss = outputs.loss>>> start_scores = outputs.start_logits>>> end_scores = outputs.end_logits四、GPU 训练启动命令行完成上述步骤后,我们已经实现了 MindStudio 的安装、训练工程的创建,以及远端服务器的连接,接下来我们打开命令行,启动方式已在上文介绍。配置环境与运行本次实验的代码使用 transformer 仓。注 : 本 例 的 远 端 服 务 器 使 用 conda 来 配 置 环 境 , 请 参 考https://zhuanlan.zhihu.com/p/489499097 配置 conda 环境。开启 conda:conda activate pt-1.8。如图所示:可以看到环境由 base 切换到 pt-1.8在 setup.py 所在路径安装 transformers:安装所需的其他依赖:如图所示:切换至 run_qa.py 所在的目录,执行训练命令:部分参数介绍:----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 权重文件输出路径训练结果如图,训练精度为 91.3094五、NPU 训练请按照上文所提到的配置步骤,配好与 npu 服务器的连接。torch1.8 的使用在 run_qa.py 脚本中增加 torch_npu 的引入,如图所示:运行脚本的更改编写运行脚本如上图所示,其中配置环境变量等步骤已包含其中,只需运行该脚本即可在npu 远端服务器上运行代码。点击左上角箭头所指下拉框,选择“Edit Configurations”进行配置,选择“Remote Run”进行远端运行。点击“田”配置选择配置好的 Deployment。在“Executable”一栏中选择要执行的脚本文件。配置完成后,点击三角进行运行:如图所示,代码正在同步到远端服务器。训练完成后,可查看生成的日志文件:NPU 训练精度为 85.44六、问题与解答Q:模型在 NPU 上运行缓慢。A:amp 在 O1 时, 部分算子输入为 FP32 , npu 上运行缓慢, 在启动命令中加入--half_precision_opertors 来指定这些算子使用 FP16 来计算后,性能提升比较大。Q:apex 选择 O2 后不断提示 Gradient overflow.。A:测试发现 apex 选择 O2 无法成功训练,本模型建议选择 O1。七、总结与分享本文介绍了 MindStudio 工具的下载安装,以及使用 MindStudio 工具完成与 GPU 服务器和 NPU 服务器的连接,并完成 xlm 模型的训练。开发过程中遇到的问题可以在昇腾论坛发帖提问,也可以查看其他案例的分享以熟悉流程。除了参考官方指导文档外,帮助更多的还   是开发者社区,如下图所示,推荐大家多看些经验分享,写的很详细也很有帮助。MindStudio 论坛:cid:link_1
  • [经验分享] 使用MindStudio进行Flaubert模型训练
    一、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”工程打开后如图所示: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. 模型介绍FlauBERT 的模型结构与 BERT 一致,由多层双向 Transformer 组成,BERT 模型整体架构如图所示。Bert 模型整体架构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)的百分比。下载地址 https://rajpurkar.github.io/SQuAD-explorer/ 本模型采用 huggingface 自带的数据集。三、相关配置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重点介绍模型定义部分:FlaubertForQuestionAnswering 继 承 自 XLMForQuestionAnswering , 两 者 只 有transformer 变量不同。FlaubertForQuestionAnswering 的 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 表示已屏蔽的令牌。langs用于指示输入中每个标记的语言的并行标记序列。token_type_ids (torch.LongTensor of shape (batch_size, sequence_length), optional)段标记索引表示输入的第一部分和第二部分。索引在[0,1]中选择: 0 对应一个句子 A 的标记,1 对应一个句子 B 的标记。position_ids每个输入序列标记的位置索引。lengths可用于避免注意填充标记索引的每个句子的长度。cache包含由模型计算的预计算的隐藏状态,可用于加速顺序解码。head_mask掩码以避免对填充标记索引进行关注。在[0,1]中选择的掩码值:   1 表示未屏蔽的令牌,0 表示已屏蔽的令牌。inputs_embeds (torch.FloatTensor of shape (batch_size, sequence_length, hidden_size), optional)您可以选择直接传递嵌入式表示,而不是传递 input _ ids。如果您希望比模型的内部嵌入查找矩阵更好地控制如何将 input _ ids 索引转换为相关向量,那么这非常有用。start_positions标记范围开始的位置(索引)的标签,用于计算令牌分类丢失。位置被固定到序列的长度   (序列长度)。在计算损失时不考虑序列之外的位置。end_positions标记范围末尾的位置(索引)的标签,用于计算令牌分类丢失。位置被固定到序列的长度   (序列长度)。在计算损失时不考虑序列之外的位置。is_impossible标记问题是否有答案(SQUAD2.0)cls_index分类标记位置(索引)的标签,用作计算答案合理性的输入。p_mask不能出现在答案中的标记的可选掩码(例如[ CLS ] ,[ PAD ] ,...)。1.0 意味着令牌应该被屏蔽。0.0 平均标记没有被掩盖。output_attentions (bool, optional) 是否返回所有注意层的注意张量。output_hidden_states (bool, optional)是否返回所有层的隐藏状态。return_dict (bool, optional)是否返回 ModelOutput 而不是纯元组Forward 函数返回值:如果 return_dict=True, 返回 QuestionAnsweringModelOutput,一组 torch.FloatTensor 包括取决于配置(FunnelConfig)和输入的各种元素。包含下列几项:loss提取从开始到结束位置的 Cross-Entropy 总和。start_top_log_probs记录 top config.start_n_top 开始 token 可能性的概率。start_top_index记录 top config.start_n_top 开始 token 可能性的索引。end_top_log_probs记录 config.start_n_top * config.end_n_top 结束 token 可能性的概率。end_top_index记录 config.start_n_top * config.end_n_top 结束 token 可能性的索引。cls_logits记录答案的 is_impossible 标签的概率。hidden_states模型在各层输出加上初始嵌入输出时的隐状态。attentions注意力 softmax 之后的注意力权重,用于计算自我注意力头部的加权平均值。下面是使用 FlaubertForQuestionAnswering 的一个例子:2. 编写 NPU 训练脚本在 NPU 中,需要配置更多的环境变量,所以我们将 source 环境变量以及运行的代码集中写到一个 shell 脚本中,即“run.sh”。77-84 为 source 环境变量,87-101 为使用 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. 训练结果在服务器上查看训练结果如下: 精度为 78.33六、使用可视化配置进行 NPU 训练编辑配置选择“Remote Run”,选择已配置好的“113”deployment,以及 run.sh 所在路径配置好后,点击运行,本地开始与远端服务器同步文件。查看训练日志:查看训练结果:精度为 77.62七、问题与解答Q:NPU 复现时偶尔会出现 torch.distributed.barrier()报错。A:是 load_and_cache_examples 函数首次保存 cache 时有几率出现这个错误,原因还没有定位到,重新启动运行脚本即可。Q:运行时报错A:检查 mapping 是否配置正确。八、分享开发过程中遇到的问题可以在昇腾论坛发帖提问,也可以查看其他案例的分享以熟悉流   程。除了参考官方指导文档外,帮助更多的还是开发者社区,如下图所示,推荐大家多看些   经验分享,写的很详细也很有帮助。MindStudio 论 坛 : cid:link_1
  • [经验分享] 使用MindStudio进行deberta模型训练
    1 介绍MindStudio 简介MindStudio 提供在 AI 开发所需的一站式开发环境,支持模型开发、算子开发以及应用开发三个主流程中的开发任务。依靠模型可视化、算力测试、IDE 本地仿真调试等功能, MindStudio 能够帮助使用者在一个工具上就能高效便捷地完成 AI 应用开发。MindStudio 采用了插件化扩展机制,开发者可以通过开发插件来扩展已有功能。1.1.1 场景介绍纯 开 发 场 景 ( 分 部 署 形 态 ) : 在 非 昇 腾 AI 设 备 上 安 装 MindStudio 和Ascend-cann-toolkit 开发套件包。可作为开发环境仅能用于代码开发、编译等不依赖于昇腾设备的开发活动(例如 ATC 模型转换、算子和推理应用程序的纯代码开发)。如果想运行应用程序或进行模型训练等,需要通过 MindStudio 远程连接功能连接已部署好运行环境所需软件包的昇腾 AI 设备。开发运行场景(共部署形态):在昇腾 AI 设备上安装 MindStudio、Ascend-cann-toolkit 开发套件包、npu-firmware 安装包、npu-driver 安装包和 AI 框架(进行模型训练时需要安装)。作为开发环境,开发人员可以进行普通的工程管理、代码编写、编译、模型转换等功   能。同时可以作为运行环境,运行应用程序或进行模型训练。1.1.2 软件包介绍MindStudio:提供图形化开发界面,支持应用开发、调试和模型转换功能,同时还支持  网络移植、优化和分析等功能。Ascend-cann-toolkit:开发套件包。为开发者提供基于昇腾 AI 处理器的相关算法开发工具包,旨在帮助开发者进行快速、高效的模型、算子和应用的开发。开发套件包只能安装   在 Linux 服务器上,开发者可以在安装开发套件包后,使用 MindStudio 开发工具进行快速开发。模型迁移任务介绍GPU 精度对齐。在复现过程中,我们原则上需要保证模型结构与论文完全一致,loss,optim,前后处理等与论文基本一致。NPU 功能打通。主要包括 NPU 1p/8p 功能打通、保存数据。NPU 性能优化(非必须)。主要包括 NPU 性能问题定位、优化。deberta 模型介绍DeBERTa (Decoding-enhanced BERT with disentangled attention),如名字所述,有两个技术来改善 BERT 和 RoBERTa,第一个是 disentangled attention(解开的注意力),每个单词使用两个向量分别编码文本和位置,在单词们之间的注意力权重是通过使用它们的文本和相对位置的解开矩阵分别进行计算的。第2 个技术是使用了一个加强的mask decoder,在decoding层引入绝对位置来预测 masked tokens。DeBERTa 目前(2021-02-08)在 GLUE 基准上第一名。大版本的 DeBERTa(15 亿参数) 在 SuperGLUE 基准的平均分数上第一次超越人类。不过这并不意味着模型达到了人类知识水平,人类拥有更好的合成综合能力,利用学到的知识处理新的问题RNN 处理文本是按顺序的,而 transformer 采用 self-attention 可以并行处理输入文本的每个单词。所以对于大规模的模型训练,transformer 更好。Disentangled attention:比如 deep 和 learning 这两个词,当它们相连出现在一起的时候,其之间的依赖性会更强,而当它们出现在不同句子里,其之间依赖性就不强。所以相对位置的   注意力很有用。Enhanced mask decoder:Disentangled attention 考虑的是相对位置,所以我们还需考虑绝对位置。DeBERTa 两个技术:Disentangled attention(注意力分散机制)在 BERT 中,输入层中的每个 token 都是用一个向量表示的,这个向量是 token 嵌入和句子嵌入以及位置嵌入的简单求和,而在 DeBERTa 中,每个 token 都是用两个向量表示的,分别对内容和位置进行编码,根据 token 的内容和相对位置,利用分散矩阵计算 token 之间的注意权值。这意味着 token-pair 的注意权重不仅取决于它们的内容,还取决于它们的相对位置。例如,当“deep”和“learning”两个词相邻出现时,它们之间的依赖性要比它们在不同的句子中出现时强得多。(其实和 roberta 比更好理解点,因为 deberta 里面也没有 nsp)Enhanced mask decoder (增强型 mask decoder)和 BERT 一样,DeBERTa 也是使用 MLM 进行预训练的。MLM 是一个填空任务,其中一个模型被教导使用一个掩码 mask 周围的单词,然后预测被 mask 掉的token 应该是什么。DeBERTa 使用上下文词的内容和位置信息进行 MLM。注意力解耦机制已经考虑了语境词的内容和相对位置,但没有考虑这些词的绝对位置,而这些位置在很多情况下对预测至关重要。通过 Git 获取代码方法如下:git clone {repository_url} # 克隆仓库的代码cd {repository_name} # 切换到模型的代码仓目录git checkout {branch/tag} # 切换到对应分支git reset --hard {commit_id} # 代码设置到对应的 commit_id(可选)cd {code_path} # 切换到模型代码所在路径,若仓库下只有该模型,则无需切换数据集介绍SQuAD 是 Stanford Question Answering Dataset 的缩写。这是一个阅读理解数据集, 由众包工作者在一组维基百科文章上提出的问题组成,其中每个问题的答案都是相应文章中的一段文本,某些问题可能无法回答。SQuAD2.0 组合了 SQuAD1.1 中的 10 万个问题,并增加了超过 5 万个无法回答的问题, 这些问题由众包工作者以对抗(adversarially)的方式设计,看起来与可回答的问题相似。  为了在 SQuAD2.0 数据集上表现出色。系统不仅必须在可能的情况下回答问题,还必须确定篇章数据何时不支持回答,并避免回答。EM(Exact Match ) 和 F1 值是用于 SQuAD 的主要指标。Exact Match 是一种常见的评价标准,它用来评价预测中匹配到正确答案(ground truth answers)的百分比。2. 准备工作VPN 安装和配置遵循以下链接完成 VPN 的安装与配置:https://gitee.com/ascend/docs-openmind/blob/master/guide/common/tutorials/昇腾生态%E4¼—智实验室网络连接指导.mdMindStudio 下载与安装Mindstudio 官网链接:cid:link_4如需在 Linux 安装昇腾套件包 ascend-cann-toolkit(以下简称 CANN),请在官网下载CANN。官网链接:cid:link_6用 户 手 册 :( 本 例 中 使 用 的 版 本 为 5.1.RC2) https://www.hiascend.com/document/detail/zh/canncommercial/51RC2/overview/index.html项目代码:cid:link_5 将项目代码下载到本地并解压。3. 相关环境配置配置 ssh点击 Customize,选择“All settings...”,点开“Tools”,选择“SSH Configurations”, 点击“+”,填写 ssh 连接所需要的远端服务器信息,点击“Test Connection”测试连接,出现如图所示弹窗即为正确连接,点击“OK”本例使用 192.168.88.72 作为 GPU 服务器,同样的操作进行配置其他服务器的 SSH:打开工程在“Projects”中选择“Open”,在弹出的文件选择框中选择上文提到的所下载的代码,点击“OK”,如图所示:选择“Trust Project”工程打开后如图所示:导入 CANN 包选择“File”->“Settings”依次如图所示进行选择,点击“Change CANN”按钮,如图所示:点击 Remote Connection 后的“田”,如图所示,跳转下文配置 SSH 界面。第一节已配置 ssh,这里我们选择 NPU (192.168.99.113)服务器的 SSH。上述步骤完成后,在 Remote CANN location 中选择远端服务器的 CANN 包,如图所示:点击“Finish”,出现进度条,等待片刻后即可完成安装。安装完成后,点击“OK”自动重启 MindStudio。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”,如图所示:训练环境安装请参照以下链接,进行训练环境安装:https://www.hiascend.com/document/detail/zh/canncommercial/51RC1/envdeployment/instg/i nstg_000002.html注意,python 版本为 3.7.0 或以上的版本,所有训练服务器的 python 版本需要保持一致。pip 源可用,确保 pip3 install --user --upgrade pip 能执行成功。在各个训练服务器上的~/.bashrc 文件中配置如下环境变量: source {Driver 包安装路径}/driver/bin/setenv.bashsource {CANN 包安装路径}/ascend-toolkit/set_env.sh source {CANN 包安装路径}/tfplugin/set_env.shexport install_path={CANN 包安装路径}/ascend-toolkit/latestexport LD_LIBRARY_PATH=${install_path}/compiler/lib64/:$LD_LIBRARY_PATH export TBE_IMPL_PATH=${install_path}/opp/op_impl/built-in/ai_core/tbeexport JOB_ID=10087 #该项不建议改动export DEVICE_ID=0 #单卡训练使用的 device_id#以下 6 项为多卡训练时的配置,请根据实际环境和需求改动export RANK_ID=0 export RANK_SIZE=8export BATCH_TASK_INDEX=0export RANK_TABLE_FILE=多卡环境组网信息 json 文件所在路径 #从多卡环境组网信息 json文件中选择要使用的 device_idexport NPU_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 #从多卡环境组网信息 json 文件中选择要使用的device_idexport TF_CPP_MIN_LOG_LEVEL=3 #该项可控制 TF 框架本身日志级别的打印,0-DEBUG,1-INFO,2-WARNING,3-ERROR如果训练服务器中没有多卡环境组网信息 json 文件,请参见下方链接,在训练服务器上生成多卡环境组网信息 json 文件。当运行任务的用户为普通用户时,需要保证普通用户对该文件有可读权限。https://www.mindspore.cn/tutorial/training/zh-CN/r1.2/advanced_use/distributed_training_asc end.html4. 工程转换原任务栏如图所示:点击菜单栏中的“Ascend”,选择“Convert To Ascend Project”:如图所示,在下拉框中做出如下选择,点击“ok”。第一个下拉框有“Ascend Operator”、“Ascend Training”和“Ascend APP”三个选项,我们是训练任务,故选择“Ascend Training”。当第一个下拉框确定为“Ascend Training”时,第二个下拉框可选框架为“Mindspore”、“Pytorch”和“Tensorflow”,这里我们选择“Pytorch”。转换成功后,菜单栏变成如图所示:5 精度复现命令行打开服务器在菜单栏中选择“Tools”->“Start SSH session...”请优先配置 GPU 服务器的 ssh 连接,然后选择配置好的 GPU 服务器的 SSH(normal728):打开后的终端如图所示:配置环境进入到 transformer 代码仓安装所需依赖:transformers:其他依赖:开始训练执行训练命令,python run_qa.py --model_name_or_path microsoft/deberta-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--output_dir ./deberta/部分参数介绍:----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 权重文件输出路径开始训练后,查看日志:6. 模型迁移所作修改在 NPU 中,需要配置更多的环境变量,所以我们将 source 环境变量以及运行的代码集中写到一个 shell 脚本中,即“run.sh”。注意:在 NPU 中,需要对 run_qa.py 做出如下更改:可视化配置选择“Edit Configurations”选择 Deployment,选择写好的脚本文件,点击 ok。配置完成后 MindStudio 会与远端服务器进行代码同步,然后开始训练。训练完成后,通过日志查看结果:精度为 93.0294 达标7. 分享与求助如果在项目进展过程中,不论是分享还遇到问题寻求答案,都可以登陆MindStudio 昇腾论坛寻求帮助:https://gitee.com/link?target=https://bbs.huaweicloud.com/forum/forum-945-1.html
  • [经验分享] 使用MindStudio进行convbert模型训练
    一、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”本例使用 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. 模型介绍ConvBERT 是从模型结构本身的冗余出发,提出的一种基于跨度的动态卷积操作的 BERT 模型。这一模型在节省了训练时间和参数的情况下,在衡量模型语言理解能力的 GLUE benchmark 上相较于之前的 State-of-the-art 方法,如 BERT 和 ELECTRA,都取得了显著的性能提升。其中 ConvBERT-base 模型利用比 ELECTRA-base 1/4 的训练时间达到了 0.7 个点的平均 GLUE score 的提升。之前 BERT 这类模型主要通过引入自注意力机制来达到高性能,但是依图团队观察到BERT 模型中的 attention map 有着如下图的分布(注:attention map 可以理解成词与词之间的关系),这表明了大多注意力主要集中在对角线,即主要学习到的是局部的注意力。这 就意味着其中存在着冗余,也就是说很多 attention map 中远距离关系值是没有必要计算的。于是依图团队考虑用局部操作,如卷积来代替一部分自注意力机制,从而在减少冗余的 同时达到减少计算量和参数量的效果。另一方面,考虑到传统的卷积采用固定的卷积核,不利于处理语言这种关系复杂的数据, 所以依图提出了一种新的基于跨度的卷积,如下图所示。原始的自注意力机制是通过计算每一对词与词之间的关系得到一个全局的 attention map。此前有文章提出过动态卷积,但其卷积的卷积核并不固定,由当前位置的词语所代表的 特征通过一个小网络生成卷积核。这样的问题就是在不同语境下,同样的词只能产生同样的 卷积核。但是同样的词在不同语境中可以有截然不同的意思,所以这会大大限制网络的表达 能力。基于这一观察,依图提出了基于跨度的动态卷积,通过接收当前词和前后的一些词作为 输入,来产生卷积核进行动态卷积,这在减少了自注意力机制冗余的同时,也很好地考虑到 了语境和对应卷积核的多样性。2. 数据集介绍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”,配置本地到远端服务器的映射。点击“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. 模型代码介绍将由 tf 训练好的模型的权重加载到 pytorch 模型上的类。该类实现在 convBert 中独有的跨步卷积操作,之后将在 conBertSelfAttention 中与自注意力机制进行结合使用。这是一种新颖的卷积,它通过接收输入跨度而不是仅单个 token, 来产生更多的自适应卷积内核,从而能够区分在不同上下文中,针对相同 token 生成的内核。ConvBert 中的自注意力机制的实现,与其它以 bert 为基础的模型的实现相同。ConvBert 中的主要创新部分。将卷积与 self-attention 整合,形成两种操作结合的混合注意力机制。 self-attention 会使用所有输入 token,生成注意力权重以捕获全局依赖性,而为了获取当前 token 的局部范围,生成要捕获局部范围的“注意力权重”。 为了实现这一目标, 不是使用所有输入 token 共享的固定参数的标准卷积,而是使用动态卷积,捕获不同 token 的局部依赖性。动态卷积使用内核生成器,为不同的输入 token 生成不同的内核。但是,这种动态卷积无法区分不同上下文中的相同 token,所以生成了相同的内核。因此,使用上述的基于跨度的动态卷积。通过基于跨度的动态卷积,建立了混合注意力,以改善常规的self-attention,从而提高了预训练的效率以及捕获全局和局部信息的能力。2. NPU 启动脚本编写在 run_qa.py 同级目录下,编写 run.sh 脚本如下,上半部分为环境变量配置,下半部分为启动命令。新建 test 文件夹,并将环境变量放到“env_npu.sh”中。输出会重定向到 train_0.log 此外,在 NPU 服务器使用 1.8 版本的 torch 需要在 run_qa.py 做出如下修改:五、GPU 训练首先使用 conda list 命令查看是否环境中存在 transformer 库如果有的话使用 pip uninstall transformers 进行卸载在 transformer 路径下使用命令 pip install -e ./进行安装安装完成后进行模型训练进入 transformer/examples/pytorch/question-answering 路径启动代码如下:python -m torch.distributed.launch --nproc_per_node 8 run_qa.py --model_name_or_path dbmdz/convbert-base-turkish-mc4-cased --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 O1 --output_dir /home/name/output/其中 name 为自定文件夹名称参数说明如下:结果总结如下表六、NPU 训练按上文所述编写启动脚本后,运行启动脚本,具体步骤如下: 选择“Edit Configurations”选择“Remote Run”,Deployment 一栏中选择配置好的NPU SSH 即配置好的与 192.168.99.113服务器的连接,在 Executable 中选择运行脚本,即上文编写好的训练脚本,点击“OK”。点击三角形运行代码,部分运行日志如图所示:运行结果如图所示: 性能为 231.84FPS精度为 70.74七、分享开发过程中遇到的问题可以在昇腾论坛发帖提问,也可以查看其他案例的分享以熟悉流 程。除了参考官方指导文档外,帮助更多的还是开发者社区,如下图所示,推荐大家多看些 经验分享,写的很详细也很有帮助。MindStudio 论坛:cid:link_1
  • [经验分享] 使用MindStudio进行canine模型训练
    一、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进行camembert模型训练
    一、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进行big_bird模型训练
    一、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进行bart模型训练
    一、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进行albert模型训练
    一、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完成SPNASNet_100开发
    使用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%。
  • [经验分享] 用MindStudio完成基于CTC算法的语音热词唤醒
    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训练营】今晚19:00看新硬件首秀、国赛获奖项目,抽新硬件兑换券!!!
    ​扫码进下方任一微信群,并报名CANN训练营可参与抽奖​参与开发板领取规则①参与抽奖者需进群并报名CANN训练营,仅参与未报名无效②中奖后请及时联系小助手,公布后10个工作日内未提供具体信息视为无效报名链接:cid:link_1 直播链接: https://2b87aad812c94b3392d218f35fa6ca3f.shixizhi.huawei.com/live/viewer.htm?actId=7da1rk37&liveId=1579653306145419265&tenant_id=1493401497873534978