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

二、这份脚本在做什么

它只做了一件事:

如果说 notebook 更适合:

那么这个脚本更适合:


三、逐行解释

#!/usr/bin/env bash

这一行叫 shebang

它告诉系统:

简单理解:

set -e

这是 shell 脚本里非常常见的一句。

意思是:

为什么要这样?

因为训练脚本里,如果前面已经失败了,后面继续执行通常只会造成更混乱的错误。

cd "$(dirname "$0")"

这句很实用。

它的作用是:

拆开理解:

$0

在 shell 里,$0 表示:

dirname "$0"

dirname 的意思是:

$(...)

这是 shell 的命令替换写法,表示:

所以整句意思就是:

这样做的好处是:

python train_lora.py \

表示:

末尾的反斜杠 \ 表示:

这样写的好处是:

--model_name_or_path sshleifer/tiny-gpt2 \

表示给 Python 脚本传入参数:

这个参数告诉脚本:

一个非常重要的观察

这里传的是:

也就是在线模型名。

train_lora.py 的默认值其实是:

也就是本地路径。

所以这份脚本实际上在做一件事:

这意味着如果网络不稳定,你可以考虑把这里改成:

--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 步做一次评估。

注意这里最后一行没有反斜杠,因为命令在这里结束。


四、这份脚本的真正作用

对初学者来说,这份脚本有两个意义:

  1. 让你看到:notebook 之外,训练也可以完全在命令行中完成
  2. 让你学会:训练配置其实就是一组参数

它帮助你从:

走向:


五、你应该重点理解什么

  1. run_train.sh 本身不训练模型,它只是启动 train_lora.py
  2. 大部分训练控制逻辑,其实都体现在命令行参数里
  3. 命令行参数会覆盖 Python 脚本里的默认参数
  4. 如果以后你换模型、换数据,最先改的通常就是这份脚本里的参数