Created by: Xreki
实现新的Profiler接口,涉及到两个类型的定义
ProfilerOptions类
- 功能:设置Profiler所需的所有配置
class ProfilerOptions(object):
def __init__(self, options=None):
self.options = {
'state': 'All',
'sorted_key': 'default',
'tracer_level': 'Default',
'batch_range': [0, sys.maxsize],
'output_thread_detail': False,
'profile_path': 'none',
'timeline_path': 'none',
'op_summary_path': 'none'
}
if options is not None:
for key in self.options.keys():
if options.get(key, None) is not None:
self.options[key] = options[key]
- 输入:options是一个dict,或包含一个dict的json字符串,可能包含以下关键字
- state,当前
start_profiler
接口参数state - sorted_key,当前
stop_profiler
接口参数sorted_key。 - tracer_level,当前
stop_profiler
接口参数tracer_option。- tracer_option目前还没有宣传和广泛使用,可考虑改名。
- batch_range,Profiler分析的iter范围,需配合Profiler的一些接口函数使用才能生效。
- output_thread_detail,是否打印每个线程的数据。
- 执行器使用多个线程并发启动op,打印所有线程的数据时,刷屏严重,影响用户分析
- profile_path,当前
stop_profiler
接口参数profile_path。- 该文件保存的是序列化数据,不可读,主要用于生成timeline数据。
- 训练Profiler接口若能直接生成timeline数据,则不再需要保存改文件。
- timeline_path,生成timeline文件的路径。
- op_summary_path,生成op summary文件的路径。
- state,当前
- 说明:
- 允许用户指定部分选项配置。未指定的选项使用默认值。
- 待细化:可以提供一些额外的接口,允许用户来修改某一个选项的值。比如用户可以按照如下方式来配置state:
options = ProfilerOptions().with_state("All")
Profiler类
- 新版本中将实现一个Profiler类。这样设计的好处是:
- 通过
ProfilerOptions
来设置Profiler配置选项,且只需要在构造函数中传入一次,可在类型作为成员保存下来,在后续的start
、stop
接口中可以直接使用这些配置。 - 类还可以保存一些别的信息(比如batch_id、enabled),来辅助完成一些别的功能。
- 通过
class Profiler(object):
def __init__(self, enabled=True, options=None):
if options is not None:
self.profiler_options = options
else:
self.profiler_options = ProfilerOptions()
self.batch_id = 0
self.enabled = enabled
-
成员变量:
- options,类型为
ProfilerOptions
,用来设置Profiler所有的配置选项 - batch_id,用来记录训练迭代的iter数,配合
add_step
函数,可实现设定batch_range
的功能。 - enabled,是否开启profile功能。避免用户额外的接口封装工作。当
enabled=False
时,所有的函数都直接返回。
- options,类型为
-
成员函数
-
start()
,Profiler开始统计。对应当前接口start_profiler()
-
stop()
,Profiler结束统计。对应当前接口stop_profiler()
-
reset()
,Profiler复位,即数据清零。对应当前接口reset_profiler()
-
record_step(change_profiler_status=True)
,即batch_id += 1
,表示训练迭代了一次。当change_profiler_status=True
时,该函数会根据batch_range
中的信息来改变Profiler的状态:- 当
batch_id=batch_range[0]
时,会调用start()
来开启Profiler,或者调用reset()
来复位Profiler - 当
batch_id=batch_range[1]
时,会调用stop()
来停止Profiler。
- 当
-
全局函数get_profiler
- 功能:通过一个全局变量
_current_profiler
来记录当前的Profiler对象,通过一个全局函数get_profiler()
来获取当前的Profiler对象。
使用示例
def train():
...
for iter range(max_iters):
exe.run(...)
utils.get_profiler().record_step()
...
options = utils.ProfilerOptions(options={
'state': 'All',
'sorted_key': 'total',
'tracer_level': 'Default',
'batch_range': [5, 15],
'profile_path': 'test.profile'
})
with utils.Profiler(enabled=True, options=options):
train()