赞
踩
14.10. 预训练BERT — 动手学深度学习 2.0.0 documentation (d2l.ai)
在d2l-zh/pytorch/data目录解压:
- ~/d2l-zh/pytorch/data$ unzip wikitext-2-v1.zip
- Archive: wikitext-2-v1.zip
- creating: wikitext-2/
- inflating: wikitext-2/wiki.test.tokens
- inflating: wikitext-2/wiki.valid.tokens
- inflating: wikitext-2/wiki.train.tokens
- import torch
- from torch import nn
- from d2l import torch as d2l
-
- batch_size, max_len = 512, 64
- train_iter, vocab = d2l.load_data_wiki(batch_size, max_len)
-
- net = d2l.BERTModel(len(vocab), num_hiddens=128, norm_shape=[128],
- ffn_num_input=128, ffn_num_hiddens=256, num_heads=2,
- num_layers=2, dropout=0.2, key_size=128, query_size=128,
- value_size=128, hid_in_features=128, mlm_in_features=128,
- nsp_in_features=128)
- devices = d2l.try_all_gpus()
- loss = nn.CrossEntropyLoss()
-
- #@save
- def _get_batch_loss_bert(net, loss, vocab_size, tokens_X,
- segments_X, valid_lens_x,
- pred_positions_X, mlm_weights_X,
- mlm_Y, nsp_y):
- # 前向传播
- _, mlm_Y_hat, nsp_Y_hat = net(tokens_X, segments_X,
- valid_lens_x.reshape(-1),
- pred_positions_X)
- # 计算遮蔽语言模型损失
- mlm_l = loss(mlm_Y_hat.reshape(-1, vocab_size), mlm_Y.reshape(-1)) *\
- mlm_weights_X.reshape(-1, 1)
- mlm_l = mlm_l.sum() / (mlm_weights_X.sum() + 1e-8)
- # 计算下一句子预测任务的损失
- nsp_l = loss(nsp_Y_hat, nsp_y)
- l = mlm_l + nsp_l
- return mlm_l, nsp_l, l
- def train_bert(train_iter, net, loss, vocab_size, devices, num_steps):
- net = nn.DataParallel(net, device_ids=devices).to(devices[0])
- trainer = torch.optim.Adam(net.parameters(), lr=0.01)
- step, timer = 0, d2l.Timer()
- animator = d2l.Animator(xlabel='step', ylabel='loss',
- xlim=[1, num_steps], legend=['mlm', 'nsp'])
- # 遮蔽语言模型损失的和,下一句预测任务损失的和,句子对的数量,计数
- metric = d2l.Accumulator(4)
- num_steps_reached = False
- while step < num_steps and not num_steps_reached:
- for tokens_X, segments_X, valid_lens_x, pred_positions_X,\
- mlm_weights_X, mlm_Y, nsp_y in train_iter:
- tokens_X = tokens_X.to(devices[0])
- segments_X = segments_X.to(devices[0])
- valid_lens_x = valid_lens_x.to(devices[0])
- pred_positions_X = pred_positions_X.to(devices[0])
- mlm_weights_X = mlm_weights_X.to(devices[0])
- mlm_Y, nsp_y = mlm_Y.to(devices[0]), nsp_y.to(devices[0])
- trainer.zero_grad()
- timer.start()
- mlm_l, nsp_l, l = _get_batch_loss_bert(
- net, loss, vocab_size, tokens_X, segments_X, valid_lens_x,
- pred_positions_X, mlm_weights_X, mlm_Y, nsp_y)
- l.backward()
- trainer.step()
- metric.add(mlm_l, nsp_l, tokens_X.shape[0], 1)
- timer.stop()
- animator.add(step + 1,
- (metric[0] / metric[3], metric[1] / metric[3]))
- step += 1
- if step == num_steps:
- num_steps_reached = True
- break
-
- print(f'MLM loss {metric[0] / metric[3]:.3f}, '
- f'NSP loss {metric[1] / metric[3]:.3f}')
- print(f'{metric[2] / timer.sum():.1f} sentence pairs/sec on '
- f'{str(devices)}')
-
- train_bert(train_iter, net, loss, len(vocab), devices, 50)
-
- def get_bert_encoding(net, tokens_a, tokens_b=None):
- tokens, segments = d2l.get_tokens_and_segments(tokens_a, tokens_b)
- token_ids = torch.tensor(vocab[tokens], device=devices[0]).unsqueeze(0)
- segments = torch.tensor(segments, device=devices[0]).unsqueeze(0)
- valid_len = torch.tensor(len(tokens), device=devices[0]).unsqueeze(0)
- encoded_X, _, _ = net(token_ids, segments, valid_len)
- return encoded_X
-
- tokens_a = ['a', 'crane', 'is', 'flying']
- encoded_text = get_bert_encoding(net, tokens_a)
- # 词元:'<cls>','a','crane','is','flying','<sep>'
- encoded_text_cls = encoded_text[:, 0, :]
- encoded_text_crane = encoded_text[:, 2, :]
- encoded_text.shape, encoded_text_cls.shape, encoded_text_crane[0][:3]
-
- tokens_a, tokens_b = ['a', 'crane', 'driver', 'came'], ['he', 'just', 'left']
- encoded_pair = get_bert_encoding(net, tokens_a, tokens_b)
- # 词元:'<cls>','a','crane','driver','came','<sep>','he','just',
- # 'left','<sep>'
- encoded_pair_cls = encoded_pair[:, 0, :]
- encoded_pair_crane = encoded_pair[:, 2, :]
- encoded_pair.shape, encoded_pair_cls.shape, encoded_pair_crane[0][:3]
这个代码实现了基于Transformers模型业务的BERT(Bidirectional Encoder Representations from Transformers)的训练,以及在预训练过程中如何将BERT模型应用于两个NLP任务:遮蔽语言模型(Masked Language Model,MLM)和下一个句子预测(Next Sentence Prediction,NSP)。具体来说,它进行了以下步骤:
1. 加载数据集:
train_iter, vocab = d2l.load_data_wiki(batch_size, max_len)
这行代码将会加载一个预处理过的维基百科数据集作为BERT的训练数据,每个批次的大小为512,最大长度为64个词元。
2. 创建BERT模型:
net = d2l.BERTModel(len(vocab), ...)
这里定义了一个BERT模型实例,其中包含有几种参数配置:词汇表大小、隐藏特征表示的维数、前馈神经网络层的参数等。
3. 设定损失函数和训练设备:
- 损失函数使用了交叉熵损失。
- 训练设备可以是GPU(如果可用)。
4. 定义BERT的批量损失计算函数`_get_batch_loss_bert`:
计算给定批次数据的损失值,包括遮蔽语言模型损失和下一个句子预测损失。
5. 定义BERT的训练函数`train_bert`:
设置BERT模型训练的相关参数和流程。
6. 执行训练:
train_bert(train_iter, net, loss, len(vocab), devices, 50)
运行训练函数,进行50步训练。
7. 用`get_bert_encoding`函数获得BERT模型编码的词元表示:
函数接受一对句子(tokens_a和tokens_b),对它们进行编码,并返回编码后的词元表示。如果只有一个句子,tokens_b=None,默认tokens_b不提供。
8. 最后,通过编码两个示例句子,展示如何使用BERT模型来获取词元的嵌入表示。
注意,完整的代码实现了从数据准备、模型构建、训练到获取嵌入表示的整个过程。在实际使用时需要对应相应的数据集、网络参数和训练步骤进行适当的设置。此外,由"#<save>"标记的部分,是保存函数定义的提示,便于以后的复用。注意,该代码块可能需要根据实际环境和数据集导入额外的包和模块。
要在ROCm上运行预训练的BERT模型,您需要确保您的系统已经安装了支持ROCm的TensorFlow版本,并且已经正确配置了相关的环境。以下是一些关键步骤和注意事项:
请注意,上述步骤是一个大致的指南,具体操作可能需要根据您的实际情况和需求进行调整。此外,由于ROCm和BERT都是不断发展的技术,建议您查阅最新的官方文档和社区讨论,以获取最准确的安装和运行指南。
在ROCm(AMD的开源GPU加速计算平台)上运行预训练的BERT模型,通常涉及以下几个步骤:
请注意,具体的实现细节可能会因你使用的深度学习框架和BERT模型版本而有所不同。因此,建议参考你选择的框架和模型的官方文档以获取更详细的指导和示例代码。
另外,由于ROCm是AMD的开源项目,其社区支持和资源可能不如NVIDIA的CUDA生态系统丰富。因此,在使用ROCm时可能会遇到一些挑战和限制。如果你遇到任何问题或困难,建议查阅相关的论坛、社区和文档以获取帮助。
找到了第 1 篇资料:AMD显卡配置深度学习环境(ROCm-pytorch) - 知乎
找到了第 2 篇资料:无需配环境,让你跟显卡唠唠嗑:AMD ROCm大语言模型 ...
找到了第 3 篇资料:面向中文的BERT预训练模型 - 知乎
找到了第 4 篇资料:BERT模型从训练到部署全流程_部署bert模型-CSDN博客
找到了第 5 篇资料:ROCm上运行深度卷积神经网络(AlexNet)-CSDN博客
找到了第 6 篇资料:AMD ROCM有没有明显的坑? - 电脑讨论(新) - Chiphell ...
找到了第 7 篇资料:Posts tagged BERT — ROCm Blogs
找到了第 8 篇资料:ROCm 6.0.0 Release · ROCm ROCm · Discussion #2729
找到了第 9 篇资料:零基础用 Bert 训练并部署文本分类模型 - 知乎
找到了第 10 篇资料:深度解析BERT:从理论到Pytorch实战-腾讯云开发者社区-腾讯云
找到了第 11 篇资料:BERT模型:从训练到部署的完整指南-百度开发者中心
找到了第 12 篇资料:BERT简单使用:从预训练到部署的完整指南-百度开发者中心
在ROCm上运行预训练的BERT模型主要涉及以下几个步骤:
安装ROCm环境:确保你的系统已经安装了ROCm,包括所需的内核驱动、ROCm平台和相关的依赖库。根据 22,可以通过 amdgpu-install
命令来安装ROCm环境。
安装支持ROCm的深度学习框架:选择一个与ROCm兼容的深度学习框架,比如PyTorch。根据 22,建议使用AMD提供的Docker镜像来安装PyTorch,这样可以确保与ROCm的兼容性。
获取BERT预训练模型:你可以从Hugging Face的模型库或其他资源获取预训练的BERT模型。根据 24,有多种中文BERT预训练模型可供选择。
转换模型格式:如果BERT模型不是为ROCm优化的格式,你可能需要将其转换为ROCm兼容的格式。这可能涉及到将模型权重从一种格式转换为另一种格式,比如从TensorFlow的.ckpt
转换为ONNX或直接支持ROCm的PyTorch模型格式。
在ROCm上运行BERT模型:加载模型并在ROCm加速的GPU上运行推理或进一步的训练。根据 23,可以使用专为大型语言模型设计的部署工具LM Studio,它支持ROCm加速。
性能优化:利用ROCm提供的性能分析工具,如rocprof、roctracer等,来分析和优化模型的性能。
请注意,由于硬件和软件的快速发展,具体的安装和配置步骤可能会随着时间而变化,因此建议查阅最新的ROCm和相关深度学习框架的官方文档。此外,由于ROCm是一个相对较新的平台,社区支持和资源可能没有像CUDA那样丰富,因此在ROCm上进行开发可能需要更多的实验和调试。2627
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。