fastNLP.core.dist_trainer module

分布式 Trainer 使用步骤 1. 在代码中调用 DistTrainer,类似 Trainer,传入模型和数据等等参数 2. 在命令行中,将 python your_script.py 替换为 python -m torch.distributed.launch –nproc_per_node=N your_script.py

fastNLP.core.dist_trainer.get_local_rank()[源代码]

别名 fastNLP.get_local_rank fastNLP.core.dist_trainer.get_local_rank

返回当前进程的 local rank, 0 到 N-1 ,N为当前分布式总进程数

class fastNLP.core.dist_trainer.DistTrainer(train_data, model, optimizer=None, loss=None, callbacks_all=None, callbacks_master=None, batch_size_per_gpu=8, n_epochs=1, num_workers=1, drop_last=False, dev_data=None, metrics=None, metric_key=None, update_every=1, print_every=10, validate_every=- 1, save_path=None, device='auto', fp16=False, use_tqdm=True, sampler=None, **kwargs)[源代码]

基类:object

别名 fastNLP.DistTrainer fastNLP.core.dist_trainer.DistTrainer

分布式的 Trainer,支持分布式训练和混合精度的训练。具体实现原理请阅读 pytorch 官方文档。

Note: 使用分布式 Trainer 时会同时有多个进程执行训练代码。因此将单进程的训练代码改为多进程之前, 请仔细检查,确保训练代码中的同步和互斥操作能正确执行(如模型保持,打印日志等)

__init__(train_data, model, optimizer=None, loss=None, callbacks_all=None, callbacks_master=None, batch_size_per_gpu=8, n_epochs=1, num_workers=1, drop_last=False, dev_data=None, metrics=None, metric_key=None, update_every=1, print_every=10, validate_every=- 1, save_path=None, device='auto', fp16=False, use_tqdm=True, sampler=None, **kwargs)[源代码]
参数
  • train_data – 训练集, DataSet 类型。

  • model (nn.modules) – 待训练的模型

  • optimizertorch.optim.Optimizer 优化器。如果为None,则Trainer使用默认的Adam(model.parameters(), lr=4e-3)这个优化器

  • loss – 使用的 LossBase 对象。当为None时,默认使用 LossInForward

  • callbacks_all (list) – 用于在train过程中起调节作用的回调函数,作用于所有训练进程中。 可使用的callback参见 callback模块

  • callbacks_master (list) – 用于在train过程中起调节作用的回调函数,只作用于其中一个进程( Master 进程)。 可使用的callback参见 callback模块

  • batch_size_per_gpu (int) – 训练时,每个进程的 batch 大小。

  • n_epochs (int) – 需要优化迭代多少次。

  • num_workers – int, 有多少个线程来进行数据pad处理。

  • drop_last – 如果最后一个batch没有正好为batch_size这么多数据,就扔掉最后一个batch

  • dev_data – 用于做验证的DataSet, DataSet 类型。

  • metrics – 验证的评估函数。可以只使用一个 Metric , 也可以使用多个 Metric ,通过列表传入。 如验证时取得了更好的验证结果(如果有多个Metric,以列表中第一个Metric为准),且save_path不为None, 则保存当前模型。Metric种类详见 metrics模块 。仅在传入dev_data时有效。

  • metric_key (str,None) – Metric 有时会有多个指标, 比如 SpanFPreRecMetric 中包含了’f’, ‘pre’, ‘rec’。此时需 要指定以哪个指标为准。另外有些指标是越小效果越好,比如语言模型的困惑度,这种情况下,在key前面增加一个’-‘来表 明验证时,值越小越好(比如: “-ppl”)。仅在传入dev_data时有效。

  • update_every – int, 多少步更新一次梯度。用于希望累计梯度的场景,比如需要128的batch_size, 但是直接设为128 会导致内存不足,通过设置batch_size=32, update_every=4达到目的。当optimizer为None时,该参数无效。

  • print_every (int) – 多少次反向传播更新tqdm显示的loss; 如果use_tqdm=False, 则多少次反向传播打印loss。

  • validate_every (int) – 多少个step在验证集上验证一次; 如果为-1,则每个epoch结束验证一次。仅在传入dev_data时有效。

  • save_path (str,None) – 将模型保存路径,如果路径不存在,将自动创建文件夹。如果为None,则不保存模型。如果dev_data为None,则保存 最后一次迭代的模型。保存的时候不仅保存了参数,还保存了模型结构。即便使用DataParallel,这里也只保存模型。

  • device (str) – 指定 device,可以是 gpu,cpu 或 auto

  • fp16 (bool) – 指定是否使用半精度训练。

  • use_tqdm (bool) – 是否使用tqdm来显示训练进度; 如果为False,则将loss打印在终端中。

  • sampler (Sampler) – 使用的sampler,如果不指定,默认使用的DistributedSampler。使用这个参数的情况一般为,明确修改了每个 rank的Dataset,使得每个rank上的dataset虽然sample数量一样多,但是sample其实不一样。

  • kwargs

    支持配置可选参数 bool test_use_tqdm: 在dev上验证的时候是否开启tqdm Sampler test_sampler: 在evaluate的时候使用的sampler int dev_batch_size: 在evaluate时,使用的evaluate的batch大小 bool test_use_fp16: test时使用fp16 bool set_grad_to_none: zero_grad时将grad设为None而不是0 GradScaler grad_scaler: 自定义的梯度 scaler bool pin_memory: 是否将产生的tensor使用pin memory, 可能会加快数据速度。一般在tensor较多或tensor维度较大时,有速度增益。 bool find_unused_parameters: 在将model转化为DistributedDataParallel类型的时候,需要填入该参数,除非model内确实有

    forward没用上的参数,否则应该不需要用到该参数。

property is_master

是否是主进程

train(load_best_model=True, on_exception='auto')[源代码]

使用该函数使Trainer开始训练。

参数

on_exception (str) – 在训练过程遭遇exception,并被 :py:class:Callback 的on_exception()处理后,是否继续抛出异常。 支持’ignore’,’raise’, ‘auto’: ‘ignore’将捕获异常,写在Trainer.train()后面的代码将继续运行; ‘raise’将异常抛出; ‘auto’将ignore以下两种Exception: CallbackException与KeyboardInterrupt, raise其它exception.

Return dict

返回一个字典类型的数据, 内含以下内容:

seconds: float, 表示训练时长
以下三个内容只有在提供了dev_data的情况下会有。
best_eval: Dict of Dict, 表示evaluation的结果。第一层的key为Metric的名称,
            第二层的key为具体的Metric
best_epoch: int,在第几个epoch取得的最佳值
best_step: int, 在第几个step(batch)更新取得的最佳值
save_check_point(name=None, only_params=False)[源代码]

保存当前模型

close()[源代码]

关闭Trainer,销毁进程