최소GPT
훈련과 추론 모두에서 GPT를 PyTorch로 다시 구현합니다. minGPT는 현재 사용 가능한 대부분의 GPT 모델 구현이 다소 광범위할 수 있으므로 작고 깨끗하며 해석 가능하고 교육적입니다. GPT는 복잡한 모델이 아니며 이 구현은 약 300줄의 코드로 구성됩니다(mingpt/model.py 참조). 진행 중인 작업은 인덱스 시퀀스가 Transformer에 입력되고 시퀀스의 다음 인덱스에 대한 확률 분포가 나오는 것입니다. 대부분의 복잡성은 효율성을 위해 일괄 처리(예제 전체 및 시퀀스 길이 모두)를 통해 영리하게 이루어졌습니다.
참고(2023년 1월) : 일부 세부 사항을 계속 수락하고 변경할 수 있지만 minGPT는 반보관된 상태입니다. 보다 최근의 개발에 대해서는 내가 다시 작성한 nanoGPT를 참조하세요. 기본적으로 minGPT는 다양한 장소(노트북, 블로그, 코스, 책 등)에서 참조되었으며, 이로 인해 코드를 발전시키기 위해 만들고 싶었던 더 큰 변경을 수행할 의지가 줄어들었습니다. 또한 저는 교육에만 초점을 맞추는 것에서 여전히 단순하고 해킹 가능하지만 이빨이 있는 것(중간 규모의 업계 벤치마크를 재현하고 런타임 효율성을 얻기 위해 일부 절충안을 수용하는 등)으로 방향을 조금 바꾸고 싶었습니다.
minGPT 라이브러리는 세 개의 파일로 구성되어 있습니다. mingpt/model.py에는 실제 Transformer 모델 정의가 포함되어 있고, mingpt/bpe.py에는 OpenAI가 GPT에서 했던 것과 똑같이 텍스트와 정수 시퀀스 간을 변환하는 약간 리팩토링된 바이트 쌍 인코더(mingpt/trainer)가 포함되어 있습니다. py는 모델을 훈련하는 (GPT 독립적) PyTorch 상용구 코드입니다. 그런 다음 projects
폴더의 라이브러리를 사용하는 여러 데모와 프로젝트가 있습니다.
-
projects/adder
처음부터 GPT를 훈련하여 숫자를 추가합니다(GPT-3 문서의 추가 섹션에서 영감을 얻음). -
projects/chargpt
일부 입력 텍스트 파일에서 문자 수준 언어 모델이 되도록 GPT를 교육합니다. -
demo.ipynb
간단한 정렬 예에서 노트북 형식으로 GPT
및 Trainer
의 최소한의 사용을 보여줍니다. -
generate.ipynb
사전 훈련된 GPT2를 로드하고 프롬프트가 주어지면 텍스트를 생성하는 방법을 보여줍니다.
라이브러리 설치
import mingpt
다음을 수행하세요.
git clone https://github.com/karpathy/minGPT.git
cd minGPT
pip install -e .
용법
GPT-2(124M 매개변수 버전)를 인스턴스화하는 방법은 다음과 같습니다.
from mingpt . model import GPT
model_config = GPT . get_default_config ()
model_config . model_type = 'gpt2'
model_config . vocab_size = 50257 # openai's model vocabulary
model_config . block_size = 1024 # openai's model block_size (i.e. input context length)
model = GPT ( model_config )
훈련 방법은 다음과 같습니다.
# your subclass of torch.utils.data.Dataset that emits example
# torch LongTensor of lengths up to 1024, with integers from [0,50257)
train_dataset = YourDataset ()
from mingpt . trainer import Trainer
train_config = Trainer . get_default_config ()
train_config . learning_rate = 5e-4 # many possible options, see the file
train_config . max_iters = 1000
train_config . batch_size = 32
trainer = Trainer ( train_config , model , train_dataset )
trainer . run ()
보다 구체적인 예는 demo.ipynb
참조하세요.
단위 테스트
아직은 적용 범위가 그리 놀라운 수준은 아니지만 다음과 같습니다.
python -m unittest discover tests
해야 할 일
- 임의의 특정 텍스트 파일에 gpt-2 미세 조정 데모 추가
- 대화 에이전트 데모 추가
- 기존 프로젝트에 대한 더 나은 결과 문서(adder, chargpt)
- 혼합 정밀도 및 관련 교육 확장 기능 추가
- 분산 교육 지원
- 프로젝트에서 일부 벤치마크 재현(예: text8 또는 기타 언어 모델링)
- 성명서 인쇄 대신 적절한 로깅 아마추어 시간 하하
- 아마도 require.txt 파일이 있어야 할 것 같아요...
- gpt2-* 이외의 다른 많은 모델 가중치를 로드하는 것이 가능해야 합니다.
참고자료
암호:
- openai/gpt-2에는 TensorFlow의 모델 정의가 있지만 학습 코드는 없습니다.
- openai/image-gpt에는 코드 수정과 같은 좀 더 현대적인 gpt-3이 있으며 좋은 참조 자료도 있습니다.
- Huggingface/Transformers에는 언어 모델링 예제가 있습니다. 모든 기능을 갖추고 있지만 결과적으로 추적하기가 다소 어렵습니다. 예를 들어 일부 대형 함수에는 간단한 언어 모델링의 기본 설정에서 사용되지 않는 다양한 분기 문 뒤에 사용되지 않는 코드가 90%나 있습니다.
논문 + 일부 구현 참고 사항:
생성적 사전 훈련(GPT-1)을 통한 언어 이해 향상
- 우리 모델은 원래의 변압기 작업을 크게 따릅니다.
- 우리는 마스크된 self-attention 헤드(768차원 상태 및 12개 attention 헤드)가 있는 12층 디코더 전용 변환기를 훈련했습니다. 위치별 피드포워드 네트워크의 경우 3072차원 내부 상태를 사용했습니다.
- Adam의 최대 학습 속도는 2.5e-4입니다. (나중에 이 모델 크기의 GPT-3은 6e-4를 사용합니다)
- LR 붕괴: 처음 2000번의 업데이트 동안 0에서 선형적으로 증가하고 코사인 일정을 사용하여 0으로 어닐링됨
- 무작위로 샘플링된 64개의 미니배치, 512개 토큰의 연속 시퀀스에 대해 100세대 동안 훈련합니다.
- layernorm은 모델 전반에 걸쳐 광범위하게 사용되므로 N(0, 0.02)의 간단한 가중치 초기화로 충분합니다.
- 40,000개의 병합이 포함된 바이트쌍 인코딩(BPE) 어휘
- 정규화에 대한 비율이 0.1인 잔여, 임베딩 및 주의 드롭아웃.
- 모든 비편향 또는 이득 가중치에 대해 w = 0.01인 (37)에서 제안된 L2 정규화의 수정된 버전
- 활성화 함수에는 GELU(Gaussian Error Linear Unit)를 사용했습니다.
- 우리는 원래 작업에서 제안된 정현파 버전 대신 학습된 위치 임베딩을 사용했습니다.
- 미세 조정을 위해: 분류기에 0.1 비율로 드롭아웃을 추가합니다. 학습률은 6.25e-5이고 배치 크기는 32.3 에포크입니다. 훈련의 0.2%가 넘는 워밍업이 포함된 선형 학습률 감소 일정을 사용합니다. λ는 0.5로 설정되었습니다.
- GPT-1 모델은 12개의 레이어와 d_model 768, ~117M 매개변수입니다.
언어 모델은 비지도 멀티태스킹 학습자(GPT-2)입니다.
- LayerNorm은 활성화 전 잔여 네트워크와 유사하게 각 하위 블록의 입력으로 이동되었습니다.
- 최종 self-attention 블록 이후에 추가 레이어 정규화가 추가되었습니다.
- 모델 깊이가 있는 잔여 경로의 누적을 설명하는 수정된 초기화가 사용됩니다. 초기화 시 잔여 레이어의 가중치를 1/√N만큼 조정합니다. 여기서 N은 잔여 레이어 수입니다. (발표된 코드에서 이전 0.02의 간단한 사용만 찾을 수 있기 때문에 이상합니다... image-gpt 릴리스에서 c_proj에 사용되는 것을 발견했고 심지어 mlp가 아닌 attn에만 사용되는 것을 발견했습니다. 허. https: //github.com/openai/image-gpt/blob/master/src/model.py)
- 어휘가 50,257개로 확장되었습니다.
- 컨텍스트 크기를 512에서 1024 토큰으로 늘립니다.
- 512의 더 큰 배치 크기가 사용됩니다.
- GPT-2는 48개 레이어와 d_model 1600을 사용했습니다(원래 12개 레이어와 d_model 768). ~1.542B 매개변수
언어 모델은 Few-Shot Learners(GPT-3)입니다.
- GPT-3: 96개 레이어, 96개 헤드, d_model 12,288(175B 매개변수).
- GPT-1 유사: 12개 레이어, 12개 헤드, d_model 768(125M)
- 우리는 여기에 설명된 수정된 초기화, 사전 정규화 및 가역적 토큰화를 포함하여 GPT-2와 동일한 모델 및 아키텍처를 사용합니다.
- 우리는 Sparse Transformer와 유사하게 Transformer의 레이어에서 교대로 조밀하고 지역적으로 묶인 Sparse Attention 패턴을 사용합니다.
- 우리는 항상 병목 레이어 크기의 4배인 피드포워드 레이어를 가집니다. dff = 4 * dmodel
- 모든 모델은 nctx = 2048 토큰의 컨텍스트 창을 사용합니다.
- β1 = 0.9, β2 = 0.95, eps = 10−8인 Adam
- 모든 모델은 약간의 정규화를 제공하기 위해 0.1의 가중치 감소를 사용합니다. (참고: GPT-1은 0.01을 사용했습니다. 위 내용을 참조하세요.)
- 그라디언트의 전역 표준을 1.0에서 자릅니다.
- 처음 3억 7,500만 개의 토큰에 대한 선형 LR 준비. 그런 다음 학습률을 해당 값의 10%(2,600억 개 이상의 토큰)까지 낮추기 위해 코사인 붕괴를 사용합니다.
- 모델 크기에 따라 배치 크기를 작은 값(32,000개 토큰)에서 처음 40억~120억 개의 훈련 토큰에 걸쳐 전체 값까지 선형적으로 점진적으로 늘립니다.
- 특수한 END OF DOCUMENT 토큰 구분 기호와 함께 전체 2048 크기의 시간 컨텍스트 창이 항상 사용됩니다.
픽셀을 이용한 생성적 사전 훈련(이미지 GPT)
- 이미지 작업을 할 때 우리는 1 ≤ i ≤ n에 대한 항등 순열 πi = i를 선택합니다(래스터 순서라고도 함).
- k = 512인 k-평균을 사용하여 (R, G, B) 픽셀 값을 클러스터링하여 고유한 9비트 색상 팔레트를 만듭니다.
- 가장 큰 모델인 iGPT-XL은 L = 60개의 레이어를 포함하고 총 6.8B 매개변수에 대해 d = 3072의 임베딩 크기를 사용합니다.
- 다음으로 큰 모델인 iGPT-L은 L = 48 레이어인 GPT-2와 기본적으로 동일하지만 총 1.4B 매개변수에 대해 d = 1536(vs 1600)이라는 약간 더 작은 임베딩 크기를 포함합니다.
- Sparse Transformer(Child et al., 2019)에서와 같이 레이어 종속 방식으로 가중치를 초기화하고 로짓을 생성하는 모든 투영을 0으로 초기화한다는 점을 제외하면 GPT-2와 동일한 모델 코드를 사용합니다.
- 또한 L = 36 및 d = 1024인 455M 매개변수 모델인 iGPT-M을 훈련합니다.
- L = 24 및 d = 512인 76M 매개변수 모델인 iGPT-S(알겠습니다. 헤드 수는 몇 개입니까? Github 코드 주장 8과 같습니다)
- iGPT-XL을 사전 학습할 때 배치 크기 64를 사용하고 2M 반복 학습을 수행하며, 다른 모든 모델의 경우 배치 크기 128을 사용하고 1M 반복 학습을 수행합니다.
- β1 = 0.9 및 β2 = 0.95인 Adam
- 학습률은 한 epoch 동안 예열된 후 0으로 감소합니다.
- 0.01의 작은 가중치 감쇠를 적용해도 표현 품질이 변경되지 않았기 때문에 가중치 감쇠를 사용하지 않았습니다.
- iGPT-S lr 0.003
- 드롭아웃은 사용되지 않습니다.
특허
MIT