<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          使用 PyTorch 進(jìn)行分布式訓(xùn)練

          共 6607字,需瀏覽 14分鐘

           ·

          2021-07-10 05:48


          點(diǎn)擊下方AI算法與圖像處理”,一起進(jìn)步!

          重磅干貨,第一時(shí)間送達(dá)

          引言

          在本教程中,您將學(xué)習(xí)如何在單個(gè)節(jié)點(diǎn)上跨多個(gè) GPU 并行 ML 模型訓(xùn)練的實(shí)踐方面。您還將學(xué)習(xí) PyTorch 的分布式數(shù)據(jù)并行框架的基礎(chǔ)知識(shí)。

          學(xué)習(xí)之前,我們先了解一下什么是DDP。

          什么是 DDP?

          DDP 是 PyTorch 中的一個(gè)庫,它支持跨多個(gè)設(shè)備的梯度同步。這意味著什么?這意味著您可以通過跨多個(gè) GPU并行處理幾乎線性地加快模型訓(xùn)練。換句話說,在一臺(tái)有兩個(gè) GPU 的機(jī)器上訓(xùn)練這個(gè)模型比在一個(gè) GPU 上訓(xùn)練要節(jié)約大約一半的時(shí)間。許多云計(jì)算提供商,如 AWS 和 GCP,都提供多 gpu 計(jì)算機(jī)。例如,AWS 中的 ml.p2.8 xlarge 實(shí)例具有8個(gè) GPU。它不是嚴(yán)格的線性的,因?yàn)閺亩鄠€(gè)設(shè)備收集張量的性能開銷很小。

          DDP 同樣支持分布在多個(gè)獨(dú)立主機(jī)上的訓(xùn)練,這樣的設(shè)置超出了本教程的范圍。

          它是如何工作的?

          DDP 的工作原理是為每個(gè) GPU 創(chuàng)建一個(gè)單獨(dú)的 Python 進(jìn)程。每個(gè)進(jìn)程都使用一個(gè)不重疊的數(shù)據(jù)子集。注意,最多只能在一個(gè) GPU 上運(yùn)行一個(gè) DDP 進(jìn)程。也就是說,機(jī)器上可用的 DDP 進(jìn)程可能少于 GPU。在這種情況下,一些 gpu 將繼續(xù)未使用。對于一個(gè)腳本,不可能有比 GPU 更多的進(jìn)程。

          PyTorch 提供了產(chǎn)生多個(gè)進(jìn)程的工具,以及將數(shù)據(jù)集分割成不重疊的子集的工具。

          如果您有興趣了解關(guān)于 DDP 實(shí)現(xiàn)的更多細(xì)節(jié),請隨意瀏覽 DDP 設(shè)計(jì)文檔:https://pytorch.org/docs/master/notes/ddp.html

          術(shù)語

          在我們開始之前,讓我們熟悉一些 DDP 的概念:

          size:進(jìn)行訓(xùn)練的 GPU 設(shè)備的數(shù)量

          rank:對GPU設(shè)備有一個(gè)序列的id號


          DDP 使您的腳本可以通過命令行參數(shù)獲得 rank 值。可以通過 torch.cuda.device_count()獲得 size,前提是您希望使用所有可用的 GPU。

          準(zhǔn)備數(shù)據(jù)集

          讓我們從學(xué)習(xí)如何使用 PyTorch 將數(shù)據(jù)集拆分為不重疊的子集開始。首先,讓我們看看如何創(chuàng)建簡單的非分布式數(shù)據(jù)集:
          # Download and initialize MNIST train datasettrain_dataset = datasets.MNIST('./mnist_data',                               download=True,                               train=True)# Wrap train dataset into DataLoadertrain_loader = DataLoader(train_dataset,                          batch_size=batch_size,                          shuffle=True,                          num_workers=4,                          pin_memory=True)
          創(chuàng)建一個(gè)分布式的數(shù)據(jù)加載器,可以使用 torch.utils.data.DistributedSampler:
          # Download and initialize MNIST train datasettrain_dataset = datasets.MNIST('./mnist_data',                               download=True,                               train=True,                               transform=transform)# Create distributed sampler pinned to ranksampler = DistributedSampler(train_dataset,                             num_replicas=world_size,                             rank=rank,                             shuffle=True,  # May be True                             seed=42)# Wrap train dataset into DataLoadertrain_loader = DataLoader(train_dataset,                          batch_size=batch_size,                          shuffle=False,  # Must be False!                          num_workers=4,                          sampler=sampler,                          pin_memory=True)
          我們創(chuàng)建 DisstributedSampler 并將其傳遞給 DataLoader。在 DataLoader 上設(shè)置 shuffle = False 以避免混亂子集是至關(guān)重要的。Shuffle 過程是由采樣器完成的,所以你可能想要設(shè)置 shuffle = True。

          準(zhǔn)備模型

          下面是一個(gè)在單個(gè)設(shè)備環(huán)境中如何初始化模型的例子:
          def create_model():    model = nn.Sequential(        nn.Linear(28*28, 128),  # MNIST images are 28x28 pixels        nn.ReLU(),        nn.Dropout(0.2),        nn.Linear(128, 128),        nn.ReLU(),        nn.Linear(128, 10, bias=False)  # 10 classes to predict    )    return model# Initialize the modelmodel = create_model()
          為了使其在多 GPU 環(huán)境中工作,需要進(jìn)行以下修改:
          # Initialize the modelmodel = create_model()# Create CUDA devicedevice = torch.device(f'cuda:{rank}')# Send model parameters to the devicemodel = model.to(device)# Wrap the model in DDP wrappermodel = DistributedDataParallel(model, device_ids=[rank], output_device=rank)
          訓(xùn)練周期

          單設(shè)備訓(xùn)練周期的代碼類似于:
          for i in range(epochs):    for x, y in train_loader:        # do the training        ...
          在多 GPU 環(huán)境下,采樣器必須知道哪個(gè) epoch:
          for i in range(epochs):    train_loader.sampler.set_epoch(i)    for x, y in train_loader:        # do the training        ...
          從命令行參數(shù)獲取rank

          DDP 會(huì)將 -- local-rank 參數(shù)傳遞給你的腳本。你可以這樣解析:
          parser = argparse.ArgumentParser()parser.add_argument("--local_rank", type=int)args = parser.parse_args()rank = args.local_rank
          保存模型

          在每個(gè) GPU 上保存模型參數(shù)的副本,所以你應(yīng)該只保存一次模型:
          if rank == 0:    torch.save(model.module.state_dict(), 'model.pt')
          啟動(dòng)腳本

          DDP 提供了一個(gè)啟動(dòng)實(shí)用程序,您可以使用它產(chǎn)生多個(gè)進(jìn)程。如果你的機(jī)器有4個(gè) GPU 可用,一個(gè)命令行看起來像這樣:
          python -m torch.distributed.launch --nproc_per_node=4 ddp_tutorial_multi_gpu.py
          注意,這里沒有明確指定 -- local-rank。在調(diào)用腳本之前,PyTorch 會(huì)自動(dòng)將其添加到命令行中。

          確保它起作用

          有幾個(gè)簡單的命令可以告訴你你的實(shí)現(xiàn)是正確的:

          1. 打印數(shù)據(jù)加載程序的長度len(train_loader) .例如,您的數(shù)據(jù)集有10,000個(gè)示例,批量大小為100。這意味著數(shù)據(jù)加載器將有10,000/100 = 1,000個(gè)批次。這將是只使用一個(gè)設(shè)備時(shí)數(shù)據(jù)加載程序的長度。然而,在 DDP 中,這個(gè)數(shù)字將被設(shè)備的數(shù)量除以。因此,如果您使用相同的數(shù)據(jù)集和設(shè)置,但在2個(gè) GPU 上進(jìn)行訓(xùn)練,數(shù)據(jù)加載程序的長度將為1,000/2 = 500。

          2. 使用 nvidia-smi 工具來監(jiān)控 GPU 的使用。如果您的實(shí)現(xiàn)是正確的,那么您應(yīng)該看到所有的 GPU 或多或少都得到了同樣的使用。

          努力分享優(yōu)質(zhì)的計(jì)算機(jī)視覺相關(guān)內(nèi)容,歡迎關(guān)注:

                 
          個(gè)人微信(如果沒有備注不拉群!
          請注明:地區(qū)+學(xué)校/企業(yè)+研究方向+昵稱



          下載1:何愷明頂會(huì)分享


          AI算法與圖像處理」公眾號后臺(tái)回復(fù):何愷明,即可下載。總共有6份PDF,涉及 ResNet、Mask RCNN等經(jīng)典工作的總結(jié)分析


          下載2:終身受益的編程指南:Google編程風(fēng)格指南


          AI算法與圖像處理」公眾號后臺(tái)回復(fù):c++,即可下載。歷經(jīng)十年考驗(yàn),最權(quán)威的編程規(guī)范!



               
          下載3 CVPR2021

          AI算法與圖像處公眾號后臺(tái)回復(fù):CVPR即可下載1467篇CVPR 2020論文 和 CVPR 2021 最新論文

          點(diǎn)亮 ,告訴大家你也在看

          瀏覽 31
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美视频在线网址 | 亲子乱AV一区二区 | 精品黄色| 国产无码在线影院 | 美国 日本 韩国三级三级三级黄色A在线播放 |