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