diff --git a/react-ui/config/routes.ts b/react-ui/config/routes.ts
index 8ec050ae..ec2d251f 100644
--- a/react-ui/config/routes.ts
+++ b/react-ui/config/routes.ts
@@ -141,12 +141,18 @@ export default [
{
name: '实验对比',
path: 'compare',
- component: './Experiment/Comparison/index',
- },
- {
- name: '实验可视化对比',
- path: 'compare-visual',
- component: './Experiment/Aim/index',
+ routes: [
+ {
+ name: '实验对比',
+ path: '',
+ component: './Experiment/Comparison/index',
+ },
+ {
+ name: '可视化对比',
+ path: 'compare-visual',
+ component: './Experiment/Aim/index',
+ },
+ ],
},
{
name: '可视化',
@@ -223,7 +229,18 @@ export default [
{
name: '实验实例详情',
path: 'instance/:experimentId/:id',
- component: './HyperParameter/Instance/index',
+ routes: [
+ {
+ name: '实验实例详情',
+ path: '',
+ component: './HyperParameter/Instance/index',
+ },
+ {
+ name: '可视化对比',
+ path: 'compare-visual',
+ component: './HyperParameter/Aim/index',
+ },
+ ],
},
],
},
diff --git a/react-ui/src/pages/Dataset/components/ResourcePage/index.tsx b/react-ui/src/pages/Dataset/components/ResourcePage/index.tsx
index c21984ac..4714a4f0 100644
--- a/react-ui/src/pages/Dataset/components/ResourcePage/index.tsx
+++ b/react-ui/src/pages/Dataset/components/ResourcePage/index.tsx
@@ -98,7 +98,7 @@ function ResourcePage({ resourceType }: ResourcePageProps) {
dataType={activeType}
dataTag={activeTag}
initialSearchText={cacheState?.searchText}
- initialPagination={cacheState?.initialPagination}
+ initialPagination={cacheState?.pagination}
setCacheState={setCacheState}
>
diff --git a/react-ui/src/pages/Experiment/Comparison/index.tsx b/react-ui/src/pages/Experiment/Comparison/index.tsx
index 200b4ba1..d10e8069 100644
--- a/react-ui/src/pages/Experiment/Comparison/index.tsx
+++ b/react-ui/src/pages/Experiment/Comparison/index.tsx
@@ -77,7 +77,7 @@ function ExperimentComparison() {
const url = res.data;
// window.open(url, '_blank');
SessionStorage.setItem(SessionStorage.aimUrlKey, url);
- navigate('../compare-visual');
+ navigate('compare-visual');
}
};
diff --git a/react-ui/src/pages/Experiment/Info/index.jsx b/react-ui/src/pages/Experiment/Info/index.jsx
index 1e96c34c..56f7e979 100644
--- a/react-ui/src/pages/Experiment/Info/index.jsx
+++ b/react-ui/src/pages/Experiment/Info/index.jsx
@@ -3,7 +3,6 @@ import { ExperimentStatus } from '@/enums';
import { useStateRef } from '@/hooks/useStateRef';
import { useVisible } from '@/hooks/useVisible';
import { getExperimentIns } from '@/services/experiment/index.js';
-import { getWorkflowById } from '@/services/pipeline/index.js';
import themes from '@/styles/theme.less';
import { fittingString, parseJsonText } from '@/utils';
import { formatDate } from '@/utils/date';
@@ -40,7 +39,7 @@ function ExperimentText() {
useEffect(() => {
initGraph();
- getWorkflow();
+ getExperimentInstance();
return () => {
if (evtSourceRef.current) {
@@ -66,38 +65,54 @@ function ExperimentText() {
}, []);
// 获取流水线模版
- const getWorkflow = async () => {
- const [res] = await to(getWorkflowById(locationParams.workflowId));
- if (res && res.data && res.data.dag) {
- try {
- const dag = JSON.parse(res.data.dag);
- dag.nodes.forEach((item) => {
- item.in_parameters = JSON.parse(item.in_parameters);
- item.out_parameters = JSON.parse(item.out_parameters);
- item.control_strategy = JSON.parse(item.control_strategy);
- item.imgName = item.img.slice(0, item.img.length - 4);
- });
- workflowRef.current = dag;
- getExperimentInstance();
- } catch (error) {
- // JSON.parse 错误
- console.error('JSON.parse error: ', error);
- }
- }
- };
+ // const getWorkflow = async () => {
+ // const [res] = await to(getWorkflowById(locationParams.workflowId));
+ // if (res && res.data && res.data.dag) {
+ // try {
+ // const dag = JSON.parse(res.data.dag);
+ // dag.nodes.forEach((item) => {
+ // item.in_parameters = JSON.parse(item.in_parameters);
+ // item.out_parameters = JSON.parse(item.out_parameters);
+ // item.control_strategy = JSON.parse(item.control_strategy);
+ // item.imgName = item.img.slice(0, item.img.length - 4);
+ // });
+ // workflowRef.current = dag;
+ // getExperimentInstance();
+ // } catch (error) {
+ // // JSON.parse 错误
+ // console.error('JSON.parse error: ', error);
+ // }
+ // }
+ // };
// 获取实验实例
const getExperimentInstance = async () => {
const [res] = await to(getExperimentIns(locationParams.id));
- if (res && res.data && workflowRef.current) {
+ if (res && res.data) {
setExperimentIns(res.data);
- const { status, nodes_status, argo_ins_ns, argo_ins_name, finish_time } = res.data;
- const workflowData = workflowRef.current;
+ const { status, nodes_status, argo_ins_ns, argo_ins_name, finish_time, dag } = res.data;
+ if (!dag) {
+ return;
+ }
+
+ const workflow = parseJsonText(dag);
const experimentStatusObjs = parseJsonText(nodes_status);
+ if (!workflow || !workflow.nodes) {
+ return;
+ }
+
+ workflow.nodes.forEach((item) => {
+ item.in_parameters = parseJsonText(item.in_parameters);
+ item.out_parameters = parseJsonText(item.out_parameters);
+ item.control_strategy = parseJsonText(item.control_strategy);
+ item.imgName = item.img.slice(0, item.img.length - 4);
+ });
+ workflowRef.current = workflow;
+
if (experimentStatusObjs) {
// 更新各个节点
- workflowData.nodes.forEach((item) => {
- const experimentNode = experimentStatusObjs?.[item.id];
+ workflow.nodes.forEach((item) => {
+ const experimentNode = experimentStatusObjs[item.id];
updateWorkflowNode(item, experimentNode);
});
@@ -113,20 +128,20 @@ function ExperimentText() {
}
// 绘制图
- getGraphData(workflowData, true);
+ getGraphData(workflow, true);
if (status === ExperimentStatus.Pending) {
// 如果状态是 Pending, 打开第一个节点
- const node = workflowData.nodes[0];
+ const node = workflow.nodes[0];
if (node) {
setExperimentNodeData(node);
openPropsDrawer();
}
} else if (status === ExperimentStatus.Running) {
- // 如果状态是 Running,打开第一个运行中的节点,如果没有运行中的节点,则打开第一个节点
+ // 如果状态是 Running,打开第一个 Running 或者 pending 的节点,如果没有,则打开第一个节点
const node =
- workflowData.nodes.find((item) => item.experimentStatus === ExperimentStatus.Running) ??
- workflowData.nodes[0];
+ workflow.nodes.find((item) => item.experimentStatus === ExperimentStatus.Running || item.experimentStatus === ExperimentStatus.Pending) ??
+ workflow.nodes[0];
if (node) {
setExperimentNodeData(node);
openPropsDrawer();
@@ -153,13 +168,13 @@ function ExperimentText() {
return;
}
try {
- const dataJson = JSON.parse(data);
+ const dataJson = parseJsonText(data);
const statusData = dataJson?.result?.object?.status;
if (!statusData) {
return;
}
const { finishedAt, phase, nodes = {} } = statusData;
-
+
// 更新实验实例状态和结束时间
// setExperimentIns((prev) => ({
// ...prev,
diff --git a/react-ui/src/pages/Experiment/components/ExportModelModal/index.tsx b/react-ui/src/pages/Experiment/components/ExportModelModal/index.tsx
index e4fde742..883ab49c 100644
--- a/react-ui/src/pages/Experiment/components/ExportModelModal/index.tsx
+++ b/react-ui/src/pages/Experiment/components/ExportModelModal/index.tsx
@@ -121,6 +121,8 @@ function ExportModelModal({
const params = {
...formData,
identifier: resource?.identifier,
+ owner: resource?.owner,
+ is_public: resource?.is_public,
name: resource?.name,
[config.sourceParamKey]: DataSource.HandExport,
train_task: {
@@ -174,6 +176,8 @@ function ExportModelModal({
onChange={handleResourceChange}
options={resources}
fieldNames={{ label: 'name', value: 'id' }}
+ optionFilterProp="name"
+ showSearch
allowClear
>
diff --git a/react-ui/src/pages/HyperParameter/Aim/index.tsx b/react-ui/src/pages/HyperParameter/Aim/index.tsx
new file mode 100644
index 00000000..3a8d1d0d
--- /dev/null
+++ b/react-ui/src/pages/HyperParameter/Aim/index.tsx
@@ -0,0 +1,12 @@
+/*
+ * @Author: 赵伟
+ * @Date: 2025-03-31 16:38:59
+ * @Description: 实验对比 Aim
+ */
+
+import IframePage, { IframePageType } from '@/components/IFramePage';
+
+function AimPage() {
+ return ;
+}
+export default AimPage;
diff --git a/react-ui/src/pages/HyperParameter/components/ExperimentHistory/index.tsx b/react-ui/src/pages/HyperParameter/components/ExperimentHistory/index.tsx
index c9c9dce5..39ecebda 100644
--- a/react-ui/src/pages/HyperParameter/components/ExperimentHistory/index.tsx
+++ b/react-ui/src/pages/HyperParameter/components/ExperimentHistory/index.tsx
@@ -3,7 +3,9 @@ import TrialStatusCell from '@/pages/HyperParameter/components/TrialStatusCell';
import { HyperParameterTrial } from '@/pages/HyperParameter/types';
import { getExpMetricsReq } from '@/services/hyperParameter';
import { to } from '@/utils/promise';
+import SessionStorage from '@/utils/sessionStorage';
import tableCellRender, { TableCellValueType } from '@/utils/table';
+import { useNavigate } from '@umijs/max';
import { App, Button, Table, type TableProps } from 'antd';
import classNames from 'classnames';
import { useEffect, useState } from 'react';
@@ -36,6 +38,7 @@ function ExperimentHistory({ trialList = [] }: ExperimentHistoryProps) {
const metricAnalysis: Record = first?.metric_analysis ?? {};
const paramsNames = Object.keys(config);
const metricNames = Object.keys(metricAnalysis);
+ const navigate = useNavigate();
const trialColumns: TableProps['columns'] = [
{
@@ -160,7 +163,8 @@ function ExperimentHistory({ trialList = [] }: ExperimentHistoryProps) {
const [res] = await to(getExpMetricsReq(selectedRowKeys));
if (res && res.data) {
const url = res.data;
- window.open(url, '_blank');
+ SessionStorage.setItem(SessionStorage.aimUrlKey, url);
+ navigate('compare-visual');
}
};
diff --git a/react-ui/src/pages/ModelDeployment/components/ServerLog/index.less b/react-ui/src/pages/ModelDeployment/components/ServerLog/index.less
index 11f3bf34..4b7f5762 100644
--- a/react-ui/src/pages/ModelDeployment/components/ServerLog/index.less
+++ b/react-ui/src/pages/ModelDeployment/components/ServerLog/index.less
@@ -20,5 +20,9 @@
&__more {
padding: 20px 0;
}
+
+ &::-webkit-scrollbar-thumb {
+ background: rgba(255, 255, 255, 0.5);
+ }
}
}