为何time.process_time()测量model.fit()性能时结果异常(远超系统时间)
问题
我使用以下代码片段测量并输出模型拟合过程中消耗的时间:
import time perf_counter_train_begin = time.perf_counter() process_time_train_begin = time.process_time() model.fit(data, ...) perf_counter_train = time.perf_counter() - perf_counter_train_begin process_time_train = time.process_time() - process_time_train_begin print(f"System Time: {perf_counter_train}; Process Time: {process_time_train}")
原本预期,由于系统调用、进程调度等因素,通过time.perf_counter()获取的系统时间可能远大于time.process_time()获取的进程时间。但运行神经网络训练脚本时,得到如下结果:
System Time: 51.13854772000013; Process Time: 115.725974476
根据时钟判断系统时间测量正确,但进程时间结果异常,请问我哪里操作出错了?
分析与解决
你没操作错,这是完全正常的现象,核心原因是两个函数的统计逻辑不同:
time.process_time()统计的是当前进程下所有线程的CPU时间总和,不是单线程的CPU耗时。而神经网络训练框架(比如TensorFlow、PyTorch)默认会开启多线程/多设备并行计算,多个线程同时占用CPU资源,累加后的总CPU时间自然会超过实际流逝的物理时间(也就是perf_counter()统计的时间)。- 举个直观的例子:如果训练同时跑了4个线程,每个线程实际占用CPU 30秒,那么
process_time()会返回120秒,但实际流逝的物理时间只有30秒左右,和你得到的结果逻辑完全匹配。 - 要是你想验证这个结论,可以手动限制训练框架的线程数:比如TensorFlow用
tf.config.threading.set_intra_op_parallelism_threads(1),PyTorch用torch.set_num_threads(1),之后再运行代码,就能看到process_time()的结果会和perf_counter()的结果接近。
内容的提问来源于stack exchange,提问作者user3366592
相关产品推荐
相关产品推荐

