From ecabf5b8ca71eea7380645051d98804715e482a3 Mon Sep 17 00:00:00 2001 From: zhaowei Date: Sun, 27 Apr 2025 08:44:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=BB=E5=8A=A8=E5=AD=A6=E4=B9=A0?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8F=AF=E8=A7=86=E5=8C=96=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/ActiveLearn/Instance/index.tsx | 8 ++++ .../ExperimentVisualResult/index.tsx | 38 +++++++++++++++++++ react-ui/src/pages/ActiveLearn/types.ts | 1 + .../components/ExperimentInstance/index.less | 4 +- .../components/ExperimentList/index.tsx | 4 +- .../AutoML/components/TensorBoard/index.tsx | 5 ++- react-ui/src/pages/Points/index.tsx | 23 ++++++++++- 7 files changed, 76 insertions(+), 7 deletions(-) create mode 100644 react-ui/src/pages/ActiveLearn/components/ExperimentVisualResult/index.tsx diff --git a/react-ui/src/pages/ActiveLearn/Instance/index.tsx b/react-ui/src/pages/ActiveLearn/Instance/index.tsx index 1e930ae3..680f935c 100644 --- a/react-ui/src/pages/ActiveLearn/Instance/index.tsx +++ b/react-ui/src/pages/ActiveLearn/Instance/index.tsx @@ -12,6 +12,7 @@ import ActiveLearnBasic from '../components/ActiveLearnBasic'; import ExperimentHistory from '../components/ExperimentHistory'; import ExperimentLog from '../components/ExperimentLog'; import ExperimentResult from '../components/ExperimentResult'; +import ExperimentVisualResult from '../components/ExperimentVisualResult'; import { ActiveLearnData, ActiveLearnInstanceData } from '../types'; import styles from './index.less'; @@ -20,6 +21,7 @@ enum TabKeys { Log = 'log', Result = 'result', History = 'history', + Visual = 'Visual', } const NodePrefix = 'workflow'; @@ -187,6 +189,12 @@ function ActiveLearnInstance() { /> ), }, + { + key: TabKeys.Visual, + label: '可视化结果', + icon: , + children: , + }, ]; const tabItems = diff --git a/react-ui/src/pages/ActiveLearn/components/ExperimentVisualResult/index.tsx b/react-ui/src/pages/ActiveLearn/components/ExperimentVisualResult/index.tsx new file mode 100644 index 00000000..e6893c20 --- /dev/null +++ b/react-ui/src/pages/ActiveLearn/components/ExperimentVisualResult/index.tsx @@ -0,0 +1,38 @@ +/* + * @Author: 赵伟 + * @Date: 2024-09-02 08:42:57 + * @Description: 可视化 + */ + +import IframePage, { IframePageType } from '@/components/IFramePage'; +import { getExpMetricsReq } from '@/services/experiment/index.js'; +import { to } from '@/utils/promise'; +import SessionStorage from '@/utils/sessionStorage'; +import { useEffect, useState } from 'react'; + +type ExperimentVisualResultProps = { + metricsId?: string; +}; + +function ExperimentVisualResult({ metricsId }: ExperimentVisualResultProps) { + const [aimUrl, setAimUrl] = useState(''); + useEffect(() => { + // 获取 AIM Url + const getExpMetrics = async (metricsId: string) => { + const [res] = await to(getExpMetricsReq([metricsId])); + if (res && res.data) { + const url = res.data; + SessionStorage.setItem(SessionStorage.aimUrlKey, url); + setAimUrl(url); + } + }; + + if (metricsId) { + getExpMetrics(metricsId); + } + }, [metricsId]); + + return <>{aimUrl && }; +} + +export default ExperimentVisualResult; diff --git a/react-ui/src/pages/ActiveLearn/types.ts b/react-ui/src/pages/ActiveLearn/types.ts index be5cf89c..aefc3379 100644 --- a/react-ui/src/pages/ActiveLearn/types.ts +++ b/react-ui/src/pages/ActiveLearn/types.ts @@ -52,6 +52,7 @@ export type ActiveLearnData = { update_by?: string; update_time?: string; status_list: string; // 最近五次运行状态 + experiment_ins_id: string; } & FormData; // 主动学习实验实例 diff --git a/react-ui/src/pages/AutoML/components/ExperimentInstance/index.less b/react-ui/src/pages/AutoML/components/ExperimentInstance/index.less index 6cd9ef98..833ced06 100644 --- a/react-ui/src/pages/AutoML/components/ExperimentInstance/index.less +++ b/react-ui/src/pages/AutoML/components/ExperimentInstance/index.less @@ -11,11 +11,11 @@ } .check { - width: calc((100% + 32px + 33px) / 6.25 / 2); + width: calc((100% + 32px + 33px) / 5 / 2); } .index { - width: calc((100% + 32px + 33px) / 6.25 / 2); + width: calc((100% + 32px + 33px) / 5 / 2); } .description { diff --git a/react-ui/src/pages/AutoML/components/ExperimentList/index.tsx b/react-ui/src/pages/AutoML/components/ExperimentList/index.tsx index 3313b1d0..14571f5b 100644 --- a/react-ui/src/pages/AutoML/components/ExperimentList/index.tsx +++ b/react-ui/src/pages/AutoML/components/ExperimentList/index.tsx @@ -249,7 +249,7 @@ function ExperimentList({ type }: ExperimentListProps) { title: '类型', dataIndex: 'type', key: 'type', - width: 120, + width: '10%', render: tableCellRender(false, TableCellValueType.Enum, { options: autoMLTypeOptions, }), @@ -263,7 +263,7 @@ function ExperimentList({ type }: ExperimentListProps) { title: '实验名称', dataIndex: config.nameProperty, key: 'name', - width: '16%', + width: '20%', render: tableCellRender(false, TableCellValueType.Link, { onClick: gotoDetail, }), diff --git a/react-ui/src/pages/AutoML/components/TensorBoard/index.tsx b/react-ui/src/pages/AutoML/components/TensorBoard/index.tsx index d74733e7..e05a9452 100644 --- a/react-ui/src/pages/AutoML/components/TensorBoard/index.tsx +++ b/react-ui/src/pages/AutoML/components/TensorBoard/index.tsx @@ -26,8 +26,9 @@ function TensorBoard({ namespace, path }: TensorBoardProps) { }; const [res] = await to(runTensorBoardReq(params)); if (res && res.data) { - SessionStorage.setItem(SessionStorage.tensorBoardUrlKey, res.data); - setTensorboardUrl(res.data); + const url = res.data; + SessionStorage.setItem(SessionStorage.tensorBoardUrlKey, url); + setTensorboardUrl(url); } }; diff --git a/react-ui/src/pages/Points/index.tsx b/react-ui/src/pages/Points/index.tsx index a20570c7..e96588a5 100644 --- a/react-ui/src/pages/Points/index.tsx +++ b/react-ui/src/pages/Points/index.tsx @@ -21,6 +21,8 @@ enum TaskType { Workflow = 'workflow', Ray = 'ray', Service = 'service', + AutoML = 'machine_learn', + ActiveLearn = 'active_learn', } const taskTypeOptions = [ @@ -40,6 +42,14 @@ const taskTypeOptions = [ value: TaskType.Service, label: '服务', }, + { + value: TaskType.AutoML, + label: '自动机器学习', + }, + { + value: TaskType.ActiveLearn, + label: '主动学习', + }, ]; export type PointsData = { @@ -57,6 +67,7 @@ export type PointsData = { task_ins_id: number; // 实例id task_type: string; user_id: number; + task_state: 0 | 1; // 任务是否被删除,0:删除 }; export type PointsStatistics = { @@ -81,6 +92,16 @@ const formatTask = (value: string, record: PointsData) => { url = `/pipeline/hyperparameter/instance/${record.task_id}/${record.task_ins_id}`; } break; + case TaskType.AutoML: + if (record.task_id && record.task_ins_id) { + url = `/pipeline/automl/instance/${record.task_id}/${record.task_ins_id}`; + } + break; + case TaskType.ActiveLearn: + if (record.task_id && record.task_ins_id) { + url = `/pipeline/active-learn/instance/${record.task_id}/${record.task_ins_id}`; + } + break; case TaskType.Service: if (record.task_id && record.task_ins_id) { url = `/dataset/modelDeployment/serviceInfo/${record.task_id}/versionInfo/${record.task_ins_id}`; @@ -90,7 +111,7 @@ const formatTask = (value: string, record: PointsData) => { break; } - if (url) { + if (url && record.task_state === 1) { return {value}; } else { return {value};