ROCm上运行预训练BERT

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.zipcreating: 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 d2lbatch_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_lreturn 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 = Falsewhile 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 += 1if step == num_steps:num_steps_reached = Truebreakprint(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_Xtokens_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版本,并且已经正确配置了相关的环境。以下是一些关键步骤和注意事项:

  1. 安装Anaconda:首先,您需要在您的Linux系统上安装Anaconda,这是一个用于科学计算的Python发行版,它包含了运行BERT所需的许多库和工具。
  2. 安装TensorFlow:在ROCm上运行BERT需要使用TensorFlow的特定版本,即支持ROCm的版本。您可以从TensorFlow官方网站或者通过其他渠道获取适合ROCm的TensorFlow版本。
  3. 硬件配置:确保您的硬件配置满足运行BERT的要求。一般来说,需要有足够的GPU内存和计算能力。例如,有案例使用了配置为4*V100 (16G),8核CPU,128G内存的硬件配置。
  4. 数据准备:根据您的NLP任务需求,准备或收集相应的训练数据。如果是特定的领域,如金融领域,您可能需要金融新闻、研究报告等数据。
  5. 模型调整:由于BERT是一个大规模的模型,您可能需要根据实际情况对模型进行调整,比如调整模型的大小、学习率等参数,以适应您的硬件条件和训练数据。
  6. 性能优化:在预训练过程中,您可能需要对性能进行优化,这包括使用混合精度训练、优化器选择等技术来提高训练效率和速度。
  7. 训练和评估:最后,您需要实际运行预训练过程,并在完成后对模型进行评估和调优,以确保其在您的特定任务上能够达到最佳性能。

请注意,上述步骤是一个大致的指南,具体操作可能需要根据您的实际情况和需求进行调整。此外,由于ROCm和BERT都是不断发展的技术,建议您查阅最新的官方文档和社区讨论,以获取最准确的安装和运行指南。

在ROCm(AMD的开源GPU加速计算平台)上运行预训练的BERT模型,通常涉及以下几个步骤:

  1. 安装ROCm:首先,你需要在你的AMD GPU支持的机器上安装ROCm。这包括安装驱动程序、运行时库、编译器(如HIP)等。确保你按照ROCm的官方文档进行了正确的安装和配置。
  2. 选择深度学习框架:选择一个支持ROCm的深度学习框架,如PyTorch或TensorFlow。这些框架提供了在GPU上运行深度学习模型的接口。你需要安装这些框架的ROCm版本。
  3. 下载预训练的BERT模型:从可靠的来源(如Hugging Face的Transformers库)下载预训练的BERT模型。确保你选择了与你的深度学习框架兼容的模型版本。
  4. 加载预训练的BERT模型:使用你选择的深度学习框架加载预训练的BERT模型。这通常涉及调用框架提供的特定函数或API来加载模型的权重和配置。
  5. 准备数据和预处理:准备你要用于自然语言处理任务的数据,并进行必要的预处理,如分词、编码等。确保你的数据格式与BERT模型的输入要求相匹配。
  6. 在ROCm上运行BERT模型:将你的数据和BERT模型传递给深度学习框架,并指定使用ROCm作为计算后端。这通常涉及设置环境变量或调用框架的特定函数来指定GPU加速。然后,你可以运行你的自然语言处理任务,并观察BERT模型在ROCm上的性能。

请注意,具体的实现细节可能会因你使用的深度学习框架和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模型主要涉及以下几个步骤:

  1. 安装ROCm环境:确保你的系统已经安装了ROCm,包括所需的内核驱动、ROCm平台和相关的依赖库。根据 22,可以通过 amdgpu-install 命令来安装ROCm环境。

  2. 安装支持ROCm的深度学习框架:选择一个与ROCm兼容的深度学习框架,比如PyTorch。根据 22,建议使用AMD提供的Docker镜像来安装PyTorch,这样可以确保与ROCm的兼容性。

  3. 获取BERT预训练模型:你可以从Hugging Face的模型库或其他资源获取预训练的BERT模型。根据 24,有多种中文BERT预训练模型可供选择。

  4. 转换模型格式:如果BERT模型不是为ROCm优化的格式,你可能需要将其转换为ROCm兼容的格式。这可能涉及到将模型权重从一种格式转换为另一种格式,比如从TensorFlow的.ckpt转换为ONNX或直接支持ROCm的PyTorch模型格式。

  5. 在ROCm上运行BERT模型:加载模型并在ROCm加速的GPU上运行推理或进一步的训练。根据 23,可以使用专为大型语言模型设计的部署工具LM Studio,它支持ROCm加速。

  6. 性能优化:利用ROCm提供的性能分析工具,如rocprof、roctracer等,来分析和优化模型的性能。

请注意,由于硬件和软件的快速发展,具体的安装和配置步骤可能会随着时间而变化,因此建议查阅最新的ROCm和相关深度学习框架的官方文档。此外,由于ROCm是一个相对较新的平台,社区支持和资源可能没有像CUDA那样丰富,因此在ROCm上进行开发可能需要更多的实验和调试。2627

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/15675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库--数据库基础(一)

目录 第一章 绪论 一.数据库的基本概念 1. 数据库的4个基本概念 2、数据库系统的特点 二.数据库和文件 三.数据模型 1.概念模型 2.逻辑模型(物理模型) 2.1关系模型 四.数据库系统的三级模式结构&#xff1a; 五数据库的二级映像功能与数据独立性 第二章 关系数据库…

2024电工杯数学建模B题高质量成品论文,包括代码数据

2024电工杯数学建模B题高质量成品论文&#xff0c;包括代码数据 完整内容见文末名片 摘要 大学时期是学生们知识学习和身体成长的重要阶段&#xff0c;良好的饮食习惯对于促进生长发育和保证身体健康具有重要意义。针对当前大学生中存在的饮食结构不合理及不良饮食习惯的问题…

为了性能,放弃tft_eSPI,选择arduino_gfx吧

本来对于tft_espi和arduino_gfx没啥特别的感觉&#xff0c;都是tft屏幕驱动,arduino_gfx的好处就是除了支持tft外还支持一些oled屏幕。 谁知道在探寻我那个在单片机项目上显示中文方案 https://github.com/StarCompute/tftziku 时候&#xff0c;寻求极致性能测了一些东西。 t…

算法之背包问题

可分的背包问题是可以用贪心法来解决&#xff0c;而0-1背包问题通常使用动态规划方法来解决。 可分背包问题&#xff1a; 在可分背包问题中&#xff0c;物品可以被分割&#xff0c;您可以取走物品的一部分以适应背包的容量。这里的关键是物品的价值密度&#xff0c;即单…

VTK9.2.0+QT5.14.0绘制三维显示背景

背景 上一篇绘制点云的博文中&#xff0c;使用的vtkCameraOrientationWidget来绘制的坐标轴&#xff0c;最近又学习到两种新的坐标轴绘制形式。 vtkOrientationMarkerWidget vtkAxesActor 单独使用vtkAxesActor能够绘制出坐标轴&#xff0c;但是会随着鼠标操作旋转和平移时…

微服务中使用Maven BOM来管理你的版本依赖

摘要: 原创出处 sf.gg/a/1190000021198564 「飘渺Jam」欢迎转载&#xff0c;保留摘要&#xff0c;谢谢&#xff01; 为什么要使用BOM? 如何定义BOM? 项目使用方法? BOM&#xff08;Bill of Materials&#xff09;是由Maven提供的功能,它通过定义一整套相互兼容的jar包版…

通过 NIO + 多线程 提升硬件设备与系统的数据传输性能

一、项目展示 下图&#xff08;模拟的数据可视化大屏&#xff09;中数据是动态显示的 二、项目简介 描述&#xff1a;使用Client模拟了硬件设备&#xff0c;比如可燃气体浓度检测器。Client通过Socket与Server建立连接&#xff0c;Server保存数据到txt文件&#xff0c;并使用W…

结构体(位段)内存分配

结构体由多个数据类型的成员组成。那编译器分配的内存是不是所有成员的字节数总和呢&#xff1f; 首先&#xff0c;stu的内存大小并不为29个字节&#xff0c;即证明结构体内存不是所有成员的字节数和。   其次&#xff0c;stu成员中sex的内存位置不在21&#xff0c;即可推测…

Linux服务器安装docker,基于Linux(openEuler、CentOS8)

本实验环境为openEuler系统(以server方式安装)&#xff08;CentOS8基本一致&#xff0c;可参考本文) 目录 知识点实验 知识点 Docker 是一个开源的应用容器引擎。它允许开发者将应用及其所有依赖项打包到一个可移植的容器中&#xff0c;并发布到任何支持Docker的流行Linux或Wi…

【Linux】TCP协议【上】{协议段属性:源端口号/目的端口号/序号/确认序号/窗口大小/紧急指针/标记位}

文章目录 1.引入2.协议段格式4位首部长度16位窗口大小32位序号思考三个问题【demo】标记位URG: 紧急指针是否有效提升某报文被处理优先级【0表示不设置1表示设置】ACK: 确认号是否有效PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走RST: 对方要求重新建立连接; 我们把携带R…

windows 设置系统字体 (win11 win10)

由于微软的字体是有版权的&#xff0c;所以我打算替换掉 1.下载替换工具 github的项目&#xff0c;看起来很多人对微软默认字体带版权深恶痛绝。 项目地址&#xff1a;nomeiryoUi地址 这里选取最新的版本即可 2.打开软件 这里显示标题栏不能改&#xff0c;确认&#xff0c;其…

盖雅技能发展云,助力制造企业人效合一

制造行业尽管经历多次变革&#xff0c;但企业对人的管理始终是一项高度依赖经验和耗费人力的工作。随着供应链管理和生产设备的自动化、数字化升级&#xff0c;如何将第一生产要素——人&#xff0c;通过数字化的工具融入制造过程的闭环&#xff0c;对企业实现自动化工厂和智能…

力扣 滑动窗口题目总结

Leetcode3.无重复字符的最长子串 思路&#xff1a; 这道题主要用到思路是&#xff1a;滑动窗口 什么是滑动窗口&#xff1f; 其实就是一个队列,比如例题中的 abcabcbb&#xff0c;进入这个队列&#xff08;窗口&#xff09;为 abc 满足题目要求&#xff0c;当再进入 a&#x…

牛客NC334 字典序第K小【困难 10叉树 Java/Go/PHP/C++】,力扣 440. 字典序的第K小数字

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/670c2bda374241d7ae06ade60de33e8b https://leetcode.cn/problems/k-th-smallest-in-lexicographical-order/description/ 本答案核心 10叉树, 数学规律Java代码 import java.util.*;public class Solution {…

大模型的灵魂解读:Anthropic AI的Claude3 Sonnet可解释性研究

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提供了大模型领域最新技…

Vue集成Iframe

一、应用场景&#xff0c;为什么要集成Iframe&#xff1f; 1、庞大项目拆分后&#xff0c;便于管理和部署&#xff0c;用集成Iframe的方法合并 2、避免功能重复开发&#xff0c;共用模块可单独开发为一个项目&#xff0c;既可独立部署&#xff0c;也可集成到中台系统 二、集成…

[算法][前缀和] [leetcode]724. 寻找数组的中心下标

题目地址 https://leetcode.cn/problems/find-pivot-index/description/ 题目描述 代码 class Solution {public int pivotIndex(int[] nums) {int total Arrays.stream(nums).sum();//前缀和int prefixSum 0;int len nums.length;for(int i 0;i<len;i){if (i-1>0){p…

小猪APP分发:一站式托管服务,轻松玩转应用市场

在当今移动应用爆炸式增长的时代&#xff0c;开发者们面临的挑战不再仅限于创意的火花和代码的实现&#xff0c;更在于如何让精心打造的应用快速触达广大用户。这正是小猪APP分发www.appzhu.net应运而生的背景——作为一个全面、高效的APP托管服务分发平台&#xff0c;它为开发…

基于PHP的物业管理的设计与实现

第1章 绪论... 1 1.1 研究背景与意义... 1 1.2 国内外发展现状... 2 第2章 关键技术介绍... 3 2.1 PHP语言... 3 2.2 MySQL数据库... 3 2.3 Zend框架... 4 2.4 B/S架构... 4 第3章 系统需求分析... 5 3.1 可行性分析... 5 3.1.1 技术可行性分析... 5 3.1.2 经济可行…

金职优学:分析央国企面试如何通关?

在当今竞争激烈的就业市场中&#xff0c;中央和国有企业&#xff08;以下简称“央国企”&#xff09;的面试机会对求职者来说是非常有吸引力的。这些企业通常拥有稳定的发展前景、良好的薪酬福利和广阔的职业发展空间。但是&#xff0c;要想成功通过央国企的面试&#xff0c;求…