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

pytorch 使用半精度模型部署的操作

 更新時間:2021年05月24日 11:26:38   作者:treeswolf  
這篇文章主要介紹了pytorch 使用半精度模型部署的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

背景

pytorch作為深度學習的計算框架正得到越來越多的應用.

我們除了在模型訓練階段應用外,最近也把pytorch應用在了部署上.

在部署時,為了減少計算量,可以考慮使用16位浮點模型,而訓練時涉及到梯度計算,需要使用32位浮點,這種精度的不一致經(jīng)過測試,模型性能下降有限,可以接受.

但是推斷時計算量可以降低一半,同等計算資源下,并發(fā)度可提升近一倍

具體方法

在pytorch中,一般模型定義都繼承torch.nn.Moudle,torch.nn.Module基類的half()方法會把所有參數(shù)轉為16位浮點,所以在模型加載后,調用一下該方法即可達到模型切換的目的.接下來只需要在推斷時把input的tensor切換為16位浮點即可

另外還有一個小的trick,在推理過程中模型輸出的tensor自然會成為16位浮點,如果需要新創(chuàng)建tensor,最好調用已有tensor的new_zeros,new_full等方法而不是torch.zeros和torch.full,前者可以自動繼承已有tensor的類型,這樣就不需要到處增加代碼判斷是使用16位還是32位了,只需要針對input tensor切換.

補充:pytorch 使用amp.autocast半精度加速訓練

準備工作

pytorch 1.6+

如何使用autocast?

根據(jù)官方提供的方法,

答案就是autocast + GradScaler。

如何在PyTorch中使用自動混合精度?

答案:autocast + GradScaler。

1.autocast

正如前文所說,需要使用torch.cuda.amp模塊中的autocast 類。使用也是非常簡單的

from torch.cuda.amp import autocast as autocast

# 創(chuàng)建model,默認是torch.FloatTensor
model = Net().cuda()
optimizer = optim.SGD(model.parameters(), ...)

for input, target in data:
    optimizer.zero_grad()

    # 前向過程(model + loss)開啟 autocast
    with autocast():
        output = model(input)
        loss = loss_fn(output, target)

    # 反向傳播在autocast上下文之外
    loss.backward()
    optimizer.step()

2.GradScaler

GradScaler就是梯度scaler模塊,需要在訓練最開始之前實例化一個GradScaler對象。

因此PyTorch中經(jīng)典的AMP使用方式如下:

from torch.cuda.amp import autocast as autocast

# 創(chuàng)建model,默認是torch.FloatTensor
model = Net().cuda()
optimizer = optim.SGD(model.parameters(), ...)
# 在訓練最開始之前實例化一個GradScaler對象
scaler = GradScaler()

for epoch in epochs:
    for input, target in data:
        optimizer.zero_grad()

        # 前向過程(model + loss)開啟 autocast
        with autocast():
            output = model(input)
            loss = loss_fn(output, target)

        scaler.scale(loss).backward()
        scaler.step(optimizer)
        scaler.update()

3.nn.DataParallel

單卡訓練的話上面的代碼已經(jīng)夠了,親測在2080ti上能減少至少1/3的顯存,至于速度。。。

要是想多卡跑的話僅僅這樣還不夠,會發(fā)現(xiàn)在forward里面的每個結果都還是float32的,怎么辦?

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()

    def forward(self, input_data_c1):
     with autocast():
      # code
     return

只要把forward里面的代碼用autocast代碼塊方式運行就好啦!

自動進行autocast的操作

如下操作中tensor會被自動轉化為半精度浮點型的torch.HalfTensor:

1、matmul

2、addbmm

3、addmm

4、addmv

5、addr

6、baddbmm

7、bmm

8、chain_matmul

9、conv1d

10、conv2d

11、conv3d

12、conv_transpose1d

13、conv_transpose2d

14、conv_transpose3d

15、linear

16、matmul

17、mm

18、mv

19、prelu

那么只有這些操作才能半精度嗎?不是。其他操作比如rnn也可以進行半精度運行,但是需要自己手動,暫時沒有提供自動的轉換。

相關文章

  • python實現(xiàn)斐波那契數(shù)列的方法示例

    python實現(xiàn)斐波那契數(shù)列的方法示例

    每個碼農大概都會用自己擅長的語言寫出一個斐波那契數(shù)列出來,斐波那契數(shù)列簡單地說,起始兩項為0和1,此后的項分別為它的前兩項之后。下面這篇文章就給大家詳細介紹了python實現(xiàn)斐波那契數(shù)列的方法,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • Python撲克牌21點游戲實例代碼

    Python撲克牌21點游戲實例代碼

    大家好,本篇文章主要講的是Python撲克牌21點游戲實例代碼,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 用python建立兩個Y軸的XY曲線圖方法

    用python建立兩個Y軸的XY曲線圖方法

    今天小編就為大家分享一篇用python建立兩個Y軸的XY曲線圖方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • PyQT中QTableWidget如何根據(jù)單元格內容設置自動寬度

    PyQT中QTableWidget如何根據(jù)單元格內容設置自動寬度

    這篇文章主要介紹了PyQT中QTableWidget如何根據(jù)單元格內容設置自動寬度問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Python入門及進階筆記 Python 內置函數(shù)小結

    Python入門及進階筆記 Python 內置函數(shù)小結

    這篇文章主要介紹了Python的內置函數(shù)小結,需要的朋友可以參考下
    2014-08-08
  • 一文學會VSCode使用python

    一文學會VSCode使用python

    Pycharm用著卡還收費!何不試試VSCode!一文學會VSCode使用python,本文通過圖文實例相結合給大家介紹的非常詳細,需要的朋友參考下吧
    2021-08-08
  • 一篇文章帶你了解python元組基礎

    一篇文章帶你了解python元組基礎

    今天小編就為大家分享一篇關于Python中的元組介紹,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2021-08-08
  • 將本地Python項目打包成docker鏡像上傳到服務器并在docker中運行

    將本地Python項目打包成docker鏡像上傳到服務器并在docker中運行

    Docker是一個開源項目,為開發(fā)人員和系統(tǒng)管理員提供了一個開放平臺,可以將應用程序構建、打包為一個輕量級容器,并在任何地方運行,這篇文章主要給大家介紹了關于將本地Python項目打包成docker鏡像上傳到服務器并在docker中運行的相關資料,需要的朋友可以參考下
    2023-12-12
  • 基于python實現(xiàn)監(jiān)聽Rabbitmq系統(tǒng)日志代碼示例

    基于python實現(xiàn)監(jiān)聽Rabbitmq系統(tǒng)日志代碼示例

    這篇文章主要介紹了基于python實現(xiàn)監(jiān)聽Rabbitmq系統(tǒng)日志代碼示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • python判斷鏈表是否有環(huán)的實例代碼

    python判斷鏈表是否有環(huán)的實例代碼

    在本篇文章里小編給大家整理的是關于python判斷鏈表是否有環(huán)的知識點及實例代碼,需要的朋友們參考下。
    2020-01-01

最新評論