深度學習:基于MindSpore NLP的數據并行訓練

什么是數據并行?

數據并行(Data Parallelism, DP)的核心思想是將大規模的數據集分割成若干個較小的數據子集,并將這些子集分配到不同的 NPU 計算節點上,每個節點運行相同的模型副本,但處理不同的數據子集。

1. 將數據區分為不同的mini-batch

將數據集切分為若干子集,每個mini-batch又不同的設備獨立處理。如你有4個GPU,可以把數據集分為4分,每個GPU處理一個字數據集。

2. 模型參數同步

可以通過某一進程初始化全部模型參數后,向其他進程廣播模型參數,實現同步。

3. 前向運算

每個設備獨立計算前向運算。

4. 反向運算

每個設備計算損失的梯度。

5. 梯度聚合

當所有設備計算完各自的梯度后,對所有設備的梯度取平均,每個設備的模型參數根據平均梯度進行更新。

6. 參數更新

數據并行的參數更新是在數據切分、模型參數同步后進行的。更新前,每個進程的參數相同;更新時,平均梯度相同;故更新后,每個進程的參數也相同。

數據并行的基本操作

Reduce 歸約

歸約是函數式編程的概念。數據歸約包括通過函數將一組數字歸約為較小的一組數字。

如sum([1, 2, 3, 4, 5])=15, multiply([1, 2, 3, 4, 5])=120。

AllReduce

等效于執行Reduce操作后,將結果廣播分配給所有進程。

MindSpore AllReduce

import numpy as np
from mindspore.communication import init
from mindspore.communication.comm_func import all_reduce
from mindspore import Tensorinit()
input_tensor = Tensor(np.ones([2, 8]).astype(np.float32))
output = all_reduce(input_tensor)

數據并行的主要計算思想

Parameter-Server

主要思想:所有node被分為server node和worker node

Server node:負責參數的存儲和全局的聚合操作

Worker node:負責計算?

Parameter-Server的問題:

  • 假設有N=5張卡,GPU0作為Server,其余作為Worker
  • 將大小為K的數據拆分為N-1份,分給每個Worker GPU
  • 每個GPU計算得到local gradients
  • N-1塊GPU將計算所得的local gradients發送給GPU 0
  • GPU 0對所有local gradients進行all reduce操作得到全局梯度,參數更新
  • 將該新模型的參數返回給每張GPU

假設單個Worker到Server的通信開銷為C,那么將local gradients送到GPU 0上的通信成本為C * (N - 1)。收到GPU 0通信帶寬的影響,通信成本隨著設備數的增加而線性增長。

Pytorch DataParallel?

Pytorch DP在Parameter-Server的基礎上,把GPU 0即當作Server也當作Worker。

1. 切分數據,但不切分Label

每個GPU進行正向計算之后,將正向計算結果聚合回GPU 0計算Loss,GPU 0計算完Loss的gradient之后,將梯度分發回其他worker GPU。隨后各個GPU計算整個模型的grad,再將grad聚合回GPU 0,進行AllReduce。

2. 切分數據,同時切分Label?

每張卡自己計算Loss即可,減少一次聚合操作。

Pytorch DataParallel 問題:

1. 為擺脫Parameter-Server模式,性能差。

2. 需要額外的GPU進行梯度聚合/ GPU 0需要額外的顯存。GPU 0限制了其他GPU的上限。

Ring AllReduce

每張卡單向通訊,通訊開銷一定。

每張卡占用的顯存相同。

第一步:Scatter-Reduce?

假設每張卡上各自計算好了梯度。

每張GPU依次傳值:?

重復直至:?

第二步:All-Gather

將每一個累計值a / b / c逐個發送至個張卡

直至每張卡都有每層的梯度累計值。

兩步分別做了四次通訊,便可以實現并行計算。

Ring AllReduce計算開銷

  • N-1次Scatter-Reduce
  • N-1次All-Gather
  • 每個GPUGPU一次通訊量為:K/N,K為總數據大小
  • 每個GPU通信次數為:2(N-1)

總通信量為:2(N-1)*(K/N)

當N足夠多時,通信量為一個常數2K。

Gradient Bucketing

集合通信在大張量上更有效。因此,可以在短時間內等待并將多個梯度存儲到一個數據桶(Bucket),然后進行AllReduce操作。而不是對每個梯度立刻啟動AllReduce操作。

MindSpore數據并行?

def forward_fn(data, target):logits = net(data)loss = loss_fn(logits, target)return loss, logitsgrad_fn = ms.value_and_grad(forward_fn, None, net_trainable_param(), has_aux=True)
# 初始化reducer
grad_gather = nn.DistributedGradReducer(optimizer.parameters)for epoch in range(10):i = 0for image, label in data_set:(loss_value, _), grads = grad_fn(image, label)# 進行通訊grads = grad_reducer(grads)optimizer(grads)# ...

MindNLP數據并行

def update_gradient_by_distributed_type(self, model: nn.Module) -> None:'''update gradient by distributed_type'''if accelerate_distributed_type == DistributedType.NO:returnif accelerate_distributed_type == DistrivutedType.MULTI_NPU:from mindspore.communication import get_group_sizefrom mindspore.communication.comm_func iport all_reducerank_size = get_group_size()for parameter in model.parameters():# 進行all_reducenew_grads_mean = all_reduce(parameter.grad) / rank_sizeparameter.grad = new_grads_mean

數據并行的局限性

要求單卡可以放下模型

多卡訓練時內存冗余,相同模型參數復制了多份。

MindSopre中的數據并行

1. 在啟智社區創建云腦任務或華為云創建notebook

環境選擇:mindspore==2.3.0, cann==8.0,昇騰910 * 2

?2. 更新MindSpore框架版本

pip install --upgrade mindspore

同時可以查看NPU信息:

npu--smi info

3. 配置項目環境

克隆mindnlp項目

git clone https://github.com/mindspore-lab/mindnlp.git

下載mindnlp

cd mindnlp
bash scripts/build_and_reinstall.sh

下載完成后,卸載mindformers、soundfile

pip uninstall mindformers

4. 運行訓練腳本

cd mindnlp/llm/parallel/bert_imdb_finetune_dp
msrun --worker_num=2 --local_worker_num=2 --master_port=8118 bert_imdb_finetune_cpu_mindnlp_trainer_npus_same.py 

發現兩個NPU都被占用?

日志文件開始記錄模型訓練進度?

成功實現數據并行!?

基于MindSpore微調Roberta+數據并行

數據集:imdb影評數據集

微調代碼:roberta.py

#!/usr/bin/env python
# coding: utf-8
"""
unset MULTI_NPU && python bert_imdb_finetune_cpu_mindnlp_trainer_npus_same.py
bash bert_imdb_finetune_npu_mindnlp_trainer.sh
"""
import mindspore.dataset as ds
from mindnlp.dataset import load_dataset# loading dataset
imdb_ds = load_dataset('imdb', split=['train', 'test'])
imdb_train = imdb_ds['train']
imdb_test = imdb_ds['test']imdb_train.get_dataset_size()import numpy as npdef process_dataset(dataset, tokenizer, max_seq_len=512, batch_size=4, shuffle=False):is_ascend = mindspore.get_context('device_target') == 'Ascend'def tokenize(text):if is_ascend:tokenized = tokenizer(text, padding='max_length', truncation=True, max_length=max_seq_len)else:tokenized = tokenizer(text, truncation=True, max_length=max_seq_len)return tokenized['input_ids'], tokenized['attention_mask']if shuffle:dataset = dataset.shuffle(batch_size)# map datasetdataset = dataset.map(operations=[tokenize], input_columns="text", output_columns=['input_ids', 'attention_mask'])dataset = dataset.map(operations=transforms.TypeCast(mindspore.int32), input_columns="label", output_columns="labels")# batch datasetif is_ascend:dataset = dataset.batch(batch_size)else:dataset = dataset.padded_batch(batch_size, pad_info={'input_ids': (None, tokenizer.pad_token_id),'attention_mask': (None, 0)})return datasetfrom mindnlp.transformers import AutoTokenizer
import mindspore
import mindspore.dataset.transforms as transforms
# tokenizer
tokenizer = AutoTokenizer.from_pretrained('roberta-base')dataset_train = process_dataset(yelp_ds_train, tokenizer, shuffle=True)
from mindnlp.transformers import AutoModelForSequenceClassification# set bert config and define parameters for training
model = AutoModelForSequenceClassification.from_pretrained('AI-ModelScope/roberta-base', num_labels=2, mirror='modelscope')from mindnlp.engine import TrainingArgumentstraining_args = TrainingArguments(output_dir="./",save_strategy="epoch",logging_strategy="epoch",num_train_epochs=3,learning_rate=2e-5
)training_args = training_args.set_optimizer(name="adamw", beta1=0.8)from mindnlp.engine import Trainertrainer = Trainer(model=model,args=training_args,train_dataset=dataset_train
)print('start training')
trainer.train()

運行命令:

msrun --worker_num=2 --local_worker_num=2 --master_port=8118 roberta.py

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64988.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64988.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64988.shtml

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

相關文章

五類推理(邏輯推理、概率推理、圖推理、基于深度學習的推理)的開源庫 (一)

在開發中,有一些開源庫可以實現不同類型的推理,包括邏輯推理、概率推理、圖推理、基于深度學習的推理等。以下是五類推理(邏輯推理、概率推理、圖推理、基于深度學習的推理)的現成開源庫,它們各自的功能、特點和適用場…

高等數學學習筆記 ? 函數的極限

1. 函數的極限定義 備注:已知坐標軸上一點,則: ①:的鄰域:指附近的開區間,記作。 ②:的去心鄰域:指附近的開區間,但不包含,記作。 ③:的鄰域&…

Python用K-Means均值聚類、LRFMC模型對航空公司客戶數據價值可視化分析指標應用|數據分享...

全文鏈接:https://tecdat.cn/?p38708 分析師:Yuling Fang 信息時代的來臨使得企業營銷焦點從產品中心轉向客戶中心,客戶關系管理成為企業的核心問題(點擊文末“閱讀原文”獲取完整代碼數據)。 客戶關系管理的關鍵是客…

【前端系列】優化axios響應攔截器

文章目錄 一、前言🚀🚀🚀二、axios響應攔截器:??????2.1 為什么前端需要響應攔截器element ui的消息組件 一、前言🚀🚀🚀 ?? 回報不在行動之后,回報在行動之中。 這個系列可…

【 IEEE 獨立出版 · EI核心、Scopus穩定檢索 】第二屆算法、軟件工程與網絡安全國際學術會議(ASENS 2025)

ASENS 2025 第二屆算法、軟件工程與網絡安全國際學術會議 2025 2nd International Conference on Algorithms, Software Engineering and Network Security 中國 廣州 2025年3月21-23日 會議官網:www.ic-asens.org IEEE 獨立出版 EI核心、Scopus快速…

/ete/security/limits.conf參數詳解

/ete/security/limits.conf配置文件 內容如下: * soft nofile 65535 * hard nofile 65535參數詳解 *: 表示對所有用戶生效soft: 表示軟限制,即用戶可以通過ulimit命令自行調整該值hard: 表示硬限制,即用戶無法通過ulimit命令將該值調整超過…

#Vue3篇: 無感刷新token的原理JSESSIONID無感刷新和JWT接口刷新

基于這個后端是怎么更新token的 為了理解后端是如何更新 Token 的,我們需要考慮一個典型的基于 Token 的身份驗證流程,特別是涉及 JSESSIONID 和自定義 Token(如 JWT, JSON Web Token)的情況。 下面我將介紹兩種常見的更新 Token …

模塊化通訊管理機在物聯網系統中的應用

安科瑞劉鴻鵬 摘要 隨著能源結構轉型和智能化電網的推進,電力物聯網逐漸成為智能電網的重要組成部分。本文以安科瑞ANet系列智能通信管理機為例,探討其在電力物聯網中的應用,包括數據采集、規約轉換、邊緣計算、遠程控制等技術實踐&#…

Python基于Gradio可視化部署機器學習應用

Gradio 是一個用于快速創建機器學習模型和用戶界面之間交互的 Python 庫。它允許你無需編寫大量前端代碼,就能將機器學習模型部署為可交互的網頁應用。以下是一個基于 Gradio 可視化部署機器學習應用的基本步驟: 安裝 Gradio: 首先&#xff0…

Springboot使用RabbitMQ實現關閉超時訂單的一個簡單示例

1.maven中引入rabbitmq的依賴&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency> 2.application.yml中進行rabbitmq相關配置&#xff1a; # rabbit…

AE Pinnacle 10x6 kW DeviceNet MDXL User r Manual

AE Pinnacle 10x6 kW DeviceNet MDXL User r Manual

vscode中調用deepseek實現AI輔助編程

來自 Python大數據分析 費弗里 1 簡介 大家好我是費老師&#xff0c;最近國產大模型Deepseek v3新版本憑借其優秀的模型推理能力&#xff0c;討論度非常之高&#x1f525;&#xff0c;且其官網提供的相關大模型API接口服務價格一直走的“價格屠夫”路線&#xff0c;性價比很高…

慧集通iPaaS集成平臺低代碼培訓-基礎篇

訓練使用素材&#xff1a; 1.數據源&#xff1a; 單號業務日期工廠倉庫物料單位數量批次0100012022-5-1210031001030001kg500202304150100012022-5-1210031001030001kg122202304150100012022-5-1210031001030001kg1250202304150100012022-5-1210031001030002kg130202304110100…

在Linux下安裝部署Tomcat教程

摘要 Tomcat是由Apache開發的要給Servlet容器,實現了對Servlet 和JSP的支持,并提供了作為Web服務器的一些特有功能,如Tomcat管理和控制平臺,安全管理和Tomcat閥等。簡單來說,Tomcat是一個由WEB應用程序的托管平臺,可以讓用戶編寫的WEB應用程序,別Tomcat所托管,并提供網…

《探秘開源大模型:AI 世界的“超級引擎”》

《探秘開源大模型:AI 世界的“超級引擎”》 一、開源大模型崛起之路二、開源大模型發展歷程回顧(一)早期奠基:理論突破與初步實踐(二)快速發展:百花齊放的模型格局(三)當下態勢:走向成熟與多元融合三、開源大模型核心技術剖析(一)Transformer 架構:基石之穩(二)…

Leetcode打卡:我的日程安排表II

執行結果&#xff1a;通過 題目 731 我的日程安排表II 實現一個程序來存放你的日程安排。如果要添加的時間內不會導致三重預訂時&#xff0c;則可以存儲這個新的日程安排。 當三個日程安排有一些時間上的交叉時&#xff08;例如三個日程安排都在同一時間內&#xff09;&#…

實現一個通用的樹形結構構建工具

文章目錄 1. 前言2. 樹結構3. 具體實現邏輯3.1 TreeNode3.2 TreeUtils3.3 例子 4. 小結 1. 前言 樹結構的生成在項目中應該都比較常見&#xff0c;比如部門結構樹的生成&#xff0c;目錄結構樹的生成&#xff0c;但是大家有沒有想過&#xff0c;如果在一個項目中有多個樹結構&…

day30-awk進階

awk模式種類 awk的模式分為這幾種 正則表達式 基本正則擴展正則比較表達式范圍表達式特殊模式 BEGINEND awk比較運算符&#xff08;語法&#xff09; 關系運算符解釋示例<小于x<y<小于等于x<y等于xy!不等于x!y>大于等于x>y>大于x>y~匹配正則x~/正則…

大語言模型(LLM)一般訓練過程

大語言模型(LLM)一般訓練過程 數據收集與預處理 收集:從多種來源收集海量文本數據,如互聯網的新聞文章、博客、論壇,以及書籍、學術論文、社交媒體等,以涵蓋豐富的語言表達和知識領域。例如,訓練一個通用型的LLM時,可能會收集數十億甚至上百億字的文本數據.清洗:去除…

數據庫新建用戶后(Host:%),報錯:localhost無法連接

存在問題 在給數據庫&#xff08;MySQL、MariaDB等&#xff09;創建了新的用戶名&#xff08;eg&#xff1a;maxscale&#xff09;后&#xff0c;無法使用新用戶名登錄&#xff0c;并報如下錯誤&#xff1a;ERROR 1045 (28000): Access denied for user maxscalelocalhost (us…