From ba465b501691c0a9431b8e54e730d4ba0c5b1f18 Mon Sep 17 00:00:00 2001 From: caoxiaozhu Date: Sat, 11 Jul 2026 11:00:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=B0=83=E4=BC=98=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E6=94=AF=E6=8C=81=20SFT=20=E8=87=AA=E5=8A=A8=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E6=9D=83=E9=87=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FineTuneTask 类型新增 auto_merge 字段,SFT 训练表单新增自动合并权重开关并在创建/启动时随参提交,回归脚本补充 auto_merge 与模型对话框断言。 --- .../scripts/regression-fine-tune-create-ui.mjs | 17 ++++++++++++----- frontend/src/types/index.ts | 1 + .../src/views/fine-tune/FineTuneCreateView.vue | 13 +++++++++++++ 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/frontend/scripts/regression-fine-tune-create-ui.mjs b/frontend/scripts/regression-fine-tune-create-ui.mjs index ae57479..7513ef8 100644 --- a/frontend/scripts/regression-fine-tune-create-ui.mjs +++ b/frontend/scripts/regression-fine-tune-create-ui.mjs @@ -4,6 +4,7 @@ import { fileURLToPath } from 'node:url' const root = resolve(fileURLToPath(new URL('..', import.meta.url))) const source = readFileSync(resolve(root, 'src/views/fine-tune/FineTuneCreateView.vue'), 'utf8') +const modelDialogSource = readFileSync(resolve(root, 'src/components/ModelSelectDialog.vue'), 'utf8') function assert(condition, message) { if (!condition) { @@ -18,10 +19,16 @@ assert(source.includes('gpu-usage-bar'), 'GPU cards should visualize usage with assert(source.includes('is-busy'), 'GPU cards should have a distinct busy state for usage over 80%') assert(source.includes('gpu.gpu_percent > 80'), 'GPU busy state should be driven by usage over 80%') assert(source.includes('modelDialogVisible'), 'Model selection should open a dialog instead of a plain select') -assert(!source.includes('width="78vw"'), 'Model dialog should not use the previous oversized 78vw width') -assert(source.includes('width="860px"'), 'Model dialog should use a compact enterprise modal width') -assert(source.includes('model-series-list'), 'Model dialog should include a model series list column') -assert(source.includes('model-version-list'), 'Model dialog should include a snapshot/version list column') -assert(source.includes('confirmModelSelection'), 'Model dialog should confirm the selected model before updating the form') +assert(!modelDialogSource.includes('width="78vw"'), 'Model dialog should not use the previous oversized 78vw width') +assert(modelDialogSource.includes('width="860px"'), 'Model dialog should use a compact enterprise modal width') +assert(modelDialogSource.includes('model-series-list'), 'Model dialog should include a model series list column') +assert(modelDialogSource.includes('model-version-list'), 'Model dialog should include a snapshot/version list column') +assert(modelDialogSource.includes('handleConfirm'), 'Model dialog should confirm the selected model before updating the form') +assert(source.includes("auto_merge: false"), 'Auto merge should default to disabled') +assert(source.includes('v-if="form.train_type === \'SFT\'"'), 'Merge model settings should only be visible for SFT') +assert(source.includes('content-position="left">合并模型'), 'SFT form should include a merge model section below data configuration') +assert(source.includes('v-model="form.auto_merge"'), 'Merge model section should provide an auto merge selector') +assert(source.includes('label="自动合并权重并保存"'), 'Auto merge selector should use a clear visible label') +assert((source.match(/auto_merge: form\.train_type === 'SFT' && form\.auto_merge/g) || []).length === 2, 'Auto merge should be sent for SFT when creating and starting the task') console.log('fine-tune create UI regression checks passed') diff --git a/frontend/src/types/index.ts b/frontend/src/types/index.ts index 465ac1e..7ec9ed3 100644 --- a/frontend/src/types/index.ts +++ b/frontend/src/types/index.ts @@ -94,6 +94,7 @@ export interface FineTuneTask { template?: string base_model: number | string train_dataset_id?: number | string + auto_merge?: boolean output_model_name?: string gpus?: number[] batch_size?: number diff --git a/frontend/src/views/fine-tune/FineTuneCreateView.vue b/frontend/src/views/fine-tune/FineTuneCreateView.vue index e7fd8f2..b8cae4f 100644 --- a/frontend/src/views/fine-tune/FineTuneCreateView.vue +++ b/frontend/src/views/fine-tune/FineTuneCreateView.vue @@ -34,6 +34,7 @@ const form = reactive({ template: 'qwen', train_method: 'lora' as 'lora' | 'full', train_dataset_id: '' as string | number, + auto_merge: false, // 训练参数 batch_size: 1, learning_rate: 0.0001, @@ -216,6 +217,7 @@ async function handleSubmit() { train_method: form.train_method, gpus: selectedGpus.value, train_dataset_id: form.train_dataset_id, + auto_merge: form.train_type === 'SFT' && form.auto_merge, output_model_name: form.name, batch_size: form.batch_size, learning_rate: form.learning_rate, @@ -244,6 +246,7 @@ async function handleSubmit() { train_type: form.train_type, train_method: form.train_method, train_dataset_id: form.train_dataset_id, + auto_merge: form.train_type === 'SFT' && form.auto_merge, output_model_name: form.name, gpus: selectedGpus.value, batch_size: form.batch_size, @@ -424,6 +427,16 @@ onMounted(() => { + + 训练命令预览