A small MoonBit GPT training toolkit with tensor autodiff, tokenizer support, checkpoints, and a teaching CLI.
Dependencies
data/tiny_shakespeare.txtcharacters = 1,115,394
vocab size = 65
train tokens = 1,003,854
val tokens = 111,540
split = first 90% train, last 10% valdata/recipe_demo.txtmoon run --release cmd/main -- trainmoon run --release cmd/main -- train --out minigpt-model.bin --steps 5000--data UTF-8 语料路径,默认 data/tiny_shakespeare.txt
--tokenizer tokenizer 类型:char、word 或 bpe,默认 char
--bpe-vocab-size BPE 目标词表大小,默认 512
--out checkpoint 输出路径,默认 minigpt-model.bin
--steps 训练迭代数,默认 5000
--batch-size batch size,默认 64
--block-size 上下文长度,默认 256
--n-embd embedding width,默认 384
--n-head attention head count,默认 6
--n-layer transformer block count,默认 6
--learning-rate 学习率,默认 0.001
--eval-interval 每多少个 iter 做 eval,默认 250
--eval-iters 每次 eval 的 batch 数,默认 200
--log-interval 每多少个 iter 打印 train loss,默认 10
--always-save-checkpoint 每次 eval 后保存 checkpoint,默认 falsemoon run --release cmd/main -- train \
--out /tmp/minigpt-small.bin \
--steps 3 \
--batch-size 4 \
--block-size 8 \
--n-embd 24 \
--n-head 4 \
--n-layer 2 \
--eval-interval 1 \
--eval-iters 1 \
--log-interval 1 \
--always-save-checkpoint true
moon run --release cmd/main -- generate \
--model /tmp/minigpt-small.bin \
--prompt ROMEO: \
--max-new-tokens 8moon run --release cmd/main -- train \
--data data/recipe_demo.txt \
--tokenizer word \
--out /tmp/minigpt-recipe.bin \
--steps 500 \
--batch-size 4 \
--block-size 8 \
--n-embd 32 \
--n-head 4 \
--n-layer 2 \
--learning-rate 0.01 \
--eval-interval 100 \
--eval-iters 4 \
--log-interval 100 \
--always-save-checkpoint true
moon run --release cmd/main -- generate \
--model /tmp/minigpt-recipe.bin \
--prompt "heat" \
--max-new-tokens 4 \
--top-k 5 \
--temperature 1.0moon run --release cmd/main -- train \
--tokenizer bpe \
--bpe-vocab-size 512 \
--out /tmp/minigpt-bpe.bin \
--steps 20 \
--batch-size 4 \
--block-size 32 \
--n-embd 64 \
--n-head 4 \
--n-layer 2 \
--eval-interval 5 \
--eval-iters 2 \
--always-save-checkpoint true///|
let rng = @random.Rand::new()
///|
let config = @minigpt.TrainingConfig(
batch_size=4,
block_size=8,
steps=20,
learning_rate=0.001,
eval_iters=1,
)
///|
let result = @minigpt.train_text(corpus_text, CharacterLevel, config, rng)
///|
let checkpoint = @minigpt.encode_checkpoint(result.model, result.tokenizer)
///|
let completion = @minigpt.generate_text(
result.model,
result.tokenizer,
"ROMEO:",
40,
rng,
SamplingConfig(top_k=50, temperature=0.8),
)batch_size = 64
block_size = 256
n_layer = 6
n_head = 6
n_embd = 384
dropout = 0.2
learning_rate = 0.001
min_lr = 0.0001
warmup_iters = 100
eval_interval = 250
eval_iters = 200
log_interval = 10
weight_decay = 0.1
beta1 = 0.9
beta2 = 0.99
grad_clip = 1.0moon run --release cmd/main -- generate --model minigpt-model.bin --prompt ROMEO:completion:
ROMEO:
ROMEO:T
ROMEO:Th
ROMEO:The--model checkpoint 路径,默认 minigpt-model.bin
--prompt 补全起始文本,默认 ROMEO:
--max-new-tokens 生成 token 数,默认 80
--top-k 从模型 logits 最高的几个候选中采样,默认 20
--temperature 采样温度,默认 0.8tokenizer = char
vocab size = 65
model kind = gpt-transformer
n_embd = 384
n_head = 6
n_layer = 6
block size = 256
model parameters ~= 10.6M Doubles
training checkpoint ~= 250MBtokenizer/ char/word tokenizer and train/val split
tensor/ Tensor 和自动微分基础
nn/ 神经网络基础算子
optim/ AdamW 优化器
model.mbt MiniGPT 模型
train.mbt nanoGPT-style 训练循环
generate.mbt 采样生成
checkpoint.mbt checkpoint 编解码
cmd/main/ CLI 入口
docs/ 教学架构图
data/ Tiny Shakespeare 语料moon check --warn-list +73 --target native
moon test --target nativepub struct ArchitectureConfig {
// private fields
}fn ArchitectureConfig::ArchitectureConfig(n_embd? : Int, n_head? : Int, n_layer? : Int) -> ArchitectureConfigpub struct MiniGPT {
// private fields
}pub struct ModelConfig {
// private fields
}fn ModelConfig::ModelConfig(vocab_size : Int, n_embd? : Int, n_head? : Int, n_layer? : Int, block_size? : Int) -> ModelConfigfn ModelConfig::from_architecture(vocab_size : Int, architecture : ArchitectureConfig, block_size? : Int) -> ModelConfigpub struct SamplingConfig {
// private fields
}fn SamplingConfig::SamplingConfig(top_k? : Int, temperature? : Double, excluded_id? : Int?, allowed_ids? : Array[Int]?) -> SamplingConfigpub struct TrainingCallbacks {
// private fields
}fn TrainingCallbacks::TrainingCallbacks(on_eval? : (EvalEvent) -> Unit, on_log? : (LogEvent) -> Unit, on_checkpoint? : (TrainingState) -> Unit) -> TrainingCallbackspub struct TrainingCheckpoint {
// private fields
}fn TrainingCheckpoint::TrainingCheckpoint(model : MiniGPT, tokenizer : Tokenizer, optimizer : AdamW, iter_num : Int, best_val_loss : Double, config : TrainingConfig) -> TrainingCheckpointfn TrainingCheckpoint::from_state(state : TrainingState, tokenizer : Tokenizer) -> TrainingCheckpointpub struct TrainingConfig {
// private fields
}fn TrainingConfig::TrainingConfig(batch_size~ : Int, block_size~ : Int, steps~ : Int, learning_rate~ : Double, min_lr? : Double, warmup_iters? : Int, eval_interval? : Int, eval_iters? : Int, log_interval? : Int, weight_decay? : Double, beta1? : Double, beta2? : Double, grad_clip? : Double, always_save_checkpoint? : Bool) -> TrainingConfigpub struct TrainingState {
// private fields
}pub struct TrainingStats {
losses : Array[Double]
initial_eval_loss : Double
final_eval_loss : Double
best_val_loss : Double
saved_checkpoints : Int
}fn generate_next_token_id(model : MiniGPT, context_ids : Array[Int], rng : Rand, config : SamplingConfig) -> Intfn generate_text(model : MiniGPT, tokenizer : Tokenizer, prompt : String, max_new_tokens : Int, rng : Rand, config : SamplingConfig) -> String raise TokenizerErrorfn generate_token_ids(model : MiniGPT, prompt_ids : Array[Int], max_new_tokens : Int, rng : Rand, config : SamplingConfig) -> Array[Int]fn train_text(text : String, tokenizer_config : TokenizerConfig, config : TrainingConfig, rng : Rand) -> TrainingResultfn train_text_with_architecture(text : String, tokenizer_config : TokenizerConfig, config : TrainingConfig, architecture : ArchitectureConfig, rng : Rand) -> TrainingResultfn train_token_ids(model : MiniGPT, train_ids : Array[Int], val_ids : Array[Int], config : TrainingConfig, rng : Rand) -> TrainingStatsfn train_token_ids_with_callbacks(model : MiniGPT, train_ids : Array[Int], val_ids : Array[Int], config : TrainingConfig, rng : Rand, callbacks : TrainingCallbacks) -> TrainingStatsA small MoonBit GPT training toolkit with tensor autodiff, tokenizer support, checkpoints, and a teaching CLI.
Dependencies