LLM实验文档

目录

环境准备

SWIFT支持了exp(实验)能力,该能力是为了将多个需要进行的对比实验方便地进行管理。实验能力包含的主要功能有:

  • 支持在单机多卡(单机单卡下)并行运行多个训练(导出)等任务,并将超参数、训练输出、训练指标等信息记录下来,显卡占满情况下会排队

  • 支持直接运行训练(或导出)后的评测任务,并将评测指标记录下来

  • 支持将所有的指标生成MarkDown格式的表格方便对比

  • 支持重复幂等运行,已完成实验不会重复运行

该能力是对SWIFT训练、推理、评测能力的补充,本质是多个任务的调度能力。

准备实验配置

一个示例实验配置如下:

{
    "cmd": "sft",
    "requirements":{
        "gpu": "1",
        "ddp": "1"
    },
    "eval_requirements": {
      "gpu": "1"
    },
    "eval_dataset": ["ceval", "gsm8k", "arc"],
    "args": {
      "model_type": "qwen-7b-chat",
      "dataset": "ms-agent",
      "train_dataset_mix_ratio": 2.0,
      "batch_size": 1,
      "max_length": 2048,
      "use_loss_scale": true,
      "gradient_accumulation_steps": 16,
      "learning_rate": 5e-5,
      "use_flash_attn": true,
      "eval_steps": 2000,
      "save_steps": 2000,
      "train_dataset_sample": -1,
      "val_dataset_sample": 5000,
      "num_train_epochs": 2,
      "check_dataset_strategy": "none",
      "gradient_checkpointing": true,
      "weight_decay": 0.01,
      "warmup_ratio": 0.03,
      "save_total_limit": 2,
      "logging_steps": 10
    },
    "experiment": [
      {
        "name": "lora",
        "args": {
          "sft_type": "lora",
          "lora_target_modules": "ALL",
          "lora_rank": 8,
          "lora_alpha": 32
        }
      },
      {
        "name": "lora+",
        "args": {
          "sft_type": "lora",
          "lora_target_modules": "ALL",
          "lora_rank": 8,
          "lora_alpha": 32,
          "lora_lr_ratio": 16.0
        }
      }
    ]
}
  • cmd:本实验运行的swift命令

  • requirements:配置gpu数量和ddp数量

  • eval_requirements:评测使用的gpu数量

  • eval_dataset:评测使用的数据集,如果不配置则不进行评测

  • args:cmd命令对应的参数

  • experiment:每个子实验的独立参数,会覆盖上面的参数。必须包含name字段以存储实验结果

可以查看这个文件夹获取当前已经配置的实验示例。

运行实验

# 在swift根目录下运行
PYTHONPATH=. nohup python scripts/benchmark/exp.py --save_dir './experiment' --config your-config-path > run.log 2>&1 &

--config参数支持一个实验配置文件或一个文件夹,当指定文件夹时会并行运行其内所有的实验配置。

运行试验后会讲每个实验的日志单独记录在./exp文件夹内,实验结果会记录在--save_dir指定的文件夹内

收集实验结果

# 在swift根目录下运行
python scripts/benchmark/generate_report.py

实验结果的日志如下:

=================Printing the sft cmd result of exp tuner==================


<table border="1" class="docutils">
<thead>
<tr>
<th>exp_name</th>
<th>model_type</th>
<th>dataset</th>
<th>ms-bench mix ratio</th>
<th>tuner</th>
<th>tuner_params</th>
<th>trainable params(M)</th>
<th>flash_attn</th>
<th>gradient_checkpointing</th>
<th>hypers</th>
<th>memory</th>
<th>train speed(samples/s)</th>
<th>infer speed(tokens/s)</th>
<th>train_loss</th>
<th>eval_loss</th>
<th>gsm8k weighted acc</th>
<th>arc weighted acc</th>
<th>ceval weighted acc</th>
</tr>
</thead>
<tbody>
<tr>
<td>adalora</td>
<td>qwen-7b-chat</td>
<td>ms-agent</td>
<td>2.0</td>
<td>adalora</td>
<td>rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=False</td>
<td>26.8389(0.3464%)</td>
<td>True</td>
<td>True</td>
<td>lr=5e-05/epoch=2</td>
<td>32.55GiB</td>
<td>0.92(87543 samples/95338.71 seconds)</td>
<td>17.33(2345 tokens/135.29 seconds)</td>
<td>0.57</td>
<td>1.07</td>
<td>0.391</td>
<td>0.665</td>
<td>0.569</td>
</tr>
<tr>
<td>adapter</td>
<td>qwen-7b-chat</td>
<td>ms-agent</td>
<td>2.0</td>
<td>adapter</td>
<td></td>
<td>33.6896(0.4344%)</td>
<td>True</td>
<td>True</td>
<td>lr=5e-05/epoch=2</td>
<td>32.19GiB</td>
<td>1.48(87543 samples/59067.71 seconds)</td>
<td>26.63(4019 tokens/150.90 seconds)</td>
<td>0.55</td>
<td>1.03</td>
<td>0.438</td>
<td>0.662</td>
<td>0.565</td>
</tr>
<tr>
<td>dora</td>
<td>qwen-7b-chat</td>
<td>ms-agent</td>
<td>2.0</td>
<td>lora</td>
<td>rank=8/target=ALL/alpha=32/lr_ratio=None/use_rslora=False/use_dora=True</td>
<td>19.2512(0.2487%)</td>
<td>True</td>
<td>True</td>
<td>lr=5e-05/epoch=2</td>
<td>32.46GiB</td>
<td>0.51(87543 samples/171110.54 seconds)</td>
<td>4.29(2413 tokens/562.32 seconds)</td>
<td>0.53</td>
<td>1.01</td>
<td>0.466</td>
<td>0.683</td>
<td><strong>0.577</strong></td>
</tr>
<tr>
<td>full+galore128</td>
<td>qwen-7b-chat</td>
<td>ms-agent</td>
<td>2.0</td>
<td>full</td>
<td>galore_rank=128/galore_per_parameter=false/galore_with_embedding=false</td>
<td>7721.3245(100.0000%)</td>
<td>True</td>
<td>True</td>
<td>lr=5e-05/epoch=2</td>
<td>47.02GiB</td>
<td>1.10(87543 samples/79481.96 seconds)</td>
<td>28.96(2400 tokens/82.88 seconds)</td>
<td>0.55</td>
<td>1.00</td>
<td>0.358</td>
<td><strong>0.688</strong></td>
<td><strong>0.577</strong></td>
</tr>
<tr>
<td>...</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>```</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>

可以将表格拷贝进其它文档中用于分析。