pytorch網(wǎng)絡(luò)預(yù)處理與后處理中基于numpy操作的GPU加速-創(chuàng)新互聯(lián)

背景

為江城等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及江城網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、江城網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

python腳本運(yùn)行在服務(wù)器端的卷積神經(jīng)網(wǎng)絡(luò)往往需要將圖片數(shù)據(jù)從cv2(numpy.ndarray)->tensor送入網(wǎng)絡(luò),之后進(jìn)行inference,再將結(jié)果從tensor-> numpy.ndarray的過程。

由于cv2讀取的數(shù)據(jù)存于內(nèi)存中,以pytorch框架舉例,在把數(shù)據(jù)送入GPU前會(huì)產(chǎn)生如下的數(shù)據(jù)轉(zhuǎn)換:

GPU準(zhǔn)備進(jìn)行inference之前會(huì)判斷torch.cuda.FloatTensor是否已經(jīng)處于顯存內(nèi),如果沒有的話會(huì)隱式調(diào)用內(nèi)存與顯存中的數(shù)據(jù)轉(zhuǎn)存協(xié)議方法.async_copy()函數(shù),將數(shù)據(jù)轉(zhuǎn)存至GPU顯存中,但該部分往往需要消耗大量時(shí)間。

對(duì)策:直接在GPU顯存中開辟空間

應(yīng)用庫(kù):cupy、dlpack

一、前處理

通常pytorch前處理如下:

# 內(nèi)存分配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)

#轉(zhuǎn)置

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,則會(huì)發(fā)生如圖1所示的數(shù)據(jù)轉(zhuǎn)換。

現(xiàn)用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)

# 轉(zhuǎn)置(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()

此時(shí)過程轉(zhuǎn)換為:

說明幾點(diǎn):

1.1由于cupy直接在GPU顯存中分配空間,不需要隱式調(diào)用.async_copy()將數(shù)據(jù)調(diào)入顯存內(nèi),可見時(shí)間對(duì)比:

隱式調(diào)用GPU前傳時(shí)間如下圖:

非隱式調(diào)用GPU前傳時(shí)間如下圖:

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

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鄭州婦科醫(yī)院 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框架中,有的工程需要圖像正則化,有的不需要。當(dāng)網(wǎng)絡(luò)前傳時(shí)若需要圖像正則化(一般為減均值與除方差),一般選用的是torchvision.transform。但是該內(nèi)置函數(shù)只接受CPU端的torch.FloatTensor,這就意味著若要使用內(nèi)置transform函數(shù),就需要將cupy GPU數(shù)據(jù)先轉(zhuǎn)成CPU的torch.FloatTensor,勢(shì)必會(huì)造成數(shù)據(jù)轉(zhuǎn)換資源浪費(fèi)。重寫transform函數(shù):

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內(nèi)運(yùn)行,時(shí)間幾乎可以忽略

二、后處理

此部分適用于分割網(wǎng)絡(luò),即需要預(yù)先在GPU端分配生成的mask空間。通常做法分配torch.cuda.FloatTensor空間,隱式調(diào)用.async_copy()送入GPU,同樣會(huì)消耗很多時(shí)間。類似于前處理,可以利用cupy生成mask空間,再轉(zhuǎn)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時(shí)間

cupy分配mask時(shí)間

三、cupy與常規(guī)前后處理時(shí)間對(duì)比

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)站題目:pytorch網(wǎng)絡(luò)預(yù)處理與后處理中基于numpy操作的GPU加速-創(chuàng)新互聯(lián)
鏈接URL:http://muchs.cn/article38/pgssp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、定制開發(fā)建站公司、網(wǎng)站維護(hù)、品牌網(wǎng)站建設(shè)搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)