run:
  run_id: sft-qwen2.5-7b-k8s-001
  stage: sft
  task_type: causal_lm
  description: "面向 Kubernetes 平台问答与排障助手的指令微调示例"

inputs:
  base_model: "Qwen/Qwen2.5-7B"
  base_model_revision: "main"
  train_dataset: "/data/llm-k8s-sft/train.jsonl"
  eval_dataset: "/data/llm-k8s-sft/val.jsonl"
  dataset_version: "llm-k8s-sft-v1.3.2"

tokenizer:
  max_seq_length: 4096
  truncation_side: "right"
  packing: true
  chat_template_from_model: true

training:
  num_train_epochs: 3
  max_steps: 1200
  per_device_train_batch_size: 1
  per_device_eval_batch_size: 1
  gradient_accumulation_steps: 16
  learning_rate: 0.0002
  lr_scheduler_type: "cosine"
  warmup_ratio: 0.03
  weight_decay: 0.01
  max_grad_norm: 1.0
  logging_steps: 10
  eval_steps: 100
  save_steps: 120
  save_total_limit: 3
  bf16: true
  gradient_checkpointing: true

lora:
  enabled: true
  r: 64
  lora_alpha: 128
  lora_dropout: 0.05
  bias: "none"
  target_modules:
    - "q_proj"
    - "k_proj"
    - "v_proj"
    - "o_proj"
    - "gate_proj"
    - "up_proj"
    - "down_proj"

optimization:
  optimizer: "adamw_torch"
  loss_mask: "assistant_only"
  seed: 42

distributed:
  strategy: "ddp"
  num_nodes: 1
  gpus_per_node: 4

outputs:
  output_dir: "/mnt/models/runs/sft-qwen2.5-7b-k8s-001"
  adapter_dir: "/mnt/models/adapters/qwen2.5-7b-k8s-sft-v1"
  merged_model_dir: "/mnt/models/merged/qwen2.5-7b-k8s-sft-v1"
  push_to_registry: true
