目录 一、MindStudio 环境搭建 2MindStudio 下载 2软件安装 4打开工程 7 二. 训练配置 15打开命令行 15配置本地到远端服务器的映射 15 三、 相关介绍 21模型概况 21数据集 22代码介绍 22 四、 GPU 训练 25 五、 NPU 训练 26打开终端 27配置环境变量 28torch1.8 的使用 28运行脚本的更改 28 六、 总结与分享 30一、MindStudio 环境搭建 Mindstudio 官网链接:https://www.hiascend.com/zh/software/mindstudio 本次实验使用 MindStudio 开发工具,按照此教程配置环境,安装 MindStudio。MindStudio 是一套基于华为自研昇腾 AI 处理器开发的 AI 全栈开发工具平台,该 IDE 上功能很多,涵盖面广,可以进行包括网络模型训练、移植、应用开发、推理运行及自定义算子开发等多种任 务。MindStudio 除了具有工程管理、编译、调试、运行等功能外,还能进行性能分析,算子比对,可以有效提高工作人员的开发效率。除此之外,MindStudio 还具有远端环境,运行任务可在远端实现,对于近端的个人设备要求不高,用户交互体验很好,可以让我们随时随地 进行使用。 如需在Linux 安装昇腾套件包ascend-cann-toolkit(以下简称 CANN),请在官网下载 CANN。官网链接:https://www.hiascend.com/software/cann 用户手册:(本例中使用的版本为 5.1.RC2) https://www.hiascend.com/document/detail/zh/canncommercial/51RC2/overview/index.ht ml 代码链接为:https://gitee.com/yaohaozhe/transformer 需将代码仓下载到本地。MindStudio 下载 打开官网链接,在跳转的如图 1-1 中点击"立即下载"。 图 1-1 官网下载界面 在如图 1-2 的跳转页面中,选择配套的 MindStudio 版本,本例使用的 CANN 包版本为 5.1.RC2, 故下载 MindStudio_5.0.RC2_win.exe。 图 1-2 版本选择 点击"软件包下载"后,跳出软件下载须知,阅读 MindStudio 软件许可协议,同意则勾选, 然后点击"立即下载"。如图 1-3 所示: 图 1-3 软件下载须知软件安装 下载完成后,在弹出的安装界面中点击"Next"。如图 1-4 所示: 图 1-4 在接下来的界面中配置安装路径,点击"Browse..."选择安装的目的路径。完成后点击"Next>"。如图 1-5 所示: 图 1-5 在 Create Desktop Shortcut 中勾选 MindStudio,以在桌面创建 MindStudio 快捷方式。在 Update Context Menu 中勾选 Add "Open Folder as Project"以方便创建工程。 接下来点击"Next >"。如图 1-6 所示: 图 1-6 接下来点击"install",如图 1-7 所示: 图 1-7 等待进度条结束后,点击"Next >"。如图 1-8 所示: 图 1-8 勾选 Run MindStudio 可以立即打开 MindStudio。点击"Finish"完成安装。如图 1-9 所示: 图 1-9 安装完成打开工程 安装完成后,第一次打开 MindStudio 会出现如图 1-10 所示界面: 图 1-10 如图 1-11 所示的 Projects,用于工程打开、创建: 图 1-11 Projects 界面 如图 1-12 所示的 Customize 可以进行颜色主题,字体等选择: 图 1-12 Customize 界面可以安装所需要的插件,如图 1-13 所示: 图 1-13 Plugins 界面 点击界面中的 Help 可以跳转到 MindStudio 社区,如图 1-14 所示: 图 1-14 Learn MindStudio 界面点击 Projects 中的 Open,如图 1-15 所示: 图 1-15 选择刚下载好的代码仓文件,如图 1-16 所示: 图 1-16 选择箭头所指的"Trust",如图 1-17 所示: 图 1-17 打开后,如图 1-18 所示: 图 1-18 选择"File"->"Settings"来配置 CANN 包,如图 1-19: 图 1-19 依次如图所示进行选择,点击"Change CANN"按钮,如图 1-20 所示: 图 1-20 点击 Remote Connection 后的"田",如图 1-21 所示,跳转到图 1-22 所示配置 SSH 界面。 图 1-21 如图 1-22 所示,点击"+",增加 ssh 连接。 图 1-22 如图 1-23 所示,填写远端服务器的用户名,端口,密码等信息,点击"Test Connection"测试连接是否成功。 图 1-23 出现如图 1-24 所示"Successfully connected!"后表明连接成功,点击"OK": 注:成功连接的服务器会被保存,下文中会用到。在此处可继续添加 GPU 服务器的 SSH 连接。 图 1-24 上述步骤完成后,在 Remote CANN location 中选择远端服务器的 CANN 包,如图 1-25 所示: 图 1-25 点击"Finish",等待片刻后即可完成安装。随后点击菜单栏中"Ascend"->"Convert to Ascend project"。 图 1-26 如图 1-27 所示,在下拉框中做出如下选择,点击"ok"。 图 1-27 转换成功后,菜单栏变成如图 1-28 所示: 图 1-28二.训练配置打开命令行 选择菜单栏中的"Tools",选择"Start SSH session"。 图 2-1 创建命令行 选择所需要的服务器,如图 2-2 所示: 图 2-2 选择服务器配置本地到远端服务器的映射 选择菜单栏中的"Tools",点击"Deployment",点击"Configuration",如图 2-3 所示: 图 2-3 点击"+",新建"deployment",命名为"gpu",点击"Connection",选择配置好的 gpu 服务器的 ssh。点击右侧中间的"Mappings",在左侧"Local Path"中选择需要在远端服务器运行的本地项目,在右侧"Deployment Path"中,配置服务器中的路径。如图 2-5 所示: 图 2-4 图 2-5 同理可配置 NPU(192.168.99.113)服务器的 Deployment。 在菜单栏中选择"File",点击"Project Structure",如图 2-6 所示: 图 2-6 打开的 Project Structure 界面如图 2-7 所示,在左侧选择 SDKs,点击箭头所指的"+",选择 "Add Python SDK"。 图 2-7 点击"SSH Interpreter",在"Deploy"中选择前文配置好的 gpu 服务器,在"Interpreter"中选择远端服务器上的 python 文件夹,"Name"会自动获取。如图 2-8 所示: 图 2-8 配置好后,点击"OK"出现 python SDK,配置成功。如图 2-9 所示: 图 2-9 点击"Project",选择刚配置好的远端 SDK。如图 2-10 所示。 图 2-10 点击左侧"Modules",在右侧选择"Dependencies",在 Module SDK 下拉框中选择刚配置好的远端 SDK,点击"OK",如图 2-11 所示: 图 2-11 点击菜单栏中的"Tools",选择"Deployment",选择"Automatic Upload",修改代码保存后可自动上传到远端服务器。如图 2-12 所示: 图 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 完整代码: AlbertGroup 内部的层级由 inner_group_num 参数确定,默认为 1。其内部处理的逻辑也很简单,即 forward 多层的 AlbertLayer,这个 AlbertLayer 就代表着一个 block。 由此可见,假设一个 block 的参数量为 m。则实际的 encoder 的参数量 K 为: K = m * inner_group_num * num_hidden_groups inner_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 所示。 图 4-1 安装完成之后方可进行模型训练,进入到 transformer/examples/pytorch/question- answering 路径下后输入如下启动代码后即可开始训练。 python -m torch.distributed.launch --nproc_per_node 8 run_qa.py --model _name_or_path albert-base-v2 --dataset_name squad --do_train --do_eval --per_device_train_batch_size 12 --learning_rate 3e-5 --num_train_epoch s 2 --max_seq_length 384 --doc_stride 128 --fp16 --fp16_opt_level O1 -- output_dir /home/name/output/ 下面将启动代码的参数进行说明 作用 参数名 model_name_or_path 加载的模型权重 dataset_name 使用的数据集名称 do_train 是否执行训练,默认为 true do_eval 是否执行评估,默认为 true per_device_train_batch_size 训练批次大小 fp16 是否使用混合精度,默认为 false learning_rate 初始学习率 pad_to_max_length 是否把所有的输入 pad 到最大长度 num_train_epochs 训练轮数 doc_stride 将一个长文档拆分为块时,块之间要步数 loss_scale 混合精度的 scale fp16_opt_level 混合精度的模式 local_rank 指定多卡训练的 id,默认值为-1(单卡训练) dataloader_drop_last 是否覆盖之前下载的数据集,默认为 True optim 优化器选择 output_dir 重保存路径 训练完成后得到如下结果,如图 4-2 所示。 图 4-2五、NPU 训练 根据前文介绍的服务器连接,建立与 NPU 服务器的连接。打开终端 如图 5-1 所示,点击"Start SSH session...": 图 5-1 选择已经成功连接的 192.168.99.113 服务器: 图 5-2 打开成功后,如图 5-3 所示: 图 5-3 依赖的安装同第四章 GPU 部分内容。本章介绍 NPU 服务器需要额外做的操作,如环境变量的配置,torch1.8 版本的使用,运行脚本的更改等。配置环境变量 激活 conda 后,在任意路径执行 source /usr/local/Ascend/ascend-toolkit/set_env.sh 如图 5-4 所示: 图 5-4torch1.8 的使用 在 run_qa.py 脚本中增加 torch_npu 的引入,如图 5-5 所示: 图 5-5运行脚本的更改 在 NPU 中使用 run_qa.py 脚本默认是单卡运算,如需多卡,需使用 ddp 进行指定,如图 5-6 所示: 图 5-6 点击配置可视化运行设置"Edit Configurations...",运行如图 5-7 所示: 图 5-7 配置好图中所圈画出来的地方,点击"OK" 图 5-8 运行后结果可在 train_0.log 中查看: 图 5-9六、总结与分享 本文介绍了 MindStudio 工具的下载安装,以及使用 MindStudio 工具完成与 GPU 服务器和 NPU 服务器的连接,并完成 albert 模型的训练。 训练过程中遇到的问题及解决方案: Question1:Loss 震荡不收敛Answer:调小 learning-rate Question2:模型训练精度 NPU 单 P 达标,8P 不达标: Answer: 混合精度使用 O1,将 O2 注释. 开发过程中遇到的问题可以在昇腾论坛发帖提问,也可以查看其他案例的分享以熟悉流 程。除了参考官方指导文档外,帮助更多的还是开发者社区,如下图所示,推荐大家多看些 经验分享,写的很详细也很有帮助。 MindStudio 论坛:https://bbs.huaweicloud.com/forum/forum-945-1.html?filterCondition=1