將Pytorch模型從CPU轉換成GPU


 

1. 如何進行遷移

對模型和相應的數據進行.cuda()處理。通過這種方式,我們就可以將內存中的數據復制到GPU的顯存中去。從而可以通過GPU來進行運算了。

 

1.1 判定使用GPU

下載了對應的GPU版本的Pytorch之后,要確保GPU是可以進行使用的,通過torch.cuda.is_available()的返回值來進行判斷。
通過torch.cuda.device_count()可以獲得能夠使用的GPU數量。其他就不多贅述了。 
常常通過如下判定來寫可以跑在GPU和CPU上的通用模型:

1 if torch.cuda.is_available():
2     ten1 = ten1.cuda()
3     MyModel = MyModel.cuda() 

 

 

2. 對應數據的遷移

2.1 將Tensor遷移到顯存中去

不論是什么類型的Tensor(FloatTensor或者是LongTensor等等),一律直接使用方法.cuda()即可。 
例如:

1 ten1 = torch.FloatTensor(2)
2 
3 ten1_cuda = ten1.cuda()

 

如果要將顯存中的數據復制到內存中,則對cuda數據類型使用.cpu()方法即可。

2.2 將Variable遷移到顯存中去

在模型中,我們最常使用的是Variable這個容器來裝載使用數據。主要是由於Variable可以進行反向傳播來進行自動求導。 
同樣地,要將Variable遷移到顯存中,同樣只需要使用.cuda()即可實現。

這里有一個小疑問,對Variable直接使用.cuda和對Tensor進行.cuda然后再放置到Variable中結果是否一致呢。答案是肯定的。

ten1 = torch.FloatTensor(2) >>> 6.1101e+24 4.5659e-41 [torch.FloatTensor of size 2] ten1_cuda = ten1.cuda() >>>> 6.1101e+24 4.5659e-41 [torch.cuda.FloatTensor of size 2 (GPU 0)] V1_cpu = autograd.Variable(ten1) >>>> Variable containing: 6.1101e+24 4.5659e-41 [torch.FloatTensor of size 2] V2 = autograd.Variable(ten1_cuda) >>>> Variable containing: 6.1101e+24 4.5659e-41 [torch.cuda.FloatTensor of size 2 (GPU 0)] V1 = V1_cpu.cuda() >>>> Variable containing: 6.1101e+24 4.5659e-41 [torch.cuda.FloatTensor of size 2 (GPU 0)]

 

最終我們能發現他們都能夠達到相同的目的,但是他們完全一樣了嗎?我們使用V1 is V2發現,結果是否定的。

對於V1,我們是直接對Variable進行操作的,這樣子V1的.grad_fn中會記錄下創建的方式。因此這二者並不是完全相同的。

2.3 數據遷移小結

.cuda()操作默認使用GPU 0也就是第一張顯卡來進行操作。當我們想要存儲在其他顯卡中時可以使用.cuda(<顯卡號數>)來將數據存儲在指定的顯卡中。還有很多種方式,具體參考官方文檔。

 

3. 模型遷移

模型的遷移這里指的是torch.nn下面的一些網絡模型以及自己創建的模型遷移到GPU上去。

上面講了使用.cuda()即可將數據從內存中移植到顯存中去。 
對於模型來說,也是同樣的方式,我們使用.cuda來將網絡放到顯存上去。

3.1 torch.nn下的基本模型遷移

我們很驚奇地發現對於模型來說,不像數據那樣使用了.cuda()之后會改變其的數據類型。模型看起來沒有任何的變化。 
但是他真的沒有改變嗎。 
我們將data1投入linear_cuda中去可以發現,系統會報錯,而將.cuda之后的data2投入linear_cuda才能正常工作。並且輸出的也是具有cuda的數據類型。

那是怎么一回事呢? 
這是因為這些所謂的模型,其實也就是對輸入參數做了一些基本的矩陣運算。所以我們對模型.cuda()實際上也相當於將模型使用到的參數存儲到了顯存上去。

對於上面的例子,我們可以通過觀察參數來發現區別所在。

linear.weight
>>>> Parameter containing:
    -0.6847 0.2149 -0.5473 0.6863 [torch.FloatTensor of size 2x2] linear_cuda.weight >>>> Parameter containing: -0.6847 0.2149 -0.5473 0.6863 [torch.cuda.FloatTensor of size 2x2 (GPU 0)] 

 

3.2 自己模型的遷移

對於自己創建的模型類,由於繼承了torch.nn.Module,則可同樣使用.cuda()來將模型中用到的所有參數都存儲到顯存中去。

這里筆者曾經有一個疑問:當我們對模型存儲到顯存中去之后,那么這個模型中的方法后面所創建出來的Tensor是不是都會默認變成cuda的數據類型。答案是否定的。具體操作留給讀者自己去實現。

3.3 模型小結

對於模型而言,我們可以將其看做是一種類似於Variable的容器。我們對它進行.cuda()處理,是將其中的參數放到顯存上去(因為實際使用的時候也是通過這些參數做運算)。

 

https://blog.csdn.net/qq_28444159/article/details/78781201


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM