|
@@ -1,4 +1,6 @@
|
|
|
<script lang="ts" setup>
|
|
<script lang="ts" setup>
|
|
|
|
|
+import type { FormLayout } from '@vben/common-ui';
|
|
|
|
|
+
|
|
|
import type { CollapsibleParamSchema } from '@vben-core/shadcn-ui';
|
|
import type { CollapsibleParamSchema } from '@vben-core/shadcn-ui';
|
|
|
|
|
|
|
|
import { ref } from 'vue';
|
|
import { ref } from 'vue';
|
|
@@ -13,22 +15,32 @@ import { useVbenForm, z } from '#/adapter/form';
|
|
|
|
|
|
|
|
import DocButton from '../doc-button.vue';
|
|
import DocButton from '../doc-button.vue';
|
|
|
|
|
|
|
|
-const layouts = [
|
|
|
|
|
|
|
+const layouts: { label: string; value: FormLayout }[] = [
|
|
|
{ label: 'Vertical', value: 'vertical' },
|
|
{ label: 'Vertical', value: 'vertical' },
|
|
|
{ label: 'Horizontal', value: 'horizontal' },
|
|
{ label: 'Horizontal', value: 'horizontal' },
|
|
|
];
|
|
];
|
|
|
-const layout = ref(layouts[0].value);
|
|
|
|
|
|
|
|
|
|
-function getNumberValidator(key: string, limit?: [number, number]) {
|
|
|
|
|
|
|
+const layout = ref(layouts[0]?.value ?? 'vertical');
|
|
|
|
|
+
|
|
|
|
|
+function getNumberValidator(key: string, limit?: [number?, number?]) {
|
|
|
let validator = z.number({
|
|
let validator = z.number({
|
|
|
required_error: `${key} 值不能为空`,
|
|
required_error: `${key} 值不能为空`,
|
|
|
invalid_type_error: `${key} 值只能为数字`,
|
|
invalid_type_error: `${key} 值只能为数字`,
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
|
|
+ // validator.default(null);
|
|
|
|
|
+
|
|
|
if (limit) {
|
|
if (limit) {
|
|
|
- validator = validator
|
|
|
|
|
- .min(limit[0], { message: `${key} 值不在区间范围内` })
|
|
|
|
|
- .max(limit[1], { message: `${key} 值不在区间范围内` });
|
|
|
|
|
|
|
+ if (limit[0] !== undefined) {
|
|
|
|
|
+ validator = validator.min(limit[0], {
|
|
|
|
|
+ message: `${key} 值不能小于${limit[0]}`,
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ if (limit[1] !== undefined) {
|
|
|
|
|
+ validator = validator.max(limit[1], {
|
|
|
|
|
+ message: `${key} 值不能大于${limit[0]}`,
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return validator.default(null);
|
|
return validator.default(null);
|
|
@@ -107,12 +119,13 @@ const paramsValidator = z.object({
|
|
|
learning_rate: getNumberValidator('learning_rate'),
|
|
learning_rate: getNumberValidator('learning_rate'),
|
|
|
eval_steps: getNumberValidator('eval_steps', [1, 2_147_483_647]),
|
|
eval_steps: getNumberValidator('eval_steps', [1, 2_147_483_647]),
|
|
|
num_train_epochs: getNumberValidator('num_train_epochs', [1, 200]),
|
|
num_train_epochs: getNumberValidator('num_train_epochs', [1, 200]),
|
|
|
- max_length: getNumberValidator('max_length', [1, 131_072]),
|
|
|
|
|
|
|
+ max_length: getNumberValidator('max_length', [500, 131_072]),
|
|
|
warmup_ratio: getNumberValidator('warmup_ratio', [0, 1]),
|
|
warmup_ratio: getNumberValidator('warmup_ratio', [0, 1]),
|
|
|
save_steps: getNumberValidator('save_steps', [1, 2_147_483_647]),
|
|
save_steps: getNumberValidator('save_steps', [1, 2_147_483_647]),
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
const [BaseForm, baseFormApi] = useVbenForm({
|
|
const [BaseForm, baseFormApi] = useVbenForm({
|
|
|
|
|
+ showDefaultActions: false,
|
|
|
// 所有表单项共用,可单独在表单内覆盖
|
|
// 所有表单项共用,可单独在表单内覆盖
|
|
|
commonConfig: {
|
|
commonConfig: {
|
|
|
// 在label后显示一个冒号
|
|
// 在label后显示一个冒号
|
|
@@ -129,6 +142,17 @@ const [BaseForm, baseFormApi] = useVbenForm({
|
|
|
// 水平布局,label和input在同一行
|
|
// 水平布局,label和input在同一行
|
|
|
layout: 'vertical',
|
|
layout: 'vertical',
|
|
|
schema: [
|
|
schema: [
|
|
|
|
|
+ {
|
|
|
|
|
+ component: 'Switch',
|
|
|
|
|
+ fieldName: 'qat',
|
|
|
|
|
+ componentProps: {
|
|
|
|
|
+ checkedChildren: '开',
|
|
|
|
|
+ unCheckedChildren: '关',
|
|
|
|
|
+ class: 'w-auto',
|
|
|
|
|
+ },
|
|
|
|
|
+ label: 'QAT',
|
|
|
|
|
+ defaultValue: false,
|
|
|
|
|
+ },
|
|
|
{
|
|
{
|
|
|
component: VbenCollapsibleParams,
|
|
component: VbenCollapsibleParams,
|
|
|
componentProps: {
|
|
componentProps: {
|
|
@@ -138,20 +162,70 @@ const [BaseForm, baseFormApi] = useVbenForm({
|
|
|
modelPropName: 'value',
|
|
modelPropName: 'value',
|
|
|
fieldName: 'params',
|
|
fieldName: 'params',
|
|
|
label: '参数配置',
|
|
label: '参数配置',
|
|
|
- formItemClass: 'col-span-2 items-baseline',
|
|
|
|
|
|
|
+ formItemClass: 'col-span-8 items-baseline col-start-1',
|
|
|
|
|
+ dependencies: {
|
|
|
|
|
+ triggerFields: ['qat'],
|
|
|
|
|
+ componentProps(values) {
|
|
|
|
|
+ return {
|
|
|
|
|
+ params: values.qat
|
|
|
|
|
+ ? [
|
|
|
|
|
+ {
|
|
|
|
|
+ key: 'calib_steps',
|
|
|
|
|
+ description: `校准步数;校准的数据集大小 = 校准步数 * 训练的batch_size`,
|
|
|
|
|
+ option: {
|
|
|
|
|
+ min: 1,
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ ...paramsSchema,
|
|
|
|
|
+ ]
|
|
|
|
|
+ : paramsSchema,
|
|
|
|
|
+ };
|
|
|
|
|
+ },
|
|
|
|
|
+ trigger(values, __, controller) {
|
|
|
|
|
+ const paramsRef =
|
|
|
|
|
+ controller.getFieldComponentRef<typeof VbenCollapsibleParams>(
|
|
|
|
|
+ 'params',
|
|
|
|
|
+ );
|
|
|
|
|
+ if (values.qat) {
|
|
|
|
|
+ paramsRef?.updateValues?.({
|
|
|
|
|
+ calib_steps: 10,
|
|
|
|
|
+ micro_batch_size: 32,
|
|
|
|
|
+ learning_rate: 4e-5,
|
|
|
|
|
+ eval_steps: 80,
|
|
|
|
|
+ num_train_epochs: 3,
|
|
|
|
|
+ max_length: 32_768,
|
|
|
|
|
+ warmup_ratio: 0.1,
|
|
|
|
|
+ save_steps: 80,
|
|
|
|
|
+ });
|
|
|
|
|
+ } else {
|
|
|
|
|
+ paramsRef?.updateValues?.({ calib_steps: null });
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ rules(values) {
|
|
|
|
|
+ if (values.qat) {
|
|
|
|
|
+ return paramsValidator.extend({
|
|
|
|
|
+ calib_steps: getNumberValidator('calib_steps', [1]),
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ return paramsValidator;
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
rules: paramsValidator,
|
|
rules: paramsValidator,
|
|
|
|
|
+ // defaultValue: {
|
|
|
|
|
+ // micro_batch_size: 24,
|
|
|
|
|
+ // },
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
component: 'RichEditor',
|
|
component: 'RichEditor',
|
|
|
fieldName: 'richEditor',
|
|
fieldName: 'richEditor',
|
|
|
label: '富文本',
|
|
label: '富文本',
|
|
|
- formItemClass: 'col-span-3 items-baseline',
|
|
|
|
|
|
|
+ formItemClass: 'col-span-12 items-baseline',
|
|
|
collapsible: true,
|
|
collapsible: true,
|
|
|
defaultCollapsed: false, // 默认false
|
|
defaultCollapsed: false, // 默认false
|
|
|
},
|
|
},
|
|
|
],
|
|
],
|
|
|
// 大屏一行显示3个,中屏一行显示2个,小屏一行显示1个
|
|
// 大屏一行显示3个,中屏一行显示2个,小屏一行显示1个
|
|
|
- wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3',
|
|
|
|
|
|
|
+ wrapperClass: 'grid-cols-12',
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
function onSubmit(values: Record<string, any>) {
|
|
function onSubmit(values: Record<string, any>) {
|
|
@@ -160,6 +234,12 @@ function onSubmit(values: Record<string, any>) {
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+function onLayoutChange(layout: FormLayout) {
|
|
|
|
|
+ baseFormApi.setState({
|
|
|
|
|
+ layout,
|
|
|
|
|
+ });
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
function handleSetFormValue() {
|
|
function handleSetFormValue() {
|
|
|
baseFormApi.setFieldValue('params', {
|
|
baseFormApi.setFieldValue('params', {
|
|
|
micro_batch_size: 8,
|
|
micro_batch_size: 8,
|
|
@@ -172,10 +252,16 @@ function handleSetFormValue() {
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-function onLayoutChange(layout: string) {
|
|
|
|
|
- baseFormApi.setState({
|
|
|
|
|
- layout,
|
|
|
|
|
- });
|
|
|
|
|
|
|
+function handleResetFormValue() {
|
|
|
|
|
+ baseFormApi.resetForm(undefined, { force: true });
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+async function handleSubmitFormValue() {
|
|
|
|
|
+ const { valid } = await baseFormApi.validate();
|
|
|
|
|
+
|
|
|
|
|
+ if (valid) {
|
|
|
|
|
+ baseFormApi.submitForm();
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
@@ -201,10 +287,16 @@ function onLayoutChange(layout: string) {
|
|
|
option-type="button"
|
|
option-type="button"
|
|
|
v-model:value="layout"
|
|
v-model:value="layout"
|
|
|
@update:value="onLayoutChange"
|
|
@update:value="onLayoutChange"
|
|
|
- >
|
|
|
|
|
|
|
+ />
|
|
|
|
|
+ <Button type="primary" @click="handleSetFormValue">
|
|
|
设置表单值
|
|
设置表单值
|
|
|
- </RadioGroup>
|
|
|
|
|
- <Button type="primary" @click="handleSetFormValue">设置表单值</Button>
|
|
|
|
|
|
|
+ </Button>
|
|
|
|
|
+ <Button type="primary" @click="handleSubmitFormValue">
|
|
|
|
|
+ 提交表单
|
|
|
|
|
+ </Button>
|
|
|
|
|
+ <Button type="primary" @click="handleResetFormValue">
|
|
|
|
|
+ 重置表单
|
|
|
|
|
+ </Button>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
<div class="w-full overflow-hidden">
|
|
<div class="w-full overflow-hidden">
|