使用MindStudio进行albert模型训练

目录

一、MindStudio 环境搭建 2

  1. MindStudio 下载 2
  2. 软件安装 4
  3. 打开工程 7

二. 训练配置 15

  1. 打开命令行 15
  2. 配置本地到远端服务器的映射 15

三、 相关介绍 21

  1. 模型概况 21
  2. 数据集 22
  3. 代码介绍 22

四、 GPU 训练 25

五、 NPU 训练 26

  1. 打开终端 27
  2. 配置环境变量 28
  3. torch1.8 的使用 28
  4. 运行脚本的更改 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

需将代码仓下载到本地。

  1. 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 软件下载须知

  1. 软件安装

下载完成后,在弹出的安装界面中点击“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 安装完成

  1. 打开工程

安装完成后,第一次打开 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

二.训练配置

  1. 打开命令行

选择菜单栏中的“Tools”,选择“Start SSH session”。

图 2-1 创建命令行

选择所需要的服务器,如图 2-2 所示:

图 2-2 选择服务器

  1. 配置本地到远端服务器的映射

选择菜单栏中的“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

三、相关介绍

  1. 模型概况

ALBERT 架构的主干和 BERT 类似,都使用了基于 GELU 的非线性激活函数的 Transformer。但是其分别在两个地方减少了参数量。

以下图为例可以看到模型的参数主要集中在两块,一块是 Token embedding projection block, 另一块是 Attention feed-forward block,前者占有 20% 的参数量,后者占有 80% 的参数量。

  1. 数据集

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. 代码介绍

模型代码路径:

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 内部的共享方式分为三种

对于不同的内部共享,在初始化 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 服务器的连接。

  1. 打开终端

如图 5-1 所示,点击“Start SSH session...”:

图 5-1

选择已经成功连接的 192.168.99.113 服务器:

图 5-2

打开成功后,如图 5-3 所示:

图 5-3

依赖的安装同第四章 GPU 部分内容。本章介绍 NPU 服务器需要额外做的操作,如环境变量的配置,torch1.8 版本的使用,运行脚本的更改等。

  1. 配置环境变量

激活 conda 后,在任意路径执行 source /usr/local/Ascend/ascend-toolkit/set_env.sh

如图 5-4 所示:

图 5-4

  1. torch1.8 的使用

在 run_qa.py 脚本中增加 torch_npu 的引入,如图 5-5 所示:

图 5-5

  1. 运行脚本的更改

在 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

展开阅读全文

页面更新:2024-04-20

标签:模型   精度   脚本   路径   界面   参数   版本   代码   服务器   数据

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top