async def custom_aligned_metrics_streamer(requested_runs: List[AlignedRunIn], x_axis: str) -> bytes: for run_data in requested_runs: run_hashname = run_data.run_id requested_traces = run_data.traces run = Run(hashname=run_hashname) traces_list = [] for trace_data in requested_traces: context = Context(trace_data.context) trace = run.get_trace(metric_name=trace_data.metric_name, context=context) x_axis_trace = run.get_trace(metric_name=x_axis, context=context) if not (trace and x_axis_trace): continue _slice = slice(*trace_data.slice) iters = trace.values.sparse_numpy()[0] sliced_iters = sliced_np_array(iters, _slice) x_axis_iters, x_axis_values = collect_x_axis_data( x_axis_trace, sliced_iters) traces_list.append({ 'metric_name': trace.name, 'context': trace.context.to_dict(), 'x_axis_values': x_axis_values, 'x_axis_iters': x_axis_iters, }) run_dict = {run_hashname: traces_list} encoded_tree = encode_tree(run_dict) yield collect_run_streamable_data(encoded_tree)
def collect_requested_traces(run: Run, requested_traces: List[TraceBase], steps_num: int = 200) -> List[dict]: processed_traces_list = [] for requested_trace in requested_traces: metric_name = requested_trace.metric_name context = Context(requested_trace.context) trace = run.get_trace(metric_name=metric_name, context=context) if not trace: continue iters, values = trace.values.sparse_list() num_records = len(values) step = (num_records // steps_num) or 1 _slice = slice(0, num_records, step) processed_traces_list.append({ 'metric_name': trace.name, 'context': trace.context.to_dict(), 'values': sliced_array(values, _slice), 'iters': sliced_array(iters, _slice), }) return processed_traces_list