pytorch訓練過程中GPU利用率低

2021-10-07 19:08:58 字數 4000 閱讀 6246

在訓練人臉資料集ms1m時,採用pytorch的imagefolder對原始的影象進行的讀取。由於人臉資料小,且量大,導致gpu很快訓練完成,但是io卻很慢,從而拖垮了整個訓練時間。

以上問題的根本原因在於pytorch沒有自己的資料格式,像tf的tfrecorde,mx的rec檔案以及caffe使用lmdb,都有自己的格式。因此,我們可以採用其他框架的格式做資料讀取,pytorch來做訓練。

影象資料夾如下形式:

imgs

首先生成.lst檔案,該檔案包含了影象的所有路徑。執行**

python img2rec.py train_data imgs -

-list

--recursive -

-num-thread=

10

然後根據生成的.lst檔案生成rec檔案

執行**

python img2rec train_data images -

-num-thread=

10

正式的**部分

import mxnet as mx

from mxnet.gluon.data.vision import imagerecorddataset

from mxnet.gluon.data import dataloader

import torch

import numpy as np

from pil import image

defload_mx_rec()

: data = imagerecorddataset(

'f:/mxnet/train_data.rec'

) train_loader = dataloader(data, batch_size=

4, shuffle=

false

) train_transform = transforms.compose(

[transforms.resize(

[int

(128

*128

/112),

int(

128*

128/

112)])

, transforms.randomcrop(

[128

,128])

, transforms.randomhorizontalflip(

), transforms.totensor()]

)for

input

, label in

iter

(train_loader)

: inputs =

input

.asnumpy(

) nb = torch.rand(4,

3,128,

128)

for i in

range(4

):image = image.fromarray(inputs[i,:,

:,:]

) image = train_transform(image)

nb[i,:,

:,:]

= image

labels = label.asnumpy(

) labels = torch.from_numpy(labels)

.long()

# load_mx_rec()

import mxnet as mx

from mxnet.gluon.data.vision import imagerecorddataset

from mxnet.gluon.data import dataloader

import torch

import numpy as np

import cv2

defload_mx_rec_2()

: data = imagerecorddataset(

'f:/mxnet/train_data.rec'

) data1 = datasets.imagefolder(

'f:/mxnet/images'

) train_loader = dataloader(data, batch_size=

4, shuffle=

false

)# train_transform = transforms.compose([transforms.resize([int(128 * 128 / 112)

# , int(128 * 128 / 112)]), transforms.randomcrop([128, 128])

# , transforms.randomhorizontalflip(), transforms.totensor()])

forinput

, label in

iter

(train_loader)

: inputs =

input

.asnumpy(

) nb = torch.rand(4,

3,128,

128)

for i in

range(4

):image = cv2.cvtcolor(inputs[i,:,

:,:]

, cv2.color_rgb2bgr)

size =

(int

(128

*128

/112),

int(

128*

128/

112)

) image = cv2.resize(image, size)

x = np.random.randint(0,

int(

128*

128/

112)

-128

) y = np.random.randint(0,

int(

128*

128/

112)

-128

) image = image[x:x+

128, y:y+

128]

if random.choice([0

,1])

>0:

cv2.flip(image,

1, image)

image = cv2.cvtcolor(image, cv2.color_bgr2rgb)

image = image.transpose(3,

1,2)

.astype(np.float32)

/255

image[0,

:,:]

=(image[0,

:,:]

-0.5)/

0.5 image[1,

:,:]

=(image[1,

:,:]

-0.5)/

0.5 image[2,

:,:]

=(image[2,

:,:]

-0.5)/

0.5 image = torch.from_numpy(image)

nb[i,:,

:,:]

= image

labels = label.asnumpy(

) labels = torch.from_numpy(labels)

.long()

load_mx_rec_2(

)

訓練過程 GPU訓練

為什麼y2b的8m,8張普通tt為啥要跑幾個月?因為gpu其實有60 的時間都是在等待資料填充完成,簡直蠢。1 換個固態硬碟試試?沒用。問題出在系統匯流排上,一幀的資料量入視訊記憶體後有1.58g 當前最優的分布式訓練方式是通過引數伺服器 parameter server 執行的同步隨機梯度下降演算...

的訓練過程 模型訓練過程中累計auc

在平時計算auc的時候,大都是使用 sklearn.metrics.roc auc score 來計算。一般操作是將每個batch 出來的結果 拼接起來,然後扔到該函式中計算。但是如果測試集量級過大 比如 10億量級 每個樣本的 結果拼接起來之後至少需要 3g記憶體。這個開銷顯然不是我們想要的。有什...

Tensorflow訓練過程中validation

tensorflow因為靜態圖的原因,邊train邊validation的過程相較於pytorch來說複雜一些。分別獲取訓練集和驗證集的資料。我這裡使用的是從tfrecoed讀入資料。training data img name batch train,img batch train,gtboxes...