彗星在线服务器已与SparkNLP集成,这有利于NLP工程师在服务器上部署模型或完整的管道。它有助于持续监测和评估部署在服务器上的模型的参数。彗星使模型能够被访问,而不管它是在哪个平台上开发的,服务器上的模型管道或模型本身都可以用来获得预测。本文简要介绍了如何将SparkNLP管道集成到彗星服务器中并获得相应的预测结果。
目录
- SparkNLP简介
- 设置Pyspark和SparkNLP
- 在服务器中创建一个彗星实验
- 从AWS服务器中提取数据
- 定义一个SparkNLP管道
- 在彗星服务器中记录各种指标
- 使用管道来获得预测结果
- 总结
SparkNLP简介
SparkNLP是John Snow实验室提供的最先进的开源库,它被各种组织用来提高他们的NLP任务,因为它们便于模型开发和线性扩展,并创建一个完整的NLP管道。SparkNLP的整体构建与Apache Spark有关,它提供了用Python、Java或Scala编写代码的灵活性。由于其广泛的灵活性和对基于变换器的模型的支持,如BERT和NER模型,这个库现在在许多组织中被广泛使用。
你是否在寻找一个完整的数据科学中使用的Python库。在此查看.
设置Pyspark和SparkNLP
最初,Pyspark和SparkNLP必须在工作环境中使用一些标准的pip命令进行设置。这里的实现是在Google Colab中进行的,SparkNLP是在John Snow实验室的官方仓库中设置的。SparkNLP显示模块与comet_ml一起被用于可视化,如下图所示。
!wget http://setup.johnsnowlabs.com/colab.sh -O - | bash
!pip install --ignore-installed spark-nlp-display
!pip install comet_ml --quiet
在服务器中创建一个彗星实验
最初,SparkNLP模块是可用的,并且在工作环境中启动了火花会话,如下图所示。
import sparknlp
from sparknlp.base import *
from sparknlp.annotator import *
from sparknlp.pretrained import PretrainedPipeline
## Acquiring required pyspark modules
from pyspark.ml import Pipeline
from pyspark.sql import SparkSession
import pyspark.sql.functions as F
## Starting the spark session in the working environment
spark = sparknlp.start()
# Importing required Comet modules
import comet_ml
from sparknlp.logging.comet import CometLogger
现在,实验在彗星服务器上启动,使用户能够登录到他们的服务器上,并以一个独特的API密钥开始实验。同时,所有的日志文件被引导到一个目录,以监测服务器上的所有实验。
comet_ml.init(project_name='comet-with-sparknlp')
OUTPUT_LOG_PATH = './run'
现在,在服务器上设置的实验可以被验证其存在,其中服务器上的实验状态将被更新为实时,如下图所示。
logger = CometLogger()
从AWS服务器提取数据
curl shell命令用于从AWS服务器上提取训练数据,spark read函数用于读取与spark context对象有关的parquet数据,show()命令用于可视化顶级条目的数据框架。
!curl -O 'https://s3.amazonaws.com/auxdata.johnsnowlabs.com/public/resources/en/classifier-dl/toxic_comments/toxic_train.snappy.parquet'
train_df=spark.read.parquet("toxic_train.snappy.parquet").repartition(120)
train_df.show(5)
定义一个SparkNLP管道
在创建任何管道之前,必须进行适当的处理,以适应管道中的数据,预处理步骤由文档汇编器承担,以缩小数据,然后再将其纳入管道,标记器被用来标记文本文档,输出列被设置为标记文档。下面给出了后续的步骤。
doc = (DocumentAssembler().setInputCol("text").setOutputCol("document").setCleanupMode("shrink"))
## Creating a tokenizer instance
tokenizer = Tokenizer().setInputCols(["document"]).setOutputCol("token")
将SparkNLP与Tensorflow-Hub结合起来
由于我们正在处理文本数据和NLP模型,在这里TensorFlow-hub被用来整合彗星服务器上的NLP模型,如果需要的话,还可以无缝利用TensorFlow hub仓库中的任何预训练模型。因此,在这里,TensorFlow中心的通用句子编码器模块被用来与SparkNLP整合,以获得可用的数据。
univ_sent_enc = (UniversalSentenceEncoder.pretrained().setInputCols(["document"]).setOutputCol("sentence_embeddings"))
现在让我们使用TensorFlow中心库的多类分类器模型,因为我们有多个实例来分类从AWS服务器提供的数据,如下图所示。
multiClassifier = (MultiClassifierDLApproach().setInputCols("sentence_embeddings").setOutputCol("category").setLabelColumn("labels").setBatchSize(256)
.setMaxEpochs(15)
.setLr(1e-2)
.setThreshold(0.5)
.setShufflePerEpoch(False)
.setEnableOutputLogs(True)
.setOutputLogsPath(OUTPUT_LOG_PATH)
.setValidationSplit(0.2)
)
现在让我们在comet服务器上整合多分类器实例,让我们让comet服务器监控所进行的日志实验,如下图所示。
logger.monitor(OUTPUT_LOG_PATH, multiClassifier)
现在,让我们在管道中拟合训练数据和多分类器实例。
拟合SparkNLP管道中的数据
现在让我们看看在管道上拟合训练数据,管道的各个阶段包括拟合文档汇编器实例、句子编码器实例和多分类器实例,以及用于拟合训练数据的管道实例。
spark_nlp_pipe = Pipeline(stages=[doc, univ_sent_enc, multiClassifier])
model = spark_nlp_pipe.fit(train_df)
## Lets first direct to the run directory of the server
!ls ./run
现在让我们使用comet服务器的log_completed_run模块来记录服务器上创建的管道,如下图所示。
logger = CometLogger()
logger.log_completed_run('./run/MultiClassifierDLApproach_1d7c43772adc.log')
现在管道被记录在服务器上,记录在服务器上的实验可以被可视化,所有的管道参数都可以在工作环境中被可视化。
logger.experiment.display(tab='charts')
现在,由于管道与训练数据相匹配,让我们看看如何从AWS服务器获得测试数据,并从集成在彗星服务器中的模型获得预测结果。
从AWS服务器上获取测试数据
与获取训练数据类似,测试数据也是通过curl shell命令从AWS服务器上提取的,并使用spark context对象来读取数据集,如下所示。
!curl -O 'https://s3.amazonaws.com/auxdata.johnsnowlabs.com/public/resources/en/classifier-dl/toxic_comments/toxic_test.snappy.parquet'
test_df=spark.read.parquet("/content/toxic_test.snappy.parquet").repartition(10)
现在,这个测试数据框由管道中的模型看不到的数据组成,它将被用来从部署在管道中的模型中获得预测结果。但在从管道中的模型获得预测之前,让我们看看如何在服务器中记录各种参数以评估模型的性能
记录彗星服务器中的各种指标
为了评估和记录服务器中的参数,有必要将测试数据传递给模型,以获得预测结果,同时评估所需参数。
pred=model.transform(test_df)
由于这是一个spark的上下文对象,预测结果被转换为Pandas数据帧,以方便解释存在的多个类来对一个实例进行分类。
pred_df=pred.select('labels','category.result').toPandas()
pred_df.head()
我们可以看到,我们有多个标签需要分类,让我们使用scikit learn模块的MultiLabelBinarizer库对标签列进行二进制化或编码。
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer() ## Creating an instance
y_actual = mlb.fit_transform(pred_df['labels'])
y_predicted = mlb.fit_transform(pred_df['result'])
现在,每个类别标签的实际值和预测值都将使用分类报告进行评估。
from sklearn.metrics import classification_report
cr=classification_report(y_actual,y_predicted,output_dict=True)
for k,v in cr.items():
print('{} {}'.format(k,v))
现在我们已经获得了各种分类报告的指标,让我们把这些指标记录到彗星服务器上,从而修改管道中的模型。指标的记录可以用log_metrics()来完成,键和值对可以被记录到彗星记录器中。服务器中记录的指标可以使用彗星实验的显示功能进行可视化,并将标签声明为指标显示。
for k,v in cr.items():
logger.log_metrics(v,prefix=k)
logger.experiment.display(tab='metrics')
所以,现在我们对如何可视化模型的各种指标有了一个概念,让我们看看如何从彗星服务器中的管道获得预测结果。
使用管道来获得预测结果
SparkNLP支持各种预训练的模型,如命名实体识别模型和Bert模型。所以在这里我们使用了名为ner_dl的命名实体识别模型,该模型经过预训练,可以找到诸如人名、地名和组织的特征。因此,任何具有这些特征的文本文件(语料库)都可以使用ner_dl的预训练模型。
首先,让我们在一个字符串中提到我们使用的模型名称,然后使用WordEmbeddings函数进行必要的处理,设置适当的输入列和输出列。下面提到了要遵循的步骤。
embeddings=WordEmbeddingsModel.pretrained('glove_100d').setInputCols(["document", 'token']).setOutputCol("embeddings")
现在,预训练的模型在工作环境中可用,在这里我们设置了适当的输入函数,以传递给NER模型,以及使用中的模型所产生的输出,如下图所示。
ner_converter=NerConverter().setInputCols(['document', 'token', 'ner']).setOutputCol('ner_chunk')
现在让我们把所有的阶段添加到管道中,以便从服务器中的管道获得预测结果。
nlp_pipeline=Pipeline(stages=[doc,tokenizer,embeddings,ner_model,ner_converter])
因此,一旦管道的这些阶段被声明为一个空的spark数据框架,以适应管道。
empty_df = spark.createDataFrame([['']]).toDF('text')
pipeline_model = nlp_pipeline.fit(empty_df)
现在,任何文本文档都可以被推入数据框架,并在管道中使用预训练的NER模型来获得预测结果。
import pandas as pd
text_list=['Hi hello Good Morning!!. It is a beautiful day with a pleasant weather']
df = spark.createDataFrame(pd.DataFrame({'text': text_list}))
results = pipeline_model.transform(df)
results.show()
由于我们使用的是spark数据框,它不容易解释,为了方便解释,我们可以将spark数据框转换为pandas数据框,如下图所示,并解释每个阶段和每个阶段通过部署在comet服务器中的模型获得的预测结果。
res_df=results.toPandas()
res_df.head()
总结
这就是一个完整的SparkNLP管道是如何创建并部署在彗星服务器上的。彗星服务器的主要优势是持续监控管道的不同阶段或服务器中使用的模型的任何问题。所有的参数和整个管道都可以在服务器上访问,而不管访问的平台是什么,以及服务器上各种运行和实验记录的可解释性报告,以及彗星服务器上记录的各种参数的可解释性图表。
参考资料
The postHow to create and deploy NLP pipelines on comet server with SparkNLP?appeared first onAnalytics India Magazine.