MindStudio Insight服务化调优
简介
MindStudio Insight工具以时间线(Timeline)的呈现方式,将请求端到端的执行情况平铺在时间轴上,直观体现请求在各个关键阶段的耗时情况以及当下请求的状态信息,可帮助用户快速识别服务化性能瓶颈,并调整调优策略。
使用前准备
环境准备
请先安装MindStudio Insight工具,具体安装步骤请参见MindStudio Insight安装指南。
数据准备
请导入正确格式的性能数据,具体数据说明请参见数据说明,数据导入操作请参见导入数据。
数据说明
MindStudio Insight支持导入性能数据文件,并以图形化形式呈现相关内容。在服务化调优场景中,主要支持导入两种数据类型,分别为可视化折线图的SQLite数据库文件(profiler.db)和推理服务化请求trace数据的json文件(chrome_tracing.json)。
根据文件类型的不同,MindStudio Insight提供了灵活的导入方式,具体如表 1 数据导入方式所示。
| 文件名称 | 导入方式 |
|---|---|
| chrome_tracing.json | 支持导入单文件。 |
| profiler.db | - 支持导入单文件。 - 支持批量导入:导入多个文件夹中的profiler.db文件,只需选择父目录导入即可。 |
| 以“ms_service_”开头的db文件 | 支持导入同一个文件夹下以“ms_service_”开头的多个db文件,这些文件代表多个进程文件,以及一个总体的db文件,只需选择文件夹目录即可。 |
注意事项
- 支持同时导入系统调优和服务化调优的性能数据,需将两个场景的数据置于同一文件夹中,导入时选择该文件夹即可。
- 数据获取方法请参见《性能调优工具指南》中的“msServiceProfiler服务化调优工具 > msServiceProfiler服务化调优 > 数据解析”章节。
时间线(Timeline)
功能说明
在服务化调优过程中,MindStudio Insight工具以时间线(Timeline)的呈现方式,将请求端到端的执行情况平铺在时间轴上,直观体现请求在各个关键阶段的耗时情况以及当下请求的状态信息。通过分析时间线,用户可以快速识别服务化性能瓶颈,并根据问题现象,调整调优策略。
通过观察时间线视图各个层级上的耗时长短、间隙等判断对应的关键阶段是否存在性能问题。
界面介绍
界面展示
时间线(Timeline)界面包含工具栏(区域一)、图形化展示(区域二)和数据窗格(区域三)三个部分,如图 1 时间线界面所示。
- 区域一:工具栏,包含常用快捷按钮,从左至右依次为标记列表、过滤(支持按卡或按泳道过滤展示)、搜索、连线事件、重置缩放(页面复原)和时间轴缩小放大按钮。
- 区域二:图形化展示,左侧显示服务化采集的性能数据,一层级为进程,二层级为请求的各个关键阶段信息,具体泳道信息请参见泳道信息。右侧为时间线视图,逐行对时间线进行图形化展现,包括各关键阶段执行序列和执行时长。
- 区域三:数据窗格,统计信息或指令详情信息展示区,选中详情(Slice Detail)为选中单个关键阶段的详细信息、选中列表(Slice List)为泳道选中区域的关键阶段列表信息。
表 1 泳道信息
| 泳道名称 | 说明 |
|---|---|
| CPU Usage | CPU平均利用率。仅在开启host_system_usage_freq数据采集开关后采集到的数据才会展示该泳道。 |
| Memory Usage | Host侧系统内存使用率。仅在开启host_system_usage_freq数据采集开关后采集到的数据才会展示该泳道。 |
| NPU Usage | NPU内存占用。仅在开启npu_memory_usage_freq数据采集开关后采集到的数据才会展示该泳道。 |
| KVCache | KV Cache剩余量随时间变化图。 |
| BatchSchedule | 组batch时间,单位ns。 |
| WAITING | 请求转移到WAITING状态的时刻。 |
| PENDING | 请求转移到PENDING状态的时刻。 |
| RUNNING | 请求转移到RUNNING状态的时刻。 |
| RUNNING2 | 请求转移到RUNNING2状态的时刻。 |
| SWAPPED | batch进入SWAPPED状态的时刻。 |
| RECOMPUTE | 请求转移到RECOMPUTE状态的时刻。 |
| SUSPENDED | batch进入SUSPENDED状态的时刻。 |
| END | 请求转移到END状态的时刻。 |
| END_PRE | 请求转移到END_PRE状态的时刻。 |
| STOP | batch进入STOP状态的时刻。 |
| PREFILL_HOLD | batch进入PREFILL_HOLD状态的时刻。 |
| http | http请求完整生命周期数据,包含http请求的接收,encode,decode的时间。 |
| batchFrameworkProcessing | 组batch数据,包含组batch时间,当前batch的类型(prefill或者decode),请求的rid和迭代次数。 |
| preprocessBatch | IBIS数据下发中给batch添加参数的时间,单位ns。 |
| SerializeExecuteMessage | IBIS数据下发中序列化时间,单位ns。 |
| setInferBuffer | IBIS数据下发中设置buffer时间,单位ns。 |
| grpcWriteToSlave | IBIS数据下发中gRPC读,单位ns。 |
| deserializeExecuteRequestsForInfer | IBIS数据下发中反序列化时间,单位ns。 |
| convertTensorBatchToBackend | IBIS数据下发中request转化时间,单位ns。 |
| getInputMetadata | IBIS数据下发中获取metadata时间,单位ns。 |
| beforemodelExec | 模型执行前处理时间,单位ns。 |
| modelExec | 模型执行数据,单位ns,包含执行时间,当前batch的类型(prefill或者decode),请求的rid和迭代次数。 |
| instanceExecute | 模型实例执行时间,单位ns。 |
| Queue | 请求进入队列的时刻。 |
| PDcommunication | PD分离通信时间,单位ns。仅在PD分离场景下存在该泳道。 |
| forward | 模型推理前向传播时间,单位ns。 |
| operatorExecute | Python侧模型执行接口时间,单位ns。 |
| processPythonExecResult | 数据接收中response转化,序列化以及写入共享内存时间,单位ns。 |
| deserializeExecuteResponse | 数据接收中反序列化时间,单位ns。 |
| saveoutAndContinueBatching | 数据接收中将response解析为output的时间,单位ns。 |
| continueBatching | 数据接收中将请求加入队列的时间,单位ns。 |
| sendExecuteMessage | 发送执行信息时间,单位ns。 |
| postprocess | 模型推理后处理时间,单位ns。 |
| preprocess | 模型推理前处理时间,单位ns。 |
| processBroadcastMessage | 通信广播信息时间,单位ns。 |
| sample | 采样时间,单位ns。 |
| PullKVCache | PD节点之间的KVCache传输时间,单位ns。仅在PD分离场景下存在该泳道。 |
| CANN | 算子执行时间,单位ns。仅在开启acl_task_time数据采集开关后采集到的数据才会展示该泳道。 |
| dpBatch | 模型推理过程中各请求对应的dp域信息。 |
| RequestState | 模型推理过程中请求状态变化。 |
使用说明
服务化调优场景下,时间线(Timeline)界面的使用说明可参见《MindStudio Insight系统调优》的“使用说明”。
选中详情
当选中单个关键阶段色块时,可在下方“选中详情”页签中显示该关键阶段的详情信息,当“选中详情”中存在res_list信息时,单击表格中rid列表的任意一行,会在“选中详情”的右侧区域显示对应rid的request详细信息,request详情根据实际采集的信息动态显示,如图 1 选中详情所示,字段解释如表 1 选中详情字段解释所示。
| 中文字段 | 英文字段 | 说明 |
|---|---|---|
| 标题 | Title | 名称。 |
| 开始 | Start | 起始时间。 |
| 开始(原始时间戳) | Start(Raw Timestamp) | 数据采集到的原始开始时间。 |
| 持续时间 | Wall Duration | 总耗时。 |
| 参数 | Args | 关键阶段的相关参数信息。 |
系统视图
在“系统视图”页签,当选择“统计系统视图”时,页面包含卡序号选框、服务化数据页签,在卡序号选框中可以选择想要查看的卡。
服务化数据包括kvcache_usage、batch_info、request_data和forward_info等页签,如图 2 系统视图所示。
选择任一服务化数据,右侧区域会显示对应的详细信息,字段解释如表 2 服务化视图字段说明所示,且各字段支持搜索,在字段名称后单击
,可搜索所需信息。
| 中文字段 | 英文字段 | 说明 |
|---|---|---|
| kvcache_usage | kvcache_usage | 推理过程的显存使用情况。 |
| rid | rid | 请求ID。 |
| name | name | 具体改变显存使用的方法。 |
| real_start_time_ms | real_start_time_ms | 发生显存使用情况变更的时间,单位ms。 |
| device_kvcache_left | device_kvcache_left | 显存中剩余blocks数量。 |
| kvcache_usage_rate | kvcache_usage_rate | kvcache利用率。 |
| batch_info | batch_info | 服务化推理batch为粒度的详细数据,包含组batch和执行batch两种耗时信息。 |
| name | name | 用于区分组batch和执行batch。name为batchFrameworkProcessing表示组batch;name为modelExec表示执行batch。 |
| res_list | res_list | batch组合情况。 |
| start_time_ms | start_time_ms | 组batch或执行batch的开始时间,单位ms。 |
| end_time_ms | end_time_ms | 组batch或执行batch的结束时间,单位ms。 |
| batch_size | batch_size | batch中的请求数量。 |
| batch_type | batch_type | batch中的请求状态(prefill和decode)。 |
| during_time_ms | during_time_ms | 执行时间,单位ms。 |
| dp*_rid | dp*_rid | DP域包含的请求ID,*表示DP域ID,取值为[0, n-1]。 |
| dp*_size | dp*_size | DP域的batchsize,*表示DP域ID,取值为[0, n-1]。 |
| dp*_forward_ms | dp*_forward_ms | DP域中执行时长最长的forward的执行时间,单位ms,*表示DP域ID,取值为[0, n-1]。 |
| request_data | request_data | 服务化推理请求为粒度的详细数据,包括TTFT,请求的输入输出长度信息。 |
| http_rid | http_rid | HTTP请求ID。 |
| start_time_ms | start_time_ms | 请求到达的时间,单位ms。 |
| recv_token_size | recv_token_size | 请求的输入长度。 |
| reply_token_size | reply_token_size | 请求的输出长度。 |
| execution_time_ms | execution_time_ms | 请求端到端耗时,单位ms。 |
| queue_wait_time_ms | queue_wait_time_ms | 请求在整个推理过程中在队列中等待的时间,这里包括waiting状态和pending状态的时间,单位ms。 |
| first_token_latency | first_token_latency | 首Token时延,单位ms。 |
| forward_info | forward_info | 服务化推理模型前向执行过程的详细数据。 |
| name | name | 标注forward事件,代表模型前向执行过程。 |
| relative_start_time(ms) | relative_start_time(ms) | 每台机器上forward与第一个forward之间的时间。 |
| start_time(ms) | start_time(ms) | forward的开始时间。 |
| end_time(ms) | end_time(ms) | forward的结束时间。 |
| during_time(ms) | during_time(ms) | forward的执行时间,单位ms。 |
| bubble_time(ms) | bubble_time(ms) | forward之间的空泡时间,单位ms。 |
| batch_size | batch_size | forward处理的请求数量。 |
| batch_type | batch_type | forward中的请求状态。 |
| forward_iter | forward_iter | 不同卡上forward的迭代序号。 |
| dp_rank | dp_rank | 标识forward的DP信息,相同DP域该列的值相同。 |
| prof_id | prof_id | 标识不同卡,相同的卡该列的值相同。 |
| hostname | hostname | 标识不同机器,相同机器该列的值相同。 |
支持生成色块相关折线图
在服务化调优场景下,支持生成任意色块的“执行时间折线图”和“空泡折线图”,便于分析问题。
在时间线(Timeline)界面,选择任一泳道的任意一个色块,单击鼠标右键,选择“生成该色块执行时间折线图”或“生成该色块空泡折线图”,跳转至折线图(Curve)界面,生成该色块所在泳道的对应折线图和数据详情,显示平均持续时间和持续时间,如图 3 生成色块折线图所示。
如果在折线图中发现异常,需要定位异常点,可区域放大选择需查看的异常点,在折线图下方数据详情表格中找到对应数据,在数据所在行单击鼠标右键,选择“跳转至时间线视图”,可跳转至时间线(Timeline)界面,定位至具体的色块上,如图 4 跳转至时间线视图所示。
折线图(Curve)
功能说明
支持以折线图和数据详情表的形式展示具体数据变化,便于直观的分析。仅当导入profiler.db文件时,展示折线图(Curve)界面。
界面介绍
折线图(Curve)界面包含参数配置栏(区域一)、折线数据(区域二)和表格数据详情(区域三)三个部分组成,如图 1 折线图界面所示。
- 区域一:参数配置栏,包含卡序号和分组方式。
- 区域二:折线数据,以折线图形式展示数据的变化情况。
- 区域三:表格数据详情,展示了SQLite数据库的详细数据。表格支持排序和分页功能。单击每列的表头,可根据当前列的升序、降序和默认排序呈现数据。
使用说明
支持折线图局部放大和还原
MindStudio Insight支持通过鼠标左键框选放大选中部分和右键还原进行折线图的展示。为提升显示性能,折线图在数据量较大时会隐藏大部分点,可在框选到足够精细区域时显示所有点位,也可单击鼠标右键还原最初整体展示效果。
在折线图中单击鼠标左键拖至需要放大的终点位置并松开鼠标左键,框选部分将会被放大;如果还存在点被隐藏,重复放大操作即可展示被隐藏的点,选中放大区域如图 1 选中放大区域所示。
在折线图中也可单击正上方的图例,选择隐藏所需的折线,隐藏后,该折线在图中不展示,对应图例置灰,再次单击置灰图例,可将其重新展示。
说明
- 单击折线图右上角
按钮,使其为置灰状态,则折线图将锁定,不再支持鼠标左键框选放大功能;再次单击此按钮,或者单击鼠标右键即可恢复。放大功能默认开启。 - 单击折线图右上角
按钮,折线图将会撤销一次放大操作。 - 单击折线图右上方
按钮,折线图将会恢复最初状态。






