《自然语言处理》-文本生成实验(基于MindSpore),避免的坑,保姆式教学

2023-11-02

最近我的导师去了解一下华为的MindSpore框架,觉得很有意思然后就让我跑一下他的文本生成实验,不过其中有很多是他的实验手册没怎么写清楚的点。我在这里为各位一个一个排坑拉~

#本实验都是来源于华为的文本生成实验手册,只是里面很多内容写的不清楚我这边给实验者排除会遇到的坑

  

这里很多人去找的话会直接找到OBS Brower但是注意,其实是OBS Brower+,是一个软件来的,需要下载并安装到自己的电脑上,当时我觉得安装麻烦不装了,结果走了很多弯路。 正确的是 如下图所示:而且最好是点击教你登录,然后先在OBS中创建一个桶,然后再在那个桶中拿AccessKey,当时这里也搞了我很长时间

登录之后就可以创建obs桶了!

进入之后创建一个obs桶,用于存放实验所需的文件。然后在这个桶路径下,我们创建一个 “textgeneration”的目录用于本实验数据的存放:

创建完如下所示:

            • 步骤1.然后就是下载自然语言处理包

下载链接:https://ascend-professional-construction-dataset.obs.cn-north-4.myhuaweicloud.com/NLP/NLP.zip

并在《自然语言处理》中的“实验指导书”-“文本生成 ”模块下,获取data和src文件。

            • 步骤2.再上传实验源码及数据

进入刚创建的“textgeneration”文件夹,上传源码及数据至该目录下。直接将需要上传的文件和文件夹拖到该目录下即可。

然后就是  进入Modelarts,选择Notebook

在华为云主页搜索Modelarts并点击“进入控制台”,或者通过以下网址进入:

https://console.huaweicloud.com/modelarts/?region=cn-north-4#/dashboard

点击左侧导航栏的“开发环境”,选择“Notebook”。

            • 步骤3 创建Notebook

点击创建按钮来创建一个新的Notebook,选择如下配置:

名称:建议使用textgeneration。

工作环境:选择tensorflow1.15-mindspore1.5.1-cann5.0.3-euler2.8-aarch64

规格:Ascend: 1*Ascend910|CPU:24核96GB

存储配置:默认存储

然后就立刻创建提交(有一个小时的先用时间的,大伙记住了,不用的时候一定要暂停使用,这里我可是花了20块钱大洋的)

            • 步骤4 进入Notebook实验环境

当Notebook状态变为“运行中”时,点击右侧“打开”按钮打开Notebook。选择右侧“MindSpore-python3.7-aarch64”按钮,进入Notebook实验环境。

然后就是正式开始实验了

##########################################################################

            • 步骤1 同步数据和源码至本地容器

进行实验前,我们要将obs上的文件下载至容器本地环境中此处需将obs桶名称换成自己创建的obs桶名称

输入:

import moxing as mox

mox.file.copy_parallel(src_url="s3://替换你自己的obs路径/textgeneration/data/", dst_url='./data/')

mox.file.copy_parallel(src_url="s3://替换你自己的obs路径/textgeneration/src/", dst_url='./src/')

举个例子:比如我的是

import moxing as mox
mox.file.copy_parallel(src_url="obs://huaweitesttong/testgeneration/data/", dst_url='./data/') 
mox.file.copy_parallel(src_url="obs://huaweitesttong/testgeneration/src/", dst_url='./src/')

步骤2.然后就是导入依赖库(这里还有个坑:你的python必须是3.9.0或者是3.7.5的,而且还得去安装mindspore模块)

import os

import re

import time

import numpy as np

import mindspore.dataset as de

import mindspore.common.dtype as mstype

import mindspore.dataset.transforms.c_transforms as C

from mindspore import context

from mindspore import log as logger

from mindspore.train.model import Model

from mindspore.common.tensor import Tensor

from mindspore.train.serialization import export

from mindspore.common.parameter import Parameter

from mindspore.nn.optim import AdamWeightDecay, Lamb, Momentum

from mindspore.nn.wrap.loss_scale import DynamicLossScaleUpdateCell

from mindspore.train.callback import CheckpointConfig, ModelCheckpoint

from mindspore.train.serialization import load_checkpoint, load_param_into_net

from easydict import EasyDict as edict

from src.bert_model import BertConfig

from src.poetry_dataset import create_tokenizer, padding

from src.utils import BertPoetry, BertPoetryCell, BertLearningRate, BertPoetryModel, LossCallBack

context.set_context(mode=context.GRAPH_MODE, device_target="Ascend", device_id=0)

#定义配置参数

bs = 16

cfg = edict({

    'dict_path': './data/vocab.txt',

    'disallowed_words': ['(', ')', '(', ')', '__', '《', '》', '【', '】', '[', ']'],

    'max_len': 64,

 'min_word_frequency': 8,

    'dataset_path': './data/poetry.txt',

    'batch_size': bs,

    'epoch_num': 2,

    'ckpt_prefix': 'poetry',

    'ckpt_dir': './data/checkpoint/',

    'pre_training_ckpt': './data/pretrain_ckpt/bert_base.ckpt',

    'optimizer': 'AdamWeightDecayDynamicLR',

    'AdamWeightDecay': edict({

        'learning_rate': 3e-5,

        'end_learning_rate': 1e-10,

        'power': 1.0,

        'weight_decay': 1e-5,

        'eps': 1e-6,

    }),

    'Lamb': edict({

        'start_learning_rate': 2e-5,

        'end_learning_rate': 1e-7,

        'power': 1.0,

        'weight_decay': 0.01,

        'decay_filter': lambda x: False,

    }),

    'Momentum': edict({

        'learning_rate': 2e-5,

        'momentum': 0.9,

    }),

})

bert_net_cfg = BertConfig(

    batch_size=bs,

    seq_length=128,

    vocab_size=3191,

    hidden_size=768,

    num_hidden_layers=12,

    num_attention_heads=12,

    intermediate_size=3072,

    hidden_act="gelu",

    hidden_dropout_prob=0.1,

    attention_probs_dropout_prob=0.1,

    max_position_embeddings=512,

    type_vocab_size=2,

    initializer_range=0.02,

    use_relative_positions=False,

    input_mask_from_dataset=True,

    token_type_ids_from_dataset=True,

    dtype=mstype.float32,

    compute_type=mstype.float16,

)

#加载数据

class PoetryDataGenerator(object):

    def __init__(self, batch_size, poetry, tokenizer, length=128):

        self.data = poetry

        self.batch_size = batch_size

        self.tokenizer = tokenizer

        self.length = length

    def __getitem__(self, index):

        np.random.shuffle(self.data)

        current_data = self.data[index]

        token_ids, segment_ids = self.tokenizer.encode(current_data)

        batch_token_ids = padding(token_ids, length=self.length)

        batch_segment_ids = padding(segment_ids, length=self.length)

        pad_mask = (batch_token_ids != 0).astype(np.float32)

        return (batch_token_ids, batch_segment_ids, pad_mask)

    def __len__(self):

        return len(self.data)

def create_poetry_dataset(batch_size, poetry, tokenizer):

    dt = PoetryDataGenerator(batch_size, poetry, tokenizer)

    ds = de.GeneratorDataset(dt, ["input_ids", "token_type_id", "pad_mask"])

    #ds.set_dataset_size(dt.__len__())

    int_type_cast_op = C.TypeCast(mstype.int32)

    float_type_cast_op = C.TypeCast(mstype.float32)

    ds = ds.map(input_columns="input_ids", operations=int_type_cast_op)

    ds = ds.map(input_columns="token_type_id", operations=int_type_cast_op)

    ds = ds.map(input_columns="pad_mask", operations=float_type_cast_op)

    ds = ds.batch(batch_size, drop_remainder=True)

return ds

#输入

poetry, tokenizer, keep_words = create_tokenizer(cfg)

num_tokens = len(keep_words)

dataset = create_poetry_dataset(bert_net_cfg.batch_size, poetry, tokenizer)

next(dataset.create_dict_iterator())

#模型训练

def train():

    '''

    build and train bert model for poetry generation

    '''

    poetrymodel = BertPoetryModel(bert_net_cfg, True, num_tokens, dropout_prob=0.1)

    netwithloss = BertPoetry(poetrymodel, bert_net_cfg, True, dropout_prob=0.1)

    

    callback = LossCallBack(poetrymodel)

    # optimizer

    steps_per_epoch = dataset.get_dataset_size()

    print("============ steps_per_epoch is {}".format(steps_per_epoch))

    lr_schedule = BertLearningRate(learning_rate=cfg.AdamWeightDecay.learning_rate,

                                       end_learning_rate=cfg.AdamWeightDecay.end_learning_rate,

                                       warmup_steps=1000,

                                       decay_steps=cfg.epoch_num*steps_per_epoch,

                                       power=cfg.AdamWeightDecay.power)

    optimizer = AdamWeightDecay(netwithloss.trainable_params(), lr_schedule)

    # load checkpoint into network

    ckpt_config = CheckpointConfig(save_checkpoint_steps=steps_per_epoch, keep_checkpoint_max=1)

    ckpoint_cb = ModelCheckpoint(prefix=cfg.ckpt_prefix, directory=cfg.ckpt_dir, config=ckpt_config)

    param_dict = load_checkpoint(cfg.pre_training_ckpt)

    new_dict = {}

    # load corresponding rows of embedding_lookup

    for key in param_dict:

        if "bert_embedding_lookup" not in key:

            new_dict[key] = param_dict[key]

        else:

            value = param_dict[key]

            np_value = value.data.asnumpy()

            np_value = np_value[keep_words]

            tensor_value = Tensor(np_value, mstype.float32)

            parameter_value = Parameter(tensor_value, name=key)

            new_dict[key] = parameter_value

    load_param_into_net(netwithloss, new_dict)

    update_cell = DynamicLossScaleUpdateCell(loss_scale_value=2**32, scale_factor=2, scale_window=1000)

    netwithgrads = BertPoetryCell(netwithloss, optimizer=optimizer, scale_update_cell=update_cell)

    model = Model(netwithgrads)

    

model.train(cfg.epoch_num, dataset, callbacks=[callback, ckpoint_cb], dataset_sink_mode=True)

#启动训练

train()

#测试评估

def generate_head_poetry(model, head=""):

    token_ids, segment_ids = tokenizer.encode('')

    token_ids = token_ids[:-1]

    segment_ids = segment_ids[:-1]

    punctuations = [',', '。']

    punctuation_ids = [tokenizer._token_to_id[token] for token in punctuations]

    poetry = []

    length = 128

    for ch in head:

        poetry.append(ch)

        token_id = tokenizer._token_to_id[ch]

        token_ids.append(token_id)

        segment_ids.append(0)

        while True:

            index = len(token_ids)

            _target_ids = padding(np.array(token_ids), length=length)

            _segment_ids = padding(np.array(segment_ids), length=length)

            pad_mask = (_target_ids != 0).astype(np.float32)

            

            _target_ids = Tensor([_target_ids], mstype.int32)

            _segment_ids = Tensor([_segment_ids], mstype.int32)

            pad_mask = Tensor([pad_mask], mstype.float32)

            _probas = model(_target_ids, _segment_ids, pad_mask).asnumpy()

            

            _probas = _probas[0, index-1, 3:]

            p_args = _probas.argsort()[::-1][:100]

            p = _probas[p_args]

            p = p / sum(p)

            target_index = np.random.choice(len(p), p=p)

            target = p_args[target_index] + 3

            token_ids.append(target)

            segment_ids.append(0)

            if target > 3:

                poetry.append(tokenizer._id_to_token[target])

            if target in punctuation_ids:

                break

    return ''.join(poetry)

!ls data/checkpoint

#加载恢复离线模型

bert_net_cfg.batch_size = 1

poetrymodel = BertPoetryModel(bert_net_cfg, False, 3191, dropout_prob=0.0)

poetrymodel.set_train(False)

ckpt_path = './data/checkpoint/poetry-2_1535.ckpt'

param_dict = load_checkpoint(ckpt_path)

load_param_into_net(poetrymodel, param_dict)

#输入

generate_head_poetry(poetrymodel, "人工智能")

generate_head_poetry(poetrymodel, "自然语言处理")

#本实验都是来源于华为的文本生成实验手册,只是里面很多内容写的不清楚我这边给实验者排除会遇到的坑

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《自然语言处理》-文本生成实验(基于MindSpore),避免的坑,保姆式教学 的相关文章

  • python 中 matlibplot 中散点图的缩放轴

    我正在使用 matlibplot 进行数据可视化 我的绘图共有 6502 个数据值 运行良好 但值接近且密集 例如 我的 y 轴值范围在 3 到 10 之间 我需要清楚地获取它们之间的每个点 即像 9 2 和 9 8 这样的值至少要以 1
  • 是否有与 Java 的 IdentityHashMap 等效的 Python 版本?

    我正在遍历一个数据结构 想要构建一个映射 X gt Y 的字典 其中 X 是我正在遍历的数据结构中的一个字段 Y 是我正在动态构建的数据结构中的一个字段 X 是不可散列的类型 Java的IdentityHashMap的目的是模拟动态字段 由
  • 如何配置 VS Code 以便能够单步执行调试 Python 脚本时加载的共享库 (.so)?

    从命令行使用 gdb 我可以在加载共享库时中断 知道我有共享库的源代码 如何在 VS Code 中获得相同的行为 对我来说 它以某种方式起作用 这是我的设置 Ubuntu 18 04 调试我从 Python3 加载的 C 共享库 更具体地说
  • PyTorch 如何计算二阶雅可比行列式?

    我有一个正在计算向量的神经网络u 我想计算关于输入的一阶和二阶雅可比矩阵x 单个元素 有人知道如何在 PyTorch 中做到这一点吗 下面是我项目中的代码片段 import torch import torch nn as nn class
  • 从第二个 DF 中查找一个 DF 中属于同等大小的矩形(由两个点给出)的点的快速(矢量化)方法

    我的数据框 A 如下所示 type latw lngs late lngn 0 1000 45 457966 9 174864 45 458030 9 174907 1 1000 45 457966 9 174864 45 458030 9
  • IP保持不变

    我正在尝试通过代码连接到 Tor 并更改我的身份 到目前为止我得到的结果是我连接成功但无法更改我的身份 这是我的代码 import socket import socks import httplib def connectTor sock
  • 为什么del是Python中的指令而不是方法? [复制]

    这个问题在这里已经有答案了 为什么Python的创建者更喜欢这种语法 指令 del list index 超过这个 方法 list del index 在我看来 这del属于同一 类别 append remove find ETC 因此应该
  • 我怎样才能用Python中的语音识别来检测一个单词

    我知道如何用 Python 检测语音 但这个问题更具体 如何让 Python 只监听一个单词 然后如果 Python 可以识别该单词则返回 True 我知道 我可以让 Python 一直监听 然后做出类似的东西 伪代码 while True
  • 将 *.appspot.com 重定向到自定义域:Google 应用引擎 (Django)

    我直接将我的一些示例代码放在这里以获得更好的了解 url py r robots txt myapp views robots r myapp views home views py def home request my code ret
  • Django:在管理界面中显示多对多项目的列表

    这可能是一个简单的问题 但我似乎无法理解 我在 models py 中有两个简单的模型 Service 和 Host Host services 与 Service 具有 m2m 关系 换句话说 一台主机有多个服务 一个服务可以驻留在多个主
  • Scrapy规则如何与爬行蜘蛛一起工作

    我很难理解 scrapy 爬行蜘蛛规则 我有一个例子 它并不像我希望的那样工作 所以它可能是两件事 我不明白规则是如何运作的 我形成了不正确的正则表达式 导致我无法获得所需的结果 好吧 这就是我想做的 我想编写爬行蜘蛛 它将获取所有可用的统
  • rpy2 传递 python 保留关键字参数

    我试图通过 python 使用 r 的密度函数 并且必须将 from to 参数传递给密度函数 然而 由于 from 这个词是Python中的保留关键字 我该如何实现这一点呢 谢谢 这是到目前为止的代码 r density robjects
  • 确定 TCP Listen() 队列中当前积压的连接数

    有没有办法找出currentLinux 上 TCP 套接字上等待 Accept 的连接尝试次数 我想我可以在每个事件循环上点击 EWOULDBLOCK 之前计算成功的 Accept 数量 但我使用的是隐藏这些细节的高级库 Python Tw
  • 使用 Python 访问 MP3 音乐数据

    我正在尝试编写一个 Python 脚本 用于使用歌曲的数据作为比较的基础来搜索重复的 mp3 4 文件 我的情况涉及许多文件名相似但 ID3 标签不同的 mp3 4 文件 起初 我尝试循环并使用 md5 来查找重复文件 忽略文件名 当然 当
  • SyntaxError:创建类实例时语法无效[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在 Python shell 3 3 2 中运行这段代码 但它给了我SyntaxError invalid syntax cla
  • 在 C++ 中运行 python [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个用 C 编写的应用程序和一个测试系统 也是用 C 编写的 测试系统非常复杂并且很难改变 我只想做一些小的改变 我的班级是这样的
  • AWS Cognito 作为网站的 Django 身份验证后端

    我对 Cognito 的理解是 它可以用来代替本地 Django 管理数据库来对网站的用户进行身份验证 然而 我没有找到任何带有通过 Cognito 登录屏幕的基本 Hello World 应用程序的详细示例 如果有人可以发布一篇文章 逐步
  • 在 Python 中将主题标头添加到 server.sendmail()

    我正在编写一个 python 脚本来从终端发送电子邮件 在我目前发送的邮件中 它没有主题 我们如何为此电子邮件添加主题 我当前的代码 import smtplib msg From email protected cdn cgi l ema
  • 需要FTP文件而不存储解释器文件通过Python保存在本地

    我正在尝试做一些图像解释器并尝试将它们直接存储到 FTP 服务器 但我的步骤是从本地文件夹上传图像 然后将其转换为蒙版图像 然后它将获得最终输出 但是在我的蒙版和最终输出场景中 临时图像被保存在本地 这是我不想要的 但如果不将图像存储在本地
  • Bokeh 中的相关图问题

    当我通过绘制数据时rect 来自 Bokeh 我在可视化中得到了一条由水平块组成的单行 数据打印正确 据我所知格式正确 type 验证它们都是列表 谁能诊断这个吗 如果问题不在这里 那么我可以附加更多代码 如果需要 在 Ubuntu 14

随机推荐

  • QT 实现16进制与字符串互转

    QT 实现16进制与字符串互转 文章目录 QT 实现16进制与字符串互转 前言 一 字符串QString转换16进制 二 16进制转换为字符串QString 三 正则表达式限制输入16进制 四 文本自动补全空格功能的实现 前言 QT在界面时
  • matlab图像处理——直方图及直方图均衡化

    imhist 对rice png和增强亮度后的 增强对比度后的图进行直方图展示 imhist 对于brightness 和 contrast的不同 clear all brightness I imread rice png J imadd
  • 洛谷Java入门代码之分苹果

    题目描述 八尾勇喜欢吃苹果 她现在有 m m 100 m m le 100 m m 100 个苹果 吃完一个苹果需要花费 t t 100 t t le100 t t 100 分钟 吃完一个后立刻开始吃下一个 现在时间过去了 s s 1000
  • LevelDB简介

    LevelDB简介 综述 leveldb整体架构 提供接口 db h 技术 memtable WAL sstable Manifest cache LRU cache LRU的优缺点 filter levelDB初始化 compaction
  • 专治疑难系列 - 无法激活网络的解决方法

    博客主页 Passerby Wang的博客 CSDN博客 系统运维 云计算 Linux基础领域博主 所属专栏 转治疑难系列 上期文章 无 如觉得博主文章写的不错或对你有所帮助的话 还望大家多多支持呀 关注 点赞 收 藏 评论 目录 一 问题
  • Python将txt文件内容转换成列表

    参考 Python将txt文件内容转换成列表 云 社区 腾讯云 方法一 coding utf 8 f open r ip txt r a list f print a f close 方法二 coding utf 8 f open r ip
  • Sublime Text 3 安装Go语言相关插件gosublime《小白也能学会的教程》

    Sublime Text 3 安装Go语言相关插件gosublime 序言 这篇文章是自己的亲身体会 今天为了安装gosublime可是找了一堆教程 但大部分都无功于返 有些甚至点开后都是直接复制粘贴过来的 一度心灰意冷 就在我快要暴躁的时
  • Java 实现 QQ 登陆

    点击上方蓝色字体 选择 标星公众号 优质文章 第一时间送达 1 前言 个人网站最近增加了评论功能 为了方便用户不用注册就可以评论 对接了 QQ 和微博这 2 大常用软件的一键登录 总的来说其实都挺简单的 可能会有一点小坑 但不算多 完整记录
  • C++ Primer Exercise 5.18

    Understanduing the difference between C and C therefore know the computer language deeper vector
  • MySQL数据库锁的实现原理(面试)

    mysql的锁类型 一般其实就是表锁 行锁和页锁 一般myisam会加表锁 就是myisam引擎下 执行查询的时候 会默认加个表共享锁 也就是表读锁 这个时候别人只能来查 不能写数据的 然后myisam写的时候 也会加个表独占锁 也就是表写
  • 如何查看宝塔面板入口?

    终端输入 bt default
  • 【实例】python中简单分句,通过替代句号 &给句尾(不是句首)添加序号

    gt gt gt fn open E 西方哲学史 txt read gt gt gt fn fn replace t r n gt gt gt s open E 西方哲学史分句 txt w gt gt gt s s write fn 想要给
  • 蓝桥杯2018年第九届真题——乘积尾零

    乘积尾零 一 题目内容 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 如下的 10 行数据 每行有 10 个整数 请你求出它们的乘积的末尾有多少个零 5650 4542 3554 473 946 4114 3871
  • docker : unable to prepare context: context must be a directory

    1 美图 2 背景 创建了一个dockerfile base lcc lcc negix ll total 8 drwxr xr x 3 lcc staff 96 4 8 08 47 drwxr xr x 4 lcc staff 128 4
  • 介绍两种常见软件开发模式:“敏捷”和“瀑布”

    写在最前面 敏捷开发模式更加适合项目型的系统 瀑布开发模式更适合产品型系统 设计后多次迭代 以上属于个人理解 有不同的见解欢迎大家一起讨论 在软件开发时 经常面对的第一个项目实现决策是 我们应该使用哪种开发方法 这是一个引起很多讨论 和激烈
  • 图解Flink内核源码-尚硅谷大数据培训

    大佬硬核手撕Flink源码 首发内核源码图解 Flink内核源码大汇总 关注公众号 回复 Flink 还能获取全部内核讲解视频以及文档资料 1 Flink任务提交流程 相关文章 重磅 Flink源码解析环境准备及提交流程之环境准备重磅 Fl
  • XAMPP Mysql/MariaDB 忘记密码

    对于本地的本地的phpMyAdmin 忘记登录密码怎么办哪 看看下文 能省去你不少时间和精力 首先进入DOS 开一个cmd 第一步 先停掉MySQL服务 cmd命令行 c gt sc stop mysql XAMPP 手动点击MySQL g
  • 层次分析法模型(数学建模学习)

    本系列参考清风老师的数学建模课程 层次分析法模型 一 模型介绍 一 模型引入 对于方案选择类问题 评价类问题采用层次分析法 The ayalytic hierarchy process AHP 模型进行评分 之后评分高的就是最佳方案 二 模
  • Wireshark对SMTP抓包分析

    本文主要使用Wireshark对邮件客户端使用SMTP协议发送邮件的过程进行抓包分析并使用telnet命令进行简单操作 1 SMTP简介 简单邮件传输协议 英语 Simple Mail Transfer Protocol 缩写 SMTP 是
  • 《自然语言处理》-文本生成实验(基于MindSpore),避免的坑,保姆式教学

    最近我的导师去了解一下华为的MindSpore框架 觉得很有意思然后就让我跑一下他的文本生成实验 不过其中有很多是他的实验手册没怎么写清楚的点 我在这里为各位一个一个排坑拉 本实验都是来源于华为的文本生成实验手册 只是里面很多内容写的不清楚