欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

pytorch中關(guān)于distributedsampler函數(shù)的使用

 更新時間:2023年02月02日 14:06:49   作者:DRACO于  
這篇文章主要介紹了pytorch中關(guān)于distributedsampler函數(shù)的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

關(guān)于distributedsampler函數(shù)的使用

1.如何使用這個分布式采樣器

在使用distributedsampler函數(shù)時,觀察loss發(fā)現(xiàn)loss收斂有規(guī)律,發(fā)現(xiàn)是按順序讀取數(shù)據(jù),未進行shuffle。

問題的解決方式就是懷疑 seed 有問題,參考源碼 DistributedSampler,發(fā)現(xiàn) shuffle 的結(jié)果依賴 g.manual_seed(self.epoch) 中的 self.epoch。

    def __iter__(self):
        # deterministically shuffle based on epoch
        g = torch.Generator()
        g.manual_seed(self.epoch)
        if self.shuffle:
            indices = torch.randperm(len(self.dataset), generator=g).tolist()
        else:
            indices = list(range(len(self.dataset)))
 
 
        # add extra samples to make it evenly divisible
        indices += indices[:(self.total_size - len(indices))]
        assert len(indices) == self.total_size
 
        # subsample
        indices = indices[self.rank:self.total_size:self.num_replicas]
        assert len(indices) == self.num_samples
 
        return iter(indices)

而 self.epoch 初始默認是 0

        self.dataset = dataset
        self.num_replicas = num_replicas
        self.rank = rank
        self.epoch = 0
        self.num_samples = int(math.ceil(len(self.dataset) * 1.0 / self.num_replicas))
        self.total_size = self.num_samples * self.num_replicas
        self.shuffle = shuffle

但是 DistributedSampler 也提供了一個 set 函數(shù)來改變 self.epoch

def set_epoch(self, epoch):
    self.epoch = epoch

所以在運行的時候要不斷調(diào)用這個 set_epoch 函數(shù)。只要把我的代碼中的

# sampler.set_epoch(e)

全部代碼如下:

import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader
from torch.utils.data.distributed import DistributedSampler
 
 
torch.distributed.init_process_group(backend="nccl")
 
input_size = 5
output_size = 2
batch_size = 2
data_size = 16
 
local_rank = torch.distributed.get_rank()
torch.cuda.set_device(local_rank)
device = torch.device("cuda", local_rank)
 
class RandomDataset(Dataset):
    def __init__(self, size, length, local_rank):
        self.len = length
        self.data = torch.stack([torch.ones(5), torch.ones(5)*2,
                                 torch.ones(5)*3,torch.ones(5)*4,
                                 torch.ones(5)*5,torch.ones(5)*6,
                                 torch.ones(5)*7,torch.ones(5)*8,
                                 torch.ones(5)*9, torch.ones(5)*10,
                                 torch.ones(5)*11,torch.ones(5)*12,
                                 torch.ones(5)*13,torch.ones(5)*14,
                                 torch.ones(5)*15,torch.ones(5)*16]).to('cuda')
 
        self.local_rank = local_rank
    def __getitem__(self, index):
 
        return self.data[index]
 
    def __len__(self):
        return self.len
    
dataset = RandomDataset(input_size, data_size, local_rank)
sampler = DistributedSampler(dataset)
rand_loader = DataLoader(dataset=dataset,
                         batch_size=batch_size,
                         sampler=sampler)
 
e = 0
while e < 2:
    t = 0
    # sampler.set_epoch(e)
    for data in rand_loader:
        print(data)
    e+=1

運行:

CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.launch --nproc_per_node=2 test.py

2.關(guān)于用不用這個采樣器的區(qū)別

多卡去訓(xùn)模型,嘗試著用DDP模式,而不是DP模式去加速訓(xùn)練(很容易出現(xiàn)負載不均衡的情況)。

遇到了一點關(guān)于DistributedSampler這個采樣器的一點疑惑,想試驗下在DDP模式下,使用這個采樣器和不使用這個采樣器有什么區(qū)別。

實驗代碼:

整個數(shù)據(jù)集大小為8,batch_size 為4,總共跑2個epoch。

import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader
from torch.utils.data.distributed import DistributedSampler
torch.distributed.init_process_group(backend="nccl")
 
batch_size = 4
data_size = 8
 
local_rank = torch.distributed.get_rank()
print(local_rank)
torch.cuda.set_device(local_rank)
device = torch.device("cuda", local_rank)
 
class RandomDataset(Dataset):
        def __init__(self, length, local_rank):
            self.len = length
            self.data = torch.stack([torch.ones(1), torch.ones(1)*2,torch.ones(1)*3,torch.ones(1)*4,torch.ones(1)*5,torch.ones(1)*6,torch.ones(1)*7,torch.ones(1)*8]).to('cuda')
            self.local_rank = local_rank
        def __getitem__(self, index):
            return self.data[index]
        def __len__(self):
            return self.len
 
dataset = RandomDataset(data_size, local_rank)
sampler = DistributedSampler(dataset)
 
#rand_loader =DataLoader(dataset=dataset,batch_size=batch_size,sampler=None,shuffle=True)
rand_loader = DataLoader(dataset=dataset,batch_size=batch_size,sampler=sampler)
epoch = 0
while epoch < 2:
    sampler.set_epoch(epoch)
    for data in rand_loader:
            print(data)
    epoch+=1

運行命令: 

CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.launch --nproc_per_node=2 test.py

實驗結(jié)果:

結(jié)論分析:上面的運行結(jié)果來看,在一個epoch中,sampler相當(dāng)于把整個數(shù)據(jù)集 劃分成了nproc_per_node份,每個GPU每次得到batch_size的數(shù)量,也就是nproc_per_node 個GPU分一整份數(shù)據(jù)集,總數(shù)據(jù)量大小就為1個dataset。

如果不用它里面自帶的sampler,單純的還是按照我們一般的形式。Sampler=None,shuffle=True這種,那么結(jié)果將會是下面這樣的:

結(jié)果分析:沒用sampler的話,在一個epoch中,每個GPU各自維護著一份數(shù)據(jù),每個GPU每次得到的batch_size的數(shù)據(jù),總的數(shù)據(jù)量為2個dataset,

總結(jié)

一般的形式的dataset只能在同進程中進行采樣分發(fā),也就是為什么圖2只能單GPU維護自己的dataset,DDP中的sampler可以對不同進程進行分發(fā)數(shù)據(jù),圖1,可以夸不同進程(GPU)進行分發(fā)。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python request設(shè)置HTTPS代理代碼解析

    Python request設(shè)置HTTPS代理代碼解析

    這篇文章主要介紹了Python request設(shè)置HTTPS代理代碼解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • python實現(xiàn)圖片變亮或者變暗的方法

    python實現(xiàn)圖片變亮或者變暗的方法

    這篇文章主要介紹了python實現(xiàn)圖片變亮或者變暗的方法,涉及Python中Image模塊操作圖片的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • python代碼區(qū)分大小寫嗎

    python代碼區(qū)分大小寫嗎

    在本篇文章里小編給大家整理了一篇關(guān)于python是否區(qū)分大小寫的相關(guān)內(nèi)容,對此有疑惑的新手們來學(xué)習(xí)下吧。
    2020-06-06
  • python+pyqt5編寫md5生成器

    python+pyqt5編寫md5生成器

    這篇文章主要為大家詳細介紹了python+pyqt5編寫md5生成器,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • 忘記ftp密碼的解決方法示例

    忘記ftp密碼的解決方法示例

    忘記ftp密碼了怎么辦?下面介紹一個使用python ftplib庫的方法,大家參考使用吧
    2014-01-01
  • Numpy 將二維圖像矩陣轉(zhuǎn)換為一維向量的方法

    Numpy 將二維圖像矩陣轉(zhuǎn)換為一維向量的方法

    今天小編就為大家分享一篇Numpy 將二維圖像矩陣轉(zhuǎn)換為一維向量的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • 關(guān)于數(shù)據(jù)分析之滾動窗口pandas.DataFrame.rolling方法

    關(guān)于數(shù)據(jù)分析之滾動窗口pandas.DataFrame.rolling方法

    Pandas庫中的rolling方法是數(shù)據(jù)處理中常用的功能,它允許用戶對數(shù)據(jù)進行滾動窗口(滑動窗口)操作,通過指定窗口大小,可以使用不同的聚合函數(shù)對窗口內(nèi)的數(shù)據(jù)進行計算,例如最大值、最小值、平均值、中位數(shù)等,此外,rolling方法還可以計算方差、標準差、偏度、峰度
    2024-09-09
  • Pygame坦克大戰(zhàn)游戲開發(fā)實戰(zhàn)詳解代碼

    Pygame坦克大戰(zhàn)游戲開發(fā)實戰(zhàn)詳解代碼

    《坦克大戰(zhàn)》以二戰(zhàn)坦克為題材,既保留了射擊類游戲的操作性,也改進了射擊類游戲太過于復(fù)雜難玩的高門檻特點,集休閑與競技于一身。經(jīng)典再度襲來,流暢的畫面,瘋狂的戰(zhàn)斗,讓玩家再次進入瘋狂坦克的世界。玩家的目標是控制坦克躲避危險,消滅掉所有的敵人即可進入下一關(guān)
    2022-02-02
  • python 利用turtle模塊畫出沒有角的方格

    python 利用turtle模塊畫出沒有角的方格

    今天小編就為大家分享一篇python 利用turtle模塊畫出沒有角的方格,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • 整理Python最基本的操作字典的方法

    整理Python最基本的操作字典的方法

    這篇文章主要介紹了整理Python最基本的操作字典的方法,是Python學(xué)習(xí)中最基礎(chǔ)的內(nèi)容,需要的朋友可以參考下
    2015-04-04

最新評論