[Pytorch]當DataParallel碰上RNN的那些坑

[前言]

最近在使用Pytorch寫RNN相關的模型,然後因為實驗室有兩張GPU可以用,所以我就想把model放到兩張GPU平行處理,參考Pytorch document就知道其實用法很簡單,只要使nn.DataParallel(model)就可以了,不過在使用RNN相關模型的時候有一些問題要注意,既然最近遇到了就順便記錄一下,以免以後又遇到重複的問題。

[坑-1]

當使用RNN相關的model搭配nn.DataParallel()時會出現下列warning:

RuntimeWarning: RNN module weights are not part of single contiguous chunk of memory.

This means they need to be compacted at every call, possibly greatly increasing memory usage. To compact weights again call flatten_parameters().

參照網路上的說法,由於將model的參數放到gpu上的時候不保證放置的memory位置一定是連續的,所以可能會有fragmentation現象,這會造成效能的降低,透過flatten_parameters()可以使得model的參數在gpu memory上的位置是連續的

繼續閱讀 “[Pytorch]當DataParallel碰上RNN的那些坑"

[Python]json.load() v.s. json.loads()

[前言]

最近在用別人的open source時因為json檔案讀取的問題卡一段時間,去trace code下去發現原來是別人的專案裡面有用到json.loads(),它的用處跟我平常在用的json.load()不太一樣,所以在這裡紀錄一下。

[問題描述]

首先,json.load()是用來讀取整個檔案的,也就是說通常會先用open()去打開json檔案,然後把檔案讀進來,大概像下面這樣:

with open(fileneme, 'r') as f:
     result=json.load(f)

不過如果是用json.loads()的時候,他會搭配檔案一次讀一行的動作,把該行字串當成json讀進來,用法如下: 繼續閱讀 “[Python]json.load() v.s. json.loads()"

[DL]運行Keras時遇到CUDNN_STATUS_INTERNAL_ERROR問題

[問題描述]

最近在執行Keras程式碼時,遇到了以下的問題:

UnknownError: 2 root error(s) found.
  (0) Unknown: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
     [[{{node conv2d_3/convolution}}]]
     [[loss_1/mul/_201]]
  (1) Unknown: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
     [[{{node conv2d_3/convolution}}]]
0 successful operations.
0 derived errors ignored.

 

[環境描述]

  • 當前的tensorflow版本: 1.14.0
  • 當前的keras版本: 2.2.4
  • 當前的cuda版本: cuda 10

繼續閱讀 “[DL]運行Keras時遇到CUDNN_STATUS_INTERNAL_ERROR問題"

[Pytorch]cuda out of memory when increase loop iteration

今天發現了這陣子一直沒有解決的一個bug,蠢到都想挖一個洞把自己埋起來,還是記錄一下以免日後又犯蠢。

不太清楚要怎麼用英文下這個標題,主要的問題敘述是:在使用pytorch訓練模型的時候,為了紀錄模型對於testing set的效果,每隔幾個epoch我就會將acc / loss append到一個list中,然後我的模型常常會發生一個很神奇的狀況:

剛開始跑的時候GPU mem還塞得下,但隨著loop次數增加,mem居然也相對的增加了,導致幾個loop後就會發生"cuda out of memory"的問題。

 

一開始我還以為是模型太大,可是後來想想,不對啊,如果前幾個loop是可以跑完的,那就代表gpu memoey應該是可以塞下整個模型的,後來去檢查我的code和上網搜尋相關資源後才發現我犯了一個很蠢的事情,先給大家看一下我的code大概是怎麼寫的:

繼續閱讀 “[Pytorch]cuda out of memory when increase loop iteration"

[Python]Utility function of calculate convolution output shape

心情不好就來發發廢文技術文,然後完蛋了要過年了距離我的目標100篇還差5篇。

在使用pytorch時比較麻煩的一點是,convolution的shape要計算好,才不會給錯conv的參數,所以這時候使用者就要對於Convolution到底怎麼運作的(kernel size/padding/stride/dilation)有很清楚的瞭解才行,不然連shape都推不出來是要怎麼給模型參數?

pytorch的doc內對於各種Conv(Conv1d, Conv2d)都給了一個公式讓大家可以很方便的推出input shape 和 output shape之間的對應關係,可是我又很懶不想每次都慢慢去看公式來算,所以參考網路上的資源就寫了兩個function,分別來計算給定input shape和你想要的Conv設定(kernel size/ padding…這些)時,output shape會長怎樣,順便拿這個來發廢文,廢話不多說,直接發代碼啦。

繼續閱讀 “[Python]Utility function of calculate convolution output shape"

[Python]Use Capstone to disassemble code

最近因為研究需要,開始學習如何透過Python將一個PE file的程式碼部分給反組譯成組合語言,以下很快地紀錄整個過程,由於對於資安逆向工程還沒有很熟悉,如果有錯誤還請指正。

PE file,全名又稱The Portable Executable,是一種可以在Windows作業系統下被執行的檔案格式(順帶一提Linux下似乎是ELF),檔案結構大概長下面這個樣子(圖片來源):

PE-architecture.jpg

整個檔案除了header以外,還有許多的sections,而其中程式碼的部分會被存放在.text section裡面。

繼續閱讀 “[Python]Use Capstone to disassemble code"

[ML]Sklearn的scoring parameters

對於Machine Learning / Deep Learning,常會根據Task的不同而使用不同的Evaluation Metrics,例如MAE、MSE、RMSE…等等,在sklearn中當然也提供了function讓user能夠快速地進行計算,比方說如果想要算MAE的話可以這樣寫:

from sklearn.metrics import mean_absolute_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mean_absolute_error(y_true, y_pred)

y_true = [[0.5, 1], [-1, 1], [7, -6]]
y_pred = [[0, 2], [-1, 2], [8, -5]]
mean_absolute_error(y_true, y_pred)

mean_absolute_error(y_true, y_pred, multioutput='raw_values')

mean_absolute_error(y_true, y_pred, multioutput=[0.3, 0.7])

透過呼叫sklearn.metrics下的mean_absolute_error()來進行計算,但如果仔細看sklearn的document的話會發現在scoring parameter下有一些奇怪的名詞,例如:

  • neg_mean_absolute_error
  • neg_mean_squared_error
  • neg_mean_squared_log_error
  • neg_median_absolute_error

不難猜測前綴的neg_是指negative,所以這些值實際上應該是原本的值加上一個負號繼續閱讀 “[ML]Sklearn的scoring parameters"