
이것은 논문의 Tinystories 실험에 대한 코드입니다. 절차 정의 된 작업에 미세 조정의 효과를 기계적으로 분석합니다. 이 코드는 멋진 https://github.com/karpathy/llama2.c를 기반으로합니다.
설치하려면 repo를 복제하고 가상 Env/uthing을 만들고 pip install -r requirements.txt .txt.
데이터 세트를 다운로드하려면 python tinystories.py download --data_cache_dir <path_to_data_dir> <path_to_data_dir> 하십시오.
이 코드는 python tinystories pretokenize <args> 사용하여 훈련 전에 데이터 세트를 생성하고 토큰 화를합니다. 다양한 사전 레이싱 및 미세 조정 데이터 세트 및 교육 프로토콜 (예 : 삭제 및 복구)을 지정하기 위해 다른 필터링 인수를 사용하여 pretokenize 명령을 사용합니다.
python tinystories train_vocab 사용하여 토큰 화기를 훈련시키는 명령도 있습니다. 이것은 tok8192.model . 모델과 tok8192.vocab 의 두 파일로 구성됩니다. 이미이 작업을 수행했으며 Tokenizer는 data/tok8192.{model/vocab} . 이 파일을 실험에 사용할 <path_to_data_dir> 로 옮겨야합니다.
실험이 거기에 기록되도록 wandb 에 로그인해야합니다.
위에서 언급했듯이, 각 미세 조정 프로토콜은 교육이 시작되기 전에 생성하는 데이터 세트에 의해 제어됩니다. 모든 교육에 먼저 python tinystories pretokenize ... 사용하여 해당 데이터 세트를 생성해야합니다.
usage: tinystories.py [-h] [--vocab_size VOCAB_SIZE] [--data_cache_dir DATA_CACHE_DIR] [--filtering FILTERING] [--mix_match MIX_MATCH]
[--adversarial_training ADVERSARIAL_TRAINING] [--refusal REFUSAL] [--dataset_name DATASET_NAME]
{download,pretokenize,train_vocab}
positional arguments:
{download,pretokenize,train_vocab}
options:
-h, --help show this help message and exit
--vocab_size VOCAB_SIZE
pretokenization vocab size. 0 = use Llama 2 tokenizer.
--data_cache_dir DATA_CACHE_DIR
Adjust data cache dir
--filtering FILTERING
How to filter data
--mix_match MIX_MATCH
How to mix_match sample
--adversarial_training ADVERSARIAL_TRAINING
How to adversarially sample
--refusal REFUSAL Which features to refusal-train on
--dataset_name DATASET_NAME
dataset name filtering , mix_match , adversarial_training 및 refusal 인수는 특정 형식을 취합니다.
filtering : --filtering=<FEATURE>=<VALUE>,<FEATURE>!=<VALUE>,...mix_match : --mix_match=<FEATURE>:<VALUE1>=<VALUE2>,... <VALUE1> <VALUE2> 로 <FEATURE> 로 대체합니다.adversarial_training : --adversarial_training=<FEATURE>=<VALUE>:<PROBABILITY>,... <VALUE> adds <FEATURE> 에 <PROBABILITY> 확률이 있습니다.refusal : --refusal=<FEATURE>=<VALUE>:<PROBABILITY>,... 이야기를 거부로 설정하고 <VALUE> <PROBABILITY> <FEATURE> 추가합니다. 토큰 화로 인해 데이터 세트를 생성하는 데 ~ 10 분이 걸립니다. 데이터 세트 이름이 전달되지 않으면 제공된 기능에서 하나가 생성되고 데이터 세트는 DATA_CACHE_DIR/<dataset_name> 에 저장됩니다.
주어진 기능에 대해 삭제 및 복구 실험에 필요한 모든 데이터 세트를 생성하려면 dataset_gen/tw_fs.sh 를 사용하지만 DATA_CACHE_DIR 올바른 디렉토리로 변경하고 FEATURE_DELETE 및 FEATURE_IRRELEVANT 조정하십시오.
https://drive.google.com/file/d/19duv1xv2uw789hee4zc5bb5bmknrrug7q/view?usp=sharing을 여기에서 여기에서 기본, 사후-복구 및 사후 회전 미세 조정 모델을 다운로드 할 수 있습니다.
해당 파일에서 모델을 추출한 다음 model_names.md를보고 어떤 모델인지 확인해야합니다.
이 모델의 토큰 화기는 tokenizers/ 에 있습니다. 모델 체크 포인트에 사용중인 DATA_CACHE_DIR 에이 파일을 복사해야합니다.
훈련을 실행하려면 python train.py <args> 사용하십시오. configs 에서 파일을 복사하고 요구 사항에 맞게 인수를 조정하여 특정 교육 구성을 만들 수 있으며, 그러한 명령 줄에서 인수를 재정의 할 수도 있습니다.
python train.py configs/base30M.py --batch_size=32 --lr=1e-4 인수는 = 공간이 아니라 사용해야합니다.
이 설정을 사용하면 실험 세트 또는 스윕에 대한 구성 파일을 작성한 다음 명령 줄에서 실험 (즉 기본 모델, 학습 속도, 데이터 세트 등)에 따라 다양한 인수 만 전달할 수 있습니다.
이 모든 명령은 통계 및 세대를 자동으로 wandb 에 로그인하므로 로그인한지 확인하십시오.
python train.py configs/base91M.py --batch_size=256 --dropout=0.1 --gradient_accumulation_steps=2 --learning_rate=0.0001 --max_iters=100000 --max_seq_len=512삭제:
python train.py configs/base91M_tw_delete_no_lrs.py --dataset_name=filter-adv-Twist --learning_rate=1e-05회복:
python train.py configs/base91M_tw_recovery_no_lrs.py --model_dir=/cache/tinystories/base91M-train-2023_10_06_15_15_49_074/out wandb 가 청소하면서 실험을 진행했습니다. 삭제 및 회복을위한 예제 스위프 구성 sweeps/*.yaml 볼 수 있습니다. wandb sweep -p tinystories-uft -e ucl-dar sweeps/<sweep.yaml> 로 스윕을 만들고 사용하는 제출 스크립트에서 wandb agent <sweep_id> --count 1 (slurm/etc.를 사용하는 경우 --count 1 ).
보다 이국적인 출시 및 하이퍼 파라미터 재정의 경우 Train.py 스크립트를 참조하십시오. 다음은 매개 변수를 설정하는 방법에 대한 간단한 안내서입니다. Chinchilla 종이의 끝 부분에있는 테이블을보고 변압기 매개 변수 (Dim, N_Layers, N_HEADS)가 어떻게 자라거나 줄어든 방법을 알 수 있습니다. 이 패턴을 외삽/보간하여 변압기가 커지거나 더 작은 변압기를 얻습니다. 문제에 따라 최대 컨텍스트 길이를 설정하십시오. 다음 토큰을 예측하는 데 중요한 토큰 수가 될 것입니다. 예를 들어 Llama 2는 2048을 사용합니다. 다음으로, 당신은 업데이트 당 총 배치 크기 (스크립트에 의해 인쇄 된 "반복 당 토큰으로 인쇄) 중간 크기의 응용 프로그램의 경우 약 100k 토큰이되기를 원합니다. 작은 응용 분야의 경우 대규모 훈련 (예 : GPTS/LLAMA)의 경우 보통 ~ 0.5m 이상입니다. 당신은 당신의 시스템이 허용하는 모든 것에 대해 batch_size를 먼저 최대화하여 거기에 도착합니다 (예 : 최근 실행에서 Mine은 16 살이었습니다. 그 후 GPU가 메모리가 부족하기 때문에) gradient_accumulation_steps를 ~ 100k의 총 배치 크기에 도달하는 데 필요한만큼 높은 것으로 높이고 싶습니다. 마지막으로 Learning_rate (LR)를 조정하려고합니다. 당신은 이것이 당신의 훈련이 허용하는만큼 높기를 원합니다. 매우 작은 네트워크는 큰 LR (예 : 1E-3 이상)으로 도망 갈 수 있습니다. 대형 네트워크에는 LR이 낮아야합니다. 3E-4는 대부분의 중간 크기의 응용 분야에서 안전한 선택이지만 중소부 네트워크에는 너무 낮을 수 있으므로 늘리십시오! 마지막으로 Max_iters는 교육 기간입니다. 다른 설정으로 재생하십시오. 나는 대부분이 매개 변수를 조정하고 다른 대부분을 변하지 않은 채로 남겨 둡니다. 다음은 110m 모델을 어떻게 교육했는지에 대한 예입니다. 최적의 어느 곳에서나 생각하지는 않지만 나에게 합리적으로 보였습니다 : Dim 768, N_Layers 12, N_HEADS 12 (따라서 각 헤드의 크기는 768 / 12 = 64 채널), 1024의 Seq Len, Batch Size 16 (이것은 내 A100 40GB GPU가 가장 적합한 것입니다). 총 토큰 배치 크기 16 배치 크기 * 1024 토큰 순서 대상 * 8 Grad_accum = 131,072 업데이트 당 토큰. 좋은. 학습 속도 4E-4 (아마도 너무 낮을 것입니다). max_iters 200k (아마도 너무 높음). 일반적으로 중간 크기로 약간 도움이됩니다. 그게 다야. 클라우드 머신에서 4 GPU에 분산 데이터 병렬 (DDP)을 사용하여 ~ 하루 정도 교육을 받았습니다.
MIT
이 코드를 사용하는 경우 우리의 작업을 인용하십시오.
@misc{jain2023mechanistically,
title={Mechanistically analyzing the effects of fine-tuning on procedurally defined tasks},
author={Samyak Jain and Robert Kirk and Ekdeep Singh Lubana and Robert P. Dick and Hidenori Tanaka and Edward Grefenstette and Tim Rocktäschel and David Scott Krueger},
year={2023},
eprint={2311.12786},
archivePrefix={arXiv},
primaryClass={cs.LG}
}
또한 Tinystories 논문을 인용해야합니다.
@misc{eldan2023tinystories,
title={TinyStories: How Small Can Language Models Be and Still Speak Coherent English?},
author={Ronen Eldan and Yuanzhi Li},
year={2023},
eprint={2305.07759},
archivePrefix={arXiv},
primaryClass={cs.CL}
}