为何process_time()返回异常时长?模型训练耗时测量问题
解决模型训练耗时测量错误的问题
问题根源
process_time()返回的是当前进程的CPU累计执行时间(用户态+内核态运行时间总和),并非真实的墙钟时间(从训练开始到结束实际经过的时间)。
- 你看到的
start=17.203125不是指17点,而是进程启动后到调用start = process_time()时,CPU已经累计执行了17.2秒;end=64888.7是训练结束时进程的CPU累计执行时间,两者差值是训练过程中CPU实际运行的时长,和真实训练耗时完全不是一个概念。 - 如果训练依赖GPU,CPU多数时间处于等待状态,
process_time()不会统计等待时间;但如果是多线程CPU运算,它会累加所有线程的CPU时间,导致结果远大于实际耗时。
正确测量实际耗时的方法
用以下两种方法测量真实经过的时间:
方法1:使用perf_counter()(推荐,精度更高)
from time import perf_counter start = perf_counter() history = model.fit(data,...) end = perf_counter() print(f"实际训练耗时: {end - start:.2f} 秒")
方法2:使用time()
import time start = time.time() history = model.fit(data,...) end = time.time() print(f"实际训练耗时: {end - start:.2f} 秒")
排查原测量结果异常的方向
如果想搞清楚process_time()结果离谱的原因,可以做这些检查:
- 查看训练时的CPU使用率:如果是纯CPU训练且开启了多线程/多进程,
process_time()会累加所有核心的运行时间,比如8核CPU满负荷跑2小时,结果会是16小时左右。 - 检查训练代码是否有同步执行的CPU密集型任务:比如数据预处理放在训练循环里实时执行,导致CPU持续高负载,累计时间远超实际耗时。
- 确认框架的训练配置:比如TensorFlow的
fit()是否开启了多线程数据加载,这部分的CPU运行时间会被process_time()统计进去。
内容的提问来源于stack exchange,提问作者user21525821
相关产品推荐
相关产品推荐

