Files
YG_FT/frontend/dist/assets/FineTuneCreateView-BSTk2np8.js
2026-07-27 09:50:33 +08:00

3 lines
24 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{E as Ve,a as qe}from"./el-form-item-Bf1ASn5W.js";import{E as Ce}from"./el-popper-B8UgShUN.js";import{E as de}from"./index-CMWHMPp0.js";import{E as pe}from"./index-D0UXUP15.js";import{E as $e,a as Ee,b as ze}from"./el-select-BslWanml.js";import{E as Te,a as Pe,b as Ue}from"./el-radio-group-BZw_vTIf.js";import{E as Me}from"./el-divider-BbpAxc9L.js";import{E as Se}from"./el-input-number-8Eh01QWw.js";import{d as me,D as ue,e as x,w as o,o as i,q as l,s as n,c as d,ad as q,n as j,aa as m,M as w,g as y,x as f,y as C,j as T,G as Ie,z as Fe,at as Ae,al as De,f as J,au as Re,av as Oe,aw as Ge,ax as Le,A as z,v as Ne,ay as Be}from"./index-DdQQsURt.js";import"./el-tooltip-l0sNRNKZ.js";import"./el-scrollbar-DrHhzmuH.js";import"./el-tag-CPRZ_Dgw.js";import{P as je}from"./PageCard-Bbwtm1na.js";import{E as Qe}from"./el-dialog-C_Q_cskK.js";import{E as He}from"./el-empty-Dh4WYaxf.js";import{E as Ke,a as We}from"./el-tab-pane-dAlLTK53.js";import{_ as _e}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{c as Ze,e as Je,f as Xe,u as Ye,p as et}from"./fineTune-C-eDijEZ.js";import{g as tt}from"./model-DEzmeLDW.js";import{g as lt}from"./dataset-DdOzO3-c.js";import"./castArray-CpvD1ywp.js";import"./_baseClone-D4mnAM_M.js";import"./index-Cgs7GwqN.js";import"./index-DBPUxcNG.js";import"./raf-BYY9WY16.js";import"./index-0bM-ph_e.js";import"./vnode-CqdGOdYr.js";import"./index-BV2APNtK.js";import"./scroll-CpiyMIWy.js";import"./clamp-V2IKZsEW.js";import"./toNumber-CQdo6fpk.js";import"./_baseIteratee-D4ynv-ep.js";import"./omit-DNWyMDNK.js";import"./index-r223TcOB.js";import"./el-card-tEKE7Xc8.js";import"./index-DfWYLT6u.js";import"./use-dialog-C94bnueH.js";import"./index-DbNLHhq1.js";const at={class:"model-dialog-body"},nt={class:"model-dialog-toolbar"},ot={class:"model-dialog-content"},st={class:"model-series-list"},it=["onClick"],ut={class:"model-version-list"},rt=["onClick"],dt={class:"model-version-main"},pt={class:"model-dialog-footer"},mt={class:"selected-model-summary"},_t={key:0,class:"selected-model-pill"},ct={class:"model-dialog-actions"},vt=me({__name:"ModelSelectDialog",props:{modelValue:{type:Boolean},models:{},currentModelId:{}},emits:["update:modelValue","confirm"],setup(a,{emit:S}){const k=a,P=S,b=C("official"),p=C(""),$=C(""),F=C("");function O(_){return _.replace(/-\d+(?:\.\d+)?B.*$/i,"").replace(/-\d+(?:\.\d+)?b.*$/i,"").replace(/-\d{4}.*$/,"")}const E=T(()=>{const _=F.value.trim().toLowerCase(),u=k.models.filter(c=>b.value==="official"?c.model_source!=="api":c.model_source==="api");return _?u.filter(c=>[c.name,c.description,c.path,c.online_model_name].filter(Boolean).some(A=>String(A).toLowerCase().includes(_))):u}),I=T(()=>{const _=new Map;return E.value.forEach(u=>{const c=O(u.name),A=_.get(c)||[];A.push(u),_.set(c,A)}),Array.from(_.entries()).map(([u,c])=>({name:u,count:c.length,models:c}))}),s=T(()=>{var _;return((_=I.value.find(u=>u.name===p.value))==null?void 0:_.models)||[]}),L=T(()=>k.models.find(_=>_.id===$.value));function Q(){var u;const _=((u=I.value[0])==null?void 0:u.name)||"";(!p.value||!I.value.some(c=>c.name===p.value))&&(p.value=_)}ue(()=>k.modelValue,_=>{if(_){const u=k.models.find(c=>c.id===k.currentModelId);b.value=(u==null?void 0:u.model_source)==="api"?"mine":"official",$.value=k.currentModelId,Q()}}),ue([b,F],()=>{Q()});function X(_){p.value=_}function Y(_){$.value=_.id}function H(){P("update:modelValue",!1)}function K(){$.value!==""&&$.value!==void 0&&$.value!==null&&P("confirm",$.value),P("update:modelValue",!1)}return(_,u)=>{const c=Ke,A=We,ee=de,D=He,N=pe,te=Qe;return i(),x(te,{"model-value":a.modelValue,class:"model-select-dialog",width:"860px",top:"10vh","show-close":!1,"append-to-body":"","onUpdate:modelValue":u[2]||(u[2]=v=>P("update:modelValue",v))},{header:o(()=>[l("div",{class:"model-dialog-header"},[u[4]||(u[4]=l("div",{class:"model-dialog-title"},[l("span",null,"选择模型"),l("em",null,"仅可选 1 个模型")],-1)),l("button",{class:"model-dialog-close",type:"button",onClick:H},[...u[3]||(u[3]=[l("i",{class:"fa fa-close"},null,-1)])])])]),footer:o(()=>[l("div",pt,[l("div",mt,[l("span",null,"已选 "+m(L.value?1:0)+"/1",1),L.value?(i(),d("div",_t,[u[10]||(u[10]=l("i",{class:"fa fa-star-o"},null,-1)),f(" "+m(L.value.name),1)])):y("",!0)]),l("div",ct,[n(N,{onClick:H},{default:o(()=>[...u[11]||(u[11]=[f("取消",-1)])]),_:1}),n(N,{type:"primary",onClick:K},{default:o(()=>[...u[12]||(u[12]=[f("确定",-1)])]),_:1})])])]),default:o(()=>[l("div",at,[l("div",nt,[n(A,{modelValue:b.value,"onUpdate:modelValue":u[0]||(u[0]=v=>b.value=v),class:"model-tabs"},{default:o(()=>[n(c,{label:"官方模型",name:"official"}),n(c,{label:"我的模型",name:"mine"})]),_:1},8,["modelValue"]),n(ee,{modelValue:F.value,"onUpdate:modelValue":u[1]||(u[1]=v=>F.value=v),class:"model-search",placeholder:"从全部模型中搜索",clearable:""},{suffix:o(()=>[...u[5]||(u[5]=[l("i",{class:"fa fa-search"},null,-1)])]),_:1},8,["modelValue"])]),l("div",ot,[l("aside",st,[u[7]||(u[7]=l("div",{class:"column-title"},"模型系列",-1)),(i(!0),d(w,null,q(I.value,v=>(i(),d("button",{key:v.name,class:j(["model-series-item",{active:p.value===v.name}]),type:"button",onClick:W=>X(v.name)},[u[6]||(u[6]=l("i",{class:"fa fa-star-o"},null,-1)),l("span",null,m(v.name),1),l("em",null,m(v.count),1)],10,it))),128)),I.value.length?y("",!0):(i(),x(D,{key:0,description:"暂无模型","image-size":80}))]),l("section",ut,[u[9]||(u[9]=l("div",{class:"column-title"},"快照版本",-1)),(i(!0),d(w,null,q(s.value,v=>(i(),d("button",{key:v.id,class:j(["model-version-item",{active:$.value===v.id}]),type:"button",onClick:W=>Y(v)},[l("div",dt,[l("strong",null,m(v.name),1),l("span",null,m(v.description||v.path||v.online_model_name||"暂无模型描述"),1)]),u[8]||(u[8]=l("span",{class:"model-radio-dot"},null,-1))],10,rt))),128)),s.value.length?y("",!0):(i(),x(D,{key:0,description:"暂无快照版本","image-size":80}))])])])]),_:1},8,["model-value"])}}}),ft=_e(vt,[["__scopeId","data-v-7fb2f968"]]),ce={batch_size:1,learning_rate:1e-4,n_epochs:1,save_steps:100,lr_scheduler_type:"cosine",max_length:512,warmup_ratio:.05,weight_decay:.01,lora_alpha:16,lora_dropout:.1,lora_rank:8,quantization_bit:0,export_quantized:!1,quant_method:"bnb",quant_bits:4,quant_group_size:128,export_format:"Q4_K_M"};function gt(){return{name:"",description:"",train_type:"SFT",base_model:"",template:"qwen",train_method:"lora",train_dataset_id:"",auto_merge:!1,...ce}}function re(a,S){return{name:a.name,description:a.description,base_model:a.base_model,template:a.template,train_type:a.train_type,train_method:a.train_method,gpus:[...S],train_dataset_id:a.train_dataset_id,auto_merge:a.train_type==="SFT"&&a.auto_merge,output_model_name:a.name,batch_size:a.batch_size,learning_rate:a.learning_rate,n_epochs:a.n_epochs,save_steps:a.save_steps,lr_scheduler_type:a.lr_scheduler_type,max_length:a.max_length,warmup_ratio:a.warmup_ratio,weight_decay:a.weight_decay,lora_alpha:a.lora_alpha,lora_dropout:a.lora_dropout,lora_rank:a.lora_rank,quantization_bit:a.train_method==="lora"?a.quantization_bit:0,export_quantized:a.export_quantized,quant_method:a.export_quantized?a.quant_method:"",quant_bits:a.export_quantized?a.quant_bits:0,quant_group_size:a.export_quantized?a.quant_group_size:0,export_format:a.export_quantized&&a.quant_method==="gguf"?a.export_format:""}}function yt(a,S){const k=S.length?S.join(","):"0",P=a.train_type==="DPO"?"dpo":a.train_type==="CPT"?"pt":"sft",b=[`CUDA_VISIBLE_DEVICES=${k} llamafactory-cli train`,` --stage ${P}`," --do_train"," --model_name_or_path <base_model_path>"," --dataset <dataset>",` --template ${a.template}`,` --finetuning_type ${a.train_method}`,` --output_dir ./saves/${a.name||"output"}`,` --per_device_train_batch_size ${a.batch_size}`,` --learning_rate ${a.learning_rate}`,` --num_train_epochs ${a.n_epochs}`,` --save_steps ${a.save_steps}`,` --lr_scheduler_type ${a.lr_scheduler_type}`,` --cutoff_len ${a.max_length}`,` --warmup_ratio ${a.warmup_ratio}`,` --weight_decay ${a.weight_decay}`];return a.train_method==="lora"&&(b.push(` --lora_alpha ${a.lora_alpha}`,` --lora_dropout ${a.lora_dropout}`,` --lora_rank ${a.lora_rank}`),a.quantization_bit&&b.push(` --quantization_bit ${a.quantization_bit}`)),a.export_quantized&&(b.push(` # 训练后导出量化模型:${a.quant_method} ${a.quant_bits}bit`),a.quant_method==="gguf"&&b.push(` # export_format=${a.export_format}`),(a.quant_method==="gptq"||a.quant_method==="awq")&&b.push(` # group_size=${a.quant_group_size}`)),b.join(` \\
`)}function bt(a){return{...a,status:"pending",progress:0}}const ht={class:"fine-tune-create page-card-host has-fixed-footer"},wt={class:"gpu-list"},kt=["onClick"],xt={class:"gpu-card-top"},Vt={class:"gpu-title"},qt={class:"gpu-index"},Ct={class:"gpu-name"},$t={class:"gpu-usage"},Et={class:"gpu-usage-bar"},zt={class:"gpu-meta"},Tt={key:0,class:"gpu-empty"},Pt={class:"hyperparam-section"},Ut={class:"param-table-wrapper"},Mt={class:"param-table"},St={class:"param-col name"},It={class:"param-col config"},Ft={key:2,class:"param-hint"},At={class:"param-col desc"},Dt={class:"desc-text"},Rt={class:"param-footer"},Ot={class:"preflight-actions"},Gt={class:"command-preview-wrapper"},Lt={class:"command-preview"},Nt={class:"preflight-header"},Bt={key:0},jt={key:0,class:"preflight-section"},Qt={class:"command-preview remote"},Ht={key:1,class:"preflight-section"},Kt={key:2,class:"preflight-section"},Wt={key:3,class:"preflight-section"},Zt={class:"form-actions-wrapper"},Jt=me({__name:"FineTuneCreateView",setup(a){const S=Ne(),k=C(),P=C(!1),b=C(!1),p=C(null),$=C([]),F=C([]),O=C([]),E=C([]),I=C(!1),s=Fe(gt()),L={name:[{required:!0,message:"请输入任务名称",trigger:"blur"},{pattern:/^[a-zA-Z0-9_]+$/,message:"仅支持字母、数字、下划线",trigger:"blur"},{max:50,message:"不超过 50 字符",trigger:"blur"}],base_model:[{required:!0,message:"请选择模型",trigger:"change"}],template:[{required:!0,message:"请选择训练模板",trigger:"change"}],train_dataset_id:[{required:!0,message:"请选择训练数据集",trigger:"change"}]},Q=T(()=>s.train_method==="lora"),X=T(()=>$.value.find(r=>r.id===s.base_model)),Y=T(()=>{var r;return((r=X.value)==null?void 0:r.name)||""}),H=T(()=>yt(s,E.value)),K=T(()=>{var e,V,U,g;const r=(V=(e=p.value)==null?void 0:e.preview)==null?void 0:V.command;return Array.isArray(r)&&r.length?r.join(" "):((g=(U=p.value)==null?void 0:U.preview)==null?void 0:g.command_text)||""});function _(r){const e=E.value.indexOf(r);e===-1?E.value.push(r):E.value.splice(e,1)}function u(r){return`${Math.max(0,Math.min(r,100))}%`}function c(){I.value=!0}function A(r){var e;s.base_model=r,(e=k.value)==null||e.validateField("base_model")}function ee(){Object.assign(s,ce)}const D=C(!1),N=T(()=>{const r=[{key:"batch_size",name:"batch_size",desc:"批次大小,代表模型训练过程中,模型更新一次参数所需要的数据样本数。",hint:"[1, 64], step:1",type:"number",min:1,max:64,step:1},{key:"learning_rate",name:"learning_rate",desc:"学习率,代表每次更新数据的增量参数权重比例。",hint:"[0.000001, 1]",type:"number",min:1e-6,max:1,step:1e-5,precision:6},{key:"n_epochs",name:"n_epochs",desc:"循环次数,代表模型训练过程中模型学习数据集的次数,可理解为看几遍数据,一般建议的范围是 1-3 遍即可,可依据需求进行调整",hint:"[1, 100], step:1",type:"number",min:1,max:100,step:1},{key:"save_steps",name:"save_steps",desc:"保存步数,训练阶段模型保存的间隔步长。",hint:"[10, 10000]",type:"number",min:10,max:1e4,step:1},{key:"lr_scheduler_type",name:"lr_scheduler_type",desc:"学习率调整策略,选择不同的学习率策略。",hint:"",type:"select",options:Be},{key:"max_length",name:"max_length",desc:"序列长度,单个训练数据样本的最大长度。",hint:"[64, 4096]",type:"number",min:64,max:4096,step:1},{key:"warmup_ratio",name:"warmup_ratio",desc:"学习率预热比例,学习率预热阶段占总训练步数的比例。",hint:"[0, 1]",type:"number",min:0,max:1,step:.01,precision:2},{key:"weight_decay",name:"weight_decay",desc:"权重衰减,用于在优化过程中对模型参数施加惩罚,防止过拟合。",hint:"[0, 1]",type:"number",min:0,max:1,step:.01,precision:2}];return Q.value&&r.push({key:"lora_alpha",name:"lora_alpha",desc:"LoRA 缩放系数。",hint:"16/32/64/128",type:"select",options:[{label:"16",value:16},{label:"32",value:32},{label:"64",value:64},{label:"128",value:128}]},{key:"lora_rank",name:"lora_rank",desc:"LoRA 秩大小,控制低秩矩阵的维度。",hint:"8/16/32/64",type:"select",options:[{label:"8",value:8},{label:"16",value:16},{label:"32",value:32},{label:"64",value:64}]},{key:"lora_dropout",name:"lora_dropout",desc:"LoRA 层的 dropout 比例。",hint:"[0, 1]",type:"number",min:0,max:1,step:.05,precision:2}),r}),te=T(()=>D.value?N.value:N.value.slice(0,3));function v(r){const e=s[r];return typeof e=="boolean"?Number(e):e}function W(r,e){e!==void 0&&Reflect.set(s,r,e)}async function ve(){try{$.value=await tt()||[]}catch{$.value=[]}}async function fe(){try{F.value=(await lt()||[]).filter(r=>String(r.type).toLowerCase()==="train")}catch{F.value=[]}}async function ge(){try{const r=await Ae();O.value=(r==null?void 0:r.gpu)||[],O.value.length>0&&(E.value=[0])}catch{O.value=[]}}async function ye(){k.value&&await k.value.validate(async r=>{if(r){if(E.value.length===0){z.warning("请至少选择一个 GPU");return}P.value=!0;try{let e;try{e=await Ze(s.name)}catch{z.error("任务名校验失败,请稍后重试");return}if(e.exists){z.error("任务名称已存在,请更换");return}const V=re(s,E.value),U=await ae(V);if(!(U!=null&&U.valid)){z.error("训练预检未通过,请先处理预检问题");return}const G=(await Je(bt(V))).id;try{await Xe({...V,task_id:G}),z.success("训练任务已创建并启动")}catch{await Ye(G,{status:"failed"}),z.error("任务已创建,但训练启动失败")}S.push("/fine-tune")}catch{z.error("训练任务创建失败,请稍后重试")}finally{P.value=!1}}})}async function ae(r=re(s,E.value)){b.value=!0;try{const e=await et(r);return p.value=e,e.valid?z.success("训练预检通过"):z.warning("训练预检未通过"),e}catch{return p.value={valid:!1,errors:["预检接口调用失败,请检查后端服务和算力节点连接"],warnings:[],diagnostics:[{level:"error",title:"预检调用失败",suggestion:"请确认后端服务可访问 Compute API并检查浏览器或后端日志。"}]},z.error("训练预检失败"),p.value}finally{b.value=!1}}async function be(){k.value&&await k.value.validate(async r=>{if(r){if(E.value.length===0){z.warning("请至少选择一个 GPU");return}await ae()}})}function he(){S.back()}return Ie(()=>{ve(),fe(),ge()}),(r,e)=>{const V=Me,U=de,g=qe,G=Pe,ne=Te,M=Ee,we=ze,R=$e,oe=Ue,B=pe,le=Se,ke=Ce,xe=Ve;return i(),d("div",ht,[n(je,{title:"创建训练任务"},{default:o(()=>[n(xe,{ref_key:"formRef",ref:k,model:s,rules:L,"label-width":"140px","label-position":"left"},{default:o(()=>{var Z,se,ie;return[n(V,{"content-position":"left"},{default:o(()=>[...e[15]||(e[15]=[f("基本信息",-1)])]),_:1}),n(g,{label:"任务名称",prop:"name"},{default:o(()=>[n(U,{modelValue:s.name,"onUpdate:modelValue":e[0]||(e[0]=t=>s.name=t),placeholder:"字母、数字、下划线",maxlength:"50","show-word-limit":"",style:{width:"420px"}},null,8,["modelValue"])]),_:1}),n(g,{label:"任务描述"},{default:o(()=>[n(U,{modelValue:s.description,"onUpdate:modelValue":e[1]||(e[1]=t=>s.description=t),type:"textarea",rows:4,maxlength:"200","show-word-limit":"",style:{width:"600px"}},null,8,["modelValue"])]),_:1}),n(V,{"content-position":"left"},{default:o(()=>[...e[16]||(e[16]=[f("训练配置",-1)])]),_:1}),n(g,{label:"GPU 硬件"},{default:o(()=>[l("div",wt,[(i(!0),d(w,null,q(O.value,(t,h)=>(i(),d("div",{key:h,class:j(["gpu-card",{active:E.value.includes(h),"is-busy":t.gpu_percent>80}]),onClick:Xt=>_(h)},[l("div",xt,[l("div",Vt,[l("span",qt,"GPU-"+m(h),1),l("span",Ct,m(t.name),1)]),l("span",$t,m(t.gpu_percent)+"%",1)]),l("div",Et,[l("span",{style:De({width:u(t.gpu_percent)})},null,4)]),l("div",zt,[l("span",null,"显存 "+m(t.memory_used_gb)+"/"+m(t.memory_total_gb)+"GB",1),l("span",null,m(t.temperature)+"°C",1),l("span",null,m(t.power_w)+"W",1)])],10,kt))),128)),O.value.length?y("",!0):(i(),d("div",Tt,"暂无 GPU 信息"))])]),_:1}),n(g,{label:"训练方式"},{default:o(()=>[n(ne,{modelValue:s.train_type,"onUpdate:modelValue":e[2]||(e[2]=t=>s.train_type=t)},{default:o(()=>[n(G,{value:"SFT"},{default:o(()=>[...e[17]||(e[17]=[f("SFT 微调训练",-1)])]),_:1}),n(G,{value:"DPO"},{default:o(()=>[...e[18]||(e[18]=[f("DPO 偏好训练",-1)])]),_:1}),n(G,{value:"CPT"},{default:o(()=>[...e[19]||(e[19]=[f("CPT 继续预训练",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),n(g,{label:"选择模型",prop:"base_model"},{default:o(()=>[n(U,{class:"model-picker-input","model-value":Y.value,placeholder:"请选择基座模型",readonly:"",onClick:c,style:{width:"420px"}},{suffix:o(()=>[...e[20]||(e[20]=[l("i",{class:"fa fa-angle-right"},null,-1)])]),_:1},8,["model-value"])]),_:1}),n(g,{label:"训练模板",prop:"template"},{default:o(()=>[n(R,{modelValue:s.template,"onUpdate:modelValue":e[3]||(e[3]=t=>s.template=t),placeholder:"请选择训练模板",filterable:"",style:{width:"420px"}},{default:o(()=>[(i(!0),d(w,null,q(J(Re),t=>(i(),x(we,{key:t.label,label:t.label},{default:o(()=>[(i(!0),d(w,null,q(t.options,h=>(i(),x(M,{key:h.value,label:h.label,value:h.value},null,8,["label","value"]))),128))]),_:2},1032,["label"]))),128))]),_:1},8,["modelValue"])]),_:1}),n(g,{label:"训练方法"},{default:o(()=>[n(ne,{modelValue:s.train_method,"onUpdate:modelValue":e[4]||(e[4]=t=>s.train_method=t)},{default:o(()=>[n(oe,{value:"lora"},{default:o(()=>[...e[21]||(e[21]=[f("LoRA高效微调",-1)])]),_:1}),n(oe,{value:"full"},{default:o(()=>[...e[22]||(e[22]=[f("全参微调",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),n(V,{"content-position":"left"},{default:o(()=>[e[24]||(e[24]=l("span",{style:{"font-size":"15px","font-weight":"600",color:"#1f2937","margin-right":"12px"}},"超参配置",-1)),n(B,{link:"",type:"primary",size:"small",onClick:ee},{default:o(()=>[...e[23]||(e[23]=[l("i",{class:"fa fa-refresh",style:{"margin-right":"4px"}},null,-1),f(" 恢复默认配置 ",-1)])]),_:1})]),_:1}),l("div",Pt,[l("div",Ut,[l("div",Mt,[e[25]||(e[25]=l("div",{class:"param-header"},[l("div",{class:"param-col name"},"参数名称"),l("div",{class:"param-col config"},"配置"),l("div",{class:"param-col desc"},"说明")],-1)),(i(!0),d(w,null,q(te.value,t=>(i(),d("div",{class:"param-row",key:t.key},[l("div",St,m(t.name),1),l("div",It,[t.type==="number"?(i(),x(le,{key:0,"model-value":Number(v(t.key)),min:t.min,max:t.max,step:t.step,precision:t.precision,"controls-position":"right",style:{width:"200px"},"onUpdate:modelValue":h=>W(t.key,h)},null,8,["model-value","min","max","step","precision","onUpdate:modelValue"])):t.type==="select"?(i(),x(R,{key:1,"model-value":v(t.key),style:{width:"200px"},"onUpdate:modelValue":h=>W(t.key,h)},{default:o(()=>[(i(!0),d(w,null,q(t.options,h=>(i(),x(M,{key:h.value,label:h.label,value:h.value},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onUpdate:modelValue"])):y("",!0),t.hint?(i(),d("span",Ft,m(t.hint),1)):y("",!0)]),l("div",At,[n(ke,{content:t.desc,placement:"top",effect:"dark","show-after":200},{default:o(()=>[l("span",Dt,m(t.desc),1)]),_:2},1032,["content"])])]))),128))]),l("div",Rt,[n(B,{link:"",type:"primary",onClick:e[5]||(e[5]=t=>D.value=!D.value)},{default:o(()=>[l("i",{class:j(D.value?"fa fa-angle-up":"fa fa-angle-down"),style:{"margin-right":"4px"}},null,2),f(" "+m(D.value?"收起配置":"展开配置"),1)]),_:1})])])]),n(V,{"content-position":"left"},{default:o(()=>[...e[26]||(e[26]=[f("数据配置",-1)])]),_:1}),n(g,{label:"训练数据集",prop:"train_dataset_id"},{default:o(()=>[n(R,{modelValue:s.train_dataset_id,"onUpdate:modelValue":e[6]||(e[6]=t=>s.train_dataset_id=t),placeholder:"请选择训练数据集",filterable:"",style:{width:"420px"}},{default:o(()=>[(i(!0),d(w,null,q(F.value,t=>(i(),x(M,{key:t.id,label:t.name,value:t.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),s.train_type==="SFT"?(i(),d(w,{key:0},[n(V,{"content-position":"left"},{default:o(()=>[...e[27]||(e[27]=[f("合并模型",-1)])]),_:1}),n(g,{label:"自动合并权重并保存"},{default:o(()=>[n(R,{modelValue:s.auto_merge,"onUpdate:modelValue":e[7]||(e[7]=t=>s.auto_merge=t),style:{width:"420px"}},{default:o(()=>[n(M,{label:"否",value:!1}),n(M,{label:"是",value:!0})]),_:1},8,["modelValue"])]),_:1})],64)):y("",!0),n(V,{"content-position":"left"},{default:o(()=>[...e[28]||(e[28]=[f("模型量化",-1)])]),_:1}),s.train_method==="lora"?(i(),x(g,{key:1,label:"训练时量化"},{default:o(()=>[n(R,{modelValue:s.quantization_bit,"onUpdate:modelValue":e[8]||(e[8]=t=>s.quantization_bit=t),style:{width:"420px"}},{default:o(()=>[(i(!0),d(w,null,q(J(Oe),t=>(i(),x(M,{key:t.value,label:t.label,value:t.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1})):y("",!0),n(g,{label:"导出量化模型"},{default:o(()=>[n(R,{modelValue:s.export_quantized,"onUpdate:modelValue":e[9]||(e[9]=t=>s.export_quantized=t),style:{width:"420px"}},{default:o(()=>[n(M,{label:"否",value:!1}),n(M,{label:"是",value:!0})]),_:1},8,["modelValue"])]),_:1}),s.export_quantized?(i(),d(w,{key:2},[n(g,{label:"量化方法"},{default:o(()=>[n(R,{modelValue:s.quant_method,"onUpdate:modelValue":e[10]||(e[10]=t=>s.quant_method=t),style:{width:"420px"}},{default:o(()=>[(i(!0),d(w,null,q(J(Ge),t=>(i(),x(M,{key:t.value,label:t.label,value:t.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),n(g,{label:"量化位数"},{default:o(()=>[n(le,{modelValue:s.quant_bits,"onUpdate:modelValue":e[11]||(e[11]=t=>s.quant_bits=t),min:s.quant_method==="bnb"?4:2,max:s.quant_method==="bnb"?8:16,step:1,"controls-position":"right",style:{width:"200px"}},null,8,["modelValue","min","max"])]),_:1}),s.quant_method==="gptq"||s.quant_method==="awq"?(i(),x(g,{key:0,label:"分组大小"},{default:o(()=>[n(le,{modelValue:s.quant_group_size,"onUpdate:modelValue":e[12]||(e[12]=t=>s.quant_group_size=t),min:32,max:1024,step:32,"controls-position":"right",style:{width:"200px"}},null,8,["modelValue"])]),_:1})):y("",!0),s.quant_method==="gguf"?(i(),x(g,{key:1,label:"导出格式"},{default:o(()=>[n(R,{modelValue:s.export_format,"onUpdate:modelValue":e[13]||(e[13]=t=>s.export_format=t),style:{width:"420px"}},{default:o(()=>[(i(!0),d(w,null,q(J(Le),t=>(i(),x(M,{key:t.value,label:t.label,value:t.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1})):y("",!0)],64)):y("",!0),n(V,{"content-position":"left"},{default:o(()=>[...e[29]||(e[29]=[f("训练命令预览",-1)])]),_:1}),l("div",Ot,[n(B,{type:"primary",plain:"",loading:b.value,onClick:be},{default:o(()=>[...e[30]||(e[30]=[l("i",{class:"fa fa-check-circle-o",style:{"margin-right":"4px"}},null,-1),f(" 预检训练配置 ",-1)])]),_:1},8,["loading"]),e[31]||(e[31]=l("span",{class:"preflight-hint"},"预检会调用后端调度和 Compute validate提前检查数据格式、模型路径、GPU 条件和真实训练命令。",-1))]),l("div",Gt,[l("pre",Lt,m(H.value),1)]),p.value?(i(),d("div",{key:3,class:j(["preflight-panel",{"is-valid":p.value.valid,"is-invalid":!p.value.valid}])},[l("div",Nt,[l("strong",null,m(p.value.valid?"预检通过":"预检未通过"),1),p.value.node?(i(),d("span",Bt," 调度节点:"+m(p.value.node.code||p.value.node.name||p.value.node.id),1)):y("",!0)]),K.value?(i(),d("div",jt,[e[32]||(e[32]=l("span",{class:"section-label"},"后端真实命令",-1)),l("pre",Qt,m(K.value),1)])):y("",!0),(Z=p.value.errors)!=null&&Z.length?(i(),d("div",Ht,[e[33]||(e[33]=l("span",{class:"section-label"},"错误",-1)),l("ul",null,[(i(!0),d(w,null,q(p.value.errors,t=>(i(),d("li",{key:t},m(t),1))),128))])])):y("",!0),(se=p.value.warnings)!=null&&se.length?(i(),d("div",Kt,[e[34]||(e[34]=l("span",{class:"section-label"},"警告",-1)),l("ul",null,[(i(!0),d(w,null,q(p.value.warnings,t=>(i(),d("li",{key:t},m(t),1))),128))])])):y("",!0),(ie=p.value.diagnostics)!=null&&ie.length?(i(),d("div",Wt,[e[35]||(e[35]=l("span",{class:"section-label"},"诊断建议",-1)),l("ul",null,[(i(!0),d(w,null,q(p.value.diagnostics,t=>(i(),d("li",{key:t.title},[l("strong",null,m(t.title)+"",1),f(m(t.suggestion),1)]))),128))])])):y("",!0)],2)):y("",!0),l("div",Zt,[n(B,{type:"primary",loading:P.value,onClick:ye},{default:o(()=>[...e[36]||(e[36]=[f("创建并启动训练",-1)])]),_:1},8,["loading"]),n(B,{onClick:he},{default:o(()=>[...e[37]||(e[37]=[f("取消",-1)])]),_:1})])]}),_:1},8,["model"])]),_:1}),n(ft,{modelValue:I.value,"onUpdate:modelValue":e[14]||(e[14]=Z=>I.value=Z),models:$.value,"current-model-id":s.base_model,onConfirm:A},null,8,["modelValue","models","current-model-id"])])}}}),Al=_e(Jt,[["__scopeId","data-v-bb84eb14"]]);export{Al as default};