pytorch訓(xùn)練trick

姓名:畢曉鵬

學(xué)號:19021210824

【嵌牛導(dǎo)讀】自己平時積累了一些pytorch的訓(xùn)練trick,分享給大家

【嵌牛鼻子】pytorch

【嵌牛提問】你了解更多的trick嗎?

【嵌牛正文】

pytorch隨機(jī)種子

pytorch隨機(jī)種子是隨機(jī)初始化的,如果想復(fù)現(xiàn)一個比較好的結(jié)果,可以設(shè)置固定隨機(jī)種子。

其中cudnn打開可以提高計算效率,但是會影響每次復(fù)現(xiàn)結(jié)果。另外如果圖像預(yù)處理的時候用了隨機(jī)切割,隨機(jī)翻轉(zhuǎn)需要對python的隨機(jī)數(shù)生成器進(jìn)行固定。

#增加運(yùn)行效率

torch.backends.cudnn.benchmark = False? ? ? ? # if benchmark=True, deterministic will be False

torch.backends.cudnn.deterministic = True

#固定隨機(jī)種子

np.random.seed(0)

torch.manual_seed(0)? ? ? #cpu設(shè)置隨機(jī)種子

torch.cuda.manual_seed_all(0) #為所有g(shù)pu設(shè)置隨機(jī)種子

random.seed(0)

pytorch混合精度訓(xùn)練

pytorch默認(rèn)用fp32進(jìn)行訓(xùn)練,如果用fp16做儲存和乘法,用fp32做累加計算,fp16會節(jié)省顯存占用,加快訓(xùn)練和推理的速度。但是也會帶來一些問題,具體參考下面鏈接,所以用混合精度會更好一些。

Nicolas:【PyTorch】唯快不破:基于Apex的混合精度加速?zhuanlan.zhihu.com

我一開始用的pip進(jìn)行安裝,發(fā)現(xiàn)導(dǎo)入的時候報錯,網(wǎng)上解決辦法是用源碼安裝。

pip uninstall apex

git clone https://www.github.com/nvidia/apex

cd apex

python setup.py install

使用方法:

from apex import amp

(net,net_fc),optimizer = amp.initialize([net,net_fc], optimizer, opt_level= "O1")#這里多個net就用列表

with amp.scale_loss(loss_mean, optimizer) as scaled_loss:

scaled_loss.backward()

#bn同步

from apex.parallel import convert_syncbn_model

net = convert_syncbn_model(net)

net = net.to(device)

#多卡

from apex.parallel import DistributedDataParallel as DDP

net, opt = amp.initialize(net, opt, opt_level="O1")? # 字母小寫o,不是零。

net = DDP(net, delay_allreduce=True)? # 必須在initialze之后

發(fā)現(xiàn)在我電腦上用1050ti對比,3030減小到2725M,速度有一定下降,可能因為我顯卡的原因顯存變化不明顯。

2080ti可以節(jié)省一半顯存,而且速度單卡混合精度要比之前雙卡float32快一點(diǎn)。

多顯卡訓(xùn)練

os.environ["CUDA_VISIBLE_DEVICES"] = "0,1"

device_ids = [0,1]

net = nn.DataParallel(net, device_ids=[0,1])#指定顯卡

net.to(device=device_ids[0])? #網(wǎng)絡(luò)放到顯卡0

單卡加載多卡訓(xùn)練權(quán)重

from collections import OrderedDict

state_dictBA = torch.load(opt.pth)

# create new OrderedDict that does not contain `module.`

new_state_dictBA = OrderedDict()

for k, v in state_dictBA.items():

? ? name = k[7:] # remove `module.`

? ? new_state_dictBA[name] = v

G_BA.load_state_dict(new_state_dictBA)

tensorboard使用

首先安裝 pip tensorboard

在程序里調(diào)用,這里只是顯示波形圖

from torch.utils.tensorboard import SummaryWriter

import time

writer = SummaryWriter('./path/to/log')

for epoch in range(100):

? ? time.sleep(5)

? ? print(epoch)

? ? writer.add_scalar('loss', 100-epoch,epoch)

? ? writer.add_scalar('acc', epoch/100, epoch)

3、在命令窗口打開界面tensorboard --logdir=log,這里在log路徑下打開,否則要指定log文件夾目錄。

計算模型耗時:

正確測試代碼在cuda運(yùn)行時間,需要加上torch.cuda.synchronize(),使用該操作來等待GPU全部執(zhí)行結(jié)束,CPU才可以讀取時間信息。

torch.cuda.synchronize()#等待當(dāng)前設(shè)備上所有流中的所有核心完成。

start = time.time()

result = model(input)

torch.cuda.synchronize()

end = time.time()

多線程讀取數(shù)據(jù)

當(dāng)gpu處理數(shù)據(jù)很快時,cpu讀取數(shù)據(jù)的速度可能會成為瓶頸,導(dǎo)致顯卡利用率一直在波動。

可以設(shè)置多線程(一般為4,8,16),打開pin_memory(需要內(nèi)存大一些)

torch.utils.data.DataLoader(image_datasets[x],

? ? ? ? ? ? ? ? ? ? ? ? ? ? batch_size=batch_size,

? ? ? ? ? ? ? ? ? ? ? ? ? ? shuffle=True,

? ? ? ? ? ? ? ? ? ? ? ? ? ? num_workers=8,

? ? ? ? ? ? ? ? ? ? ? ? ? ? pin_memory=True)

參考:

英偉達(dá)APEX,多GPU分布式訓(xùn)練,同步Batchnorm,自動混合精度訓(xùn)練法寶指南_我的博客有點(diǎn)東西-CSDN博客_syncbatchnorm?blog.csdn.net深度學(xué)習(xí)PyTorch,TensorFlow中GPU利用率較低,CPU利用率很低,且模型訓(xùn)練速度很慢的問題總結(jié)與分析_人工智能_是否龍磊磊真的一無所有的博客-CSDN博客?blog.csdn.netPyTorch測試模型執(zhí)行計算耗費(fèi)的時間?www.itdecent.cnpytorch加載預(yù)訓(xùn)練網(wǎng)絡(luò)權(quán)重,單GPU加載多GPU,CPU加載GPU權(quán)重_人工智能_YellowYi的博客-CSDN博客?blog.csdn.net

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容