项目教程及代码来自:同济子豪兄
https://github.com/TommyZihao/Train_Custom_Dataset
https://www.bilibili.com/video/BV1Ng411C7WY
一、学习总结
这节课体验了pytorch的迁移学习模式的一种,即在pytorch原有模型(示例为resnet18)基础上,微调最后一层(分类层)。当然也能选择微调所有训练层或是仅仅借用resnet18的框架自行从头训练参数,这部分就等日后体验。 模型的训练以batch为最小单位进行,每一次遍历完训练集(一个epoch)后会依据测试集对得到模型的准确度进行评估,并保存下准确度更高模型。训练过程中的日志记录以及可视化监控由wandb,一个可以通过浏览器页面查看实时数据的py库实现。
(本地vs云平台)
二、感悟
这一次代码试运行打破了我想在本地mac上训练模型的幻想。训练模型时mac的cpu没法并行计算,速度极慢,跑一个epoch要700秒…相对比gpu云平台只要9秒一个epoch,还是乖乖选云平台吧。
wandb,即weight and bias数据监控平台太惊艳了,用云gpu平台训练模型+wandb浏览器页面监控数据,在外只要带个pad就能方便的观测,谢谢子豪佬介绍的网站[赞]
三、日志
安装py库
conda有 seaborn plotly
pip安装 wandb pip install wandb -i https://pypi.tuna.tsinghua.edu.cn/simple
用于记录训练过程中的数据。可视化与监控
关于对模型进行完整训练时报错:
[W ParallelNative.cpp:229] Warning: Cannot set number of intraop threads after parallel work has started or after set_num_threads call when using native parallel backend (function set_num_threads)
调查后发现原因为DataLoader无法使用并行计算
目前只有两种低效的解决方法。能跑通,但效率大打折扣
1.调用DataLoader时设置num_workers=0,只为数据提供主线程
#DataLoader类的函数参数说明
num_workers (int, optional): how many subprocesses to use for data
loading. ``0`` means that the data will be loaded in the main process.
default: ``0``)
2是修改环境变量,同样是设置仅使用单线程
export OMP_NUM_THREADS=1
或者
import os
os.environ["OMP_NUM_THREADS"] = "1"
参考链接:
https://www.cnblogs.com/ytxwzqin/p/12012025.html pytorch-3
https://www.pudn.com/news/6228d9fd9ddf223e1ad257a4.html
https://stackoverflow.com/questions/64772335/pytorch-w-parallelnative-cpp206