姓名:畢曉鵬
學(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