一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - pytorch 使用半精度模型部署的操作

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

2021-11-11 10:28treeswolf Python

這篇文章主要介紹了pytorch 使用半精度模型部署的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

背景

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

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

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

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

具體方法

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

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

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

準備工作

pytorch 1.6+

如何使用autocast?

根據官方提供的方法,

答案就是autocast + GradScaler。

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

答案:autocast + GradScaler。

1.autocast

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from torch.cuda.amp import autocast as autocast
 
# 創建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中經典的AMP使用方式如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from torch.cuda.amp import autocast as autocast
 
# 創建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

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

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

?
1
2
3
4
5
6
7
8
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也可以進行半精度運行,但是需要自己手動,暫時沒有提供自動的轉換。

原文鏈接:https://blog.csdn.net/treeswolf/article/details/105748209

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品自在线 | 久久视频精品3线视频在线观看 | 亚洲欧美日韩精品久久亚洲区 | 男生同性视频twink在线 | 手机在线伦理片 | 免费一区在线观看 | 高h短篇辣肉各种姿势bl | 青青网在线视频 | 亚洲AV福利天堂一区二区三 | 青草青草视频 | 手机看片自拍 | 国产午夜亚洲精品一区网站 | 免费草比视频 | 日韩一级片在线播放 | 午夜无码片在线观看影院 | 性色AV一区二区三区V视界影院 | 色综合天天娱乐综合网 | 国产aaaaa一级毛片 | 欧美精品久久久久久久免费观看 | 九九在线免费视频 | 韩国黄色片网站 | 亚洲精品国产乱码AV在线观看 | 好大好爽好硬我要喷水了 | 亚洲精品人成网在线播放影院 | 欧美一区二区视频 | 男人天堂新 | 国产成人手机在线 | 5x视频在线观看 | 日本偷偷操 | 日本三级香港三级久久99 | 肉大捧一进一出视频免费播放 | 亚洲激情欧美 | 欧美特欧美特级一片 | 奇米777四色精品综合影院 | 精品久久久噜噜噜久久久app | 视频在线视频免费观看 | 婷婷色在线观看 | 日本一区二区三区视频在线观看 | 国产精品激情综合久久 | 国产大秀视频一区二区三区 | 我把寡妇日出水好爽 |