-
+
-
diff --git a/react-ui/src/pages/Experiment/training/index.jsx b/react-ui/src/pages/Experiment/Info/index.jsx
similarity index 100%
rename from react-ui/src/pages/Experiment/training/index.jsx
rename to react-ui/src/pages/Experiment/Info/index.jsx
diff --git a/react-ui/src/pages/Experiment/training/index.less b/react-ui/src/pages/Experiment/Info/index.less
similarity index 100%
rename from react-ui/src/pages/Experiment/training/index.less
rename to react-ui/src/pages/Experiment/Info/index.less
diff --git a/react-ui/src/pages/Experiment/training/props.less b/react-ui/src/pages/Experiment/Info/props.less
similarity index 100%
rename from react-ui/src/pages/Experiment/training/props.less
rename to react-ui/src/pages/Experiment/Info/props.less
diff --git a/react-ui/src/pages/Experiment/training/props.tsx b/react-ui/src/pages/Experiment/Info/props.tsx
similarity index 100%
rename from react-ui/src/pages/Experiment/training/props.tsx
rename to react-ui/src/pages/Experiment/Info/props.tsx
diff --git a/react-ui/src/pages/Experiment/components/ExperimentStatusCell/index.less b/react-ui/src/pages/Experiment/components/ExperimentStatusCell/index.less
new file mode 100644
index 00000000..a5df71aa
--- /dev/null
+++ b/react-ui/src/pages/Experiment/components/ExperimentStatusCell/index.less
@@ -0,0 +1,12 @@
+.experiment-status-cell {
+ height: 100%;
+ &__label {
+ display: none;
+ }
+}
+
+.experiment-status-cell:hover {
+ .experiment-status-cell__label {
+ display: inline;
+ }
+}
diff --git a/react-ui/src/pages/Experiment/components/ExperimentStatusCell/index.tsx b/react-ui/src/pages/Experiment/components/ExperimentStatusCell/index.tsx
new file mode 100644
index 00000000..373b6ffa
--- /dev/null
+++ b/react-ui/src/pages/Experiment/components/ExperimentStatusCell/index.tsx
@@ -0,0 +1,28 @@
+/*
+ * @Author: 赵伟
+ * @Date: 2024-04-18 18:35:41
+ * @Description: 实验状态
+ */
+
+import { ExperimentStatus } from '@/enums';
+import { experimentStatusInfo as statusInfo } from '@/pages/Experiment/status';
+import styles from './index.less';
+
+function ExperimentStatusCell(status?: ExperimentStatus | null) {
+ if (status === null || status === undefined || !statusInfo[status]) {
+ return
--;
+ }
+ return (
+
+

+
+ {statusInfo[status]?.label}
+
+
+ );
+}
+
+export default ExperimentStatusCell;
diff --git a/react-ui/src/pages/Experiment/components/LogGroup/index.tsx b/react-ui/src/pages/Experiment/components/LogGroup/index.tsx
index a3da3044..cd84406d 100644
--- a/react-ui/src/pages/Experiment/components/LogGroup/index.tsx
+++ b/react-ui/src/pages/Experiment/components/LogGroup/index.tsx
@@ -4,9 +4,9 @@
* @Description: 日志组件
*/
+import { ExperimentStatus } from '@/enums';
import { useStateRef } from '@/hooks';
-import { ExperimentStatus } from '@/pages/Experiment/status';
-import { ExperimentLog } from '@/pages/Experiment/training/props';
+import { ExperimentLog } from '@/pages/Experiment/Info/props';
import { getExperimentPodsLog } from '@/services/experiment/index.js';
import { DoubleRightOutlined, DownOutlined, UpOutlined } from '@ant-design/icons';
import { Button } from 'antd';
@@ -47,7 +47,7 @@ function LogGroup({
const [logList, setLogList, logListRef] = useStateRef
([]);
const [completed, setCompleted] = useState(false);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
- const [isMouseDown, setIsMouseDown, isMouseDownRef] = useStateRef(false);
+ const [_isMouseDown, setIsMouseDown, isMouseDownRef] = useStateRef(false);
useEffect(() => {
scrollToBottom(false);
diff --git a/react-ui/src/pages/Experiment/components/LogList/index.tsx b/react-ui/src/pages/Experiment/components/LogList/index.tsx
index 8a2ade14..0d833107 100644
--- a/react-ui/src/pages/Experiment/components/LogList/index.tsx
+++ b/react-ui/src/pages/Experiment/components/LogList/index.tsx
@@ -1,5 +1,5 @@
-import { ExperimentStatus } from '@/pages/Experiment/status';
-import { ExperimentLog } from '@/pages/Experiment/training/props';
+import { ExperimentStatus } from '@/enums';
+import { ExperimentLog } from '@/pages/Experiment/Info/props';
import LogGroup from '../LogGroup';
import styles from './index.less';
diff --git a/react-ui/src/pages/Experiment/components/TensorBoardStatus/index.tsx b/react-ui/src/pages/Experiment/components/TensorBoardStatus/index.tsx
index d8dad901..8a6f5b7c 100644
--- a/react-ui/src/pages/Experiment/components/TensorBoardStatus/index.tsx
+++ b/react-ui/src/pages/Experiment/components/TensorBoardStatus/index.tsx
@@ -5,16 +5,15 @@ import classNames from 'classnames';
import styles from './index.less';
// import stopImg from '@/assets/img/tensor-board-stop.png';
import terminatedImg from '@/assets/img/tensor-board-terminated.png';
+import { TensorBoardStatus } from '@/enums';
-export enum TensorBoardStatusEnum {
- Unknown = 'Unknown', // 未知
- Pending = 'Pending', // 启动中
- Running = 'Running', // 运行中
- Terminated = 'Terminated', // 未启动或者已终止
- Failed = 'Failed', // 失败
-}
+type TensorBoardStatusInfo = {
+ label: string;
+ icon: string;
+ classname: string;
+};
-const statusConfig = {
+const statusConfig: Record = {
Unknown: {
label: '未知',
icon: terminatedImg,
@@ -43,12 +42,12 @@ const statusConfig = {
};
type TensorBoardStatusProps = {
- status: TensorBoardStatusEnum;
+ status: TensorBoardStatus;
onClick: () => void;
};
-function TensorBoardStatus({
- status = TensorBoardStatusEnum.Unknown,
+function TensorBoardStatusCell({
+ status = TensorBoardStatus.Unknown,
onClick,
}: TensorBoardStatusProps) {
return (
@@ -64,7 +63,7 @@ function TensorBoardStatus({
{statusConfig[status].icon ? (
<>
|
- {status === TensorBoardStatusEnum.Pending ? (
+ {status === TensorBoardStatus.Pending ? (
) : (
{
if (
- experimentIn.tensorBoardStatus === TensorBoardStatusEnum.Terminated ||
- experimentIn.tensorBoardStatus === TensorBoardStatusEnum.Failed
+ experimentIn.tensorBoardStatus === TensorBoardStatus.Terminated ||
+ experimentIn.tensorBoardStatus === TensorBoardStatus.Failed
) {
await runTensorBoard(experimentIn);
} else if (
- experimentIn.tensorBoardStatus === TensorBoardStatusEnum.Running &&
+ experimentIn.tensorBoardStatus === TensorBoardStatus.Running &&
experimentIn.tensorboardUrl
) {
window.open(experimentIn.tensorboardUrl, '_blank');
@@ -457,12 +458,12 @@ function Experiment() {
{item.nodes_result?.tensorboard_log ? (
- handleTensorboard(item)}
- >
+ >
) : (
- '-'
+ '--'
)}
diff --git a/react-ui/src/pages/Experiment/status.ts b/react-ui/src/pages/Experiment/status.ts
index b9c45af6..02b68f53 100644
--- a/react-ui/src/pages/Experiment/status.ts
+++ b/react-ui/src/pages/Experiment/status.ts
@@ -1,23 +1,13 @@
+import { ExperimentStatus } from '@/enums';
import themes from '@/styles/theme.less';
-export interface StatusInfo {
+export interface ExperimentStatusInfo {
label: string;
color: string;
icon: string;
}
-export enum ExperimentStatus {
- Running = 'Running',
- Succeeded = 'Succeeded',
- Pending = 'Pending',
- Failed = 'Failed',
- Error = 'Error',
- Terminated = 'Terminated',
- Skipped = 'Skipped',
- Omitted = 'Omitted',
-}
-
-export const experimentStatusInfo: Record
= {
+export const experimentStatusInfo: Record = {
Running: {
label: '运行中',
color: themes.primaryColor,
diff --git a/react-ui/src/pages/ModelDeployment/Info/index.tsx b/react-ui/src/pages/ModelDeployment/Info/index.tsx
index a548e93a..4f73f46f 100644
--- a/react-ui/src/pages/ModelDeployment/Info/index.tsx
+++ b/react-ui/src/pages/ModelDeployment/Info/index.tsx
@@ -17,9 +17,9 @@ import { ModelDeploymentData } from '../types';
import styles from './index.less';
export enum ModelDeploymentTabKey {
- Predict = 'Predict',
- Guide = 'Guide',
- Log = 'Log',
+ Predict = 'Predict', // 预测
+ Guide = 'Guide', // 调用指南
+ Log = 'Log', // 服务日志
}
function ModelDeploymentInfo() {
diff --git a/react-ui/src/pages/ModelDeployment/List/index.tsx b/react-ui/src/pages/ModelDeployment/List/index.tsx
index bc1f03dd..934b4cbd 100644
--- a/react-ui/src/pages/ModelDeployment/List/index.tsx
+++ b/react-ui/src/pages/ModelDeployment/List/index.tsx
@@ -166,7 +166,7 @@ function ModelDeployment() {
};
// 分页切换
- const handleTableChange: TableProps['onChange'] = (pagination, filters, sorter, { action }) => {
+ const handleTableChange: TableProps['onChange'] = (pagination, _filters, _sorter, { action }) => {
if (action === 'paginate') {
setPagination(pagination);
}
@@ -179,7 +179,7 @@ function ModelDeployment() {
dataIndex: 'index',
key: 'index',
width: '20%',
- render(text, record, index) {
+ render(_text, _record, index) {
return {(pagination.current! - 1) * pagination.pageSize! + index + 1};
},
},
diff --git a/react-ui/src/pages/ModelDeployment/types.ts b/react-ui/src/pages/ModelDeployment/types.ts
index c8dfe808..4bdf28c8 100644
--- a/react-ui/src/pages/ModelDeployment/types.ts
+++ b/react-ui/src/pages/ModelDeployment/types.ts
@@ -26,7 +26,7 @@ export type ModelDeploymentData = {
// 操作类型
export enum ModelDeploymentOperationType {
- Create = 'Create',
- Update = 'Update',
- Restart = 'Restart',
+ Create = 'Create', // 创建
+ Update = 'Update', // 更新
+ Restart = 'Restart', // 重启
}
diff --git a/react-ui/src/services/experiment/index.js b/react-ui/src/services/experiment/index.js
index 89028b24..66d27eb6 100644
--- a/react-ui/src/services/experiment/index.js
+++ b/react-ui/src/services/experiment/index.js
@@ -126,7 +126,15 @@ export function getExpEvaluateInfosReq(experimentId) {
// 获取当前实验的模型训练指标信息
export function getExpTrainInfosReq(experimentId) {
- return request(`/api/mmp//aim/getExpTrainInfos/${experimentId}`, {
+ return request(`/api/mmp/aim/getExpTrainInfos/${experimentId}`, {
method: 'GET',
});
}
+
+// 获取当前实验的指标对比地址
+export function getExpMetricsReq(data) {
+ return request(`/api/mmp/aim/getExpMetrics`, {
+ method: 'POST',
+ data
+ });
+}
diff --git a/react-ui/src/types.ts b/react-ui/src/types.ts
index 57dc3856..aa9b0e5e 100644
--- a/react-ui/src/types.ts
+++ b/react-ui/src/types.ts
@@ -4,7 +4,7 @@
* @Description: 定义全局类型,比如无关联的页面都需要要的类型
*/
-import { ExperimentStatus } from '@/pages/Experiment/status';
+import { ExperimentStatus } from '@/enums';
// 流水线全局参数
export type PipelineGlobalParam = {
diff --git a/react-ui/src/utils/table.tsx b/react-ui/src/utils/table.tsx
new file mode 100644
index 00000000..3058284a
--- /dev/null
+++ b/react-ui/src/utils/table.tsx
@@ -0,0 +1,68 @@
+/*
+ * @Author: 赵伟
+ * @Date: 2024-06-26 10:05:52
+ * @Description: 列表自定义 render
+ */
+
+import { formatDate } from '@/utils/date';
+import { Tooltip } from 'antd';
+import dayjs from 'dayjs';
+
+type TableCellFormatter = (value?: any | null) => string | undefined | null;
+
+// 字符串转换函数
+export const stringFormatter: TableCellFormatter = (value?: any | null) => {
+ return value;
+};
+
+// 日期转换函数
+export const dateFormatter: TableCellFormatter = (value?: any | null) => {
+ if (value === undefined || value === null || value === '') {
+ return null;
+ }
+ if (!dayjs(value).isValid()) {
+ return null;
+ }
+ return formatDate(value);
+};
+
+// 数组转换函数
+export function arrayFormatter(property?: string) {
+ return (value?: any | null): ReturnType => {
+ if (
+ value === undefined ||
+ value === null ||
+ Array.isArray(value) === false ||
+ value.length === 0
+ ) {
+ return null;
+ }
+
+ let list = value;
+ if (property && typeof value[0] === 'object') {
+ list = value.map((item) => item[property]);
+ }
+ return list.join(',');
+ };
+}
+
+function tableCellRender(ellipsis: boolean = false, format: TableCellFormatter = stringFormatter) {
+ return (value?: any | null) => {
+ const text = format(value);
+ if (ellipsis && text) {
+ return (
+
+ {renderCell(text)}
+
+ );
+ } else {
+ return renderCell(text);
+ }
+ };
+}
+
+function renderCell(text?: any | null) {
+ return {text ?? '--'};
+}
+
+export default tableCellRender;
diff --git a/ruoyi-modules/management-platform/pom.xml b/ruoyi-modules/management-platform/pom.xml
index 4cb1ae7d..37234ad0 100644
--- a/ruoyi-modules/management-platform/pom.xml
+++ b/ruoyi-modules/management-platform/pom.xml
@@ -205,6 +205,17 @@
org.springframework.boot
spring-boot-starter-websocket
+
+ org.json
+ json
+ 20210307
+
+
+ org.apache.dubbo
+ dubbo
+ 3.0.8
+ compile
+
diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/aim/AimController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/aim/AimController.java
index f1750133..f6b0b863 100644
--- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/aim/AimController.java
+++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/aim/AimController.java
@@ -4,16 +4,16 @@ import com.ruoyi.common.core.web.controller.BaseController;
import com.ruoyi.common.core.web.domain.GenericsAjaxResult;
import com.ruoyi.platform.service.AimService;
import com.ruoyi.platform.vo.FrameLogPathVo;
+import com.ruoyi.platform.vo.InsMetricInfoVo;
import com.ruoyi.platform.vo.PodStatusVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
+import java.util.List;
+
@RestController
@RequestMapping("aim")
@Api("Aim管理")
@@ -22,17 +22,25 @@ public class AimController extends BaseController {
@Resource
private AimService aimService;
- /**
- * 启动tensorBoard接口
- *
- * @param frameLogPathVo 存储路径
- * @return url
- */
- @PostMapping("/run")
- @ApiOperation("启动aim`")
+
+ @GetMapping("/getExpTrainInfos/{experiment_id}")
+ @ApiOperation("获取当前实验的模型训练指标信息")
@ApiResponse
- public GenericsAjaxResult runAim(@RequestBody FrameLogPathVo frameLogPathVo) throws Exception {
- return genericsSuccess(aimService.runAim(frameLogPathVo));
+ public GenericsAjaxResult> getExpTrainInfos(@PathVariable("experiment_id") Integer experimentId) throws Exception {
+ return genericsSuccess(aimService.getExpTrainInfos(experimentId));
}
+ @GetMapping("/getExpEvaluateInfos/{experiment_id}")
+ @ApiOperation("获取当前实验的模型推理指标信息")
+ @ApiResponse
+ public GenericsAjaxResult> getExpEvaluateInfos(@PathVariable("experiment_id") Integer experimentId) throws Exception {
+ return genericsSuccess(aimService.getExpEvaluateInfos(experimentId));
+ }
+
+ @PostMapping("/getExpMetrics")
+ @ApiOperation("获取当前实验的指标对比地址")
+ @ApiResponse
+ public GenericsAjaxResult getExpMetrics(@RequestBody List runIds) throws Exception {
+ return genericsSuccess(aimService.getExpMetrics(runIds));
+ }
}
\ No newline at end of file
diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/jupyter/JupyterController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/jupyter/JupyterController.java
index 0abcae75..3167e2ec 100644
--- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/jupyter/JupyterController.java
+++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/jupyter/JupyterController.java
@@ -3,6 +3,7 @@ package com.ruoyi.platform.controller.jupyter;
import com.ruoyi.common.core.web.controller.BaseController;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.domain.GenericsAjaxResult;
+import com.ruoyi.platform.domain.DevEnvironment;
import com.ruoyi.platform.service.JupyterService;
import com.ruoyi.platform.vo.FrameLogPathVo;
import com.ruoyi.platform.vo.PodStatusVo;
@@ -60,8 +61,8 @@ public class JupyterController extends BaseController {
@PostMapping("/getStatus")
@ApiOperation("查询jupyter pod状态")
@ApiResponse
- public GenericsAjaxResult getStatus(@RequestBody FrameLogPathVo frameLogPathVo) throws Exception {
- return genericsSuccess(this.jupyterService.getJupyterStatus(frameLogPathVo));
+ public GenericsAjaxResult getStatus(DevEnvironment devEnvironment) throws Exception {
+ return genericsSuccess(this.jupyterService.getJupyterStatus(devEnvironment));
}
diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ModelDependencyDao.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ModelDependencyDao.java
index 3a999886..ba1bc40b 100644
--- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ModelDependencyDao.java
+++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ModelDependencyDao.java
@@ -84,5 +84,9 @@ public interface ModelDependencyDao {
List queryByModelDependency(@Param("modelDependency") ModelDependency modelDependency);
List queryChildrenByVersionId(@Param("model_id")String modelId, @Param("version")String version);
+
+ List queryByIns(@Param("expInsId")Integer expInsId);
+
+ ModelDependency queryByInsAndTrainTaskId(@Param("expInsId")Integer expInsId,@Param("taskId") String taskId);
}
diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ExperimentInstanceStatusTask.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ExperimentInstanceStatusTask.java
index 4680285e..131dca48 100644
--- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ExperimentInstanceStatusTask.java
+++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ExperimentInstanceStatusTask.java
@@ -7,20 +7,15 @@ import com.ruoyi.platform.mapper.ExperimentDao;
import com.ruoyi.platform.mapper.ExperimentInsDao;
import com.ruoyi.platform.mapper.ModelDependencyDao;
import com.ruoyi.platform.service.ExperimentInsService;
-import com.ruoyi.platform.service.ModelDependencyService;
import com.ruoyi.platform.utils.JacksonUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
@Component()
public class ExperimentInstanceStatusTask {
@@ -34,7 +29,7 @@ public class ExperimentInstanceStatusTask {
private ModelDependencyDao modelDependencyDao;
private List experimentIds = new ArrayList<>();
- @Scheduled(cron = "0/14 * * * * ?") // 每30S执行一次
+ @Scheduled(cron = "0/30 * * * * ?") // 每30S执行一次
public void executeExperimentInsStatus() throws IOException {
// 首先查到所有非终止态的实验实例
List experimentInsList = experimentInsService.queryByExperimentIsNotTerminated();
@@ -46,95 +41,94 @@ public class ExperimentInstanceStatusTask {
String oldStatus = experimentIns.getStatus();
try {
experimentIns = experimentInsService.queryStatusFromArgo(experimentIns);
- }catch (Exception e){
+ } catch (Exception e) {
experimentIns.setStatus("Failed");
}
-// if (!StringUtils.equals(oldStatus,experimentIns.getStatus())){
- experimentIns.setUpdateTime(new Date());
- // 线程安全的添加操作
- synchronized (experimentIds) {
- experimentIds.add(experimentIns.getExperimentId());
- }
- updateList.add(experimentIns);
-
-// }
-// experimentInsDao.update(experimentIns);
+ experimentIns.setUpdateTime(new Date());
+ // 线程安全的添加操作
+ synchronized (experimentIds) {
+ experimentIds.add(experimentIns.getExperimentId());
+ }
+ updateList.add(experimentIns);
}
-
}
- if (updateList.size() > 0){
+ if (updateList.size() > 0) {
experimentInsDao.insertOrUpdateBatch(updateList);
//遍历模型关系表,找到
List modelDependencyList = new ArrayList();
- for (ExperimentIns experimentIns : updateList){
+ for (ExperimentIns experimentIns : updateList) {
ModelDependency modelDependencyquery = new ModelDependency();
modelDependencyquery.setExpInsId(experimentIns.getId());
modelDependencyquery.setState(2);
List modelDependencyListquery = modelDependencyDao.queryByModelDependency(modelDependencyquery);
- if (modelDependencyListquery==null||modelDependencyListquery.size()==0){
+ if (modelDependencyListquery == null || modelDependencyListquery.size() == 0) {
continue;
}
ModelDependency modelDependency = modelDependencyListquery.get(0);
//查看状态,
- if (StringUtils.equals("Failed",experimentIns.getStatus())){
+ if (StringUtils.equals("Failed", experimentIns.getStatus())) {
//取出节点状态
String trainTask = modelDependency.getTrainTask();
Map trainMap = JacksonUtil.parseJSONStr2Map(trainTask);
String task_id = (String) trainMap.get("task_id");
- if (StringUtils.isEmpty(task_id)){
+ if (StringUtils.isEmpty(task_id)) {
continue;
}
String nodesStatus = experimentIns.getNodesStatus();
Map nodeMaps = JacksonUtil.parseJSONStr2Map(nodesStatus);
Map nodeMap = JacksonUtil.parseJSONStr2Map(JacksonUtil.toJSONString(nodeMaps.get(task_id)));
- if (nodeMap==null){
+ if (nodeMap == null) {
continue;
}
- if (!StringUtils.equals("Succeeded",(String)nodeMap.get("phase"))){
+ if (!StringUtils.equals("Succeeded", (String) nodeMap.get("phase"))) {
modelDependency.setState(0);
modelDependencyList.add(modelDependency);
}
}
}
- if (modelDependencyList.size()>0) {
+ if (modelDependencyList.size() > 0) {
modelDependencyDao.insertOrUpdateBatch(modelDependencyList);
}
}
-
}
- @Scheduled(cron = "0/17 * * * * ?") // / 每30S执行一次
+
+ @Scheduled(cron = "0/30 * * * * ?") // / 每30S执行一次
public void executeExperimentStatus() throws IOException {
- if (experimentIds.size()==0){
+ if (experimentIds.size() == 0) {
return;
}
// 存储需要更新的实验对象列表
List updateExperiments = new ArrayList<>();
- for (Integer experimentId : experimentIds){
+ for (Integer experimentId : experimentIds) {
// 获取当前实验的所有实例列表
List insList = experimentInsService.getByExperimentId(experimentId);
List statusList = new ArrayList();
// 更新实验状态列表
- for (int i=0;i iterator = experimentIds.iterator();
+ while (iterator.hasNext()) {
+ Integer experimentId = iterator.next();
+ for (Experiment experiment : updateExperiments) {
+ if (experiment.getId().equals(experimentId)) {
+ iterator.remove();
+ }
}
}
}
diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/AimService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/AimService.java
index 60f74b90..c83a42af 100644
--- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/AimService.java
+++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/AimService.java
@@ -1,7 +1,14 @@
package com.ruoyi.platform.service;
-import com.ruoyi.platform.vo.FrameLogPathVo;
+import com.ruoyi.platform.vo.InsMetricInfoVo;
+
+import java.util.List;
public interface AimService {
- String runAim(FrameLogPathVo frameLogPathVo);
+
+ List getExpTrainInfos(Integer experimentId) throws Exception;
+
+ List getExpEvaluateInfos(Integer experimentId) throws Exception;
+
+ String getExpMetrics(List runIds) throws Exception;
}
diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/JupyterService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/JupyterService.java
index 09a7fc68..b2af9cca 100644
--- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/JupyterService.java
+++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/JupyterService.java
@@ -1,6 +1,6 @@
package com.ruoyi.platform.service;
-import com.ruoyi.platform.vo.FrameLogPathVo;
+import com.ruoyi.platform.domain.DevEnvironment;
import com.ruoyi.platform.vo.PodStatusVo;
import java.io.InputStream;
@@ -16,5 +16,5 @@ public interface JupyterService {
String stopJupyterService(Integer id) throws Exception;
- PodStatusVo getJupyterStatus(FrameLogPathVo frameLogPathVo);
+ PodStatusVo getJupyterStatus(DevEnvironment devEnvironment) throws Exception;
}
diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelDependencyService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelDependencyService.java
index 5c8b9d1d..049d87d1 100644
--- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelDependencyService.java
+++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelDependencyService.java
@@ -62,4 +62,8 @@ public interface ModelDependencyService {
List queryByModelDependency(ModelDependency modelDependency) throws IOException;
ModelDependcyTreeVo getModelDependencyTree(ModelDependency modelDependency) throws Exception;
+
+ List queryByIns(Integer expInsId);
+
+ ModelDependency queryByInsAndTrainTaskId(Integer expInsId, String taskId);
}
diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/AimServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/AimServiceImpl.java
index f66dc178..fdd7b5c9 100644
--- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/AimServiceImpl.java
+++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/AimServiceImpl.java
@@ -1,13 +1,157 @@
package com.ruoyi.platform.service.impl;
+import com.ruoyi.platform.domain.ExperimentIns;
+import com.ruoyi.platform.domain.ModelDependency;
import com.ruoyi.platform.service.AimService;
-import com.ruoyi.platform.vo.FrameLogPathVo;
+import com.ruoyi.platform.service.ExperimentInsService;
+import com.ruoyi.platform.service.ModelDependencyService;
+import com.ruoyi.platform.utils.AIM64EncoderUtil;
+import com.ruoyi.platform.utils.HttpUtils;
+import com.ruoyi.platform.utils.JacksonUtil;
+import com.ruoyi.platform.utils.JsonUtils;
+import com.ruoyi.platform.vo.InsMetricInfoVo;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import java.net.URLEncoder;
+import java.util.*;
+import java.util.stream.Collectors;
+
@Service
public class AimServiceImpl implements AimService {
+ @Resource
+ private ExperimentInsService experimentInsService;
+
+ @Value("${aim.url}")
+ private String aimUrl;
+ @Value("${aim.proxyUrl}")
+ private String aimProxyUrl;
+
+ @Override
+ public List getExpTrainInfos(Integer experimentId) throws Exception {
+ return getAimRunInfos(true,experimentId);
+ }
+
@Override
- public String runAim(FrameLogPathVo frameLogPathVo) {
- return null;
+ public List getExpEvaluateInfos(Integer experimentId) throws Exception {
+ return getAimRunInfos(false,experimentId);
+ }
+
+ @Override
+ public String getExpMetrics(List runIds) throws Exception {
+ String decode = AIM64EncoderUtil.decode(runIds);
+ return aimUrl+"/metrics?select="+decode;
+ }
+
+ private List getAimRunInfos(boolean isTrain,Integer experimentId) throws Exception {
+ String experimentName = "experiment-"+experimentId+"-train";
+ if (!isTrain){
+ experimentName = "experiment-"+experimentId+"-evaluate";
+ }
+ String encodedUrlString = URLEncoder.encode("run.experiment==\""+experimentName+"\"", "UTF-8");
+ String url = aimProxyUrl+"/api/runs/search/run?query="+encodedUrlString;
+ String s = HttpUtils.sendGetRequest(url);
+ List