Home

Awesome

Pytorch Worker

本框架为基于pytorch的模型训练、测试框架。该框架的目的是方便大家快速上手写出pytorch的模型,同时能够定制化属于自己的模型、输出、数据处理和评价指标,方便大家快速完成同任务上的大量模型的实验。

<del>英文的README可以通过这里访问。</del>

目录

运行方法

运行方法分为模型训练和模型测试两个部分。

模型训练

无论是模型的训练还是测试,我们都需要指定本次运行的参数即配置文件,配置文件的详细说明可以可以参考下一节的内容。如果我们想要训练我们的模型,运行方法如下:

python3 train.py --config 配置文件 --gpu GPU列表

例如,如果我们想用编号为2,3,5的三张GPU运行中文Bert的分类任务,我们可以运行如下命令:

python3 train.py --config config/nlp/BasicBert.config --gpu 2,3,5

此外,除了原始的DataParallel的方法以外,我们还提供了使用DistributedDataParallel的多卡并行方法,运行命令为:

python3 -m torch.distributed.launch train.py --config config/nlp/BasicBert.config --gpu 2,3,5

具体的实现方法请参考模型中的写法。

当然,如果你不想使用GPU来运行你的模型的话,你可以去掉--gpu选项来完成这一点,例如:

python3 train.py --config config/nlp/BasicBert.config

这样的运行方式就可以不使用GPU来训练模型。

如果你并不想从头开始训练你的模型,而是希望接着之前某次训练的结果继续运行的话,可以用如下命令:

python3 train.py --config 配置文件 --gpu GPU列表 --checkpoint 模型参数文件

参数checkpoint指向中间某次的训练结果文件,框架会从该文件中读取模型、优化器和训练迭代轮数等信息。(如果在中途修改了优化器并不会导致错误,框架会自动使用新的优化器继续运行)

模型测试

模型测试的运行方法:

python3 test.py --config 配置文件 --gpu GPU列表 --checkpoint 模型参数文件 --result 测试结果保存文件

会将测试的结果以json格式保存到结果文件中。

配置文件

运行逻辑

配置文件是该框架的核心模块之一,绝大部分的运行参数都是通过读取配置文件得到的。我们以一个例子来说明框架从配置文件读取参数的运行逻辑:

python3 train.py --config config/nlp/BasicBert.config

在这段代码里面我们指定了从BasicBert.config中读取我们所需要的参数,在实际运行中我们会总共涉及到三个不同的配置文件:

  1. config/nlp/BasicBert.config
  2. config/default_local.config
  3. config/default.config

当框架尝试读取某个参数的时候,会按照上述三个配置文件的顺序从上至下依次读取。例如如果我们想要读取batch_size这个参数,框架会先尝试从config/nlp/BasicBert.config中读取该参数;如果失败,会再尝试从config/default_local.config读取该参数;如果再次失败,会尝试从config/default.config读取参数。如果在三个配置文件中都没有读取到参数,则会抛出异常。

对于三个配置文件,我们建议每个文件中所需要包含的参数有:

在程序运行中,我们传递的config参数便为所对应的配置文件,支持原版ConfigParser的各种函数包括但不限于get,getint,getboolean等方法。

基本参数说明

配置文件的结构是遵循python下的ConfigParser包进行构建的,文件中[chapter]代表的是不同适用情况的参数,具体结构可以参考config文件夹下的例子。我们接下来将会介绍在基本框架中所涉及到的一些参数的说明,参数分为必要参数(运行所有模型都需要的参数)和可选参数(运行特定模型所需要的参数)。当然,你可以随意的在你自定义的方法里面增加新的参数

[train]:训练用参数

[eval]:测试用参数

[data]:数据用参数

[distributed]: 多卡参数

[model]:模型用参数

[output]:输出用参数

新方法的添加和已有方法

我们的框架中除开配置文件读取器以外,剩下的绝大部分模块都是可定制的,包括是:数据读取器数据处理器模型指标函数指标输出,这里每一个部分都可以添加你自己需要的方法或者模型,我们将在依次介绍每个模块的实现方法和功能。

数据读取器

模块功能:用于从文件中读取数据,存进pytorch的dataset中。

实现方法:如果需要实现新的数据读取器,我们需要在dataset文件加中新建一个文件来实现我们新的数据读取器,需要按照下列方法实现:

from torch.utils.data import Dataset

class DatasetName(Dataset):
    def __init__(self, config, mode, *args, **params):
        # 在这里进行初始化
        # config为读取的配置文件
        # mode为读取器的模式,包括train、valid和test三种模式
        pass

    def __getitem__(self, item):
        # 返回第item个数据
        pass

    def __len__(self):
        # 返回数据的总量
        return len(self.file_list)

在实现好我们的数据读取器之后,再将实现的数据读取器添加到dataset/__init__.py的列表即可使用。你也可以通过已实现的方法来学习如何实现一个数据读取器。

已实现的方法

数据处理器

模块功能:将数据读取器读取的数据处理成更够交给模型运行的格式。

实现方法:如果需要实现新的数据处理器,我们需要在formatter文件加中新建一个文件来实现我们新的数据处理器,需要按照下列方法实现:

class FormatterName:
    def __init__(self, config, mode, *args, **params):
        # 在这里进行初始化
        # config为读取的配置文件
        # mode为处理器的模式,包括train、valid和test三种模式
        pass

    def process(self, data, config, mode, *args, **params):
        # 对给定的数据data进行处理
        # data的格式为大小为batch_size的数组(在test模式下,最后一个batch的大小可能小于batch_size),里面每个元素即为从数据处理器的__getitem__中返回的格式
        # config和mode参数的设置同上
        # 这里我们返回的数据类型要求必须为python的dict格式,且需要把模型需要的字段处理为Tensor的格式
        pass

在实现好我们的数据处理器之后,再将实现的数据处理器添加到formatter/__init__.py的列表即可使用。你也可以通过已实现的方法来学习如何实现一个数据处理器。

已实现的方法

模型

模块功能:运行数据,产生结果。

实现方法:如果需要实现新的模型,我们需要在model文件加中新建一个文件来实现我们新的模型,需要按照下列方法实现:

class ModelName(nn.Module):
    def __init__(self, config, gpu_list, *args, **params):
        # 模型初始化部分
        # config为读取的配置文件
        # gpu_list为在运行的时候指定的gpu_id的列表
        super(ModelName, self).__init__()

    def init_multi_gpu(self, device, config, *args, **params):
        # 多卡初始化部分,用于将模型放置于多卡上
        # 如果没有多卡的需求,则不需要实现该函数
        # device为gpu_id的列表
        # config为读取的配置文件
        pass

    def forward(self, data, config, gpu_list, acc_result, mode):
        # 模型运行的核心部分
        # data为数据处理器处理好的数据,已自动将其中的Tensor进行gpu化
        # config为读取的配置文件
        # gpu_list为在运行的时候指定的gpu_id的列表
        # acc_result为类型的评价指标结果,如已经运行的所有结果中的准确率、召回率等信息,由之后的指标函数所决定
        # mode为模型的模式,包括train、valid和test三种模式
        # 返回格式为要求为python的dict
        # 在train和valid模式中,由于需要衡量模型和优化模型,返回的结果中必须包含loss和acc_result两个字段,分别代表损失函数的结果和累计的指标量。acc_result的计算在这里并不是必须的,但是如果想从多维的角度评判模型请一定使用
        # 在test模式中,会将output字段作为结果进行记录,所以需要保证output字段的类型必须为list,且其中的内容能够被json化
        pass

在实现好我们的模型之后,再将实现的模型添加到model/__init__.py的列表即可使用。你也可以通过已实现的方法来学习如何实现一个模型。

已实现的方法

指标函数

模块功能:产生除了损失以外的其他指标,用于衡量模型的水平。

实现方法:如果需要实现新的指标函数,我们需要在tools/accuracy_tool.py文件中新建一个方法来实现我们新的指标函数,需要按照下列方法实现:

def FunctionName(outputs, label, config, result):
    # 这只是一个示例,实际上由于不同模型使用的评价指标都是不一样的,这里你可以随意改造参数,我们只以已经实现好的几个方法的参数进行说明
    # outputs为模型预测的结果
    # label为标签
    # config为读取的配置文件
    # result为历史累计的评价指标结果
    # 返回值为新的评价指标结果
    pass

在实现好我们的指标函数之后,再将实现的指标函数添加到tools/accuracy_init.py的列表即可使用。你也可以通过已实现的方法来学习如何实现一个指标函数。

已实现的方法

指标输出

模块功能:通过指标函数产生的结果,产生用于打印至终端的评价指标。

实现方法:如果需要实现新的指标输出函数,我们需要在tools/output_tool.py文件中新建一个方法来实现我们新的指标输出函数,需要按照下列方法实现:

def FunctionName(data, config, *args, **params):
    # data为我们使用指标函数产生的结果
    # config为读取的配置文件
    # 返回值为需要输出的指标结果,要求类型为字符串

在实现好我们的指标输出函数之后,再将实现的指标输出函数添加到tools/output_init.py的列表即可使用。你也可以通过已实现的方法来学习如何实现一个指标输出函数。

已实现的方法

框架运行逻辑

  1. 读取配置文件。

  2. 进行初始化操作。

    1)初始化数据处理器。

    2)初始化数据读取器。

    3)初始化模型,并多gpu化。

    4)初始化优化器。

    5)如果需要加载checkpoint,则进行加载。(加载出错只会显示warning)

  3. 开始训练。

    训练分为训练和验证两个步骤,其中训练每次迭代的逻辑为:

    1)从数据读取器读取数据。

    2)将数据交给数据处理器进行处理。

    3)模型运行数据,产生损失和评价指标,并优化模型。

    4)如果需要输出评价指标,利用指标输出函数产生输出。

    5)返回第一步,完成一次迭代。

    一个epoch完成之后,保存模型,且会检查是否需要进行验证,验证流程与训练大致相同,不过只会在全部完成之后产生一次评价指标。

依赖库

请参考requirements.txt

未来计划

  1. 添加可定制化的tensorboard显示。
  2. 添加对lr_scheduler的可定制化支持。
  3. 在各个可定制化模块中增加更多常用方法。

更新记录

V1.0.1

2020.04.22 加入了多显卡内存更平衡运行速度更快的方法。

V1.0.0

2020.01.01 完成最基本的框架。

作者与致谢

暂无。