资讯 社区 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

7.实战演练:使用文心进行模型预测

这里我们以上一节实战演练:使用文心训练模型训练出的模型为例,介绍如何使用文心进行模型预测推理。

环境安装

环境安装与配置

准备数据

  • 根据上节的任务场景,我们知道这是一个经典的NLP文本二分类任务,那么它的预测数据就是一条明文文本,模型预测结果就是在二分类的两个类别上的概率分布。非ERNIE任务需要用户自己先分好词,示例数据如下所示:

    USB接口 只有 2个 , 太 少 了 点 , 不能 接 太多 外 接 设备 ! 表面 容易 留下 污垢 !
    平时 只 用来 工作 , 上 上网 , 挺不错 的 , 没有 冗余 的 功能 , 样子 也 比较 正式 !
    还 可以 吧 , 价格 实惠   宾馆 反馈   2008417日   :   谢谢 ! 欢迎 再次 入住 其士 大酒店 。

    ERNIE任务不需要分词,格式与非ERNIE任务一致,这里不再赘述。

  • 词表文件需要和模型训练时的词表文件保持一致(使用同一个词表文件),分为两列,第一列为词,第二列为id(从0开始),列与列之间用\t进行分隔。文心的词表中,[PAD]、[CLS]、[SEP]、[MASK]、[UNK]这5个词是必须要有的,若用户自备词表,需保证这5个词是存在的。部分词表示例如下所示:

    [PAD]    0
    [CLS]    1
    [SEP]    2
    [MASK]    3
    [UNK]    4
    郑重    5
    天空    6
    工地    7
    神圣    8
  • 将准备好的待预测数据放在./data/predict_data/目录下,对应的词表文件放在./dict/目录下。

配置json:通过json进行模型配置

  • 训练出的模型储存在./output/cls_cnn_ch/save_inference_model/中,在该目录下找到被保存的inference_model文件,如inference_step_251。
  • 将其上面的模型路径填入./examples/cls_cnn_ch_infer.json中的inference_model_path字段,以cls_cnn_ch_infer.json为例,修改部分示例如下:

    {
      "dataset_reader": {    ## data部分的内容与上一节的data配置一致,这里不再赘述,区别是预测任务仅需要配置predict_reader
        "predict_reader": {
          "name": "predict_reader",
          "type": "BasicDataSetReader",
          "fields": [
            {
              "name": "text_a",
              "data_type": "string",
              "reader": {
                "type": "CustomTextFieldReader"
              },
              "tokenizer": {
                "type": "CustomTokenizer",
                "split_char": " ",
                "unk_token": "[UNK]",
                "params": null
              },
              "need_convert": true,
              "vocab_path": "./dict/vocab.txt",
              "max_seq_len": 512,
              "truncation_type": 0,
              "padding_id": 0,
              "embedding": null
            }
          ],
          "config": {
            "data_path": "./data/predict_data",
            "shuffle": false, ## 注意!这里的参数必须关掉,打乱顺序输出之后不方便比对数据看结果
            "batch_size": 8,
            "epoch": 1,    ## 注意!这里的epoch要设置为1,重复多次预测没意义。
            "sampling_rate": 1.0
          }
        }
      },
    
      "inference": {
        "output_path": "./output/predict_result.txt",  ## 预测结果的输出路径,如果不填则默认输出路径为"./output/predict_result.txt"
        "PADDLE_USE_GPU": 0,
        "PADDLE_IS_LOCAL": 1,  ## 是否单机预测,必须设置为1,目前文心的python版本预测仅支持单机
        "num_labels": 2,  ## 必填参数,表示分类模型的类别数目是多少,预测结果解析时会用到
        "inference_model_path":   "./output/cls_cnn_ch/save_inference_model/inference_step_251",  ## 待预测模型的路径
        "extra_param": {  ## 同trainer,除核心必要信息之外,需要额外标明的参数信息,比如一些meta信息可以作为日志统计的关键字。
          "meta":{
            "job_type": "text_classification"
          }
    
        }
      }
    }

启动预测

  • 运行run_infer.py ,选择对应的参数配置文件即可。如下所示:

    python run_infer.py --param_path ./examples/cls_cnn_ch_infer.json
  • 预测过程中的日志自动保存在./output/predict_result.txt文件中,预测部分结果如下所示:

    2020-02-24 18:46:54,634-INFO: start do predict....
    INFO: 02-24 18:46:54: inference.py:59 * 139699868489472 start do predict....
    2020-02-24 18:46:54,637-INFO: 0
    INFO: 02-24 18:46:54: basic_dataset_reader.py:70 * 139699868489472 0
    2020-02-24 18:46:54,669-INFO: [0.48963895 0.51036108]
    INFO: 02-24 18:46:54: cnn_classification.py:128 * 139699868489472 [0.48963895 0.51036108]                                          ## 两个概率分别表示模型对该预测文本在label=0和label=1上做出的置信判断
    2020-02-24 18:46:54,670-INFO: [0.49629667 0.50370336]
    INFO: 02-24 18:46:54: cnn_classification.py:128 * 139699868489472 [0.49629667 0.50370336]
    2020-02-24 18:46:54,671-INFO: [0.49249911 0.50750083]
    INFO: 02-24 18:46:54: cnn_classification.py:128 * 139699868489472 [0.49249911 0.50750083]
    2020-02-24 18:46:54,672-INFO: [0.49087134 0.50912869]
    INFO: 02-24 18:46:54: cnn_classification.py:128 * 139699868489472 [0.49087134 0.50912869]
    2020-02-24 18:46:54,673-INFO: [0.49540547 0.50459456]
    INFO: 02-24 18:46:54: cnn_classification.py:128 * 139699868489472 [0.49540547 0.50459456]
    2020-02-24 18:46:54,673-INFO: [0.49168214 0.50831795]
    INFO: 02-24 18:46:54: cnn_classification.py:128 * 139699868489472 [0.49168214 0.50831795]
    2020-02-24 18:46:54,674-INFO: [0.49629667 0.50370336]
    INFO: 02-24 18:46:54: cnn_classification.py:128 * 139699868489472 [0.49629667 0.50370336]
    2020-02-24 18:46:54,675-INFO: [0.49258387 0.50741607]
    INFO: 02-24 18:46:54: cnn_classification.py:128 * 139699868489472 [0.49258387 0.50741607]
    2020-02-24 18:46:54,677-INFO: 0
    INFO: 02-24 18:46:54: basic_dataset_reader.py:70 * 139699868489472 0
    2020-02-24 18:46:54,682-INFO: [0.48791078 0.51208919]
    INFO: 02-24 18:46:54: cnn_classification.py:128 * 139699868489472 [0.48791078 0.51208919]
    2020-02-24 18:46:54,683-INFO: [0.4841378  0.51586217]
    INFO: 02-24 18:46:54: cnn_classification.py:128 * 139699868489472 [0.4841378  0.51586217]
    2020-02-24 18:46:54,684-INFO: [0.4887262 0.5112738]
    INFO: 02-24 18:46:54: cnn_classification.py:128 * 139699868489472 [0.4887262 0.5112738]
    2020-02-24 18:46:54,685-INFO: [0.49037534 0.50962466]
    INFO: 02-24 18:46:54: cnn_classification.py:128 * 139699868489472 [0.49037534 0.50962466]
  • 基于ERNIE训练出的模型,预测方法与上面所述的CNN模型一致,区别就是在配置data部分的json时需要将其修改成ERNIE对应的filed_reader和tokenizer。以./examples/cls_ernie_2.0_base_cnn_ch_infer.json为例:

    {
      "dataset_reader": {
        "predict_reader": {
          "name": "predict_reader",
          "type": "BasicDataSetReader",
          "fields": [
            {
              "name": "text_a",
              "data_type": "string",
              "reader": {
                "type": "ErnieTextFieldReader"   ## ERNIE任务专用的filedreader。
              },
              "tokenizer": {
                "type": "FullTokenizer",  ## 使用FullTokenizer按字进行切分,ERNIE任务专用。
                "split_char": " ",
                "unk_token": "[UNK]"
              },
              "need_convert": true,
              "vocab_path": "../model_files/dict/vocab_ernie_2.0_base_ch.txt",  ## 设置ERNIE模型对应的词表文件,与模型训练时的词表保持一致。
              "max_seq_len": 512,
              "truncation_type": 0,
              "padding_id": 0,
              "embedding": null
            }
          ],
          "config": {
            "data_path": "./data/predict_data",
            "shuffle": false,
            "batch_size": 8,
            "epoch": 1,
            "sampling_rate": 1.0
          }
        }
      },
    
      "inference": {
        "output_path": "./output/predict_result.txt",
        "inference_model_path": "./output/cls_ernie_2.0_base_cnn_ch/save_inference_model/inference_step_251_enc", ## 基于ERNIE的cnn网络训练出来的待预测模型路径。
        "PADDLE_USE_GPU": 1,
        "PADDLE_IS_LOCAL": 1,
        "num_labels": 2,
        "extra_param": {
          "meta":{
            "job_type": "text_classification"
          }
    
        }
      }
    }

其他

上述篇幅描述的是通过离线的run_infer.py脚本,使用Python在本地进行模型的批量预测推理,如果您需要搭建HttpServer进行API方式的预测,请移步预测部署。目前文心旗舰版仅支持Python版本的模型预测推理,如果需要进行C++版的预测部署服务,请单独联系我们:文心NLP开发套件QQ群1097307223。

上一篇
6.实战演练:使用文心模型评估
下一篇
8.可视化工具