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.pswp.cn/bicheng/15675.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15675.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15675.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【第17章】MyBatis-Spring之注入映射器

文章目錄 前言一、注冊映射器1. XML 配置2. Java 配置 二、發現映射器1. <mybatis:scan/>2.MapperScan ( 建議 ) \color{#00FF00}{(建議)} (建議) 三、MapperScannerConfigurer總結 前言 與其在數據訪問對象&#xff08;DAO&#xff09;中手工編寫使用 SqlSessionDaoSu…

數據庫--數據庫基礎(一)

目錄 第一章 緒論 一.數據庫的基本概念 1. 數據庫的4個基本概念 2、數據庫系統的特點 二.數據庫和文件 三.數據模型 1.概念模型 2.邏輯模型(物理模型) 2.1關系模型 四.數據庫系統的三級模式結構&#xff1a; 五數據庫的二級映像功能與數據獨立性 第二章 關系數據庫…

WEBPACK開發|生產環境配置(抽離公共部分)

這是webpack4演示&#xff0c;webpack5有些插件不在推薦&#xff0c; 1. webpack.base.config.js文件的配置說明 const path require(path); const webpack require(webpack); const ExtractTextPlugin require(extract-text-webpack-plugin); // 該插件的主要是為了抽離c…

【LeetCode面試經典150題】100. 相同的樹

一、題目 100. 相同的樹 - 力扣&#xff08;LeetCode&#xff09; 給你兩棵二叉樹的根節點 p 和 q &#xff0c;編寫一個函數來檢驗這兩棵樹是否相同。 如果兩個樹在結構上相同&#xff0c;并且節點具有相同的值&#xff0c;則認為它們是相同的。 二、思路 二叉樹的題&#…

C++的lambda函數、bind函數、類函數綁定參數,學習測試用例

在C中&#xff0c;Lambda函數、std::bind 和類函數綁定參數提供了靈活的方式來處理函數調用。 Lambda函數是一種匿名函數&#xff0c;可以捕獲外部變量并在函數體內使用。它們提供了簡潔而強大的方式來定義內聯函數。std::bind 用于創建一個新的函數對象&#xff0c;其中部分參…

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…

23種設計模式之一————工廠模式詳細講解

工廠模式介紹 定義分類工廠模式核心角色&#xff1a;簡單工廠模式定義特點優點缺點應用場景代碼實現 工廠方法模式&#xff08;別名&#xff1a;虛擬構造&#xff09;定義特點優點缺點應用場景代碼實現 抽象工廠模式定義特點優點缺點應用場景代碼實現工廠模式小結 定義 工廠模…

算法之背包問題

可分的背包問題是可以用貪心法來解決&#xff0c;而0-1背包問題通常使用動態規劃方法來解決。 可分背包問題&#xff1a; 在可分背包問題中&#xff0c;物品可以被分割&#xff0c;您可以取走物品的一部分以適應背包的容量。這里的關鍵是物品的價值密度&#xff0c;即單…

最小產品價格差值

題目描述 給定某產品多少天的價格&#xff0c;記錄于prices中&#xff0c;請找出任意兩天之間的最小價格差&#xff08;即abs(prices[i] - prices[j])&#xff09;的最小值&#xff0c;i!j&#xff09;并計算最小介個差組合的個數 樣例1 輸入 [1,3,7,5,12] 輸出 3 樣例2…

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;即可推測…

Swift 請求用戶授權以跟蹤其跨應用或網站的活動

步驟1:導入框架 首先,需要在Swift文件中導入AppTrackingTransparency框架。 import AppTrackingTransparency import AdSupport步驟2:請求跟蹤許可 在適當的地方請求用戶的跟蹤許可。通常,這個請求會在應用啟動時或者在用戶執行某些操作(例如,訪問應用中的廣告相關功能…

Linux服務器安裝docker,基于Linux(openEuler、CentOS8)

本實驗環境為openEuler系統(以server方式安裝)&#xff08;CentOS8基本一致&#xff0c;可參考本文) 目錄 知識點實驗 知識點 Docker 是一個開源的應用容器引擎。它允許開發者將應用及其所有依賴項打包到一個可移植的容器中&#xff0c;并發布到任何支持Docker的流行Linux或Wi…

基于python flask的web服務

基本例子 from flask import Flask app Flask(__name__) app.route(/)#檢查訪問的網址&#xff0c;根路徑走這里 def hello_world():return hello world#返回hello worldif __name__ __main__:# 綁定到指定的IP地址和端口app.run(host0.0.0.0, port1000, debugTrue)##綁定端…

設計一個完美的用戶角色權限表

設計一個完美的用戶角色權限表需要考慮系統的安全性、靈活性和可擴展性。以下是一個詳細的用戶角色權限管理表設計方案&#xff0c;包含多個表結構和字段描述。 目錄 1. 用戶表&#xff08;Users Table&#xff09;2. 角色表&#xff08;Roles Table&#xff09;3. 權限表&…

【數據結構與算法 | 基礎篇】環形數組模擬隊列

1. 前言 上文我們用環形單向鏈表實現了隊列.接下來我們用環形數組來模擬隊列.并實現了isFull()&#xff0c;isEmpty()等方法. 2. 環形數組模擬隊列 (1). Queue接口 : public interface Queue<E> {//向隊伍插入值, 插入成功返回true, 否則返回falseboolean offer(E v…

【Linux】TCP協議【上】{協議段屬性:源端口號/目的端口號/序號/確認序號/窗口大小/緊急指針/標記位}

文章目錄 1.引入2.協議段格式4位首部長度16位窗口大小32位序號思考三個問題【demo】標記位URG: 緊急指針是否有效提升某報文被處理優先級【0表示不設置1表示設置】ACK: 確認號是否有效PSH: 提示接收端應用程序立刻從TCP緩沖區把數據讀走RST: 對方要求重新建立連接; 我們把攜帶R…