天然語言處理(NLP)在現代深度學習生態中愈來愈常見。從流行的深度學習框架到雲端API的支持,例如Google雲、Azure、AWS或Bluemix,NLP是深度學習平臺不可或缺的部分。儘管已經取得了使人難以置信的進步,但構建大規模的NLP應用依然還有極大的挑戰,在學習研究和生產部署之間還存在不少摩擦。做爲當前市場上最大的會話環境之一,Facebook已經面對構建大規模NLP應用的挑戰有一些年頭了,最近,Facebook的工程團隊開源了第一個版本的Pytext,一個基於PyTorch的NLP框架,能夠用來構建高效的NLP解決方案。python
PyText的最終目標是簡化端對端的NLP工做流實現。爲了實現這一目標,PyText須要解決當前NLP流程中的一些問題,其中最使人頭疼的就是NLP應用在實驗環境和生產環境的不匹配問題。json
現代NLP解決方案一般包含很是重的實驗環節,在這個階段數據科學家們將借鑑研究文件快速測試新的想法和模型,以便達成必定的性能指標。在實驗階段,數據科學家傾向於使用容易上手、界面簡單的框架,以便快速實現高級、動態的模型,例如PyTorch或TensorFlow Eager。當須要部署到生產環境時,動態圖模型的固有侷限性就帶了新的挑戰,這一階段的深度學習技術須要使用靜態計算圖,而且須要爲大規模計算進行優化。TensorFlow、Caffe2或MxNet都屬於這一類型的技術棧。結果是大型數據科學團隊不得不爲實驗和生產部署使用不一樣的技術棧。網絡
PyTorch是最先解決了快速實驗與規模化部署之間衝突的深度學習框架之一。基於PyTorch構建的PyText爲NLP領域應用了這些解決實驗環境與生產部署之間衝突的優化原則。數據結構
從概念角度觸發,PyText被設計爲實現如下四個基本目標:架構
儘量簡單、快速的實現新模型框架
簡化將預構建模型應用於新數據的工做量性能
同時爲研究者和工程師定義清晰的工做流,以便構建和評估模型,並以最小的代價上線模型學習
確保部署的模型在推理時具備高性能:低延遲、高吞吐量測試
PyText的處理容量最終打造的建模框架,可供研究者和工程師構建端到端的訓練或推理流水線。當前的PyText實現涵蓋了NLP工做流聲明週期中的基本環節,爲快速實驗、原始數據處理、指標統計、訓練和模型推理提供了必要的接口。一個高層級的PyText架構圖能夠清晰地展現這些環節如何封裝了框架的原生組件: 優化
如上圖所示,PyText的架構包含如下組成部分:
你能夠看到,PyText利用ONNX(Open Neural Network Exchange Format)將模型從實驗環境的PyTorch格式轉換爲生產環境的Caffe2運行模型。
PyText預置了衆多NLP任務組件,例如文本分類、單詞標註、語義分析和語言模型等,能夠快速實現NLP工做流。相似的,PyText使用上下文模型介入語言理解領域,例如使用SeqNN模型用於意圖標註任務,或者使用一個上下文相關的意圖槽模型用於多個任務的聯合訓練。
從NLP工做流的角度來講,PyText能夠快速將一個思路從實驗階段轉換爲生產階段。一個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簡介 - 匯智網