이 프로젝트는 GPT-2를 깔끔하고 간결하게 재구현하는 것을 목표로 합니다. src/model.rs
에 포함된 모델 구현은 300줄 미만의 코드입니다. 이것은 주로 (내 자신의) 교육 목적을 위한 재미있는 연습이었지만 기계 학습 영역에서 Rust 및 Burn의 유용성을 보여줍니다. 전체 프로젝트가 단일 바이너리로 컴파일되므로 배포가 비교적 간단해집니다.
현재는 문자 수준 토크나이저만 지원하므로 BPE 토크나이저가 필요한 공식 가중치는 아직 사용할 수 없습니다. 그러나 재미를 위해 제가 훈련시킨 작은 장난감 모델을 시험해 볼 수 있습니다(추론 참조).
이 프로젝트에는 훈련 및 추론을 위한 간단한 CLI도 포함되어 있습니다.
Usage: gpt-burn <COMMAND>
Commands:
run Generate text using a pre-trained model
train Train a new model
Nix를 사용하여 gpt-burn
설치할 수 있습니다.
nix run github:felix-andreas/gpt-burn
또는 cargo
과 함께 설치하십시오.
cargo install --git https://github.com/felix-andreas/gpt-burn
또는 저장소를 복제하고 소스에서 빌드합니다.
nix develop # optional
cargo run --release
Nix를 사용하지 않고 Ubuntu 기반 배포판을 사용하는 경우 다음과 같은 추가 종속성을 설치해야 합니다.
apt install pkg-config libssl-dev libvulkan1 mesa-vulkan-drivers vulkan-tools
저는 다음 매개변수를 사용하여 20,000개의 배치(배치 크기 128)에 대해 독일 Wikipedia 코퍼스에서 문자 수준 토크나이저를 사용하여 장난감 모델을 훈련했습니다.
매개변수 | 값 |
---|---|
매개변수 | 83M |
컨텍스트 길이 | 128 |
n_layers | 12 |
n_heads | 12 |
d_model | 768 |
여기에서 다운로드한 후 압축을 풀 수 있습니다. 또는 단일 명령으로 두 가지를 모두 수행합니다.
curl -s ' https://drive.usercontent.google.com/download?id=1GGLaPnmPQ8Z2B9vJQoI6-K128X9LJKG0&export=download&confirm=t ' | tar xzf -
그런 다음 모델을 실행합니다.
gpt-burn run ./model_83M
다음과 같은 내용이 표시되어야 합니다.
So wurden bis 1977 679 nachhaltige Wörgler Torbauten vorgeworfen, die Einwohnerzahl Sirkes bestand 2015 bis 1998.
Sie war trotz weniger als 10.000 ausgedehnter Größen wahrscheinlich auf folgende Breitenauflagen mit 932 km.
2016 wurden rund 145 Händen nach Deutschland geladen.
추가 명령줄 옵션은 다음과 같습니다.
Usage: gpt-burn run [OPTIONS] <MODEL_PATH>
Arguments:
<MODEL_PATH>
Options:
-p, --prompt <PROMPT>
-n, --n-new-tokens <N_NEW_TOKENS> [default: 1000]
-s, --seed <SEED> [default: 0]
자신만의 모델을 학습하려면 다음을 실행하세요.
gpt-burn train --context-length 128 --n-layers 12 --n-heads 12 --d-model 768 --batch-size 128 --learning-rate 0.0003 --seed 0 --text-corpus ./corpus.txt
중요한
corpus.txt
가 utf-8로 인코딩된 텍스트 파일인지 확인하세요!
대부분의 하이퍼파라미터를 명령줄 옵션으로 전달할 수 있습니다.
Usage: gpt-burn train [OPTIONS]
Options:
-o, --output-path <PATH>
-c, --context-length <CONTEXT_LENGTH> [default: 64]
-d, --d-model <D_MODEL> [default: 64]
-l, --n-layers <N_LAYERS> [default: 2]
-h, --n-heads <N_HEADS> [default: 2]
-n, --n-steps <N_STEPS> [default: 50]
-b, --batch-size <BATCH_SIZE> [default: 32]
-r, --learning-rate <LEARNING_RATE> [default: 0.003]
-s, --seed <SEED> [default: 0]
-t, --text-corpus <TEXT_CORPUS> [default: .data/corpus.txt]
-m, --n-mega-bytes <N_MEGA_BYTES> Only use first <n> megabytes of dataset for training
-x, --no-save Don't save trained model (useful for debugging)
이 모델은 Tokenizer
특성을 통해 다양한 토크나이저와 함께 사용할 수 있습니다. 아래에서 다음 문장이 어떻게 나타나는지 볼 수 있습니다.
Albert Einstein war ein schweizerisch-US-amerikanischer theoretischer Physiker deutscher Herkunft.
다른 토크나이저에 의해 인코딩됩니다.
CharTokenizer
모든 문자를 별도의 토큰으로 분할합니다.
Tokens: ["A", "l", "b", "e", "r", "t", " ", "E", "i", "n", "s", "t", "e", "i", "n", " ", "w", "a", "r", " ", "e", "i", "n", " ", "s", "c", "h", "w", "e", "i", "z", "e", "r", "i", "s", "c", "h", "-", "U", "S", "-", "a", "m", "e", "r", "i", "k", "a", "n", "i", "s", "c", "h", "e", "r", " ", "t", "h", "e", "o", "r", "e", "t", "i", "s", "c", "h", "e", "r", " ", "P", "h", "y", "s", "i", "k", "e", "r", " ", "d", "e", "u", "t", "s", "c", "h", "e", "r", " ", "H", "e", "r", "k", "u", "n", "f", "t", "."]
Values: [28, 13, 3, 6, 19, 21, 1, 32, 10, 15, 20, 21, 6, 10, 15, 1, 24, 2, 19, 1, 6, 10, 15, 1, 20, 4, 9, 24, 6, 10, 27, 6, 19, 10, 20, 4, 9, 66, 48, 46, 66, 2, 14, 6, 19, 10, 12, 2, 15, 10, 20, 4, 9, 6, 19, 1, 21, 9, 6, 16, 19, 6, 21, 10, 20, 4, 9, 6, 19, 1, 43, 9, 26, 20, 10, 12, 6, 19, 1, 5, 6, 22, 21, 20, 4, 9, 6, 19, 1, 35, 6, 19, 12, 22, 15, 7, 21, 67]
SimpleVowelTokenizer
는 청크가 3자보다 긴 경우 다음 모음 앞에 단어를 분할하여 음절과 유사한 결과를 생성합니다.
Tokens: ["Albert", " ", "Einst", "ein", " ", "war", " ", "ein", " ", "schw", "eizer", "isch", "-", "US", "-", "amer", "ikan", "isch", "er", " ", "theor", "etisch", "er", " ", "Phys", "iker", " ", "deutsch", "er", " ", "Herk", "unft"]
Values: [2, 0, 3, 9, 0, 19, 0, 9, 0, 16, 10, 15, 1, 6, 1, 7, 13, 15, 11, 0, 17, 12, 11, 0, 5, 14, 0, 8, 11, 0, 4, 18]