【PyTorch】优化分析,网康科技
0evadmin
编程语言
1
文件名:【PyTorch】优化分析,网康科技
【PyTorch】优化分析
文章目录 1. 模型训练过程划分1.1. 定义过程1.1.1. 全局参数设置1.1.2. 模型定义 1.2. 数据集加载过程1.2.1. Dataset类:创建数据集1.2.2. Dataloader类:加载数据集 1.3. 训练循环 2. 优化分析2.1. 定义过程2.2. 数据集加载过程2.3. 训练循环2.3.1. 训练模型2.3.2. 评估模型 1. 模型训练过程划分 主过程在__main__下。 if __name__ == '__main__':... 主过程分为定义过程、数据集加载过程和训练循环。 1.1. 定义过程 1.1.1. 全局参数设置 参数名作用learning_rate控制模型参数的更新步长device指定模型训练使用的设备(CPU或GPU)num_epochs指定在训练集上训练的轮数batch_size指定每批数据的样本数num_workers指定加载数据集的进程数prefetch_factor指定每个进程预加载的批数 1.1.2. 模型定义 组件作用writer定义tensorboard的事件记录器net定义神经网络结构net.apply(init_weights)模型参数初始化criterion定义损失函数optimizer定义优化器 1.2. 数据集加载过程 1.2.1. Dataset类:创建数据集 作用:定义数据集的结构和访问数据集中样本的方式。定义过程中通常需要读取数据文件,但这并不意味着将整个数据集加载到内存中。如何创建数据集 继承Dataset抽象类自定义数据集TensorDataset类:通过包装张量创建数据集 1.2.2. Dataloader类:加载数据集 作用 数据批量加载:将数据集分成多个批次(batches),并逐批次地加载数据。数据打乱(可选):在每个训练周期(epoch)开始时,DataLoader会对数据集进行随机打乱,以确保在训练过程中每个样本被均匀地使用。 主要参数 参数作用dataset指定数据集batch_size指定每批数据的样本数shuffle=False指定是否在每个训练周期(epoch)开始时进行数据打乱sampler=None指定如何从数据集中选择样本,如果指定这个参数,那么shuffle必须设置为Falsebatch_sampler=None指定生成每个批次中应包含的样本数据的索引。与batch_size、shuffle 、sampler and drop_last参数不兼容num_workers=0指定进行数据加载的进程数collate_fn=None指定将一列表的样本合成mini-batch的方法,用于映射型数据集pin_memory=False是否将数据缓存在物理RAM中以提高GPU传输效率drop_last=False是否在批次结束时丢弃剩余的样本(当样本数量不是批次大小的整数倍时)timeout=0定义在每个批次上等待可用数据的最大秒数。如果超过这个时间还没有数据可用,则抛出一个异常。默认值为0,表示永不超时。worker_init_fn=None指定在每个工作进程启动时进行的初始化操作。可以用于设置共享的随机种子或其他全局状态。multiprocessing_context=None指定多进程数据加载的上下文环境,即多进程库generator=None指定一个生成器对象来生成数据批次prefetch_factor=2控制数据加载器预取数据的数量,默认预取比实际所需的批次数量多2倍的数据persistent_workers=False控制数据加载器的工作进程是否在数据加载完成后继续存在 1.3. 训练循环 外层循环控制在训练集上训练的轮数 for epoch in trange(num_epochs):... 循环内部主要有以下模块: 训练模型 for X, y in dataloader_train:X, y = X.to(device), y.to(device)loss = criterion(net(X), y)optimizer.zero_grad()loss.mean().backward()optimizer.step() 评估模型 每轮训练后在数据集上损失 每轮训练损失每轮测试损失 def evaluate_loss(dataloader):"""评估给定数据集上模型的损失"""metric = d2l.Accumulator(2) # 损失的总和, 样本数量with torch.no_grad():for X, y in dataloader:X, y = X.to(device), y.to(device)loss = criterion(net(X), y)metric.add(loss.sum(), loss.numel())return metric[0] / metric[1] 2. 优化分析 2.1. 定义过程 特点:每次程序运行只需要进行一次。优化思路:将模型转移到GPU,同时non_blocking=True。 2.2. 数据集加载过程 特点:只是定义数据加载的方式,并没有加载数据。优化思路:合理设置数据加载参数,如 batch_size:一般取能被训练集大小整除的值。过小,则每次参数更新时所用的样本数较少,模型无法充分地学习数据的特征和分布,同时参数更新频繁,模型收敛速度提高,CPU到GPU的数据传输次数增加,CPU和内存的消耗总量增加;过大,则每次参数更新时所用的样本数较多,模型性能更稳定,对GPU、CPU和内存的单次消耗增加,对硬件配置要求更高,同时参数更新缓慢,模型收敛速度下降。num_workers:一般取CPU内核数。过小,则数据加载进程少,数据加载缓慢;过大,则数据加载进程多,对CPU要求高。pin_memory:当设置为True时,它告诉DataLoader将加载的数据张量固定在CPU内存中,使数据传输到GPU的过程更快。prefetch_factor:决定每次从磁盘加载多少个batch的数据到内存中,预先加载batch越多,在处理数据时,不会因为数据加载的延迟而影响整体的训练速度,同时可以让GPU在处理数据时保持忙碌,从而提高GPU利用率;过大,则会导致CPU和内存消耗增加。 2.3. 训练循环 优化思路: 训练和评估过程分离或者减少评估的次数:模型从训练到评估需要进行状态切换,模型评估过程开销很大。尽量使用非局部变量:减少变量、对象的创建和销毁过程 2.3.1. 训练模型 特点:训练结构固定优化思路: 将数据转移到GPU,同时non_blocking=True。优化训练结构:比如使用自动混合精度(AMP,要求pytorch>=1.6.0),通过将模型和数据转换为低精度的形式(如FP16),可以显著减少内存使用,即 from torch.cuda.amp import autocast, GradScalergrad_scaler = GradScaler()for epoch in range(num_epochs):start_time = time.perf_counter()for X, y in dataloader_train:X, y = X.to(device, non_blocking=True), y.to(device, non_blocking=True)with autocast():loss = criterion(net(X), y)optimizer.zero_grad()grad_scaler.scale(loss.mean()).backward()grad_scaler.step(optimizer)grad_scaler.update() 2.3.2. 评估模型 特点:评估结构固定优化思路: 将数据转移到GPU,同时non_blocking=True。减少不必要的运算:比如梯度计算,即: with torch.no_grad():...
同类推荐
-

【PyCharm Community Edition】:串口开发,t57
查看 -

【PyQt5+matplotlib】获取鼠标在canvas上的点击坐标,日本动漫新番(python点击鼠标获取坐标)
查看 -

【PyQt】(自制类)处理鼠标点击逻辑,风暴战区礼券
查看 -

【PyQt】(自定义类)阴影遮罩,pcpop网(pyqt隐藏按钮)
查看 -

【PyQt】(自定义类)阴影遮罩-升级版,gb浏览器(pyqt隐藏按钮)
查看 -

【PyQt学习篇 · ⑪】:QPushButton和QCommandLinkButton的使用,声卡报价
查看 -

【PyTorch 卷积】实战自定义的图片归类,步步高vivo手机
查看 -

【PyTorch】 暂退法(dropout),gtx970
查看 -

【PyTorch】nn.Conv2d函数详解,电脑功率
查看