diff --git a/json_test.json b/json_test.json new file mode 100644 index 0000000..b6f4993 --- /dev/null +++ b/json_test.json @@ -0,0 +1,904 @@ +[ + { + "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" + ] + } +] \ No newline at end of file