Pytext 簡介——Facebook 基於 PyTorch 的自然語言處理 (NLP) 框架

geeker發表於2018-12-26

自然語言處理(NLP)在現代深度學習生態中越來越常見。從流行的深度學習框架到雲端API的支援,例如Google雲、Azure、AWS或Bluemix,NLP是深度學習平臺不可或缺的部分。儘管已經取得了令人難以置信的進步,但構建大規模的NLP應用依然還有極大的挑戰,在學習研究和生產部署之間還存在很多摩擦。作為當前市場上最大的會話環境之一,Facebook已經面對構建大規模NLP應用的挑戰有一些年頭了,最近,Facebook的工程團隊開源了第一個版本的Pytext,一個基於PyTorch的NLP框架,可以用來構建高效的NLP解決方案。

PyText的最終目標是簡化端對端的NLP工作流實現。為了實現這一目標,PyText需要解決當前NLP流程中的一些問題,其中最令人頭疼的就是NLP應用在實驗環境和生產環境的不匹配問題。

更好地平衡NLP實驗和生產部署

現代NLP解決方案通常包含非常重的實驗環節,在這個階段資料科學家們將借鑑研究檔案快速測試新的想法和模型,以便達成一定的效能指標。在實驗階段,資料科學家傾向於使用容易上手、介面簡單的框架,以便快速實現高階、動態的模型,例如PyTorch或TensorFlow Eager。當需要部署到生產環境時,動態圖模型的固有侷限性就帶了新的挑戰,這一階段的深度學習技術需要使用靜態計算圖,並且需要為大規模計算進行優化。TensorFlow、Caffe2或MxNet都屬於這一型別的技術棧。結果是大型資料科學團隊不得不為實驗和生產部署使用不同的技術棧。

PyTorch是最早解決了快速實驗與規模化部署之間衝突的深度學習框架之一。基於PyTorch構建的PyText為NLP領域應用了這些解決實驗環境與生產部署之間衝突的優化原則。

理解PyText

從概念角度觸發,PyText被設計為實現以下四個基本目標:

  1. 儘可能簡單、快速的實現新模型

  2. 簡化將預構建模型應用於新資料的工作量

  3. 同時為研究者和工程師定義清晰的工作流,以便構建和評估模型,並以最小的代價上線模型

  4. 確保部署的模型在推理時具有高效能:低延遲、高吞吐量

PyText的處理容量最終打造的建模框架,可供研究者和工程師構建端到端的訓練或推理流水線。當前的PyText實現涵蓋了NLP工作流宣告週期中的基本環節,為快速實驗、原始資料處理、指標統計、訓練和模型推理提供了必要的介面。一個高層級的PyText架構圖可以清晰地展示這些環節如何封裝了框架的原生元件:

如上圖所示,PyText的架構包含以下組成部分:

  • Task:將多個用於訓練或推理的元件拼裝為一個流水線
  • Data Handler:處理原始輸入資料,貯備張量批資料,以便送入模型
  • Model:定義神經網路的架構
  • Optimizer:封裝模型引數優化過程,基於模型的前饋損失進行優化
  • Metric Reporter:實現模型相關指標的計算和報表提供
  • Trainer: 使用資料處理器、模型、損失和優化器來訓練和篩選模型
  • Predictor:使用資料處理器和模型對給定的資料集進行推理
  • Exporter: ONNX8匯出訓練好的PyTorch模型到Caffe2圖

你可以看到,PyText利用ONNX(Open Neural Network Exchange Format)將模型從實驗環境的PyTorch格式轉換為生產環境的Caffe2執行模型。

PyText預置了眾多NLP任務元件,例如文字分類、單詞標註、語義分析和語言模型等,可以快速實現NLP工作流。類似的,PyText使用上下文模型介入語言理解領域,例如使用SeqNN模型用於意圖示註任務,或者使用一個上下文相關的意圖槽模型用於多個任務的聯合訓練。

從NLP工作流的角度來說,PyText可以快速將一個思路從實驗階段轉換為生產階段。一個PyText應用的典型工作流包含如下的步驟:

  1. 用PyText實現模型,確保測試集上的離線指標正確
  2. 將模型釋出到打包的基於PyTorch的推理服務,在實時樣本上執行小規模評估
  3. 自動匯出到Caffe2網路,不過在有些情況下,例如當使用複雜的流程控制邏輯時,或者使用自定義資料結構式,PyTorch 1.0還不支援
  4. 如果第3步不支援,那麼使用Py-Torch C++ API9重寫模型,並封裝為一個Caffe2操作符
  5. 將模型釋出為生產就緒的Caffe2預測服務並啟動

使用PyText

上手PyText非常簡單,按標準python包的方法安裝框架:

$ pip install pytext-nlp

然後,我們就可以使用一個任務配置來訓練NLP模型了:

(pytext) $ cat demo/configs/docnn.json
{
  "task": {
    "DocClassificationTask": {
      "data_handler": {
        "train_path": "tests/data/train_data_tiny.tsv",
        "eval_path": "tests/data/test_data_tiny.tsv",
        "test_path": "tests/data/test_data_tiny.tsv"
      }
    }
  }
}

$ pytext train < demo/configs/docnn.json

Task是PyText應用中的用來定義模型的核心部件。每一個任務都有一個嵌入的配置,它定義了不同元件之間的關係,如下面程式碼所示:

from word_tagging import ModelInputConfig, TargetConfig

class WordTaggingTask(Task):
  class Config(Task.Config):
    features: ModelInputConfig = ModelInputConfig()
    targets: TargetConfig = TargetConfig()
    data_handler: WordTaggingDataHandler.Config = WordTaggingDataHandler.Config()
    model: WordTaggingModel.Config = WordTaggingModel.Config()
    trainer: Trainer.Config = Trainer.Config()
    optimizer: OptimizerParams = OptimizerParams()
    scheduler: Optional[SchedulerParams] = SchedulerParams()
    metric_reporter: WordTaggingMetricReporter.Config = WordTaggingMetricReporter.Config()
    exporter: Optional[TextModelExporter.Config] = TextModelExporter.Config()

一旦模型訓練完畢,我們就可以對模型進行評估,也可以匯出為Caffe2格式:

(pytext) $ pytext test < "$CONFIG"

(pytext) $ pytext export --output-path exported_model.c2 < "$CONFIG"

需要指出的是,PyText提供了可擴充套件的架構,可以定製、擴充套件其中任何一個構建模組。

PyText代表了NLP開發的一個重要里程碑,它是最早解決實驗與生產匹配問題的框架之一。基於Facebook和PyTorch社群的支援,PyText可能有機會稱為深度學習生態中最重要的NLP技術棧之一。

匯智網翻譯整理,轉載請標明出處。Pytext簡介

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章