ROCm上运行预训练BERT

news2024/11/18 8:28:50

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版本,并且已经正确配置了相关的环境。以下是一些关键步骤和注意事项:

  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.coloradmin.cn/o/1692577.html

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

相关文章

Autodesk 3DS Max v2025 解锁版安装教程 (3D 建模软件)

前言 Autodesk 3ds Max 是一款功能强大的 3D 建模和动画解决方案&#xff0c;游戏开发人员、视觉效果艺术家和平面设计师使用它来创建庞大的世界、令人惊叹的场景和引人入胜的虚拟现实 (VR) 体验。 Autodesk 3DS MAX是业界使用最广泛的3D建模和动画软件程序之一&#xff0c;它…

MoE 系列论文解读:Gshard、FastMoE、Tutel、MegaBlocks 等

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接…

并发编程:ScheduledThreadPoolExecutor你真的了解吗?

前言 首先看到标题&#xff0c;我们其实很多人都知道&#xff0c;但是呢 在实际项目中我们面对很多延迟任务实现方案有很多选择&#xff0c;甚至直接在网上百度反正都能实现就行&#xff0c;但是忽略了很多细节&#xff0c;导致生产上的事故&#xff0c;都是因为没有真正了解到…

根据多个坐标经纬度获取到中心点的经纬度,scala语言

文章目录 前言scala 代码 总结 前言 Scala 语言 通过多个经纬度坐标点, 计算出中心点, 这里使用的是 Scala 语言,其他的语言需要自行转换。求出来的并不是原有的点&#xff0c;而是原有点的中心位置的点。 scala 代码 package com.dw.process.midimport java.lang.Double.pa…

数据库DCL语句

数据库DCL语句 介绍&#xff1a; DCL英文全称是Data Control Language(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访 问权限。 管理用户&#xff1a; 查询用户: select * from mysql.user;创建用户: create user 用户名主机名 identified by 密码;修改用…

CSDN 自动评论互动脚本

声明 该脚本的目的只是为了提升博客创作效率和博主互动效率,希望大家还是要尊重各位博主的劳动成果。 数据库设计 尽量我们要新建一个数据库csdn_article,再在其中建一个数据表article -- csdn_article-- article-- 需要进行自动评论的表格信息...CREATE TABLE `article`…

python低阶基础100题(上册)

** python低阶基础100题&#xff08;上册&#xff09; ** 1. 请打印出字符串 Hello World print("Hello World")2. 请打印出字符串 爸爸妈妈&#xff0c;你们辛苦啦 print("爸爸妈妈&#xff0c;你们辛苦啦")3. 请打印出字符串 人生苦短&#xff0c;我…

微信小程序uniapp+django洗脚按摩足浴城消费系统springboot

原生wxml开发对Node、预编译器、webpack支持不好&#xff0c;影响开发效率和工程构建。所以都会用uniapp框架开发 前后端分离&#xff0c;后端给接口和API文档&#xff0c;注重前端,接近原生系统 使用Navicat或者其它工具&#xff0c;在mysql中创建对应名称的数据库&#xff0…

安卓玩机搞机技巧综合资源----自己手机制作证件照的几种方法 免费制作证件照

接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 安卓玩机搞机技巧综合资源------EROFS分区格式 小米红…

Hive运行错误

Hive 文章目录 Hive错误日志错误SessionHiveMetaStoreClientql.Driver: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTaskerror: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster Please check …

什么是创造力?如何判断自己的创造力?

创造力&#xff0c;主要表现为创新思想、发现和创造新事物的能力&#xff0c;是知识&#xff0c;智力和能力的综合能力&#xff0c;尤其是在职业发展方面&#xff0c;创造力具有重要的意义&#xff0c;企业的核心竞争力就来源于创造力&#xff0c;这就需要具有创造力的员工来推…

阿尔杰姆·卢金采访

近年来&#xff0c;在中俄两国元首亲自擘画、战略引领下&#xff0c;两国新时代全面战略协作伙伴关系成熟坚韧、稳如泰山&#xff0c;树立了新型大国关系的新范式。中俄关系走出了一条大国战略互信、邻里友好的相处之道&#xff0c;给两国人民带来了实实在在的好处&#xff0c;…

使用Python将Word文档中的图片提取并生成PowerPoint幻灯片

在这篇博客中&#xff0c;我们将学习如何使用Python将Word文档中的图片提取出来并生成一个PowerPoint幻灯片。我们将借助wxPython、python-docx和python-pptx这三个强大的库来实现这一目标。以下是实现这个功能的完整过程。 C:\pythoncode\new\wordTOppt.py 所需库 首先&…

8.继承和多态

继承 为什么需要继承 Java中使用类对现实世界中实体来进行描述&#xff0c;类经过实例化之后的产物对象&#xff0c;则可以用来表示现实中的实体&#xff0c;但是现实世界错综复杂&#xff0c;事物之间可能会存在一些关联 比如&#xff1a;狗和猫 它们都是一个动物 代码举例…

文件系统--软硬链接

文章目录 现象软链接硬链接 现象 建立软链接 建立硬链接 // 删除软硬链接都可以用 unlink 指令 unlink soft-link软链接 软链接是一个独立的文件&#xff0c;因为有独立的inode number 软链接的内容&#xff1a;目标文件所对应的路劲字符串如果我们直接查看软链接文件&#…

在matlab里面计算一组给定参数的方程的解

如&#xff1a; k (1:1024); f (x)(1-x-k.*x.^2); 在这段代码给出了一组函数&#xff0c;若需要计算f0&#xff0c;可以通过自带的函数实现&#xff1a; x0 zeros(length(k),1); options optimoptions(fsolve,Display,none,TolX,tol,TolFun,tol); tic for ik 1:length…

BERT ner 微调参数的选择

针对批大小和学习率的组合进行收敛速度测试&#xff0c;结论&#xff1a; 相同轮数的条件下&#xff0c;batchsize-32 相比 batchsize-256 的迭代步数越多&#xff0c;收敛更快批越大的话&#xff0c;学习率可以相对设得大一点 画图代码&#xff08;deepseek生成&#xff09;…

aws glue配置读取本地kafka数据源

创建连接时填写本地私有ip地址&#xff0c;选择网络配置 配置任务选择kafka作为数据源 但是执行任务时日志显示连接失败 文档提到只能用加密通信 如果您希望与 Kafka 数据源建立安全连接&#xff0c;请选择 Require SSL connection (需要 SSL 连接)&#xff0c;并在 Kafka priv…

Nginx - 集成ModSecurity实现WAF功能

文章目录 Pre概述什么是ModSecurity&#xff1f;ModSecurity的工作原理主要功能和特点使用场景与其他安全解决方案的比较 ModSecurity在Nginx中的应用安装ModSecurity配置ModSecurity Pre Nginx - 集成Waf 功能 概述 ModSecurity是一款开源的Web应用防火墙&#xff08;WAF&a…

Java反射角度理解spring

概述 Java反射&#xff08;Reflection&#xff09;是Java编程语言的一个特性&#xff0c;它允许在运行时对类、接口、字段和方法进行动态查询和操作。反射提供了一种在运行时查看和修改程序行为的能力&#xff0c;这通常用于实现一些高级功能&#xff0c;如框架(Spring)、ORM&…