91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

pytorch 網絡預處理與后處理中基于numpy操作的GPU加速

發布時間:2020-07-06 07:04:44 來源:網絡 閱讀:1288 作者:ckllf 欄目:編程語言

  背景

  python腳本運行在服務器端的卷積神經網絡往往需要將圖片數據從cv2(numpy.ndarray)->tensor送入網絡,之后進行inference,再將結果從tensor-> numpy.ndarray的過程。

  由于cv2讀取的數據存于內存中,以pytorch框架舉例,在把數據送入GPU前會產生如下的數據轉換:

  GPU準備進行inference之前會判斷torch.cuda.FloatTensor是否已經處于顯存內,如果沒有的話會隱式調用內存與顯存中的數據轉存協議方法.async_copy()函數,將數據轉存至GPU顯存中,但該部分往往需要消耗大量時間。

  對策:直接在GPU顯存中開辟空間

  應用庫:cupy、dlpack

  一、前處理

  通常pytorch前處理如下:

  # 內存分配torch.FloatTensor空間

  batch_input = torch.zeros(len(image_list), 3, target_height, target_width)

  for index in range(len(image_list)):

  # image->numpy.ndarray

  img = cv2.resize(image_list[index].copy(), (target_width, target_height))

  # uint8->float32

  t_img = np.asarray(img, np.float32)

  #轉置

  m_img = t_img.transpose((2, 0, 1))

  #numpy.ndarray->torch.FloatTensor + 圖像正則化

  n_img = transform(torch.from_numpy(m_img))

  #組成batch data

  batch_input[index, :] = n_img

  # torch.FloatTensor-> torch.cuda.FloatTensor

  batch_input.cuda()

  如果將此batch送入GPU,則會發生如圖1所示的數據轉換。

  現用cupy來取代numpy操作:

  import cupy as cp

  # GPU顯存分配cupy batch_data空間

  batch_input = cp.zeros((len(image_list), 3, target_height, target_width), dtype=cp.float32)

  for index in range(len(image_list)):

  # image->cupy.ndarray

  img = cv2.resize(image_list[index], (target_width, target_height))

  # numpy.uint8 -> cupy.float32

  t_img = cp.asarray(img, cp.float32)

  # 轉置(cupy層面)

  m_img = t_img.transpose((2, 0, 1))

  # 圖像正則化

  n_img = gpu_transform(m_img)

  # 組成 batch data

  batch_input[index, :] = n_img

  # cupy.ndarray -> torch.cuda.FloatTensor

  batch_data = from_dlpack(toDlpack(batch_input)).cuda()

  此時過程轉換為:

  說明幾點:

  1.1由于cupy直接在GPU顯存中分配空間,不需要隱式調用.async_copy()將數據調入顯存內,可見時間對比:

  隱式調用GPU前傳時間如下圖:

  非隱式調用GPU前傳時間如下圖:

  1.2 cupy.ndarray到torch.cuda.FloatTensor沒辦法直接轉換,需要中間轉換格式dlpack,具體轉換如下

  rom cupy.core.dlpack import toDlpack

  from cupy.core.dlpack import fromDlpack

  from torch.utils.dlpack import to_dlpack

  from torch.utils.dlpack import from_dlpack

  import torch鄭州婦科醫院 http://www.sptdfk.com/

  #tensor->cupy

  cupy_data = fromDlpack(to_dlpack(tensor_data))

  #cupy->tensor

  tensor_data = from_dlpack(toDlpack(cupy_data))

  1.3 在pytorch框架中,有的工程需要圖像正則化,有的不需要。當網絡前傳時若需要圖像正則化(一般為減均值與除方差),一般選用的是torchvision.transform。但是該內置函數只接受CPU端的torch.FloatTensor,這就意味著若要使用內置transform函數,就需要將cupy GPU數據先轉成CPU的torch.FloatTensor,勢必會造成數據轉換資源浪費。重寫transform函數:

  self.mean = cp.array([102.9801, 115.9465, 122.7717])

  self.std = cp.array([1., 1., 1.])

  def gpu_transform(self, img):

  for index in range(img.shape[0]):

  img[index,:] -= self.mean[index]

  img[index, :] /= self.std[index]

  return img

  以上過程全部都在GPU內運行,時間幾乎可以忽略

  二、后處理

  此部分適用于分割網絡,即需要預先在GPU端分配生成的mask空間。通常做法分配torch.cuda.FloatTensor空間,隱式調用.async_copy()送入GPU,同樣會消耗很多時間。類似于前處理,可以利用cupy生成mask空間,再轉torch.cuda.FloatTensor。

  mask_gpu= from_dlpack(toDlpack(cp.zeros((len(image_list), self.num_classes, ori_img_size[0], ori_img_size[1]), dtype=cp.float32))).cuda()

  pytorch分配mask時間

  cupy分配mask時間

  三、cupy與常規前后處理時間對比


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

修水县| 尚志市| 图木舒克市| 济宁市| 丘北县| 吉木乃县| 庐江县| 睢宁县| 朝阳市| 延庆县| 托克托县| 桃园市| 杂多县| 库尔勒市| 常山县| 玉田县| 阿克苏市| 河源市| 特克斯县| 福建省| 吴堡县| 额济纳旗| 大洼县| 漠河县| 东辽县| 潼关县| 潜山县| 武功县| 固安县| 通山县| 都昌县| 牙克石市| 洮南市| 北海市| 罗江县| 武平县| 金川县| 海丰县| 福州市| 宜春市| 元阳县|