吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

GPU利用率低的本質原因

新機器視覺 ? 來源:新機器視覺 ? 2023-06-19 14:07 ? 次閱讀

最近經常有同學反饋 GPU 利用率低,嚴重浪費 GPU 資源的問題,經過對一些實例分析后,借著這篇文檔和大家分享一下解決方案,希望能對使用 GPU 的同學有些幫助。

一、GPU 利用率的定義

本文的 GPU 利用率主要指 GPU 在時間片上的利用率,即通過 nvidia-smi 顯示的 GPU-util 這個指標。統計方式為:在采樣周期內,GPU 上面有 kernel 執行的時間百分比。

二、GPU 利用率低的本質

常見 GPU 任務運行流程圖如下:

69e2e270-0d18-11ee-962d-dac502259ad0.jpg

如上圖所示,GPU 任務會交替的使用 CPU 和 GPU 進行計算,當 CPU 計算成為瓶頸時,就會出現 GPU 等待的問題,GPU 空跑那利用率就低了。那么優化的方向就是縮短一切使用 CPU 計算環節的耗時,減少 CPU 計算對 GPU 的阻塞情況。常見的 CPU 計算操作如下:

數據加載

數據預處理

模型保存

loss 計算

評估指標計算

日志打印

指標上報

進度上報

三、常見 GPU 利用率低原因分析

1、數據加載相關

1)存儲和計算跨城了,跨城加載數據太慢導致 GPU 利用率低

說明:例如數據存儲在“深圳 ceph”,但是 GPU 計算集群在“重慶”,那就涉及跨城使用了,影響很大。

優化:要么遷移數據,要么更換計算資源,確保存儲及計算是同城的。

2)存儲介質性能太差

說明:不同存儲介質讀寫性能比較:本機 SSD > ceph > cfs-1.5 > hdfs > mdfs

優化:將數據先同步到本機 SSD,然后讀本機 SSD 進行訓練。本機 SSD 盤為“/dockerdata”,可先將其他介質下的數據同步到此盤下進行測試,排除存儲介質的影響。

3)小文件太多,導致文件 io 耗時太長

說明:多個小文件不是連續的存儲,讀取會浪費很多時間在尋道上

優化:將數據打包成一個大的文件,比如將許多圖片文件轉成一個 hdf5/pth/lmdb/TFRecord 等大文件

lmdb 格式轉換樣例:

https://github.com/Lyken17/Efficient-PyTorch#data-loader

其他格式轉換方式請自行谷歌

4)未啟用多進程并行讀取數據

說明:未設置 num_workers參數或者設置的不合理,導致 cpu 性能沒有跑起來,從而成為瓶頸,卡住 GPU

優化:設置 torch.utils.data.DataLoader 方法的 num_workers 參數、tf.data.TFRecordDataset 方法的 num_parallel_reads 參數或者 tf.data.Dataset.map 的 num_parallel_calls 參數。

5)未啟用提前加載機制來實現 CPU 和 GPU 的并行

說明:未設置 prefetch_factor 等參數或者設置的不合理,導致 CPU 與 GPU 在時間上串行,CPU 運行時 GPU 利用率直接掉 0

優化:設置 torch.utils.data.DataLoader 方法的 prefetch_factor 參數 或者 tf.data.Dataset.prefetch()方法。prefetch_factor 表示每個 worker 提前加載的 sample 數量 (使用該參數需升級到 pytorch1.7 及以上),Dataset.prefetch()方法的參數 buffer_size 一般設置為:tf.data.experimental.AUTOTUNE,從而由 TensorFlow 自動選擇合適的數值。

6)未設置共享內存 pin_memory

說明:未設置 torch.utils.data.DataLoader 方法的 pin_memory 或者設置成 False,則數據需從 CPU 傳入到緩存 RAM 里面,再給傳輸到 GPU 上

優化:如果內存比較富裕,可以設置 pin_memory=True,直接將數據映射到 GPU 的相關內存塊上,省掉一點數據傳輸時間

2、數據預處理相關

1)數據預處理邏輯太復雜

說明:數據預處理部分超過一個 for 循環的,都不應該和 GPU 訓練部分放到一起

優化:a、設置 tf.data.Dataset.map 的 num_parallel_calls 參數,提高并行度,一般設置為 tf.data.experimental.AUTOTUNE,可讓 TensorFlow 自動選擇合適的數值。

b、將部分數據預處理步驟挪出訓練任務,例如對圖片的歸一化等操作,提前開啟一個 spark 分布式任務或者 cpu 任務處理好,再進行訓練。

c、提前將預處理部分需要用到的配置文件等信息加載到內存中,不要每次計算的時候再去讀取。

d、關于查詢操作,多使用 dict 加速查詢操作;減少 for、while 循環,降低預處理復雜度。

2)利用 GPU 進行數據預處理 -- Nvidia DALI

說明:Nvidia DALI 是一個專門用于加速數據預處理過程的庫,既支持 GPU 又支持 CPU

優化:采用 DALI,將基于 CPU 的數據預處理流程改造成用 GPU 來計算

DALI 文檔如下:https://zhuanlan.zhihu.com/p/105056158

3、模型保存相關

1)模型保存太頻繁

說明:模型保存為 CPU 操作,太頻繁容易導致 GPU 等待

優化:減少保存模型(checkpoint)的頻率

4、指標相關

1)loss 計算太復雜

說明:含有 for 循環的復雜 loss 計算,導致 CPU 計算時間太長從而阻塞 GPU

優化:該用低復雜度的 loss 或者使用多進程或多線程進行加速

2)指標上報太頻繁

說明:指標上報操作太頻繁,CPU 和 GPU 頻繁切換導致 GPU 利用率低

優化:改成抽樣上報,例如每 100 個 step 上報一次

5、日志相關

1)日志打印太頻繁

說明:日志打印操作太頻繁,CPU 和 GPU 頻繁切換導致 GPU 利用率低

優化:改成抽樣打印,例如每 100 個 step 打印一次

四、常見數據加載方法說明

1、pytorch 的 torch.utils.data.DataLoader

DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,
           batch_sampler=None, num_workers=0, collate_fn=None,
           pin_memory=False, drop_last=False, timeout=0,
           worker_init_fn=None, *, prefetch_factor=2,
           persistent_workers=False)
69fdaab0-0d18-11ee-962d-dac502259ad0.jpg

從參數定義中,我們可以看到 DataLoader 主要支持以下幾個功能:

支持加載 map-style 和 iterable-style 的 dataset,主要涉及到的參數是 dataset

自定義數據加載順序,主要涉及到的參數有 shuffle, sampler, batch_sampler, collate_fn

自動把數據整理成 batch 序列,主要涉及到的參數有 batch_size, batch_sampler, collate_fn, drop_last

單進程和多進程的數據加載,主要涉及到的參數有 num_workers, worker_init_fn

自動進行鎖頁內存讀取 (memory pinning),主要涉及到的參數 pin_memory

支持數據預加載,主要涉及的參數 prefetch_factor

參考文檔:https://pytorch.org/docs/stable/data.html

2、tensorflow 的 tf.data.Dataset

ds_train = tf.data.Dataset.from_tensor_slices((x,y))
    .shuffle(5000)
    .batch(batchs)
    .map(preprocess,num_parallel_calls=tf.data.experimental.AUTOTUNE)
    .prefetch(tf.data.experimental.AUTOTUNE)

Dataset.prefetch(): 可以讓數據集對象 Dataset 在 ? 訓練時預取出若干個元素,使得在 GPU 訓練的同時 CPU 可以準備數據,提升訓練流程的效率

Dataset.map(f): 轉換函數 f 映射到數據集每一個元素; 可以利用多 CPU 資源,充分利用多核心的優勢對數據進行并行化變換, num_parallel_calls 設置為 tf.data.experimental.AUTOTUNE 以讓 TensorFlow 自動選擇合適的數值,數據轉換過程多進程執行,設置 num_parallel_calls 參數能發揮 cpu 多核心的優勢

Dataset.shuffle(buffer_size): 將數據集打亂,取出前 buffer_size 個元素放入,并從緩沖區中隨機采樣,采樣后的數據用后續數據替換

Dataset.batch(batch_size):將數據集分成批次,即對每 batch_size 個元素,使用 tf.stack() 在第 0 維合并,成為一個元素

參考文檔:https://www.tensorflow.org/api_docs/python/tf/data/Dataset#methods_2

五、分布式任務常見的 GPU 利用率低問題

分布式任務相比單機任務多了一個機器間通信環節。如果在單機上面運行的好好的,擴展到多機后出現 GPU 利用率低,運行速度慢等問題,大概率是機器間通信時間太長導致的。請排查以下幾點:

1、機器節點是否處在同一 modules?

答:機器節點處于不同 modules 時,多機間通信時間會長很多,deepspeed 組件已從平臺層面增加調度到同一 modules 的策略,用戶不需要操作;其他組件需聯系我們開啟。

2、多機時是否啟用 GDRDMA

答:能否啟用 GDRDMA 和 NCCL 版本有關,經測試,使用 PyTorch1.7(自帶 NCCL2.7.8)時,啟動 GDRDMA 失敗,和 Nvidia 的人溝通后確定是 NCCL 高版本的 bug,暫時使用的運行注入的方式來修復;使用 PyTorch1.6(自帶 NCCL2.4.8)時,能夠啟用 GDRDMA。經測試,“NCCL2.4.8 + 啟用 GDRDMA ” 比 “NCCL2.7.8 + 未啟用 GDRDMA”提升 4%。通過設置 export NCCL_DEBUG=INFO,查看日志中是否出現[receive] via NET/IB/0/GDRDMA 和 [send] via NET/IB/0/GDRDMA,出現則說明啟用 GDRDMA 成功,否則失敗。

6a21da8e-0d18-11ee-962d-dac502259ad0.jpg

3、pytorch 數據并行是否采用 DistributedDataParallel ?

答:PyTorch 里的數據并行訓練,涉及 nn.DataParallel (DP) 和nn.parallel.DistributedDataParallel (DDP) ,我們推薦使用 nn.parallel.DistributedDataParallel (DDP)。
責任編輯:彭菁

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲
    +關注

    關注

    13

    文章

    4353

    瀏覽量

    86173
  • gpu
    gpu
    +關注

    關注

    28

    文章

    4774

    瀏覽量

    129353
  • 計算
    +關注

    關注

    2

    文章

    451

    瀏覽量

    38866

原文標題:GPU 利用率低常見原因分析及優化

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    GPU-Z可以監控每個vGPU的總GPU利用率嗎?

    我同時運行4個VM,每個vGPU是m60-2Q。所有虛擬機都運行bechmark測試。我使用Techpowerup GPU-Z監控每個vGPU。我發現了一個有趣的結果。如果我將所有vGPU利用率
    發表于 09-19 16:59

    是否可以看到每個VM的vGPU利用率

    我想知道是否可以看到每個VM的vGPU利用率。不在操作系統內,而是來自Grid K1卡。例如,如果GPU 0為80%,那么如果我知道45%的數字來自特定的VM,那就太棒了。我查看了論壇,但沒有
    發表于 09-21 11:06

    如何利用UCOSII中的統計任務 OS_TaskStat()知道了CPU利用率100%把利用率降下來?

    冒昧的問一下各路大神,假如我們利用UCOSII中的統計任務 OS_TaskStat()知道了CPU利用率100%,則應該怎樣操作,把利用率降下來?另外,利用率太高的話會不會不太好?
    發表于 07-12 04:36

    Post綜合后的利用率只不過是實施后的利用率

    嗨,Post綜合后的利用率只不過是實施后的利用率......?謝謝娜文G K.
    發表于 05-12 08:57

    CUP利用率怎么計算?

    要計算當前CUP利用率,是不是就使能OS_TASK_STAT_EN就可以了,并不要單獨建立一個任務去執行OSTaskStat(),是這樣嗎?參看戰艦例程,沒有找到哪里執行了OSTaskStat()!
    發表于 05-18 22:05

    請問一下如何提高無線信道利用率

    影響無線信道利用率的因素有哪些?無線利用率與網絡質量間的關系是什么?調整和提高無線信道利用率的建議有哪些?
    發表于 05-27 06:46

    如何獲取棧利用率

    如何獲取棧利用率
    發表于 02-16 07:34

    openEuler 資源利用率提升之道 01:概論

    利用率低于 20%,存在巨大的資源浪費。因此,提升數據中心資源利用率是當前急需解決的一個重要問題[2]。問題成因資源利用率低下的主要原因是任務和資源調配失衡,這種失衡又有多種表現形式
    發表于 07-06 09:54

    CPU利用率問題求解

    “你能不能實現一個理想情況下應該在每個時間片開始時執行的監控任務,并確定前一個時間片的利用率。如果利用率過高,則應發出警告。如果我們可以使用空閑時間,那么我們就可以衡量利用率。為了設置這個監視器
    發表于 12-06 06:00

    活性物質利用率

    活性物質利用率 電池具有活性物質的量與按法拉弟定律計算應產生的電量稱為理論容量。要求電極給出一定的電量時,電極的活性物質利用率可表示為
    發表于 11-06 11:02 ?2412次閱讀

    采用發電量可利用率指標的意義

    這是我們所熟悉的可利用率指標,以時間為統計對象,根據將外部原因導致停機視為可用和不可用,區分為綜合發電小時可利用率(GHA)和技術發電小時可利用率(THA)。
    的頭像 發表于 05-10 15:46 ?9508次閱讀

    利用率的獲取

    棧用于保存變量, 隨著函數調用深度和變量的數量而變化. 設置小了會出現棧溢出, 設置大了會浪費.利用率獲取RT-THREAD的統計方法是將線程棧都填充為’#’, 當需要的時候, 檢查是否被修改為其他
    發表于 12-20 19:03 ?8次下載
    棧<b class='flag-5'>利用率</b>的獲取

    GPU利用率常見原因分析及優化

    本文的 GPU 利用率主要指 GPU 在時間片上的利用率,即通過 nvidia-smi 顯示的 GPU-util 這個指標。統計方式為:在采
    的頭像 發表于 04-04 09:52 ?3708次閱讀

    常見GPU利用率原因分析

    GPU 任務會交替的使用 CPU 和 GPU 進行計算,當 CPU 計算成為瓶頸時,就會出現 GPU 等待的問題,GPU 空跑那利用率就低了
    發表于 06-19 12:22 ?1524次閱讀
    常見<b class='flag-5'>GPU</b><b class='flag-5'>利用率</b><b class='flag-5'>低</b><b class='flag-5'>原因</b>分析

    GPU用率原因和解決方法

    可能會遇到GPU用率的情況,這可能會造成性能下降和資源浪費。本文將探討GPU用率
    的頭像 發表于 12-09 14:32 ?1.2w次閱讀
    棋牌百家乐官网有稳赚的方法吗 | 浙江省| 夜总会百家乐官网的玩法技巧和规则| 博九注册| 全讯网新2网站112| 百家乐怎么会赢| 澳门百家乐官网路单怎么看| bet365提款要多久| 百家乐扫描技术| 24山辰山戍向| 百家乐官网知识技巧玩法| 2013现金棋牌游戏| 大发888娱乐老虎机| 百家乐注册优惠平台| 打百家乐官网纯打庄的方法| 百家乐官网高人破解| 365外围网| 大发888官方授权网| 什么是百家乐平注法| 百家乐官网发牌靴8| 百家乐官网道具扫描| 百家乐官网网上投注作弊| 网上现金赌场| 日博365| 环球代理| 金赞娱乐成| 明珠国际| 德州扑克的技巧| 大发888官方下载 银行| 北京太阳城医院| 太阳百家乐破解| 加州百家乐的玩法技巧和规则| 百家乐五湖四海娱乐平台| 百家乐买对子技巧| 百家乐园sun811| 澳门百家乐现场视频| 百家乐精神| ea百家乐打水| 百家乐网上赌有作假吗| 利都百家乐国际娱乐场| 什么事百家乐的路单|