Skip to content

Commit

Permalink
feat(llm): add LLM finetuning guide and parameters explanation
Browse files Browse the repository at this point in the history
  • Loading branch information
entelecheia committed May 6, 2024
1 parent 59f5244 commit 369d25c
Showing 1 changed file with 202 additions and 0 deletions.
202 changes: 202 additions & 0 deletions src/mlops2024/book/week10/llm_finetuning.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
# LLM 파인튜닝

AutoTrain을 사용하면 자신의 데이터에서 대형 언어 모델(LLM)을 쉽게 파인튜닝할 수 있습니다!

AutoTrain은 다음과 같은 유형의 LLM 파인튜닝을 지원합니다:

- Causal Language Modeling (CLM)
- Masked Language Modeling (MLM) [곧 출시 예정]

## 데이터 준비

LLM 파인튜닝은 CSV 형식의 데이터를 받습니다.

### SFT / Generic Trainer를 위한 데이터 형식

SFT / Generic Trainer의 경우 데이터는 다음 형식이어야 합니다:

| text |
| ------------------------------------------------------------- |
| human: hello \n bot: hi nice to meet you |
| human: how are you \n bot: I am fine |
| human: What is your name? \n bot: My name is Mary |
| human: Which is the best programming language? \n bot: Python |

이 형식의 예제 데이터셋은 여기서 찾을 수 있습니다: https://huggingface.co/datasets/timdettmers/openassistant-guanaco

SFT/Generic 훈련을 위해서는 데이터셋에 `text` 열이 있어야 합니다.

### Reward Trainer를 위한 데이터 형식

Reward Trainer의 경우 데이터는 다음 형식이어야 합니다:

| text | rejected_text |
| ------------------------------------------------------------- | ----------------------------------------------------------------- |
| human: hello \n bot: hi nice to meet you | human: hello \n bot: leave me alone |
| human: how are you \n bot: I am fine | human: how are you \n bot: I am not fine |
| human: What is your name? \n bot: My name is Mary | human: What is your name? \n bot: Whats it to you? |
| human: Which is the best programming language? \n bot: Python | human: Which is the best programming language? \n bot: Javascript |

Reward Trainer의 경우 데이터셋에 `text` 열(선택된 텍스트)과 `rejected_text` 열이 있어야 합니다.

### DPO Trainer를 위한 데이터 형식

DPO Trainer의 경우 데이터는 다음 형식이어야 합니다:

| prompt | text | rejected_text |
| --------------------------------------- | ------------------- | ------------------ |
| hello | hi nice to meet you | leave me alone |
| how are you | I am fine | I am not fine |
| What is your name? | My name is Mary | Whats it to you? |
| What is your name? | My name is Mary | I dont have a name |
| Which is the best programming language? | Python | Javascript |
| Which is the best programming language? | Python | C++ |
| Which is the best programming language? | Java | C++ |

DPO Trainer의 경우 데이터셋에 `prompt` 열, `text` 열(선택된 텍스트), 그리고 `rejected_text` 열이 있어야 합니다.

모든 작업에 대해 CSV와 JSONL 파일을 모두 사용할 수 있습니다!

## 매개변수

```
❯ autotrain llm --help
usage: autotrain <command> [<args>] llm [-h] [--train] [--deploy] [--inference] [--username USERNAME]
[--backend {local-cli,spaces-a10gl,spaces-a10gs,spaces-a100,spaces-t4m,spaces-t4s,spaces-cpu,spaces-cpuf}]
[--token TOKEN] [--push-to-hub] --model MODEL --project-name PROJECT_NAME [--data-path DATA_PATH]
[--train-split TRAIN_SPLIT] [--valid-split VALID_SPLIT] [--batch-size BATCH_SIZE] [--seed SEED]
[--epochs EPOCHS] [--gradient_accumulation GRADIENT_ACCUMULATION] [--disable_gradient_checkpointing]
[--lr LR] [--log {none,wandb,tensorboard}] [--text_column TEXT_COLUMN]
[--rejected_text_column REJECTED_TEXT_COLUMN] [--prompt-text-column PROMPT_TEXT_COLUMN]
[--model-ref MODEL_REF] [--warmup_ratio WARMUP_RATIO] [--optimizer OPTIMIZER] [--scheduler SCHEDULER]
[--weight_decay WEIGHT_DECAY] [--max_grad_norm MAX_GRAD_NORM] [--add_eos_token] [--block_size BLOCK_SIZE]
[--peft] [--lora_r LORA_R] [--lora_alpha LORA_ALPHA] [--lora_dropout LORA_DROPOUT]
[--logging_steps LOGGING_STEPS] [--evaluation_strategy {epoch,steps,no}]
[--save_total_limit SAVE_TOTAL_LIMIT] [--auto_find_batch_size]
[--mixed_precision {fp16,bf16,None}] [--quantization {int4,int8,None}] [--model_max_length MODEL_MAX_LENGTH]
[--max_prompt_length MAX_PROMPT_LENGTH] [--max_completion_length MAX_COMPLETION_LENGTH]
[--trainer {default,dpo,sft,orpo,reward}] [--target_modules TARGET_MODULES] [--merge_adapter]
[--use_flash_attention_2] [--dpo-beta DPO_BETA] [--chat_template {tokenizer,chatml,zephyr,None}]
[--padding {left,right,None}]
✨ AutoTrain LLM 실행
options:
-h, --help 도움말 메시지를 표시하고 종료합니다
--train 모델 훈련 명령
--deploy 모델 배포 명령 (제한된 사용 가능)
--inference 추론 실행 명령 (제한된 사용 가능)
--username USERNAME Hugging Face Hub 사용자 이름
--backend {local-cli,spaces-a10gl,spaces-a10gs,spaces-a100,spaces-t4m,spaces-t4s,spaces-cpu,spaces-cpuf}
사용할 백엔드: 기본값 또는 공간. Spaces 백엔드는 push_to_hub 및 username이 필요합니다. 고급 사용자 전용.
--token TOKEN Hugging Face API 토큰. 토큰은 모델 허브에 대한 쓰기 권한이 있어야 합니다.
--push-to-hub 훈련 후 허브로 푸시하면 훈련된 모델이 Hugging Face 모델 허브로 푸시됩니다.
--model MODEL 훈련에 사용할 기본 모델
--project-name PROJECT_NAME
훈련된 모델에 대한 출력 디렉터리/리포지토리 ID (허브에서 고유해야 함)
--data-path DATA_PATH
사용할 훈련 데이터셋. cli를 사용할 때는 적절한 형식으로 훈련 및 검증 데이터가 포함된 디렉터리 경로여야 합니다
--train-split TRAIN_SPLIT
사용할 훈련 데이터셋 분할
--valid-split VALID_SPLIT
사용할 검증 데이터셋 분할
--batch-size BATCH_SIZE, --train-batch-size BATCH_SIZE
사용할 훈련 배치 크기
--seed SEED 재현성을 위한 랜덤 시드
--epochs EPOCHS 훈련 에포크 수
--gradient_accumulation GRADIENT_ACCUMULATION, --gradient-accumulation GRADIENT_ACCUMULATION
그래디언트 누적 단계
--disable_gradient_checkpointing, --disable-gradient-checkpointing, --disable-gc
그래디언트 체크포인트를 비활성화합니다
--lr LR 학습률
--log {none,wandb,tensorboard}
실험 추적 사용
--text_column TEXT_COLUMN, --text-column TEXT_COLUMN
텍스트 데이터에 사용할 데이터셋 열을 지정합니다. 이 매개변수는 텍스트 정보를 처리하는 모델에 필수적입니다. 기본값은 'text'입니다.
--rejected_text_column REJECTED_TEXT_COLUMN, --rejected-text-column REJECTED_TEXT_COLUMN
처리하기에 적합하지 않은 기준을 만족하지 않는 항목을 저장하는 데 사용할 열을 정의합니다. 기본값은 'rejected'입니다.
orpo, dpo 및 reward trainer에서만 사용됩니다.
--prompt-text-column PROMPT_TEXT_COLUMN, --prompt-text-column PROMPT_TEXT_COLUMN
대화 또는 완성 생성과 같은 맥락적 입력이 필요한 작업을 위한 프롬프트 텍스트가 포함된 열을 식별합니다. 기본값은 'prompt'입니다.
dpo trainer에서만 사용됩니다.
--model-ref MODEL_REF
PEFT를 사용하지 않을 때 DPO에 사용할 참조 모델
--warmup_ratio WARMUP_RATIO, --warmup-ratio WARMUP_RATIO
학습률을 워밍업하는 데 할당된 훈련 비율을 설정합니다. 이는 훈련 시작 시 모델의 안정성과 성능을 높일 수 있습니다.
기본값은 0.1입니다.
--optimizer OPTIMIZER
모델을 훈련시키기 위한 최적화 알고리즘을 선택합니다. 다른 최적화기는 훈련 속도와 모델 성능에 영향을 줄 수 있습니다.
기본적으로 'adamw_torch'가 사용됩니다.
--scheduler SCHEDULER
에포크 수를 기준으로 학습률을 조정할 학습률 스케줄러를 선택합니다. 'linear'는 초기 설정된 lr에서 선형으로 학습률을 감소시킵니다.
기본값은 'linear'입니다. 코사인 어닐링 스케줄을 위해 'cosine'을 시도해 보세요.
--weight_decay WEIGHT_DECAY, --weight-decay WEIGHT_DECAY
과적합을 방지하기 위해 더 큰 가중치에 페널티를 주는 데 도움이 되는 정규화를 위한 가중치 감쇠율을 정의합니다.
기본값은 0.0입니다.
--max_grad_norm MAX_GRAD_NORM, --max-grad-norm MAX_GRAD_NORM
역전파 중에 그래디언트 폭발을 방지하는 데 중요한 그래디언트 클리핑에 대한 최대 노름을 설정합니다.
기본값은 1.0입니다.
--add_eos_token, --add-eos-token
언어 모델과 같은 특정 유형의 모델에 중요할 수 있는 텍스트 끝에 자동으로 문장 끝(EOS) 토큰을 추가할지 여부를 전환합니다.
`default` 트레이너에서만 사용됩니다.
--block_size BLOCK_SIZE, --block-size BLOCK_SIZE
시퀀스를 처리하기 위한 블록 크기를 지정합니다. 이는 최대 시퀀스 길이 또는 하나의 텍스트 블록의 길이입니다. -1로 설정하면 블록 크기가 자동으로 결정됩니다.
기본값은 -1입니다.
--peft, --use-peft LoRA-PEFT 활성화
--lora_r LORA_R, --lora-r LORA_R
Low-Rank Adaptation (LoRA)의 'r' 매개변수를 설정합니다. 기본값은 16입니다.
--lora_alpha LORA_ALPHA, --lora-alpha LORA_ALPHA
LoRA의 'alpha' 매개변수를 지정합니다. 기본값은 32입니다.
--lora_dropout LORA_DROPOUT, --lora-dropout LORA_DROPOUT
적응 중 과적합을 방지하는 데 도움이 되도록 LoRA 계층 내의 드롭아웃 비율을 설정합니다. 기본값은 0.05입니다.
--logging_steps LOGGING_STEPS, --logging-steps LOGGING_STEPS
단계별로 훈련 진행 상황을 얼마나 자주 로깅할지 결정합니다. '-1'로 설정하면 로깅 단계가 자동으로 결정됩니다.
--evaluation_strategy {epoch,steps,no}, --evaluation-strategy {epoch,steps,no}
모델의 성능을 평가하는 빈도를 선택하며, 'epoch'가 기본값으로 각 훈련 에포크 끝에 평가합니다.
--save_total_limit SAVE_TOTAL_LIMIT, --save-total-limit SAVE_TOTAL_LIMIT
디스크 사용량을 효과적으로 관리하기 위해 저장된 총 모델 체크포인트 수를 제한합니다. 기본값은 최신 체크포인트만 저장하는 것입니다.
--auto_find_batch_size, --auto-find-batch-size
시스템 성능을 기반으로 효율성을 최대화하기 위해 최적의 배치 크기를 자동으로 결정합니다.
--mixed_precision {fp16,bf16,None}, --mixed-precision {fp16,bf16,None}
성능과 메모리 사용량을 최적화하기 위해 훈련에 사용할 정밀도 모드를 선택합니다. 옵션은 'fp16', 'bf16' 또는 기본 정밀도인 None입니다.
기본값은 None입니다.
--quantization {int4,int8,None}, --quantization {int4,int8,None}
모델 크기를 줄이고 잠재적으로 추론 속도를 높이기 위해 양자화 수준을 선택합니다. 옵션에는 'int4', 'int8' 또는 None이 포함됩니다.
활성화하려면 --peft가 필요합니다.
--model_max_length MODEL_MAX_LENGTH, --model-max-length MODEL_MAX_LENGTH
단일 배치에서 처리할 모델의 최대 길이를 설정하며, 이는 성능과 메모리 사용량에 모두 영향을 줄 수 있습니다.
기본값은 1024입니다.
--max_prompt_length MAX_PROMPT_LENGTH, --max-prompt-length MAX_PROMPT_LENGTH
초기 맥락 입력이 필요한 작업에 특히 관련이 있는 훈련에 사용되는 프롬프트의 최대 길이를 지정합니다.
`orpo` 트레이너에서만 사용됩니다.
--max_completion_length MAX_COMPLETION_LENGTH, --max-completion-length MAX_COMPLETION_LENGTH
사용할 완성 길이입니다. orpo의 경우 인코더-디코더 모델에서만 사용합니다.
--trainer {default,dpo,sft,orpo,reward}
사용할 트레이너 유형
--target_modules TARGET_MODULES, --target-modules TARGET_MODULES
LoRA와 같은 적응 또는 최적화를 위해 모델 아키텍처 내에서 대상으로 할 특정 모듈을 식별합니다.
쉼표로 구분된 모듈 이름 목록입니다. 기본값은 'all-linear'입니다.
--merge_adapter, --merge-adapter
PEFT 어댑터를 모델과 병합하려면 이 플래그를 사용하세요
--use_flash_attention_2, --use-flash-attention-2, --use-fa2
flash attention 2 사용
--dpo-beta DPO_BETA, --dpo-beta DPO_BETA
DPO 트레이너의 베타값
--chat_template {tokenizer,chatml,zephyr,None}, --chat-template {tokenizer,chatml,zephyr,None}
'tokenizer', 'chatml', 'zephyr' 또는 None을 포함한 옵션으로 채팅 기반 상호 작용을 위한 특정 템플릿을 적용합니다.
이 설정은 모델의 대화 행동을 형성할 수 있습니다.
--padding {left,right,None}, --padding {left,right,None}
입력 정렬에 민감한 모델에 중요한 시퀀스의 패딩 방향을 지정합니다. 옵션에는 'left', 'right' 또는 None이 포함됩니다.
```

AutoTrain은 LLM 파인튜닝을 위한 다양한 옵션과 매개변수를 제공합니다. 이를 통해 사용자는 자신의 특정 요구 사항에 맞게 훈련 프로세스를 맞춤 설정할 수 있습니다.

데이터 준비 측면에서 AutoTrain은 다양한 훈련 작업(예: SFT, Reward 트레이너, DPO 트레이너)에 대해 특정 데이터 형식을 요구합니다. 데이터는 CSV 또는 JSONL 형식으로 제공될 수 있습니다.

훈련 매개변수와 관련하여 AutoTrain은 배치 크기, 에포크 수, 학습률, 최적화기, 스케줄러 등을 포함한 다양한 옵션을 제공합니다. 이러한 매개변수는 모델 성능과 훈련 효율성에 상당한 영향을 미칠 수 있습니다.

AutoTrain은 또한 LoRA(Low-Rank Adaptation)와 같은 고급 기술을 통합하여 계산 및 메모리 효율성을 개선하는 동시에 강력한 성능을 달성할 수 있습니다.

전반적으로 AutoTrain은 사용자가 최소한의 노력으로 LLM을 파인튜닝할 수 있는 포괄적이고 사용하기 쉬운 프레임워크를 제공합니다. 다양한 옵션과 매개변수를 통해 사용자는 자신의 특정 사용 사례에 맞게 훈련 프로세스를 최적화할 수 있습니다.

AutoTrain을 사용하면 머신러닝 전문 지식이 거의 또는 전혀 없는 사용자도 최첨단 LLM을 훈련시키고 강력한 AI 애플리케이션을 구축할 수 있습니다. 이는 LLM의 힘을 보다 광범위한 사용자와 사용 사례에 제공하는 데 도움이 될 수 있습니다.

0 comments on commit 369d25c

Please sign in to comment.