Этот проект призван стать чистой и лаконичной повторной реализацией GPT-2. Реализация модели, содержащаяся в src/model.rs
, занимает менее 300 строк кода. Хотя это было забавное упражнение в основном для (моих) образовательных целей, оно демонстрирует полезность Rust и Burn в области машинного обучения: весь проект компилируется в один двоичный файл, что делает развертывание относительно простым.
На данный момент поддерживается только токенизатор на уровне символов, поэтому официальные веса, требующие токенизатор BPE, пока использовать нельзя. Однако ради развлечения вы можете опробовать маленькую игрушечную модель, которую я обучил (см. вывод).
Проект также включает простой интерфейс командной строки для обучения и вывода.
Usage: gpt-burn <COMMAND>
Commands:
run Generate text using a pre-trained model
train Train a new model
Вы можете установить gpt-burn
с помощью Nix:
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) со следующими параметрами:
Параметр | Ценить |
---|---|
параметры | 83М |
длина контекста | 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
разбивает слова перед следующей гласной, если длина фрагмента превышает три символа, создавая результат, напоминающий слоги:
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]