0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深度學(xué)習(xí)框架DeepSpeed使用指南

科技綠洲 ? 來源:Python實(shí)用寶典 ? 作者:Python實(shí)用寶典 ? 2023-10-30 10:09 ? 次閱讀

最常見的深度學(xué)習(xí)框架應(yīng)該是TensorFlow、Pytorch、Keras,但是這些框架在面向大規(guī)模模型的時(shí)候都不是很方便。

比如Pytorch的分布式并行計(jì)算框架(Distributed Data Parallel,簡(jiǎn)稱DDP),它也僅僅是能將數(shù)據(jù)并行,放到各個(gè)GPU的模型上進(jìn)行訓(xùn)練。

圖片

也就是說,DDP的應(yīng)用場(chǎng)景在你的模型大小大于顯卡顯存大小時(shí),它就無法使用了,除非你自己再將模型參數(shù)拆散分散到各個(gè)GPU上。

今天要給大家介紹的DeepSpeed,它就能實(shí)現(xiàn)這個(gè)拆散功能,它通過將模型參數(shù)拆散分布到各個(gè)GPU上,以實(shí)現(xiàn)大型模型的計(jì)算,彌補(bǔ)了DDP的缺點(diǎn),非常方便,這也就意味著我們能用更少的GPU訓(xùn)練更大的模型,而且不受限于顯存。

圖片

DeepSpeed入門并不簡(jiǎn)單,盡管是微軟開源的框架,文檔卻寫的一般,缺少條理性,也沒有從零到一的使用示例。下面我就簡(jiǎn)單介紹一下怎么使用DeepSpeed這個(gè)框架。

1.準(zhǔn)備

開始之前,你要確保Pythonpip已經(jīng)成功安裝在電腦上,如果沒有,可以訪問這篇文章:超詳細(xì)Python安裝指南 進(jìn)行安裝。

**(可選1) **如果你用Python的目的是數(shù)據(jù)分析,可以直接安裝Anaconda:Python數(shù)據(jù)分析與挖掘好幫手—Anaconda,它內(nèi)置了Python和pip.

**(可選2) **此外,推薦大家用VSCode編輯器,它有許多的優(yōu)點(diǎn):Python 編程的最好搭檔—VSCode 詳細(xì)指南。

請(qǐng)選擇以下任一種方式輸入命令安裝依賴

  1. Windows 環(huán)境 打開 Cmd (開始-運(yùn)行-CMD)。
  2. MacOS 環(huán)境 打開 Terminal (command+空格輸入Terminal)。
  3. 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install deepspeed

此外,你還需要下載 Pytorch,在官網(wǎng)選擇自己對(duì)應(yīng)的系統(tǒng)版本和環(huán)境,按照指示安裝即可:

https://pytorch.org/get-started/locally/

圖片

2.使用 DeepSpeed

使用DeepSpeed其實(shí)和寫一個(gè)pytorch模型只有部分區(qū)別,一開始的流程是一樣的。

2.1 載入數(shù)據(jù)集:

import torch
import torchvision
import torchvision.transforms as transforms

trainset = torchvision.datasets.CIFAR10(root='./data',
                                        train=True,
                                        download=True,
                                        transform=transform)
trainloader = torch.utils.data.DataLoader(trainset,
                                          batch_size=16,
                                          shuffle=True,
                                          num_workers=2)
testset = torchvision.datasets.CIFAR10(root='./data',
                                       train=False,
                                       download=True,
                                       transform=transform)
testloader = torch.utils.data.DataLoader(testset,
                                         batch_size=4,
                                         shuffle=False,
                                         num_workers=2)

2.2 編寫模型:

import torch.nn as nn
import torch.nn.functional as F


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

net = Net()
criterion = nn.CrossEntropyLoss()

這里我寫了一個(gè)非常簡(jiǎn)單的模型作測(cè)試。

2.3 初始化Deepspeed

DeepSpeed 通過輸入?yún)?shù)來啟動(dòng)訓(xùn)練,因此需要使用argparse解析參數(shù):

import argparse


def add_argument():
    parser = argparse.ArgumentParser(description='CIFAR')
    parser.add_argument('-b',
                        '--batch_size',
                        default=32,
                        type=int,
                        help='mini-batch size (default: 32)')
    parser.add_argument('-e',
                        '--epochs',
                        default=30,
                        type=int,
                        help='number of total epochs (default: 30)')
    parser.add_argument('--local_rank',
                        type=int,
                        default=-1,
                        help='local rank passed from distributed launcher')

    parser.add_argument('--log-interval',
                        type=int,
                        default=2000,
                        help="output logging information at a given interval")

    parser = deepspeed.add_config_arguments(parser)
    args = parser.parse_args()
    return args

此外,模型初始化的時(shí)候除了參數(shù),還需要model及其parameters,還有訓(xùn)練集:

args = add_argument()
net = Net()
parameters = filter(lambda p: p.requires_grad, net.parameters())
model_engine, optimizer, trainloader, __ = deepspeed.initialize(
    args=args, model=net, model_parameters=parameters, training_data=trainset)

2.4 訓(xùn)練邏輯

下面的部分和我們平時(shí)訓(xùn)練模型是幾乎一樣的代碼,請(qǐng)注意 local_rank 是你不需要管的參數(shù),在后面啟動(dòng)模型訓(xùn)練的時(shí)候,DeepSpeed會(huì)自動(dòng)給這個(gè)參數(shù)賦值。

for epoch in range(2):
    running_loss = 0.0
    for i, data in enumerate(trainloader):
        inputs, labels = data[0].to(model_engine.local_rank), data[1].to(
            model_engine.local_rank)
        outputs = model_engine(inputs)
        loss = criterion(outputs, labels)
        model_engine.backward(loss)
        model_engine.step()

        # print statistics
        running_loss += loss.item()
        if i % args.log_interval == (args.log_interval - 1):
            print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / args.log_interval))
            running_loss = 0.0

2.5 測(cè)試邏輯

模型測(cè)試和模型訓(xùn)練的邏輯類似:

correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data
        outputs = net(images.to(model_engine.local_rank))
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels.to(
            model_engine.local_rank)).sum().item()

print('Accuracy of the network on the 10000 test images: %d %%' %
      (100 * correct / total))

2.6 編寫模型參數(shù)

在當(dāng)前目錄下新建一個(gè) config.json 里面寫好我們的調(diào)優(yōu)器、訓(xùn)練batch等參數(shù):

{
   "train_batch_size": 4,
   "steps_per_print": 2000,
   "optimizer": {
     "type": "Adam",
     "params": {
       "lr": 0.001,
       "betas": [
         0.8,
         0.999
       ],
       "eps": 1e-8,
       "weight_decay": 3e-7
     }
   },
   "scheduler": {
     "type": "WarmupLR",
     "params": {
       "warmup_min_lr": 0,
       "warmup_max_lr": 0.001,
       "warmup_num_steps": 1000
     }
   },
   "wall_clock_breakdown": false
 }

完整的開發(fā)流程就結(jié)束了,可以看到其實(shí)和我們平時(shí)使用pytorch開發(fā)模型的區(qū)別不大,就是在初始化的時(shí)候使用 DeepSpeed,并以輸入?yún)?shù)的形式初始化。

完整代碼可以在Python實(shí)用寶典后臺(tái)回復(fù) **Deepspeed **下載。

3. 測(cè)試代碼

現(xiàn)在就來測(cè)試我們上面的代碼能不能正常運(yùn)行。

在這里,我們需要用環(huán)境變量控制使用的GPU,比如我的機(jī)器有10張GPU,我只使用6, 7, 8, 9號(hào)GPU,輸入命令:

export CUDA_VISIBLE_DEVICES="6,7,8,9"

然后開始運(yùn)行代碼:

deepspeed test.py --deepspeed_config config.json

看到下面的輸出說明開始正常運(yùn)行,在下載數(shù)據(jù)了:

圖片

開始訓(xùn)練的時(shí)候 DeepSpeed 通常會(huì)打印更多的訓(xùn)練細(xì)節(jié)供用戶監(jiān)控,包括訓(xùn)練設(shè)置、性能統(tǒng)計(jì)和損失趨勢(shì),效果類似于:

worker-0: [INFO 2020-02-06 20:35:23] 0/24550, SamplesPerSec=1284.4954513975558
worker-0: [INFO 2020-02-06 20:35:23] 0/24600, SamplesPerSec=1284.384033658866
worker-0: [INFO 2020-02-06 20:35:23] 0/24650, SamplesPerSec=1284.4433482972925
worker-0: [INFO 2020-02-06 20:35:23] 0/24700, SamplesPerSec=1284.4664449792422
worker-0: [INFO 2020-02-06 20:35:23] 0/24750, SamplesPerSec=1284.4950124403447
worker-0: [INFO 2020-02-06 20:35:23] 0/24800, SamplesPerSec=1284.4756105952233
worker-0: [INFO 2020-02-06 20:35:24] 0/24850, SamplesPerSec=1284.5251526215386
worker-0: [INFO 2020-02-06 20:35:24] 0/24900, SamplesPerSec=1284.531217073863
worker-0: [INFO 2020-02-06 20:35:24] 0/24950, SamplesPerSec=1284.5125323220368
worker-0: [INFO 2020-02-06 20:35:24] 0/25000, SamplesPerSec=1284.5698818883018
worker-0: Finished Training
worker-0: GroundTruth: cat ship ship plane
worker-0: Predicted: cat car car plane
worker-0: Accuracy of the network on the 10000 test images: 57 %

當(dāng)你運(yùn)行到最后,出現(xiàn)了這樣的輸出,恭喜你,完成了你的第一個(gè) DeepSpeed 模型,可以開始你的大規(guī)模訓(xùn)練之路了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • gpu
    gpu
    +關(guān)注

    關(guān)注

    28

    文章

    4761

    瀏覽量

    129140
  • 顯存
    +關(guān)注

    關(guān)注

    0

    文章

    110

    瀏覽量

    13680
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3279

    瀏覽量

    48976
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5510

    瀏覽量

    121345
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Nanopi深度學(xué)習(xí)之路(1)深度學(xué)習(xí)框架分析

    就能實(shí)現(xiàn)!還請(qǐng)關(guān)注我后面的日記。實(shí)際上我也是剛剛有時(shí)間學(xué)習(xí)深度學(xué)習(xí),我是個(gè)純初學(xué)者,但面對(duì)深度學(xué)習(xí)里的各種復(fù)雜理論和公式推導(dǎo),自己實(shí)現(xiàn)個(gè)小功
    發(fā)表于 06-04 22:32

    主流深度學(xué)習(xí)框架比較

    DL:主流深度學(xué)習(xí)框架多個(gè)方向PK比較
    發(fā)表于 12-26 11:10

    深度學(xué)習(xí)框架只為GPU?

    CPU優(yōu)化深度學(xué)習(xí)框架和函數(shù)庫機(jī)器學(xué)***器
    發(fā)表于 02-22 06:01

    深度學(xué)習(xí)算法和應(yīng)用涌現(xiàn)的背后,是各種各樣的深度學(xué)習(xí)工具和框架

    回顧深度學(xué)習(xí)框架的演變,我們可以清楚地看到深度學(xué)習(xí)框架深度
    的頭像 發(fā)表于 01-21 13:46 ?2775次閱讀

    深度學(xué)習(xí)框架pytorch入門與實(shí)踐

    深度學(xué)習(xí)框架pytorch入門與實(shí)踐 深度學(xué)習(xí)是機(jī)器學(xué)習(xí)中的一個(gè)分支,它使用多層神經(jīng)網(wǎng)絡(luò)對(duì)大量數(shù)
    的頭像 發(fā)表于 08-17 16:03 ?1627次閱讀

    深度學(xué)習(xí)框架是什么?深度學(xué)習(xí)框架有哪些?

    深度學(xué)習(xí)框架是什么?深度學(xué)習(xí)框架有哪些?? 深度
    的頭像 發(fā)表于 08-17 16:03 ?2820次閱讀

    深度學(xué)習(xí)框架區(qū)分訓(xùn)練還是推理嗎

    深度學(xué)習(xí)框架區(qū)分訓(xùn)練還是推理嗎 深度學(xué)習(xí)框架是一個(gè)非常重要的技術(shù),它們能夠加速
    的頭像 發(fā)表于 08-17 16:03 ?1412次閱讀

    深度學(xué)習(xí)框架的作用是什么

    深度學(xué)習(xí)框架的作用是什么 深度學(xué)習(xí)是一種計(jì)算機(jī)技術(shù),它利用人工神經(jīng)網(wǎng)絡(luò)來模擬人類的學(xué)習(xí)過程。由于
    的頭像 發(fā)表于 08-17 16:10 ?1600次閱讀

    深度學(xué)習(xí)框架tensorflow介紹

    深度學(xué)習(xí)框架tensorflow介紹 深度學(xué)習(xí)框架TensorFlow簡(jiǎn)介
    的頭像 發(fā)表于 08-17 16:11 ?2563次閱讀

    深度學(xué)習(xí)算法庫框架學(xué)習(xí)

    深度學(xué)習(xí)算法庫框架學(xué)習(xí) 深度學(xué)習(xí)是一種非常強(qiáng)大的機(jī)器學(xué)習(xí)
    的頭像 發(fā)表于 08-17 16:11 ?721次閱讀

    深度學(xué)習(xí)框架對(duì)照表

    深度學(xué)習(xí)框架對(duì)照表? 隨著人工智能技術(shù)的發(fā)展,深度學(xué)習(xí)正在成為當(dāng)今最熱門的研究領(lǐng)域之一。而深度
    的頭像 發(fā)表于 08-17 16:11 ?835次閱讀

    深度學(xué)習(xí)框架連接技術(shù)

    深度學(xué)習(xí)框架連接技術(shù) 深度學(xué)習(xí)框架是一個(gè)能夠幫助機(jī)器學(xué)習(xí)
    的頭像 發(fā)表于 08-17 16:11 ?795次閱讀

    深度學(xué)習(xí)cntk框架介紹

    深度學(xué)習(xí)cntk框架介紹? 深度學(xué)習(xí)是最近幾年來非常熱門的話題,它正在徹底改變我們生活和工作的方式。隨著越來越多的創(chuàng)新和發(fā)展,人工智能和機(jī)器
    的頭像 發(fā)表于 08-17 16:11 ?1417次閱讀

    深度學(xué)習(xí)框架深度學(xué)習(xí)算法教程

    深度學(xué)習(xí)框架深度學(xué)習(xí)算法教程 深度學(xué)習(xí)是機(jī)器
    的頭像 發(fā)表于 08-17 16:11 ?1105次閱讀

    TensorFlow與PyTorch深度學(xué)習(xí)框架的比較與選擇

    深度學(xué)習(xí)作為人工智能領(lǐng)域的一個(gè)重要分支,在過去十年中取得了顯著的進(jìn)展。在構(gòu)建和訓(xùn)練深度學(xué)習(xí)模型的過程中,深度
    的頭像 發(fā)表于 07-02 14:04 ?1017次閱讀