fix: benchmark enviroment table

This commit is contained in:
jialin
2026-02-06 20:59:47 +08:00
parent 096227e3da
commit 3c5b095510
12 changed files with 258 additions and 360 deletions
+1 -1
View File
@@ -283,7 +283,7 @@ export default function useTableFetch<T>(
}
) => {
loadendRef.current = false;
const newQueryParams = { ...queryParams, ...params, page: 1 };
const newQueryParams = { ...queryParams, ...params };
setQueryParams(newQueryParams);
await fetchData({ query: newQueryParams });
if (watch && !options?.paginate) {
@@ -1,84 +0,0 @@
import AutoTooltip from '@/components/auto-tooltip';
import { convertFileSize } from '@/utils';
import { Descriptions, DescriptionsProps } from 'antd';
import React from 'react';
import styled from 'styled-components';
import { GPUData } from '../../config/detail-types';
import Section from '../summary/section';
const Content = styled.div`
display: flex;
flex-direction: column;
gap: 12px;
align-items: flex-start;
.name {
font-weight: 500;
}
`;
const Environment: React.FC<GPUData> = (props) => {
const items: DescriptionsProps['items'] = [
// {
// key: '4',
// label: 'Name',
// children: <AutoTooltip ghost>{props.name}</AutoTooltip>
// },
{
key: '1',
label: 'VRAM',
children: convertFileSize(props.memory_total)
},
{
key: '3',
label: 'Driver',
children: props.driver_version
},
{
key: '2',
label: 'Runtime',
children: props.runtime_version
},
{
key: '6',
label: 'Core',
children: props.core_total
},
{
key: '5',
label: 'Vendor',
children: props.vendor
},
{
key: '7',
label: 'GPU Type',
children: props.type
}
];
return (
<Section
title={
<span style={{ color: 'var(--ant-color-text-tertiary)' }}>
GPU {props.index}
</span>
}
>
<Content>
<div className="name">
<AutoTooltip ghost>{props.name}</AutoTooltip>
</div>
<Descriptions
items={items}
colon={true}
column={3}
styles={{
content: {
justifyContent: 'flex-start'
}
}}
></Descriptions>
</Content>
</Section>
);
};
export default Environment;
@@ -0,0 +1,39 @@
import { Col, Row } from 'antd';
import React from 'react';
const GPUHeader: React.FC<{
columns: {
title: string;
key: string;
span: number;
colStyle?: React.CSSProperties;
}[];
}> = ({ columns }) => {
return (
<Row style={{ width: '100%' }} align="middle">
{columns.map((col) => (
<Col key={col.key} span={col.span} style={{ ...col.colStyle }}>
<span
style={{
display: 'flex',
alignItems: 'flex-start',
gap: 4,
flexDirection: 'column'
}}
>
<span
style={{
color: 'var(--ant-color-text-tertiary)',
fontSize: 12
}}
>
{col.title}
</span>
</span>
</Col>
))}
</Row>
);
};
export default GPUHeader;
@@ -1,15 +1,16 @@
import AutoTooltip from '@/components/auto-tooltip';
import RowChildren from '@/components/seal-table/components/row-children';
import SealTable from '@/components/seal-table/index';
import useExpandedRowKeys from '@/hooks/use-expanded-row-keys';
import { convertFileSize } from '@/utils';
import { useIntl } from '@umijs/max';
import useMemoizedFn from 'ahooks/lib/useMemoizedFn';
import { Col, Row, Tag } from 'antd';
import { Col, Row } from 'antd';
import _ from 'lodash';
import React, { useMemo } from 'react';
import styled from 'styled-components';
import { useDetailContext } from '../../config/detail-context';
import { GPUData, WorkerData } from '../../config/detail-types';
import GPUHeader from './gpu-header';
import useGPUColumns from './use-gpu-columns';
import useWorkerColumns from './use-worker-columns';
const Container = styled.div`
display: flex;
@@ -17,164 +18,90 @@ const Container = styled.div`
gap: 16px;
`;
/**
*
* @returns display worker info and gpu info.
*/
const Environment: React.FC = () => {
const intl = useIntl();
const GPUColumns = useGPUColumns();
const workerColumns = useWorkerColumns();
const { detailData } = useDetailContext();
const { snapshot } = detailData;
// instance info
const instanceEntry = Object.entries(snapshot.instances ?? {})[0];
const instanceData = instanceEntry?.[1];
const { handleExpandChange, handleExpandAll, expandedRowKeys } =
useExpandedRowKeys();
const mainWorker = useMemo(() => {
// get workers data
const [[workerName, workerInfo]] = Object.entries(snapshot.workers);
const gpuData = Object.values(snapshot.gpus).filter(
(gpu) => gpu.worker_name === workerName
const workerMap = useMemo(() => {
return new Map(
Object.entries(snapshot.workers ?? {}).map(([workerName, workerInfo]) => [
workerInfo.id,
workerInfo
])
);
}, [snapshot.workers]);
const gpuList = useMemo(() => {
return Object.values(snapshot.gpus ?? {}) || [];
}, [snapshot.gpus]);
const findWorkerById = (workerID: number): WorkerData | undefined => {
return workerMap.get(workerID) || undefined;
};
const findGPUByWorkerName = (name: string): GPUData[] => {
return gpuList.filter((gpu) => gpu.worker_name === name);
};
// main worker
const mainWorker = useMemo(() => {
const mainworker = findWorkerById(instanceData.worker_id);
if (!mainworker) {
return null;
}
const gpuData = findGPUByWorkerName(mainworker.name);
return {
...workerInfo,
...mainworker,
..._.pick(gpuData?.[0], ['driver_version', 'runtime_version']),
isMain: true,
children: gpuData
};
}, [snapshot]);
}, [snapshot.gpus, snapshot.workers, instanceData]);
const subWorkers = useMemo(() => {
const [[instanceName, instanceData]] = Object.entries(snapshot.instances);
// subordinate workers
const subWorkerList = useMemo(() => {
const subOrdinaryWorkers = instanceData?.subordinate_workers || [];
return subOrdinaryWorkers.map((worker) => {
const gpuData = Object.values(snapshot.gpus).filter(
(gpu) => gpu.worker_name === worker.worker_name
);
// Find the worker info from the snapshot workers
const subWorker = findWorkerById(worker.worker_id);
if (!subWorker) {
return null;
}
const gpuData = findGPUByWorkerName(subWorker.name);
return {
...worker,
...subWorker,
..._.pick(gpuData?.[0], ['driver_version', 'runtime_version']),
isMain: false,
children: gpuData
};
});
}, [snapshot, mainWorker]);
const GPUColumns: {
title: string;
dataIndex: string;
key: string;
span: number;
colStyle?: React.CSSProperties;
render?: (value: any, record: any) => React.ReactNode;
}[] = [
{
title: intl.formatMessage({ id: 'benchmark.env.gpuName' }),
dataIndex: 'name',
key: 'name',
span: 6,
colStyle: { paddingLeft: 16 },
render: (value: string, record: any) => (
<AutoTooltip ghost>{value}</AutoTooltip>
)
},
{
title: intl.formatMessage({ id: 'benchmark.env.index' }),
dataIndex: 'index',
key: 'index',
span: 4,
colStyle: { paddingLeft: 48 }
},
{
title: intl.formatMessage({ id: 'resources.table.vendor' }),
dataIndex: 'vendor',
key: 'vendor',
span: 6,
colStyle: { paddingLeft: 110 }
},
{
title: intl.formatMessage({ id: 'resources.table.vram' }),
dataIndex: 'memory_total',
key: 'memory_total',
span: 4,
render: (value: number, record: any) => convertFileSize(value)
},
{
title: intl.formatMessage({ id: 'resources.table.core' }),
dataIndex: 'core_total',
key: 'core_total',
span: 4,
colStyle: { paddingLeft: 36 }
}
];
const columns = [
{
title: intl.formatMessage({ id: 'benchmark.env.workerName' }),
dataIndex: 'name',
key: 'name',
span: 6,
render: (value: string, record: any) => {
return (
<>
<AutoTooltip ghost>{value}</AutoTooltip>
{record.isMain && (
<Tag color="geekblue" style={{ marginLeft: 8 }}>
Main
</Tag>
)}
</>
);
}
},
{
title: intl.formatMessage({ id: 'benchmark.env.system' }),
dataIndex: 'os',
key: 'system',
span: 5,
render: (os: { name: string; version: string }, record: any) => {
return (
<AutoTooltip
ghost
>{`${record.os?.name || ''} (${record.os?.version || ''})`}</AutoTooltip>
);
}
},
{
title: intl.formatMessage({ id: 'benchmark.env.runtimeVersion' }),
dataIndex: 'runtime_version',
key: 'runtime_version',
span: 3,
render: (val: any, record: any) => {
return <AutoTooltip ghost>{record.runtime_version || ''}</AutoTooltip>;
}
},
{
title: intl.formatMessage({ id: 'benchmark.env.driverVersion' }),
dataIndex: 'driver_version',
key: 'driver_version',
span: 3,
render: (val: any, record: any) => {
return <AutoTooltip ghost>{record.driver_version || ''}</AutoTooltip>;
}
},
{
title: intl.formatMessage({ id: 'benchmark.env.cpuCounts' }),
dataIndex: 'cpu_total',
key: 'cpu_total',
span: 3
},
{
title: intl.formatMessage({ id: 'resources.table.memory' }),
dataIndex: 'memory_total',
key: 'memory_total',
span: 4,
render: (value: number) => convertFileSize(value)
}
];
}, [snapshot]);
const dataList = useMemo(() => {
return [mainWorker, ...subWorkers];
}, [mainWorker, subWorkers]);
return [mainWorker, ...subWorkerList].filter(Boolean) as WorkerData[];
}, [mainWorker, subWorkerList]);
const handleToggleExpandAll = useMemoizedFn((expanded: boolean) => {
const keys = dataList?.map((item) => item.id);
@@ -188,29 +115,7 @@ const Environment: React.FC = () => {
const renderChildren = useMemoizedFn((list: any[]) => {
return (
<div style={{ borderRadius: 'var(--ant-table-header-border-radius)' }}>
<Row style={{ width: '100%' }} align="middle">
{GPUColumns.map((col) => (
<Col key={col.key} span={col.span} style={{ ...col.colStyle }}>
<span
style={{
display: 'flex',
alignItems: 'flex-start',
gap: 4,
flexDirection: 'column'
}}
>
<span
style={{
color: 'var(--ant-color-text-tertiary)',
fontSize: 12
}}
>
{col.title}
</span>
</span>
</Col>
))}
</Row>
<GPUHeader columns={GPUColumns}></GPUHeader>
<RowChildren>
{list.map((gpu) => (
<Row key={gpu.id} style={{ width: '100%' }} align="middle">
@@ -250,8 +155,7 @@ const Environment: React.FC = () => {
dataSource={dataList}
loading={false}
loadend={true}
columns={columns}
childParentKey="id"
columns={workerColumns}
expandable={true}
></SealTable>
</Container>
@@ -1,43 +0,0 @@
import { convertFileSize } from '@/utils';
import { Descriptions, DescriptionsProps } from 'antd';
import React from 'react';
import { WorkerData } from '../../config/detail-types';
const Environment: React.FC<WorkerData> = (props) => {
const { os, cpu_total, memory_total } = props;
const items: DescriptionsProps['items'] = [
{
key: '4',
label: 'System',
children: os.name
},
{
key: '1',
label: 'CPU Count',
children: cpu_total
},
{
key: '5',
label: 'Memory Total',
children: convertFileSize(memory_total)
}
];
return (
<div>
<Descriptions
items={items}
colon={false}
column={3}
layout="vertical"
styles={{
content: {
justifyContent: 'flex-start'
}
}}
></Descriptions>
</div>
);
};
export default Environment;
@@ -0,0 +1,56 @@
import AutoTooltip from '@/components/auto-tooltip';
import { convertFileSize } from '@/utils';
import { useIntl } from '@umijs/max';
export default function useGPUColumns(): {
title: string;
dataIndex: string;
key: string;
span: number;
colStyle?: React.CSSProperties;
render?: (value: any, record: any) => React.ReactNode;
}[] {
const intl = useIntl();
return [
{
title: intl.formatMessage({ id: 'benchmark.env.gpuName' }),
dataIndex: 'name',
key: 'name',
span: 6,
colStyle: { paddingLeft: 16 },
render: (value: string, record: any) => (
<AutoTooltip ghost>{value}</AutoTooltip>
)
},
{
title: intl.formatMessage({ id: 'benchmark.env.index' }),
dataIndex: 'index',
key: 'index',
span: 4,
colStyle: { paddingLeft: 48 }
},
{
title: intl.formatMessage({ id: 'resources.table.vendor' }),
dataIndex: 'vendor',
key: 'vendor',
span: 4,
colStyle: { paddingLeft: 110 }
},
{
title: intl.formatMessage({ id: 'resources.table.vram' }),
dataIndex: 'memory_total',
key: 'memory_total',
colStyle: { paddingLeft: 40 },
span: 6,
render: (value: number, record: any) => convertFileSize(value)
},
{
title: intl.formatMessage({ id: 'resources.table.core' }),
dataIndex: 'core_total',
key: 'core_total',
span: 4,
colStyle: { paddingLeft: 36 }
}
];
}
@@ -0,0 +1,80 @@
import AutoTooltip from '@/components/auto-tooltip';
import { convertFileSize } from '@/utils';
import { useIntl } from '@umijs/max';
import { Tag } from 'antd';
export default function useWorkerColumns(): {
title: string;
dataIndex: string;
key: string;
span: number;
colStyle?: React.CSSProperties;
render?: (value: any, record: any) => React.ReactNode;
}[] {
const intl = useIntl();
return [
{
title: intl.formatMessage({ id: 'benchmark.env.workerName' }),
dataIndex: 'name',
key: 'name',
span: 6,
render: (value: string, record: any) => {
return (
<>
<AutoTooltip ghost>{value}</AutoTooltip>
{record.isMain && (
<Tag color="geekblue" style={{ marginLeft: 8 }}>
Main
</Tag>
)}
</>
);
}
},
{
title: intl.formatMessage({ id: 'benchmark.env.system' }),
dataIndex: 'os',
key: 'system',
span: 5,
render: (os: { name: string; version: string }, record: any) => {
return (
<AutoTooltip
ghost
>{`${record.os?.name || ''} (${record.os?.version || ''})`}</AutoTooltip>
);
}
},
{
title: intl.formatMessage({ id: 'benchmark.env.runtimeVersion' }),
dataIndex: 'runtime_version',
key: 'runtime_version',
span: 3,
render: (val: any, record: any) => {
return <AutoTooltip ghost>{record.runtime_version || ''}</AutoTooltip>;
}
},
{
title: intl.formatMessage({ id: 'benchmark.env.driverVersion' }),
dataIndex: 'driver_version',
key: 'driver_version',
span: 3,
render: (val: any, record: any) => {
return <AutoTooltip ghost>{record.driver_version || ''}</AutoTooltip>;
}
},
{
title: intl.formatMessage({ id: 'benchmark.env.cpuCounts' }),
dataIndex: 'cpu_total',
key: 'cpu_total',
span: 3
},
{
title: intl.formatMessage({ id: 'resources.table.memory' }),
dataIndex: 'memory_total',
key: 'memory_total',
span: 4,
render: (value: number) => convertFileSize(value)
}
];
}
@@ -1,61 +0,0 @@
import { Col, Row } from 'antd';
import React from 'react';
import styled from 'styled-components';
import { GPUData as GPUDataType, WorkerData } from '../../config/detail-types';
import Section from '../summary/section';
import GPUData from './gpu-data';
import Metadata from './metadata';
const Container = styled.div`
display: flex;
flex-direction: column;
border-radius: var(--ant-border-radius);
border: 1px solid var(--ant-color-border);
`;
const Content = styled.div`
display: flex;
flex-direction: column;
gap: 16px;
padding: 16px 16px;
`;
const Environment: React.FC<{
workerData: WorkerData;
gpuData: GPUDataType[];
title?: React.ReactNode;
}> = (props) => {
const { title } = props;
return (
<Container>
<Section
title={title}
styles={{
wraper: {
border: 'none',
overflow: 'unset'
},
container: {
border: 'none',
paddingInline: 16,
borderRadius: 0,
borderBottom: '1px solid var(--ant-color-split)'
}
}}
>
<Metadata {...props.workerData} />
</Section>
<Content>
<Row gutter={16}>
{props.gpuData.map((gpu, index) => (
<Col span={12} key={index}>
<GPUData {...gpu} />
</Col>
))}
</Row>
</Content>
</Container>
);
};
export default Environment;
@@ -1,13 +1,16 @@
import { useIntl } from '@umijs/max';
import { Descriptions, DescriptionsProps } from 'antd';
import { Descriptions } from 'antd';
import { DescriptionsItemType } from 'antd/es/descriptions';
import React from 'react';
import { DatasetValueMap } from '../../config';
import { useDetailContext } from '../../config/detail-context';
const Benchmark: React.FC = () => {
const intl = useIntl();
const { detailData, profilesOptions } = useDetailContext();
const items: DescriptionsProps['items'] = [
type ItemTyp = DescriptionsItemType & { hidden?: boolean };
const items: ItemTyp[] = [
{
key: '1',
label: intl.formatMessage({ id: 'benchmark.form.profile' }),
@@ -27,6 +30,7 @@ const Benchmark: React.FC = () => {
label: intl.formatMessage({
id: 'benchmark.detail.inputOutputTokenLength'
}),
hidden: detailData?.dataset_name === DatasetValueMap.ShareGPT,
children: (
<span>
{detailData?.dataset_input_tokens || '-'} /{' '}
@@ -47,6 +51,7 @@ const Benchmark: React.FC = () => {
{
key: '5',
label: intl.formatMessage({ id: 'playground.image.params.seed' }),
hidden: detailData?.dataset_name === DatasetValueMap.ShareGPT,
children: detailData?.dataset_seed || '-'
}
];
@@ -54,9 +59,9 @@ const Benchmark: React.FC = () => {
return (
<div>
<Descriptions
items={items}
items={items.filter((item) => !item.hidden)}
colon={false}
column={3}
column={detailData?.dataset_name === DatasetValueMap.ShareGPT ? 2 : 3}
styles={{
content: {
justifyContent: 'flex-start'
+6 -5
View File
@@ -64,6 +64,11 @@ export interface GPUData {
core_total: number;
}
export interface Snapshot {
instances: Record<string, InstancesData>;
workers: Record<string, WorkerData>;
gpus: Record<string, GPUData>;
}
export interface BenchmarkDetail {
profile: string;
dataset_seed: number;
@@ -100,11 +105,7 @@ export interface BenchmarkDetail {
progress: any;
worker_id: number;
pid: number;
snapshot: {
instances: Record<string, InstancesData>;
workers: Record<string, WorkerData>;
gpus: Record<string, GPUData>;
};
snapshot: Snapshot;
gpu_summary: string;
gpu_vendor_summary: string;
id: number;
@@ -214,7 +214,7 @@ const useColumnSettings = (options: {
<AutoTooltip
ghost
minWidth={20}
showTitle
showTitle={text > 0}
title={<InfoColumn fieldList={fieldList} data={record}></InfoColumn>}
>
{_.round(text, 2) || '-'}
+2 -1
View File
@@ -95,7 +95,8 @@ const Catalog: React.FC = () => {
const handleCategoryChange = (value: any) => {
handleQueryChange({
categories: value
categories: value,
page: 1
});
};