[
  {
    "param_type": "data",
    "label": "Block size",
    "name": "block_size",
    "value": 1024,
    "placeholder": "",
    "description": "최대 시퀀스 길이 또는 텍스트 한 블록의 길이. -1로 설정하면 블록 크기가 자동으로 결정됨. 기본값은 -1.",
    "inputType": "number",
    "required": true,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full",
      "basic"
    ]
  },
  {
    "param_type": "data",
    "label": "Model max length",
    "name": "model_max_length",
    "value": 2048,
    "placeholder": "",
    "description": "모델이 단일 배치에서 처리할 최대 길이를 설정하면 성능과 메모리 사용량에 영향을 줄 수 있음. 기본값은 1024.",
    "inputType": "number",
    "required": true,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full",
      "basic"
    ]
  },
  {
    "param_type": "data",
    "label": "Padding side",
    "name": "padding",
    "placeholder": "",
    "description": "시퀀스를 패딩할 측면(왼쪽 또는 오른쪽)",
    "inputType": "select",
    "value": "right",
    "options": [
      {
        "label": "right",
        "value": "right"
      },
      {
        "label": "left",
        "value": "left"
      },
      {
        "label": "None",
        "value": "None"
      }
    ],
    "required": false,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full"
    ]
  },
  {
    "param_type": "data",
    "label": "Add eos token",
    "name": "add_eos_token",
    "placeholder": "",
    "description": "시퀀스 끝에 EOS 토큰을 추가할 지 여부",
    "inputType": "bool",
    "value": "true",
    "required": false,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full"
    ]
  },
  {
    "param_type": "trainer",
    "label": "Logging method",
    "name": "log",
    "placeholder": "",
    "description": "실험 추적을 위한 로깅 방법",
    "inputType": "select",
    "value": "tensorboard",
    "options": [
      {
        "label": "tensorboard",
        "value": "tensorboard"
      },
      {
        "label": "wandb",
        "value": "wandb",
        "disabled": true
      }
    ],
    "required": true,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full",
      "basic"
    ]
  },
  {
    "param_type": "trainer",
    "label": "Logging steps",
    "name": "logging_steps",
    "value": 1,
    "placeholder": "",
    "description": "이벤트 로깅 사이의 단계 수",
    "inputType": "number",
    "required": true,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full",
      "basic"
    ]
  },
  {
    "param_type": "trainer",
    "label": "Use flash attention 2",
    "name": "use_flash_attention",
    "placeholder": "",
    "description": "flash attention version 2 사용 여부",
    "inputType": "bool",
    "value": false,
    "required": false,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full"
    ]
  },
  {
    "param_type": "trainer",
    "label": "Evaluation strategy",
    "name": "eval_strategy",
    "placeholder": "",
    "description": "evaluation 전략 (예: \"epoch\")",
    "inputType": "select",
    "value": "steps",
    "options": [
      {
        "label": "epoch",
        "value": "epoch"
      },
      {
        "label": "steps",
        "value": "steps"
      }
    ],
    "required": false,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full"
    ]
  },
  {
    "param_type": "trainer",
    "label": "Save total limit",
    "name": "save_total_limit",
    "placeholder": "",
    "description": "유지해야 하는 최대 체크포인트 수",
    "inputType": "number",
    "value": 1,
    "required": false,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full"
    ]
  },
  {
    "param_type": "trainer",
    "label": "Auto find batch size",
    "name": "auto_find_batch_size",
    "placeholder": "",
    "description": "최적의 배치 크기를 자동으로 찾을지 여부. 기본값은 False.",
    "inputType": "bool",
    "value": true,
    "required": false,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full"
    ]
  },
  {
    "param_type": "trainer",
    "label": "Mixed precision",
    "name": "mixed_precision",
    "placeholder": "",
    "description": "사용할 mixed precision 타입(예: “fp16”, “bf16” 또는 None)",
    "inputType": "select",
    "value": "fp16",
    "options": [
      {
        "label": "fp16",
        "value": "fp16"
      },
      {
        "label": "bp16",
        "value": "bp16"
      },
      {
        "label": "None",
        "value": "None"
      }
    ],
    "required": true,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full",
      "basic"
    ]
  },
  {
    "param_type": "trainer",
    "label": "Learning rate",
    "name": "learning_rate",
    "value": 0.00003,
    "placeholder": "",
    "description": "트레이닝 학습률(Learning rate)",
    "inputType": "number",
    "required": true,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full",
      "basic"
    ]
  },
  {
    "param_type": "trainer",
    "label": "Epochs",
    "name": "epochs",
    "value": 1,
    "placeholder": "",
    "description": "트레이닝 epochs 수",
    "inputType": "number",
    "required": true,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full",
      "basic"
    ]
  },
  {
    "param_type": "trainer",
    "label": "Batch size",
    "name": "batch_size",
    "value": 2,
    "placeholder": "",
    "description": "트레이닝 배치 사이즈",
    "inputType": "number",
    "required": true,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full",
      "basic"
    ]
  },
  {
    "param_type": "trainer",
    "label": "Warmup proportion",
    "name": "warmup_ratio",
    "value": 0.1,
    "placeholder": "",
    "description": "학습률(Learning rate) 워밍업 수행을 위한 트레이닝 비율",
    "inputType": "number",
    "required": false,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full"
    ]
  },
  {
    "param_type": "trainer",
    "label": "Gradient accumulation",
    "name": "gradient_accumulation",
    "value": 4,
    "placeholder": "",
    "description": "업데이트 전 gradients를 누적하는 단계 수",
    "inputType": "number",
    "required": true,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full",
      "basic"
    ]
  },
  {
    "param_type": "trainer",
    "label": "Optimizer",
    "name": "optimizer",
    "placeholder": "",
    "description": "트레이닝에 사용할 Optimizer",
    "inputType": "select",
    "value": "adamw_torch",
    "options": [
      {
        "label": "adamw_torch",
        "value": "adamw_torch"
      },
      {
        "label": "adamw",
        "value": "adamw"
      },
      {
        "label": "adam",
        "value": "adam"
      },
      {
        "label": "sgd",
        "value": "sgd"
      }
    ],
    "required": true,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full",
      "basic"
    ]
  },
  {
    "param_type": "trainer",
    "label": "Scheduler",
    "name": "scheduler",
    "placeholder": "",
    "description": "학습률(Learning rate) 스케쥴러",
    "inputType": "select",
    "value": "linear",
    "options": [
      {
        "label": "linear",
        "value": "linear"
      },
      {
        "label": "cosine",
        "value": "cosine"
      },
      {
        "label": "cosine_warmup",
        "value": "cosine_warmup"
      },
      {
        "label": "constant",
        "value": "constant"
      }
    ],
    "required": true,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full",
      "basic"
    ]
  },
  {
    "param_type": "trainer",
    "label": "Weight decay",
    "name": "weight_decay",
    "value": 0,
    "placeholder": "",
    "description": "optimizer에 적용할 가중치 감쇠",
    "inputType": "number",
    "required": false,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full"
    ]
  },
  {
    "param_type": "trainer",
    "label": "Max grad norm",
    "name": "max_grad_norm",
    "value": 1,
    "placeholder": "",
    "description": "gradient clipping의 최대 표준",
    "inputType": "number",
    "required": false,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full"
    ]
  },
  {
    "param_type": "trainer",
    "label": "Seed",
    "name": "seed",
    "value": 42,
    "placeholder": "",
    "description": "재현성을 위한 Random seed",
    "inputType": "number",
    "required": false,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full"
    ]
  },
  {
    "param_type": "trainer",
    "label": "Chat template",
    "name": "chat_template",
    "placeholder": "",
    "description": "채팅 기반 모델 템플릿 옵션: None, zephyr, chatml, or tokenizer",
    "inputType": "select",
    "value": "None",
    "options": [
      {
        "label": "None",
        "value": "None"
      },
      {
        "label": "zephyr",
        "value": "zephyr"
      },
      {
        "label": "chatml",
        "value": "chatml"
      },
      {
        "label": "tokenizer",
        "value": "tokenizer"
      }
    ],
    "required": true,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full",
      "basic"
    ]
  },
  {
    "param_type": "trainer",
    "label": "model_ref",
    "name": "model_ref",
    "placeholder": "",
    "description": "DPO 트레이너용 참조 모델",
    "inputType": "text",
    "value": "",
    "required": false,
    "disabled": false,
    "hidden": true,
    "trainer": [
      "dpo"
    ],
    "mode": [
      "full"
    ]
  },
  {
    "param_type": "trainer",
    "label": "dpo_beta",
    "name": "dpo_beta",
    "placeholder": "",
    "description": "DPO 트레이너용 Beta parameter",
    "inputType": "number",
    "value": 0.1,
    "required": false,
    "disabled": false,
    "hidden": true,
    "trainer": [
      "dpo"
    ],
    "mode": [
      "full"
    ]
  },
  {
    "param_type": "trainer",
    "label": "max prompt length",
    "name": "max_prompt_length",
    "placeholder": "",
    "description": "프롬프트 최대 길이",
    "inputType": "number",
    "value": 0.1,
    "required": false,
    "disabled": false,
    "hidden": true,
    "trainer": [
      "dpo",
      "orpo"
    ],
    "mode": [
      "full"
    ]
  },
  {
    "param_type": "trainer",
    "label": "Max completion length",
    "name": "max_completion_length",
    "placeholder": "",
    "description": "completion 최대 길이",
    "inputType": "number",
    "value": 0.1,
    "required": false,
    "disabled": false,
    "hidden": true,
    "trainer": [
      "dpo",
      "orpo"
    ],
    "mode": [
      "full"
    ]
  },
  {
    "param_type": "peft",
    "label": "Quantization",
    "name": "quantization",
    "placeholder": "",
    "description": "사용할 양자화 방법 (예: \"int4\", \"int8\", or None)",
    "inputType": "select",
    "value": "int4",
    "options": [
      {
        "label": "int4",
        "value": "int4"
      },
      {
        "label": "int8",
        "value": "int8"
      },
      {
        "label": "None",
        "value": "None"
      }
    ],
    "required": false,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full"
    ]
  },
  {
    "param_type": "peft",
    "label": "PEFT/LoRA",
    "name": "peft",
    "placeholder": "",
    "description": "파라미터 효율적 미세 조정(PEFT) 사용 여부. 비활성화 시 Full-FT방식으로 훈련합니다.",
    "inputType": "bool",
    "value": true,
    "required": true,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full",
      "basic"
    ]
  },
  {
    "param_type": "peft",
    "label": "Target modules",
    "name": "target_modules",
    "value": "all-linear",
    "placeholder": "",
    "description": "양자화 또는 파인 튜닝을 위한 타겟 모듈",
    "inputType": "text",
    "required": true,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full",
      "basic"
    ]
  },
  {
    "param_type": "peft",
    "label": "Merge adapter",
    "name": "merge_adapter",
    "placeholder": "",
    "description": "어댑터 레이어 병합 여부",
    "inputType": "bool",
    "value": "false",
    "required": false,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full"
    ]
  },
  {
    "param_type": "peft",
    "label": "Lora r",
    "name": "lora_r",
    "value": 16,
    "placeholder": "",
    "description": "LoRA matrices 순위",
    "inputType": "number",
    "required": false,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full"
    ]
  },
  {
    "param_type": "peft",
    "label": "Lora alpha",
    "name": "lora_alpha",
    "value": 32,
    "placeholder": "",
    "description": "LoRA용 Alpha parameter",
    "inputType": "number",
    "required": false,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full"
    ]
  },
  {
    "param_type": "peft",
    "label": "Lora dropout",
    "name": "lora_dropout",
    "value": 0.05,
    "placeholder": "",
    "description": "LoRA의 Dropout rate",
    "inputType": "number",
    "required": false,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full"
    ]
  },
  {
    "param_type": "column_mappings",
    "label": "Prompt text column",
    "name": "prompt_text_column",
    "placeholder": "프롬프트 텍스트의 컬럼 이름",
    "description": "프롬프트 텍스트의 컬럼 이름. 특정할 값이 없으면 'text'를 입력하세요.",
    "inputType": "text",
    "value": "text",
    "required": true,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full",
      "basic"
    ]
  },
  {
    "param_type": "dataset",
    "label": "Dataset files",
    "name": "dataset_files",
    "placeholder": "data/*.json",
    "description": "데이터셋으로 활용할 경로 또는 파일을 글로브패턴(와일드카드패턴)으로 입력하세요 예) *.parquet, data/train/*.jsonl",
    "inputType": "text",
    "value": "*.parquet",
    "required": true,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full",
      "basic"
    ]
  },
  {
    "param_type": "dataset",
    "label": "Pre-processing",
    "name": "pre_processing",
    "placeholder": "데이터셋은 dataset_dict, 토크나이저는 tokenizer 변수를 사용하여 접근하세요.",
    "description": "데이터 전처리를 위한 Python 코드",
    "inputType": "textarea",
    "value": "def _normalize_role(raw_role):\n    role = str(raw_role).strip().lower()\n\n    if role in (\"human\", \"user\"):\n        return \"user\"\n    if role in (\"gpt\", \"assistant\", \"model\"):\n        return \"assistant\"\n    if role == \"system\":\n        return \"system\"\n\n    # 알 수 없는 role은 학습 중단 대신 assistant로 보내지 말고 명확히 실패\n    raise ValueError(f\"Unsupported role: {raw_role}\")\n\n\ndef _extract_turn(turn):\n    # 보통 parquet -> datasets 에서는 dict 형태로 들어옴\n    if isinstance(turn, dict):\n        if \"from\" in turn and \"value\" in turn:\n            return {\n                \"role\": _normalize_role(turn[\"from\"]),\n                \"content\": \"\" if turn[\"value\"] is None else str(turn[\"value\"]),\n            }\n        if \"role\" in turn and \"content\" in turn:\n            return {\n                \"role\": _normalize_role(turn[\"role\"]),\n                \"content\": \"\" if turn[\"content\"] is None else str(turn[\"content\"]),\n            }\n\n    # 예외적으로 [role, content] 형태일 때도 처리\n    if isinstance(turn, (list, tuple)) and len(turn) == 2:\n        return {\n            \"role\": _normalize_role(turn[0]),\n            \"content\": \"\" if turn[1] is None else str(turn[1]),\n        }\n\n    raise ValueError(f\"Unsupported conversation turn format: {turn}\")\n\n\ndef formatting_func(example):\n    if \"conversations\" not in example:\n        raise ValueError(f\"Missing 'conversations'. Available columns: {list(example.keys())}\")\n\n    messages = [_extract_turn(turn) for turn in example[\"conversations\"]]\n\n    # 빈 메시지는 제거\n    messages = [m for m in messages if m[\"content\"].strip()]\n\n    if not messages:\n        raise ValueError(\"No valid messages found in example\")\n\n    formatted_text = tokenizer.apply_chat_template(\n        messages,\n        tokenize=False,\n        add_generation_prompt=False,\n    )\n\n    return {\"text\": formatted_text}\n\n\nfor split in list(dataset_dict.keys()):\n    dataset_dict[split] = dataset_dict[split].map(\n        formatting_func,\n        batched=False,\n        remove_columns=dataset_dict[split].column_names,\n    )",
    "required": false,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full",
      "basic"
    ]
  },
  {
    "param_type": "distributed",
    "label": "distributed backend",
    "name": "distributed_backend",
    "placeholder": "",
    "description": "분산 트레이닝에 사용할 백엔드",
    "inputType": "text",
    "value": "None",
    "required": true,
    "disabled": false,
    "hidden": true,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full"
    ]
  },
  {
    "param_type": "distributed",
    "label": "Use fsdp2",
    "name": "use_fsdp2",
    "placeholder": "",
    "description": "분산 트레이닝에 FSDP2 사용",
    "inputType": "bool",
    "value": "false",
    "required": true,
    "disabled": false,
    "hidden": true,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full"
    ]
  },
  {
    "param_type": "etc",
    "label": "Disable GC",
    "name": "disable_gc",
    "placeholder": "",
    "description": "GC 비활성화",
    "inputType": "bool",
    "value": false,
    "required": false,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full"
    ]
  },
  {
    "param_type": "etc",
    "label": "Unsloth",
    "name": "unsloth",
    "placeholder": "",
    "description": "Unsloth",
    "inputType": "select",
    "value": "false",
    "options": [
      {
        "label": "true",
        "value": "true"
      },
      {
        "label": "false",
        "value": "false"
      }
    ],
    "required": true,
    "disabled": false,
    "hidden": false,
    "trainer": [
      "default",
      "sft"
    ],
    "mode": [
      "full"
    ]
  }
]