开放能力
开发平台
行业应用
生态合作
开发与教学
资讯 社区 控制台
技术能力
语音技术
图像技术
文字识别
人脸与人体识别
视频技术
AR与VR
自然语言处理
知识图谱
数据智能
场景方案
部署方案
行业应用
智能教育
智能医疗
智能零售
智能工业
企业服务
智能政务
智能农业
信息服务
智能园区
智能硬件
专业版开发套件ERNIE

    实战演练:使用文心训练一个模型

    欢迎使用文心NLP开发套件,文心开发套件提供从数据预处理到模型训练,再到模型的预测一站式的开发功能体验。下面将以文本分类任务为例,介绍如何使用文心快速训练一个文本分类的模型。您也可以在文心code lab中,通过Jupiter文档来试用。如果您在使用文心的过程中,希望获得技术支持,请加入文心NLP开发套件交流群1041632707。

    一、进入文本分类任务目录,在目录下将会见到examples文件夹,在下一步中将进行使用

    cd wenxin/tasks/text_classification

    二、采用预置的模型CnnClassification实现文本分类(具体网络可参考models目录)

    1. 基于json实现预置网络训练。其调用了配置文件./examples/cls_cnn_ch.json,输入的数据、模型参数等在json里定义好了
    2. 训练运行的日志会自动保存在./log/test.log文件中
    3. 训练中以及结束后产生的模型文件会默认保存在./output/cls_cnn_ch/目录下,其中save_inference_model/文件夹会保存用于预测的模型文件,save_checkpoint/文件夹会保存用于热启动的模型文件
    # 基于json实现预置网络训练。其调用了配置文件./examples/cls_cnn_ch.json,输入的数据、模型参数等在json里定义好了
    !python3 run_with_json.py --param_path examples/cls_cnn_ch.json

    三、用户可以通过修改json配置data和预置网络进行修改,以下为cls_cnn_ch.json中抽取出来的部分配置,通过注释说明其基本作用。

    {
      "dataset_reader": {                                   ## data_set_reader用于实现读取数据文件、转换数据格式、组batch、shuffle等操作。
        "train_reader": {                                   ## 训练、测试、评估各自基于不同的数据集,数据格式也可能不一样,可以在json中配置不同的reader。
          "name": "train_reader",
          "type": "BasicDataSetReader",                     ## 采用BasicDataSetReader,其封装了常见的读取tsv文件、组batch等操作。
          "fields": [                                       ## 域(field)是wenxin的高阶封装,对于同一个样本存在不同域的时候,不同域有单独的数据类型(文本、数值、整型、浮点型)、单独的词表(vocabulary)等,可以根据不同域进行语义表示,如文本转id等操作,field_reader是实现这些操作的类。
            {
              "name": "text_a",                             ## 文本分类只有一个文本特征域,命名为"text_a""data_type": "string",                        ## data_type定义域的数据类型,文本域的类型为string,整型数值为int,浮点型数值为float。
              "reader": {"type":"CustomTextFieldReader"},   ## 采用针对文本域的通用reader "CustomTextFieldReader"。数值数组类型域为"ScalarArrayFieldReader",数值标量类型域为"ScalarFieldReader""tokenizer":{
                  "type":"CustomTokenizer",                 ## 指定该文本域的tokenizer为CustomTokenizer。
                  "split_char":" ",                         ## 通过空格区分不同的token。
                  "unk_token":"[UNK]",                      ## unk标记为"[UNK]""params":null
                },
              "need_convert": true,                         ## "need_convert"true说明数据格式是明文字符串,需要通过词表转换为id。
              "vocab_path": "./dict/vocab.txt",             ## 指定该文本域的词表。
              "max_seq_len": 512,                           ## 设定每个域的最大长度。
              "truncation_type": 0,                         ## 选择截断策略,0为从头开始到最大长度截断,1为从头开始到max_len-1的位置截断,末尾补上最后一个id(词或字),2为保留头和尾两个位置,然后按从头开始到最大长度方式截断。
              "padding_id": 0                               ## 设定padding时对应的id值。
            },                                              ## 如果每一个样本有多个特征域(文本类型、数值类型均可),可以仿照前面对每个域进行设置,依次增加每个域的配置即可。此时样本的域之间是以\t分隔的。
            {
              "name": "label",                              ## 标签也是一个单独的域,命名为"label"。如果多个不同任务体系的标签存在于多个域中,则可实现最基本的多任务学习。
              "data_type": "int",                           ## 标签是整型数值。
              "reader":{
                "type":"ScalarFieldReader"                  ## 整型数值域的reader为"ScalarFieldReader"},
              "tokenizer":null,
              "need_convert": false,
              "vocab_path": "",
              "max_seq_len": 1,
              "truncation_type": 0,
              "padding_id": 0,
              "embedding": null
            }
          ],
          "config": {
            "data_path": "./data/train_data/",              ## 训练数据train_reader的数据路径,写到文件夹目录。
            "shuffle": false,
            "batch_size": 8,
            "epoch": 10,
            "sampling_rate": 1.0
          }
        },
        "test_reader": {                                    ## 若要评估测试集,需配置test_reader且is_eval_test置为1,其配置方式与train_reader类似。
        ……
        },
        "dev_reader": {                                     ## 若要评估验证集,需配置dev_reader且is_eval_dev置为1,其配置方式与test_reader类似。
        ……
        }
      },
      "model": {
        "type": "CnnClassification"                         ## wenxin采用模型(models)的方式定义神经网络的基本操作,本例采用预置的模型CnnClassification实现文本分类,具体网络可参考models目录。
      },
      "trainer": {
        "PADDLE_USE_GPU": 0,                                ## 是否采用GPU训练,1是为采用GPU。
        "PADDLE_IS_LOCAL": 1,                               ## 是否单机训练,默认值为0,若要单机训练需要设置为1"train_log_step": 20,                               ## 训练时打印训练日志的间隔步数。
        "is_eval_dev": 0,                                   ## 是否在训练的时候评估开发集,如果取值为1一定需要配置dev_reader及其数据路径。
        "is_eval_test": 1,                                  ## 是否在训练的时候评估测试集,如果取值为1一定需要配置test_reader及其数据路径。
        "eval_step": 100,                                   ## 进行测试集或验证集评估的间隔步数。
        "save_model_step": 10000,                           ## 保存模型时的间隔步数,建议设置为eval_step的整数倍。
        "load_parameters": 0,                               ## 加载包含各op参数值的训练好的模型,用于预测。
        "load_checkpoint": 0,                               ## 加载包含学习率等所有参数的训练模型,用于热启动。
        "pre_train_model": [],                              ## 加载预训练模型,例如ernie。使用时需要填写预训练模型的名称name和预训练模型的目录params_path。
        "output_path": ""                                   ## 保存模型的输出路径,如置空或者不配置则默认输出路径为"./output"}
    }

    四、如何使用ERNIE1.0中文模型训练

    与非ERNIE的训练方式相同,使用预置网络进行训练的方式为使用./run_with_json.py入口脚本,通过--param_path参数来传入./examples/目录下ernie相关的json配置文件。 以预置基于ernie_1.0_base的CNN文本分类模型为例,训练分为以下几个步骤:

    1. 请使用以下命令在../model_files/中通过对应脚本下载ernie_1.0_base模型参数文件,其对应配置文件ernie_1.0_base_ch_config.json和词表vocab_ernie_1.0_base_ch.txt分别位于../model_files/目录下的config/和dict/文件夹,用户无需更改;
    # ernie_1.0_base 模型下载,进入model_files目录
    cd ../model_files
    # 运行下载脚本
    !sh download_ernie_1.0_base_ch.sh
    1. 运行以下命令在训练集(train.txt)上进行模型训练,并在测试集(test.txt)上进行验证;
    # 返回text_classification目录
    cd ../text_classification/
    ## 选择ernie相关json即可实现,用户如果实在CPU环境,需要将json文件中PADDLE_USE_GPU参数设置为0,如果是GPU环境,设为1即可
    !python3 run_with_json.py --param_path ./examples/cls_ernie_1.0_base_cnn_ch.json