Pytorch1.4報RuntimeError: max_pool2d_with_indices_out_cuda_frame failed with error code 0

RuntimeError: max_pool2d_with_indices_out_cuda_frame failed with error code 0

問題描述

pytorch前向推理模型, 在1.3版本下可以運行, 但切換到1.4後報RuntimeError: max_pool2d_with_indices_out_cuda_frame failed with error code 0. 然後進一步分析, 定位錯誤在torch.max_pool2d(input, kernel_size, stride, padding, dilation, ceil_mode), 然而該函數已近在前面幾次執行過.

images = images.cuda() 
pred = model(images.permute(0, 3, 1, 2))

將上述代碼修改成

images = images.cuda() 
pred = model(images.permute(0, 3, 1, 2).contigous())

成功解決問題.

  • Tensor多維數組底層實現是使用一塊連續內存的1維數組(行優先順序存儲,下文描述),Tensor在元信息裏保存了多維數組的形狀,在訪問元素時,通過多維度索引轉化成1維數組相對於數組起始位置的偏移量即可找到對應的數據。某些Tensor操作(如transpose、permute、narrow、expand)與原Tensor是共享內存中的數據,不會改變底層數組的存儲,但原來在語義上相鄰、內存裏也相鄰的元素在執行這樣的操作後,在語義上相鄰,但在內存不相鄰,即不連續了(is not contiguous)。
  • transpose、permute 操作雖然沒有修改底層一維數組,但是新建了一份Tensor元信息,並在新的元信息中重新指定 stride。使用transpose、permute後再使用contiguous方法則會重新開闢一塊內存空間保證數據是在邏輯順序和內存中是一致的,連續內存佈局減少了CPU對對內存的請求次數(訪問內存比訪問寄存器慢100倍),相當於空間換時間.torch.view 方法約定了不修改數組本身,只是使用新的形狀查看數據.

is_contiguous直觀的解釋是Tensor底層一維數組元素的存儲順序與Tensor按行優先一維展開的元素順序是否一致. 如果想要變得連續使用contiguous方法,如果Tensor不是連續的,則會重新開闢一塊內存空間保證數據是在內存中是連續的,如果Tensor是連續的,則contiguous無操作。
permute可以同時操作於tensor的若干維度,transpose只能同時作用於tensor的兩個維度;view只能作用在contiguous的variable上,如果在view之前調用了transpose、permute等,就需要調用contiguous()來返回一個contiguous copy;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章