이 저장소에는 "Cramming : 하루 만에 단일 GPU에서 언어 모델 훈련"에 설명 된 연구를 복제하는 코드가 포함되어 있습니다. 우리는 제한된 컴퓨팅으로 Bert-Type 모델을 예방하는 언어 모델을 실험하여 "실제로 얼마나 나쁜지"궁금해합니다.
https://arxiv.org/abs/2212.14034 및 아래의 초록을 여기에서 찾을 수 있습니다.
언어 모델링의 최근 트렌드는 스케일링을 통한 성능 향상에 중점을 두 었으며, 대부분의 연구원과 실무자에게 교육 언어 모델이 도달하지 못하는 환경을 초래했습니다. 지역 사회의 대부분은 극도의 계산의 한계를 추진하는 방법을 묻고 있지만, 우리는 반대의 질문을합니다.
하루 만에 단일 GPU를 얼마나 멀리 얻을 수 있습니까?
우리는 단일 소비자 GPU에서 하루 동안 마스킹 된 언어 모델링으로 처음부터 완전히 훈련 된 변압기 기반 언어 모델로 달성 할 수있는 다운 스트림 성능을 조사합니다. 이 시나리오에 대한 사전 여파 파이프 라인의 거의 모든 구성 요소를 재분식하고 BERT에 가깝게 성능을 가진 수정 된 파이프 라인을 제공하는 것 외에도 스케일링 다운이 어려운 이유 와이 시나리오에서 실제로 성능을 향상시키는 이유를 조사합니다. 우리는이 제한된 설정에서도 성능이 대규모 복수 환경에서 관찰 된 스케일링 법을 밀접하게 따른다는 증거를 제공합니다. 스케일링 법률 렌즈를 통해 우리는 최근 교육 및 건축에 대한 다양한 개선 사항을 분류하고 제한된 컴퓨팅 설정에 대한 장점과 실용적인 적용 가능성 (또는 그 부족)을 논의합니다.
새 코드를 실행하려면 Pytorch 2.0이 필요합니다. Pytorch 1에 머무르려면 Last1.13release 태그를 체크 아웃 할 수 있습니다. 새로운 코드베이스로 훈련 된 새로운 모델은 같은 예산으로 접착제에서 1-2% 더 우수합니다. 검사 점은 https://huggingface.co/jonasgeiping/crammed-bert에서 찾을 수 있습니다. 이전 체크 포인트는 이제 https://huggingface.co/jonasgeiping/crammed-bert-legacy입니다.
또한 데이터 전처리가 개선되었으며 이제 https://huggingface.co/datasets/jonasgeiping/the_pile_wordpiecex32768_2efdb9d060d1ae95faf952ec1a50f020에서 https://huggingface.co/datasets에서 직접 데이터를 스트리밍 할 수 있습니다.
환경:
pip install . 모든 종속성을 설치합니다.
torch (적어도 버전 2.1)transformers , tokenizers , datasets , evaluatehydra-corepsutil , pynvml , safetensorseinops pip install . 모든 패키지 및 스크립트를 설치합니다.curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh , 그런 다음 git clone https://github.com/google-research/deduplicate-text-datasets/tree/dev-v1 그 다음 cargo install --target-dir ../cramming/dedup 실행하십시오.최소한의 설치를 확인하려면 실행할 수 있습니다
python pretrain.py name=test arch=hf-bert-base train=bert-base data=sanity-check-2 dryrun=True impl.microbatch_size=2
이 명령은 작은 Sanity-Check 데이터 세트를 사전 프로세스하고 단일 교육 단계를 실행합니다.
pretrain.py 스크립트를 사용하여 제한된 컴퓨팅으로 프리 트레인을 사용하십시오. 이 저장소는 Hydra (https://hydra.cc/docs/intro/)를 사용하므로 cramming/config 의 모든 필드를 명령 줄에서 수정할 수 있습니다. 예를 들어, budget=48 추가 인수 (48 시간 동안 실행)로 제공하여 budget 수정하거나 학습 속도는 train.optim.lr=1e-4 를 통해 수정할 수 있습니다. 구성 폴더를 확인하여 모든 인수를 확인하십시오.
첫 번째 단계는 설치된 패키지를 확인하는 것입니다. 그렇게하려면 python pretrain.py dryrun=True 실행할 수 있습니다. 거기에서 추가 기능을 활성화 할 수 있습니다. 예를 들어, 아키텍처 (예 : arch=bert-original 및 Training Setup train=bert-original 를 수정하십시오. 언어 모델을 실제로 훈련 시키려면 Sanity Check 데이터 세트에서 최소한 data=pile-readymade 로 전환해야합니다. 그런 다음 개선 된 교육 설정 (예 : train=bert-o4 및 개선 된 모델 arch=crammed-bert )을 선택하십시오.
data.sources 의 데이터 소스는 교육이 시작되고 데이터베이스에 캐시되기 전에 읽고 정규화 및 황거화됩니다. 동일한 구성을 가진 후속 통화는이 데이터베이스의 토큰 화 시퀀스를 재사용합니다. 기본적 으로이 프로세스 중에 새 토큰 화기도 구성 및 저장됩니다. 중요한 데이터 옵션은 data.max_entries_in_raw_dataset 이며로드 될 원시 데이터의 양을 정의합니다. 예를 들어, C4와 같은 큰 데이터 소스의 경우 원시 데이터의 하위 집합 만 다운로드됩니다. 그런 다음 max_seq_in_tokenized_dataset 병목 현상은 데이터베이스에 얼마나 많은 처리 된 시퀀스가 저장 될 것인지. 이 숫자는 예산 내에서 읽을 것으로 예상되는 시퀀스 수보다 커야합니다.
추가 메모 :
data=pile-readymade 사용하여 전처리 데이터로 시작하십시오python pretrain.py data=... dryrun=True 실행하는 것입니다. 이는 훈련을 건조 시키지만 전체 데이터 전처리를 실행합니다. 그런 다음 나중에 실행하면 캐시 된 데이터를 재사용 할 수 있습니다.impl.threads 줄입니다. 특히 중복 제거 코드에는 상당한 양의 RAM이 필요합니다.bookcorpus-wikipedia 만으로 첫 번째 데이터 실험을 실행할 것입니다. 이는 전처리를 비교적 빠르게 빠르게 처리 한 후에 만 완전한 처리 및 필터링 된 C4를 살펴 봅니다. 참조 및 교육/아키텍처 변경에만 관심이있는 경우 여기에서 전처리 된 데이터 세트를 찾을 수 있습니다.
이러한 데이터 소스를 스트리밍 할 수 있습니다. 그렇게하려면 간단한 세트 data=pile-readymade .
전처리 된 데이터는 작업하기에 편리하며 데이터 처리 및 필터링에 대한 수정은 교육 및 아키텍처에 비해 계속 설명되지 않는다고 생각합니다. 다른 조정보다 더 나은 데이터로 더 많은 이익을 얻을 수 있으므로 궁극적으로 전체 데이터 처리 파이프 라인이 작동하도록 코드 및 환경을 설정하는 것을 고려할 수 있습니다.
이제 https://huggingface.co/jonasgeiping/crammed-bert (https://huggingface.co/jonasgeiping/crammed-bert)에서 the-pile 된 최종 버전의 검문소를 찾을 수 있습니다.
접착제 (또는 일부 접착제 작업)에서 사전 각인 모델을 평가하려면 eval.py 사용하십시오. 이 스크립트는 기본 디렉토리에서 저장된 모델을 검색합니다. 이전 실행의 이름이 주어지면이 스크립트는 기본적 으로이 이름으로 저장된 최신 체크 포인트를 검색 한 다음 평가를 실행합니다.
가중치 및 바이어스 계정에 로그인을 기록 할 수 있습니다. 그렇게하려면 wandb.entity 및 wandb.project 명령 줄 또는 cramming/config/wandb/default.yaml 로 수정하십시오.
논문에서 논의 된 최종 레시피를 복제하려면
python pretrain.py name=amp_b8192_cb_o4_final arch=crammed-bert train=bert-o4 data=pile-readymade
프리 트레인과
python eval.py eval=GLUE_sane name=amp_b8192_cb_o4_final eval.checkpoint=latest impl.microbatch_size=16 impl.shuffle_in_dataloader=True impl.compile_torch=False
모델을 평가합니다. 이 논문에서 "Crammed Bert"라고 불리는 레시피는 구성에서 crammed-bert 라는 아키텍처에 해당하며, 데이터 the-pile 에 대한 교육 설정 bert-o4 로 훈련됩니다.
최적의 성능을 얻으려면 최신 Pytorch Nightly에 있어야하고 다음 인덕터 변수를 설정해야합니다 (인덕터를 사용하여 torch.compile 설정을 수정).
max_autotune_gemm: Truemax_autotune_pointwise: Falsetriton.cudagraphs: Truetriton.cudagraph_trees: False 사전 조정 : 단일 GPU, 오리지널 버트 설정 :
python pretrain.py name=bert data=bookcorpus-wikipedia arch=bert-original train=bert-original budget=10000000
멀티 GPU, 원래 버트 설정 :
torchrun --nproc_per_node=4 --standalone pretrain.py name=bert4gpu data=bookcorpus-wikipedia arch=bert-original train=bert-original budget=10000000 impl.fullgraph=false impl._inductor_vars.triton.cudagraphs=False
Huggingface 체크 포인트 평가 (RTE 의이 예에서) :
python eval.py eval=GLUE_sane eval/tasks=rte name=bert-finetuning eval.checkpoint=hf://bert-base-uncased impl.shuffle_in_dataloader=True impl.compile_torch=False impl.microbatch_size=16
로컬 체크 포인트 평가 (현재 고정 모양을 기대하는 컴파일 비활성화) : :
python eval.py eval=GLUE_sane eval/tasks=rte name=NAME_OF_PRETRAINING_RUN eval.checkpoint=latest impl.shuffle_in_dataloader=True impl.compile_torch=False
CPU의 분산 코드에 대한 세력 검사 :
CUDA_VISIBLE_DEVICES= torchrun --nproc_per_node=2 --standalone pretrain.py name=cpu_multi_check dryrun=True data=sanity-check-2 impl.dist_backend=gloo impl.fullgraph=false impl._inductor_vars.triton.cudagraphs=False
레시피에 대한 추가 예는 /scripts 폴더에서 찾을 수 있습니다.
다음 옵션은 현재 깨진/제한/작업 중입니다. 자신의 재량에 따라 사용하십시오. 물론 여기에 기여한 것은 매우 높이 평가됩니다. 이 점을 살펴보고 싶다면이 점들에 대해 더 많은 질문을 할 수 있습니다.
Last1.13release 태그에서 이전 릴리스에서만 사용할 수 있습니다. 이 옵션 중 일부를 되 살리는 데 관심이 있다면. 새 코드베이스에 대한 업데이트로 풀 요청을 열어주십시오.질문이 있으시면 언제든지 저희에게 연락하거나 Github에서 문제를 열어주십시오.