run_train.sh 说明文档这份文件不是 notebook,而是一个 Shell 脚本。
你可以把它理解成:
对于 Python 初学者来说,它的价值很大,因为它把:
这些动作都合并成了一份很短、很好复用的脚本。
#!/usr/bin/env bash
set -e
cd "$(dirname "$0")"
python train_lora.py \
--model_name_or_path sshleifer/tiny-gpt2 \
--train_file data/sample_train.json \
--validation_file data/sample_val.json \
--output_dir outputs/tiny_lora_demo \
--num_train_epochs 1 \
--per_device_train_batch_size 2 \
--per_device_eval_batch_size 2 \
--learning_rate 5e-4 \
--max_length 128 \
--logging_steps 1 \
--save_steps 10 \
--eval_steps 10它只做了一件事:
train_lora.py如果说 notebook 更适合:
那么这个脚本更适合:
#!/usr/bin/env bash这一行叫 shebang。
它告诉系统:
bash 来执行简单理解:
set -e这是 shell 脚本里非常常见的一句。
意思是:
为什么要这样?
因为训练脚本里,如果前面已经失败了,后面继续执行通常只会造成更混乱的错误。
cd "$(dirname "$0")"这句很实用。
它的作用是:
拆开理解:
$0在 shell 里,$0 表示:
dirname "$0"dirname 的意思是:
$(...)这是 shell 的命令替换写法,表示:
所以整句意思就是:
这样做的好处是:
python train_lora.py \表示:
train_lora.py末尾的反斜杠 \ 表示:
这样写的好处是:
--model_name_or_path sshleifer/tiny-gpt2 \表示给 Python 脚本传入参数:
model_name_or_pathsshleifer/tiny-gpt2这个参数告诉脚本:
这里传的是:
sshleifer/tiny-gpt2也就是在线模型名。
但 train_lora.py 的默认值其实是:
/root/course_lora/models/tiny-gpt2也就是本地路径。
所以这份脚本实际上在做一件事:
这意味着如果网络不稳定,你可以考虑把这里改成:
--model_name_or_path /root/course_lora/models/tiny-gpt2这样就能直接走本地模型,不必重新联网。
--train_file data/sample_train.json \指定训练集文件路径。
--validation_file data/sample_val.json \指定验证集文件路径。
--output_dir outputs/tiny_lora_demo \指定训练输出目录。
也就是说,训练结果会保存到:
outputs/tiny_lora_demo--num_train_epochs 1 \训练轮数是 1。
这是最小实验的典型设置:
--per_device_train_batch_size 2 \每张设备卡上的训练 batch size 是 2。
--per_device_eval_batch_size 2 \验证 batch size 也是 2。
--learning_rate 5e-4 \学习率是 0.0005。
--max_length 128 \最大输入长度是 128 token。
--logging_steps 1 \每 1 步打一次训练日志。
--save_steps 10 \每 10 步保存一次。
--eval_steps 10每 10 步做一次评估。
注意这里最后一行没有反斜杠,因为命令在这里结束。
对初学者来说,这份脚本有两个意义:
它帮助你从:
走向:
run_train.sh 本身不训练模型,它只是启动 train_lora.py