Browse Source

Merge branch 'dev-zw' into model-deploy

pull/134/head
cp3hnu 1 year ago
parent
commit
7d51756df7
6 changed files with 86 additions and 77 deletions
  1. +1
    -1
      react-ui/src/pages/Dataset/components/ResourceIntro/index.tsx
  2. +7
    -7
      react-ui/src/pages/Dataset/config.tsx
  3. +1
    -1
      react-ui/src/pages/Experiment/Info/index.jsx
  4. +26
    -15
      react-ui/src/pages/Experiment/components/ExperimentResult/index.tsx
  5. +50
    -52
      react-ui/src/pages/Experiment/components/ExportModelModal/index.tsx
  6. +1
    -1
      react-ui/src/pages/Pipeline/Info/index.jsx

+ 1
- 1
react-ui/src/pages/Dataset/components/ResourceIntro/index.tsx View File

@@ -85,7 +85,7 @@ const formatSource = (source?: string) => {
} else if (source === DataSource.HandExport) { } else if (source === DataSource.HandExport) {
return '手动导入'; return '手动导入';
} else if (source === DataSource.AtuoExport) { } else if (source === DataSource.AtuoExport) {
return '自动导入';
return '实验自动导入';
} }
return source; return source;
}; };


+ 7
- 7
react-ui/src/pages/Dataset/config.tsx View File

@@ -199,15 +199,15 @@ export type ResourceFileData = {


// 训练任务 // 训练任务
export type TrainTask = { export type TrainTask = {
ins_id: number;
name: string;
experiment_id: number;
workflow_id: number;
ins_id: number; // 实例id
name: string; // 实验名称
experiment_id: number; //实验 id
workflow_id: number; // 流水线 id
}; };


// 项目依赖 // 项目依赖
export type ProjectDependency = { export type ProjectDependency = {
url: string;
name: string;
branch: string;
url: string; // 项目地址
name: string; // 项目名称
branch: string; // 分支
}; };

+ 1
- 1
react-ui/src/pages/Experiment/Info/index.jsx View File

@@ -353,7 +353,7 @@ function ExperimentText() {
fitView: true, fitView: true,
minZoom: 0.5, minZoom: 0.5,
maxZoom: 5, maxZoom: 5,
fitViewPadding: 300,
fitViewPadding: 200,
modes: { modes: {
default: [ default: [
// config the shouldBegin for drag-node to avoid node moving while dragging on the anchor-point circles // config the shouldBegin for drag-node to avoid node moving while dragging on the anchor-point circles


+ 26
- 15
react-ui/src/pages/Experiment/components/ExperimentResult/index.tsx View File

@@ -1,3 +1,4 @@
import { ResourceType } from '@/pages/Dataset/config';
import { getNodeResult } from '@/services/experiment/index.js'; import { getNodeResult } from '@/services/experiment/index.js';
import { downLoadZip } from '@/utils/downloadfile'; import { downLoadZip } from '@/utils/downloadfile';
import { openAntdModal } from '@/utils/modal'; import { openAntdModal } from '@/utils/modal';
@@ -34,6 +35,12 @@ function ExperimentResult({
}: ExperimentResultProps) { }: ExperimentResultProps) {
const { message } = App.useApp(); const { message } = App.useApp();
const [experimentResults, setExperimentResults] = useState<ExperimentResultData[]>([]); const [experimentResults, setExperimentResults] = useState<ExperimentResultData[]>([]);
const resourceType: ResourceType | undefined = pipelineNodeId.startsWith('general-data-process')
? ResourceType.Dataset
: pipelineNodeId.startsWith('model-train') ||
pipelineNodeId.startsWith('distributed-model-train')
? ResourceType.Model
: undefined;


useEffect(() => { useEffect(() => {
getExperimentResult({ id: `${experimentInsId}`, node_id: pipelineNodeId }); getExperimentResult({ id: `${experimentInsId}`, node_id: pipelineNodeId });
@@ -42,8 +49,11 @@ function ExperimentResult({
// 获取实验结果 // 获取实验结果
const getExperimentResult = async (params: any) => { const getExperimentResult = async (params: any) => {
const [res] = await to(getNodeResult(params)); const [res] = await to(getNodeResult(params));
if (res && res.data) {
setExperimentResults(res.data);
if (res && res.data && Array.isArray(res.data)) {
const data = res.data.filter((item: ExperimentResultData) => item.value.length > 0);
setExperimentResults(data);
} else {
setExperimentResults([]);
} }
}; };


@@ -52,9 +62,10 @@ function ExperimentResult({
downLoadZip(`/api/mmp/minioStorage/download`, { path }); downLoadZip(`/api/mmp/minioStorage/download`, { path });
}; };


// 导出到模型
const exportToModel = (path: string) => {
// 导出到数据集、模型
const exportToResource = (path: string) => {
const { close } = openAntdModal(ExportModelModal, { const { close } = openAntdModal(ExportModelModal, {
resourceType: resourceType!,
pipelineId, pipelineId,
experimentId, experimentId,
experimentName, experimentName,
@@ -86,17 +97,17 @@ function ExperimentResult({
> >
下载 下载
</Button> </Button>
<Button
size="small"
type="link"
onClick={() => {
exportToModel(item.path);
}}
>
导出到模型库
</Button>
{/* <a style={{ marginRight: '10px' }}>导出到模型库</a>
<a style={{ marginRight: '10px' }}>导出到数据集</a> */}
{resourceType && (
<Button
size="small"
type="link"
onClick={() => {
exportToResource(item.path);
}}
>
导出到{resourceType === ResourceType.Model ? '模型' : '数据集'}
</Button>
)}
</div> </div>
<div style={{ margin: '15px 0' }} className={styles['experiment-result__item__file']}> <div style={{ margin: '15px 0' }} className={styles['experiment-result__item__file']}>
<span>文件名称</span> <span>文件名称</span>


+ 50
- 52
react-ui/src/pages/Experiment/components/ExportModelModal/index.tsx View File

@@ -1,7 +1,12 @@
import editExperimentIcon from '@/assets/img/edit-experiment.png'; import editExperimentIcon from '@/assets/img/edit-experiment.png';
import KFModal from '@/components/KFModal'; import KFModal from '@/components/KFModal';
import { DataSource, ResourceVersionData, type ResourceData } from '@/pages/Dataset/config';
import { addModelVersion, getModelList, getModelVersionList } from '@/services/dataset';
import {
DataSource,
ResourceType,
ResourceVersionData,
resourceConfig,
type ResourceData,
} from '@/pages/Dataset/config';
import { to } from '@/utils/promise'; import { to } from '@/utils/promise';
import { InfoCircleOutlined } from '@ant-design/icons'; import { InfoCircleOutlined } from '@ant-design/icons';
import { Form, Input, ModalProps, Select } from 'antd'; import { Form, Input, ModalProps, Select } from 'antd';
@@ -15,20 +20,8 @@ type FormData = {
version_desc: string; version_desc: string;
}; };


// type ExportModelResponce = {
// fileName: string;
// fileSize: string;
// url: string;
// };

// type CreateModelVersionParams = FormData & {
// file_name: string;
// file_size: string;
// url: string;
// // name: string;
// };

interface ExportModelModalProps extends Omit<ModalProps, 'onOk'> { interface ExportModelModalProps extends Omit<ModalProps, 'onOk'> {
resourceType: ResourceType;
pipelineId: number; // 流水线 id pipelineId: number; // 流水线 id
experimentId: number; // 实验 id experimentId: number; // 实验 id
experimentName: string; // 实验 name experimentName: string; // 实验 name
@@ -39,6 +32,7 @@ interface ExportModelModalProps extends Omit<ModalProps, 'onOk'> {
} }


function ExportModelModal({ function ExportModelModal({
resourceType,
pipelineId, pipelineId,
experimentId, experimentId,
experimentName, experimentName,
@@ -49,9 +43,9 @@ function ExportModelModal({
...rest ...rest
}: ExportModelModalProps) { }: ExportModelModalProps) {
const [form] = Form.useForm(); const [form] = Form.useForm();
const [models, setModels] = useState<ResourceData[]>([]);
const [resources, setResources] = useState<ResourceData[]>([]);
const [versions, setVersions] = useState<ResourceVersionData[]>([]); const [versions, setVersions] = useState<ResourceVersionData[]>([]);
// const [uuid] = useState(Date.now());
const config = resourceConfig[resourceType];


const layout = { const layout = {
labelCol: { span: 24 }, labelCol: { span: 24 },
@@ -59,57 +53,57 @@ function ExportModelModal({
}; };


useEffect(() => { useEffect(() => {
requestModelList();
requestResourceList();
}, []); }, []);


// 获取选中的模型
const getSelectedModel = (id: number | undefined) => {
// 获取选中的数据集、模型
const getSelectedResource = (id: number | undefined) => {
if (id) { if (id) {
return models.find((item) => item.id === id);
return resources.find((item) => item.id === id);
} }
return undefined; return undefined;
}; };


// 模型版本 tooltip
// 版本 tooltip
const getTooltip = () => { const getTooltip = () => {
const id = form.getFieldValue('id'); const id = form.getFieldValue('id');
const model = getSelectedModel(id);
const name = model?.name ?? '';
const resource = getSelectedResource(id);
const name = resource?.name ?? '';
const versionNames = versions.map((item: ResourceVersionData) => item.name).join('、'); const versionNames = versions.map((item: ResourceVersionData) => item.name).join('、');
const tooltip = const tooltip =
versions.length > 0 ? `${name}有以下版本:\n${versionNames}\n注意不能重复` : undefined; versions.length > 0 ? `${name}有以下版本:\n${versionNames}\n注意不能重复` : undefined;
return tooltip; return tooltip;
}; };


// 处理模型名称变化
const handleModelChange = (id: number | undefined) => {
// 处理数据集、模型选择变化
const handleResourceChange = (id: number | undefined) => {
if (id) { if (id) {
getModelVersions(id);
getRecourceVersions(id);
} else { } else {
setVersions([]); setVersions([]);
} }
}; };


// 获取模型列表
const requestModelList = async () => {
// 获取数据集、模型列表
const requestResourceList = async () => {
const params = { const params = {
page: 0, page: 0,
size: 1000, size: 1000,
is_public: false, // 个人 is_public: false, // 个人
}; };
const [res] = await to(getModelList(params));
const [res] = await to(config.getList(params));
if (res && res.data) { if (res && res.data) {
setModels(res.data.content || []);
setResources(res.data.content || []);
} }
}; };


// 获取模型版本列表
const getModelVersions = async (id: number) => {
const model = getSelectedModel(id);
if (!model) {
// 获取数据集、模型版本列表
const getRecourceVersions = async (id: number) => {
const resource = getSelectedResource(id);
if (!resource) {
return; return;
} }
const [res] = await to(getModelVersionList(pick(model, ['identifier', 'owner'])));
const [res] = await to(config.getVersions(pick(resource, ['identifier', 'owner'])));
if (res && res.data) { if (res && res.data) {
setVersions(res.data); setVersions(res.data);
} }
@@ -117,17 +111,17 @@ function ExportModelModal({


// 提交 // 提交
const hanldeFinish = (formData: FormData) => { const hanldeFinish = (formData: FormData) => {
exportToModel(formData);
exportToResource(formData);
}; };


// 导出到模型
const exportToModel = async (formData: FormData) => {
// 导出到数据集、模型
const exportToResource = async (formData: FormData) => {
const id = form.getFieldValue('id'); const id = form.getFieldValue('id');
const model = getSelectedModel(id);
const resource = getSelectedResource(id);
const params = { const params = {
...formData, ...formData,
identifier: model?.identifier,
name: model?.name,
identifier: resource?.identifier,
name: resource?.name,
model_source: DataSource.HandExport, model_source: DataSource.HandExport,
train_task: { train_task: {
workflow_id: pipelineId, workflow_id: pipelineId,
@@ -142,7 +136,7 @@ function ExportModelModal({
}, },
], ],
}; };
const [res] = await to(addModelVersion(params));
const [res] = await to(config.addVersion(params));
if (res) { if (res) {
onOk(); onOk();
} }
@@ -151,7 +145,7 @@ function ExportModelModal({
return ( return (
<KFModal <KFModal
{...rest} {...rest}
title="导出到模型库"
title={`导出到${config.name}`}
image={editExperimentIcon} image={editExperimentIcon}
okButtonProps={{ okButtonProps={{
htmlType: 'submit', htmlType: 'submit',
@@ -170,17 +164,21 @@ function ExportModelModal({
labelAlign="left" labelAlign="left"
labelWrap labelWrap
> >
<Form.Item label="模型名称" name="id" rules={[{ required: true, message: '请选择模型' }]}>
<Form.Item
label={`${config.name}名称`}
name="id"
rules={[{ required: true, message: `请选择${config.name}` }]}
>
<Select <Select
placeholder="请选择模型"
onChange={handleModelChange}
options={models}
placeholder={`请选择${config.name}`}
onChange={handleResourceChange}
options={resources}
fieldNames={{ label: 'name', value: 'id' }} fieldNames={{ label: 'name', value: 'id' }}
allowClear allowClear
></Select> ></Select>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
label="模型版本"
label={`${config.name}版本`}
name="version" name="version"
tooltip={ tooltip={
getTooltip() getTooltip()
@@ -192,11 +190,11 @@ function ExportModelModal({
: undefined : undefined
} }
rules={[ rules={[
{ required: true, message: '请输入模型版本' },
{ required: true, message: `请输入${config.name}版本` },
{ {
validator: (_, value) => { validator: (_, value) => {
if (value && versions.map((item) => item.name).includes(value)) { if (value && versions.map((item) => item.name).includes(value)) {
return Promise.reject('模型版本已存在');
return Promise.reject(`${config.name}版本已存在`);
} else { } else {
return Promise.resolve(); return Promise.resolve();
} }
@@ -204,7 +202,7 @@ function ExportModelModal({
}, },
]} ]}
> >
<Input placeholder="请输入模型版本" maxLength={64} showCount allowClear />
<Input placeholder={`请输入${config.name}版本`} maxLength={64} showCount allowClear />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
label="版本描述" label="版本描述"


+ 1
- 1
react-ui/src/pages/Pipeline/Info/index.jsx View File

@@ -433,7 +433,7 @@ const EditPipeline = () => {
fitView: true, fitView: true,
minZoom: 0.5, minZoom: 0.5,
maxZoom: 5, maxZoom: 5,
fitViewPadding: 300,
fitViewPadding: 200,
modes: { modes: {
default: [ default: [
// config the shouldBegin for drag-node to avoid node moving while dragging on the anchor-point circles // config the shouldBegin for drag-node to avoid node moving while dragging on the anchor-point circles


Loading…
Cancel
Save