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

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

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

有關(guān)batch size的設(shè)置范圍

OpenCV學(xué)堂 ? 來源:機(jī)器之心 ? 作者:機(jī)器之心 ? 2022-07-12 10:15 ? 次閱讀

有關(guān) batch size 的設(shè)置范圍,其實(shí)不必那么拘謹(jǐn)。

我們知道,batch size 決定了深度學(xué)習(xí)訓(xùn)練過程中,完成每個(gè) epoch 所需的時(shí)間和每次迭代(iteration)之間梯度的平滑程度。batch size 越大,訓(xùn)練速度則越快,內(nèi)存占用更大,但收斂變慢。

又有一些理論說,GPU 對(duì) 2 的冪次的 batch 可以發(fā)揮更好性能,因此設(shè)置成 16、32、64、128 … 時(shí),往往要比設(shè)置為其他倍數(shù)時(shí)表現(xiàn)更優(yōu)。

后者是否是一種玄學(xué)?似乎很少有人驗(yàn)證過。最近,威斯康星大學(xué)麥迪遜分校助理教授,著名機(jī)器學(xué)習(xí)博主 Sebastian Raschka 對(duì)此進(jìn)行了一番認(rèn)真的討論。

Sebastian Raschka

關(guān)于神經(jīng)網(wǎng)絡(luò)訓(xùn)練,我認(rèn)為我們都犯了這樣的錯(cuò)誤:我們選擇批量大小為 2 的冪,即 64、128、256、512、1024 等等。(這里,batch size 是指當(dāng)我們通過基于隨機(jī)梯度下降的優(yōu)化算法訓(xùn)練具有反向傳播的神經(jīng)網(wǎng)絡(luò)時(shí),每個(gè) minibatch 中的訓(xùn)練示例數(shù)。)

據(jù)稱,我們這樣做是出于習(xí)慣,因?yàn)檫@是一個(gè)標(biāo)準(zhǔn)慣例。這是因?yàn)槲覀冊(cè)?jīng)被告知,將批量大小選擇為 2 的冪有助于從計(jì)算角度提高訓(xùn)練效率。

這有一些有效的理論依據(jù),但它在實(shí)踐中是如何實(shí)現(xiàn)的呢?在過去的幾天里,我們對(duì)此進(jìn)行了一些討論,在這里我想寫下一些要點(diǎn),以便將來參考。我希望你也會(huì)發(fā)現(xiàn)這很有幫助!

理論背景

在看實(shí)際基準(zhǔn)測(cè)試結(jié)果之前,讓我們簡要回顧一下將批大小選擇為 2 的冪的主要思想。以下兩個(gè)小節(jié)將簡要強(qiáng)調(diào)兩個(gè)主要論點(diǎn):內(nèi)存對(duì)齊和浮點(diǎn)效率。

內(nèi)存對(duì)齊

選擇批大小為 2 的冪的主要論據(jù)之一是 CPU 和 GPU 內(nèi)存架構(gòu)是以 2 的冪進(jìn)行組織的?;蛘吒鼫?zhǔn)確地說,存在內(nèi)存頁的概念,它本質(zhì)上是一個(gè)連續(xù)的內(nèi)存塊。如果你使用的是 macOS 或 Linux,就可以通過在終端中執(zhí)行 getconf PAGESIZE 來檢查頁面大小,它應(yīng)該會(huì)返回一個(gè) 2 的冪的數(shù)字。

0aded8f6-0125-11ed-ba43-dac502259ad0.png

這個(gè)想法是將一個(gè)或多個(gè)批次整齊地放在一個(gè)頁面上,以幫助 GPU 并行處理?;蛘邠Q句話說,我們選擇批大小為 2 以獲得更好的內(nèi)存對(duì)齊。這與在視頻游戲開發(fā)和圖形設(shè)計(jì)中使用 OpenGL 和 DirectX 時(shí)選擇二次冪紋理類似。

矩陣乘法和 Tensor Core

再詳細(xì)一點(diǎn),英偉達(dá)有一個(gè)矩陣乘法背景用戶指南,解釋了矩陣尺寸和圖形處理單元 GPU 計(jì)算效率之間的關(guān)系。因此,本文建議不要將矩陣維度選擇為 2 的冪,而是將矩陣維度選擇為 8 的倍數(shù),以便在具有 Tensor Core 的 GPU 上進(jìn)行混合精度訓(xùn)練。不過,當(dāng)然這兩者之間存在重疊:

0aed43d2-0125-11ed-ba43-dac502259ad0.png

為什么會(huì)是 8 的倍數(shù)?這與矩陣乘法有關(guān)。假設(shè)我們?cè)诰仃?A 和 B 之間有以下矩陣乘法:

0afbc4e8-0125-11ed-ba43-dac502259ad0.png

將兩個(gè)矩陣 A 和 B 相乘的一種方法,是計(jì)算矩陣 A 的行向量和矩陣 B 的列向量之間的點(diǎn)積。如下所示,這些是 k 元素向量對(duì)的點(diǎn)積:

0b0dd5e8-0125-11ed-ba43-dac502259ad0.png

每個(gè)點(diǎn)積由一個(gè)「加」和一個(gè)「乘」操作組成,我們有 M×N 個(gè)這樣的點(diǎn)積。因此,共有 2×M×N×K 次浮點(diǎn)運(yùn)算(FLOPS)。不過需要知道的是:現(xiàn)在矩陣在 GPU 上的乘法并不完全如此,GPU 上的矩陣乘法涉及平鋪。

如果我們使用帶有 Tensor Cores 的 GPU,例如英偉達(dá) V100,當(dāng)矩陣維度 (M、N 和 K)與 16 字節(jié)的倍數(shù)對(duì)齊(根據(jù) Nvidia 的本指南)后,在 FP16 混合精度訓(xùn)練的情況下,8 的倍數(shù)對(duì)于效率來說是最佳的。

通常,維度 K 和 N 由神經(jīng)網(wǎng)絡(luò)架構(gòu)決定(盡管如果我們自己設(shè)計(jì)還會(huì)有一些回旋余地),但批大小(此處為 M)通常是我們可以完全控制的。

因此,假設(shè)批大小為 8 的倍數(shù)在理論上對(duì)于具有 Tensor Core 和 FP16 混合精度訓(xùn)練的 GPU 來說是最有效的,讓我們研究一下在實(shí)踐中可見的差異有多大。

簡單的 Benchmark

為了解不同的批大小如何影響實(shí)踐中的訓(xùn)練,我運(yùn)行了一個(gè)簡單的基準(zhǔn)測(cè)試,在 CIFAR-10 上訓(xùn)練 MobileNetV3 模型 10 個(gè) epoch—— 圖像大小調(diào)整為 224×224 以達(dá)到適當(dāng)?shù)?GPU 利用率。在這里,我使用 16 位原生自動(dòng)混合精度訓(xùn)練在英偉達(dá) V100 卡上運(yùn)行訓(xùn)練,它更有效地使用了 GPU 的張量核心。

如果想自己運(yùn)行它,代碼可在此 GitHub 存儲(chǔ)庫中找到:https://github.com/rasbt/b3-basic-batchsize-benchmark

小 Batch Size 基準(zhǔn)

我們從批大小為 128 的小基準(zhǔn)開始?!赣?xùn)練時(shí)間」對(duì)應(yīng)于在 CIFAR-10 上訓(xùn)練 MobileNetV3 的 10 個(gè) epoch。推理時(shí)間意味著在測(cè)試集中的 10k 圖像上評(píng)估模型。

0b20d9ae-0125-11ed-ba43-dac502259ad0.jpg

查看上表,讓我們將批大小 128 作為參考點(diǎn)。似乎將批量大小減少一 (127) 或?qū)⑴看笮≡黾右?(129) 確實(shí)會(huì)導(dǎo)致訓(xùn)練性能減慢。但這里的差異看來很小,我認(rèn)為可以忽略不計(jì)。

將批大小減少 28 (100) 會(huì)導(dǎo)致性能明顯下降。這可能是因?yàn)槟P同F(xiàn)在需要處理比以前更多的批次(50,000 / 100 = 500 對(duì)比 50,000 / 100 = 390)??赡艹鲇陬愃频脑?,當(dāng)我們將批大小增加 28 (156) 時(shí)就可以觀察到更快的訓(xùn)練時(shí)間。

最大 Batch Size 基準(zhǔn)

鑒于 MobileNetV3 架構(gòu)和輸入圖像大小,上一節(jié)中的批尺寸相對(duì)較小,因此 GPU 利用率約為 70%。為了研究 GPU 滿負(fù)荷時(shí)的訓(xùn)練時(shí)間差異,我將批量大小增加到 512,以使 GPU 顯示出接近 100% 的計(jì)算利用率:

0b2b2d14-0125-11ed-ba43-dac502259ad0.jpg

由于 GPU 內(nèi)存限制,批大小不可能超過 515。

同樣,正如我們之前看到的,作為 2 的冪(或 8 的倍數(shù))的批大小確實(shí)會(huì)產(chǎn)生很小但幾乎不明顯的差異。

多 GPU 訓(xùn)練

之前的基準(zhǔn)測(cè)試評(píng)估了單塊 GPU 上的訓(xùn)練性能。不過如今在多 GPU 上訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)更為常見。所以讓我們看看下面的多 GPU 訓(xùn)練的數(shù)字比較:

0b39c0cc-0125-11ed-ba43-dac502259ad0.jpg

請(qǐng)注意,推理速度被省略了,因?yàn)樵趯?shí)踐中我們通常仍會(huì)使用單個(gè) GPU 進(jìn)行推理。此外,由于 GPU 的內(nèi)存限制,我無法運(yùn)行批處理大小為 512 的基準(zhǔn)測(cè)試,因此在這里降低到 256。

正如我們所看到的,這一次 2 的冪和 8 的倍數(shù)批量大小 (256) 并不比 257 快。在這里,我使用 DistributedDataParallel (DDP) 作為默認(rèn)的多 GPU 訓(xùn)練策略。你也可以使用不同的多 GPU 訓(xùn)練策略重復(fù)實(shí)驗(yàn)。GitHub 上的代碼支持 —strategy ddp_sharded (fairscale)、ddp_spawn、deepspeed 等。

基準(zhǔn)測(cè)試注意事項(xiàng)

這里需要強(qiáng)調(diào)的是上述所有基準(zhǔn)測(cè)試都有注意事項(xiàng)。例如我只運(yùn)行每個(gè)配置一次。理想情況下,我們希望多次重復(fù)這些運(yùn)行并報(bào)告平均值和標(biāo)準(zhǔn)偏差。(但這可能不會(huì)影響我們的結(jié)論,即性能沒有實(shí)質(zhì)性差異)

此外,雖然我在同一臺(tái)機(jī)器上運(yùn)行了所有基準(zhǔn)測(cè)試,但我以連續(xù)的順序運(yùn)行它們,運(yùn)行之間沒有很長的等待時(shí)間。因此這可能意味著基本 GPU 溫度在運(yùn)行之間可能有所不同,并且可能會(huì)對(duì)計(jì)時(shí)產(chǎn)生輕微影響。

我運(yùn)行基準(zhǔn)測(cè)試來模仿真實(shí)世界的用例,即在 PyTorch 中訓(xùn)練具有相對(duì)常見設(shè)置的現(xiàn)成架構(gòu)。然而,正如 Piotr Bialecki 正確指出的那樣,通過設(shè)置 torch.backends.cudnn.benchmark = True 可以稍微提高訓(xùn)練速度。

其他資源和討論

正如 Ross Wightman 所提到的,他也不認(rèn)為選擇批量大小作為 2 的冪會(huì)產(chǎn)生明顯的差異。但選擇 8 的倍數(shù)對(duì)于某些矩陣維度可能很重要。此外 Wightman 指出,在使用 TPU 時(shí)批量大小至關(guān)重要。(不幸的是,我無法輕松訪問 TPU,也沒有任何基準(zhǔn)比較)

如果你對(duì)其他 GPU 基準(zhǔn)測(cè)試感興趣,請(qǐng)?jiān)诖颂幉榭?Thomas Bierhance 的優(yōu)秀文章:https://wandb.ai/datenzauberai/Batch-Size-Testing/reports/Do-Batch-Sizes-Actually-Need-to-be-Powers-of-2---VmlldzoyMDkwNDQx

特別是你想要比較:

顯卡是否有 Tensor Core;

顯卡是否支持混合精度訓(xùn)練;

在像 DeiT 這樣的無卷積視覺轉(zhuǎn)換器

Rémi Coulom-Kayufu 的一個(gè)有趣的實(shí)驗(yàn)表明,2 次方的批大小實(shí)際上很糟糕??磥韺?duì)于卷積神經(jīng)網(wǎng)絡(luò),可以通過以下方式計(jì)算出較好的批大小:

Batch Size=int ((n×(1《《14)×SM)/(H×W×C))。

其中,n 是整數(shù),SM 是 GPU 內(nèi)核的數(shù)量(例如,V100 為 80,RTX 2080 Ti 為 68)。

結(jié)論

根據(jù)本文中共享的基準(zhǔn)測(cè)試結(jié)果,我不認(rèn)為選擇批大小作為 2 的冪或 8 的倍數(shù)在實(shí)踐中會(huì)產(chǎn)生明顯的差異。

然而,在任何給定的項(xiàng)目中,無論是研究基準(zhǔn)還是機(jī)器學(xué)習(xí)的實(shí)際應(yīng)用上,都已經(jīng)有很多旋鈕需要調(diào)整。因此,將批大小選擇為 2 的冪(即 64、128、256、512、1024 等)有助于使事情變得更加簡單和易于管理。此外,如果你對(duì)發(fā)表學(xué)術(shù)研究論文感興趣,將批大小選擇為 2 的冪將使結(jié)果看起來不像是刻意挑選好結(jié)果。

雖然堅(jiān)持批大小為 2 的冪有助于限制超參數(shù)搜索空間,但重要的是要強(qiáng)調(diào)批大小仍然是一個(gè)超參數(shù)。一些人認(rèn)為較小的批尺寸有助于泛化性能,而另一些人則建議盡可能增加批大小。

個(gè)人而言,我發(fā)現(xiàn)最佳批大小在很大程度上取決于神經(jīng)網(wǎng)絡(luò)架構(gòu)和損失函數(shù)。例如,在最近一個(gè)使用相同 ResNet 架構(gòu)的研究項(xiàng)目中,我發(fā)現(xiàn)最佳批大小可以在 16 到 256 之間,具體取決于損失函數(shù)。

因此,我建議始終考慮調(diào)整批大小作為超參數(shù)優(yōu)化搜索的一部分。但是,如果因?yàn)閮?nèi)存限制而不能使用 512 的批大小,則不必降到 256。有限考慮 500 的批大小是完全可行的。

原文標(biāo)題:一番實(shí)驗(yàn)后,有關(guān)Batch Size的玄學(xué)被打破了

文章出處:【微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:彭靜
聲明:本文內(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)投訴
  • 神經(jīng)網(wǎng)絡(luò)

    關(guān)注

    42

    文章

    4771

    瀏覽量

    100772
  • 存儲(chǔ)
    +關(guān)注

    關(guān)注

    13

    文章

    4314

    瀏覽量

    85851
  • gpu
    gpu
    +關(guān)注

    關(guān)注

    28

    文章

    4740

    瀏覽量

    128951

原文標(biāo)題:一番實(shí)驗(yàn)后,有關(guān)Batch Size的玄學(xué)被打破了

文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    中科芯CKS32K148 MCU SCG時(shí)鐘工作頻率范圍和寄存器設(shè)置

    接第四十五期的SCG介紹,下文對(duì)SCG時(shí)鐘工作頻率范圍、寄存器設(shè)置等進(jìn)行詳細(xì)闡述。
    的頭像 發(fā)表于 12-09 14:55 ?198次閱讀
    中科芯CKS32K148 MCU SCG時(shí)鐘工作頻率<b class='flag-5'>范圍</b>和寄存器<b class='flag-5'>設(shè)置</b>

    電流速斷保護(hù)的保護(hù)范圍與什么有關(guān)

    電流速斷保護(hù)是一種電力系統(tǒng)保護(hù)裝置,主要用于檢測(cè)和切斷短路故障電流,以保護(hù)電力設(shè)備和系統(tǒng)安全。 電流速斷保護(hù)的保護(hù)范圍與以下因素有關(guān): 1. 保護(hù)裝置的設(shè)置 電流速斷保護(hù)裝置的設(shè)置是影
    的頭像 發(fā)表于 09-26 16:20 ?612次閱讀

    鋸齒波同步觸發(fā)電路移相范圍與哪些參數(shù)有關(guān)

    鋸齒波同步觸發(fā)電路的移相范圍與多個(gè)參數(shù)密切相關(guān),這些參數(shù)共同決定了電路在觸發(fā)過程中的相位調(diào)整能力。具體來說,移相范圍主要與以下幾個(gè)參數(shù)有關(guān): 控制電壓Uct : 控制電壓是調(diào)節(jié)移相范圍
    的頭像 發(fā)表于 09-25 17:03 ?2308次閱讀

    瀚海微SD NAND存儲(chǔ)功能描述(27)C_SIZE

    該參數(shù)用于計(jì)算用戶的數(shù)據(jù)卡容量(不包括安全保護(hù)區(qū)域),數(shù)據(jù)卡的內(nèi)存容量從C_SIZE、C_SIZE MULT和READ_BL_LEN表項(xiàng)計(jì)算。
    的頭像 發(fā)表于 09-21 16:32 ?345次閱讀
    瀚海微SD NAND存儲(chǔ)功能描述(27)C_<b class='flag-5'>SIZE</b>

    有關(guān)LMH6552放大電路電阻設(shè)置的問題求解

    放大,輸出波形也很好; 所以為什么用作加法器差分轉(zhuǎn)單端時(shí),相同參數(shù),輸出失真呀 還有就是希望看到的人能解決下我之前發(fā)的那個(gè)有關(guān)LMH6552放大電路電阻設(shè)置的問題;
    發(fā)表于 08-29 06:07

    熱電偶的測(cè)量范圍與什么有關(guān)

    熱電偶是一種測(cè)量溫度的傳感器,其工作原理是基于塞貝克效應(yīng),即兩種不同金屬或合金在一端連接時(shí),由于溫度差產(chǎn)生電勢(shì)差的現(xiàn)象。熱電偶廣泛應(yīng)用于工業(yè)、科研、醫(yī)療等領(lǐng)域,具有測(cè)量范圍廣、精度高、穩(wěn)定性好等優(yōu)點(diǎn)
    的頭像 發(fā)表于 08-27 11:04 ?752次閱讀

    【算能RADXA微服務(wù)器試用體驗(yàn)】+ GPT語音與視覺交互:2,圖像識(shí)別

    BM1684的FP32 BModel,batch_size=1 │├── yolov8s_int8_1b.bmodel# 使用TPU-MLIR編譯,用于BM1684的INT8 BModel
    發(fā)表于 07-14 23:36

    三菱plc定時(shí)器范圍怎么設(shè)置

    。定時(shí)器的設(shè)置范圍直接影響到程序的執(zhí)行效率和控制精度。本文將詳細(xì)介紹三菱PLC定時(shí)器的設(shè)置范圍及其設(shè)置方法。 定時(shí)器的基本概念 定時(shí)器是一種
    的頭像 發(fā)表于 06-20 11:04 ?2689次閱讀

    Modbus slave寫入時(shí),限制值的范圍要如何設(shè)置

    Modbus slave寫入時(shí),限制值的范圍要如何設(shè)置
    發(fā)表于 06-14 07:43

    信號(hào)發(fā)生器如何設(shè)置頻率幅值范圍

    信號(hào)發(fā)生器是一種用于產(chǎn)生各種頻率和波形的電子設(shè)備。它廣泛應(yīng)用于實(shí)驗(yàn)室、測(cè)試和測(cè)量領(lǐng)域。本文將詳細(xì)介紹如何設(shè)置信號(hào)發(fā)生器的頻率和幅值范圍。 1. 信號(hào)發(fā)生器的基本原理 信號(hào)發(fā)生器通過振蕩器產(chǎn)生周期性
    的頭像 發(fā)表于 06-03 11:21 ?4166次閱讀

    示波器帶寬限制怎么設(shè)置

    示波器作為電子工程師和科學(xué)領(lǐng)域?qū)I(yè)人士的重要工具,主要用于捕獲和顯示電信號(hào)波形。在示波器的設(shè)置中,帶寬限制是一個(gè)關(guān)鍵參數(shù),它決定了示波器能夠準(zhǔn)確響應(yīng)和顯示的信號(hào)頻率范圍。正確設(shè)置帶寬限制對(duì)于確保測(cè)量結(jié)果的準(zhǔn)確性至關(guān)重要。本文將詳
    的頭像 發(fā)表于 05-17 17:04 ?3961次閱讀

    STM32L476G-DISCOVERY關(guān)于外設(shè)地址、儲(chǔ)存地址、buffer size 怎么設(shè)置呢?

    前的板子可以用DMA_InitTypeDef 來設(shè)置(初始化) 但是STM32L476G-DISCOVERY的設(shè)置中沒有部分選項(xiàng)(上圖中對(duì)勾選項(xiàng)是有的) 關(guān)于外設(shè)地址、儲(chǔ)存地址、buffer size 怎么
    發(fā)表于 04-26 08:27

    基于OpenCV的路面質(zhì)量檢測(cè)

    在train.py中,定義從何處收集訓(xùn)練數(shù)據(jù)。我們應(yīng)該將20%的數(shù)據(jù)分開以自動(dòng)用于驗(yàn)證。我們還定義了batch_size為32。
    的頭像 發(fā)表于 04-15 10:00 ?616次閱讀
    基于OpenCV的路面質(zhì)量檢測(cè)

    CY8C6247BZID44如何查看編譯后的SRAM Size\\Stack Size\\Heap Size?

    CY8C6247BZID44如何查看編譯后的SRAM Size\\Stack Size\\Heap Size
    發(fā)表于 01-22 08:04

    ad9361 ADC采樣率設(shè)置范圍

    AD9361是一款高性能的射頻前端芯片,廣泛應(yīng)用于無線通信系統(tǒng)中。其中一個(gè)重要特性是其具有靈活可調(diào)的ADC采樣率。本文將詳細(xì)介紹AD9361的ADC采樣率設(shè)置范圍,包括其相關(guān)特性、設(shè)置方法以及在實(shí)際
    的頭像 發(fā)表于 01-04 09:37 ?5991次閱讀