使用拥抱脸变形金刚模型推理自然语言处理(NLP)
本文向您展示了如何使用拥抱脸变形金刚为自然语言处理(NLP)模型推理。
变压器提供了拥抱的脸管道class to use the pre-trained model for inference. Transformers pipelines support a广泛的NLP的任务你可以很容易地使用砖。
需求
MLflow 2.3
任何集群拥抱的脸
变形金刚
图书馆安装可用于批量推理。的变形金刚
图书馆是预装在砖运行时10.4 LTS毫升以上。许多流行的NLP模型GPU硬件上效果最好,所以你可能获得最佳性能使用最近的GPU硬件,除非你使用一个cpu上专门为使用优化模型。
使用熊猫udf分发模型计算集群火花
当尝试pre-trained模型可以使用熊猫udf包装模型和对工人的cpu或gpu执行计算。熊猫udf模型分发给每个工人。
您还可以创建一个拥抱熊猫脸变形金刚管道机器翻译和使用UDF运行管道的工人火花集群:
进口熊猫作为pd从变形金刚进口管道进口火炬从pyspark.sql.functions进口pandas_udf设备=0如果火炬。cuda。is_available()其他的- - - - - -1translation_pipeline=管道(任务=“translation_en_to_fr”,模型=“t5-base”,设备=设备)@pandas_udf(“字符串”)deftranslation_udf(文本:pd。系列)- >pd。系列:翻译=(结果(“translation_text”]为结果在translation_pipeline(文本。to_list(),batch_size=1)]返回pd。系列(翻译)
设置设备
以这种方式可以确保使用gpu集群是否可用。
拥抱面临管道翻译返回一个Python列表dict
对象,每一个关键translation_text
包含翻译文本和一个值。该UDF提取结果返回一个熊猫系列的翻译与翻译文本。如果你的管道建成使用gpu通过设置设备= 0
工作节点上,然后火花自动抽调gpu如果你与多个gpu集群实例。
使用UDF翻译文本列中,您可以调用UDF选择
声明:
文本=(“拥抱的脸是一个法国公司,总部在纽约。”,“砖是位于旧金山。”]df=火花。createDataFrame(pd。DataFrame(文本,列=(“文本”)))显示(df。选择(df。文本,translation_udf(df。文本)。别名(“翻译”)))
返回复杂结果类型
使用熊猫udf还可以返回更加结构化的输出。例如,在命名实体识别、管道返回的列表dict
对象包含的实体,其跨度、类型和一个相关的得分。虽然类似于翻译的例子,但返回类型的@pandas_udf
注释是更复杂的命名实体识别。
你可以得到的返回类型使用通过管道的检查结果,例如通过运行管道的司机。
在这个例子中,使用以下代码:
从变形金刚进口管道进口火炬设备=0如果火炬。cuda。is_available()其他的- - - - - -1ner_pipeline=管道(任务=“尼珥”,模型=“Davlan / bert-base-multilingual-cased-ner-hrl”,aggregation_strategy=“简单”,设备=设备)ner_pipeline(文本)
产量注释:
[[{“entity_group”:“ORG”,“分数”:0.99933606,“词”:“拥抱”的脸,“开始”:0,“结束”:12},{“entity_group”:“疯狂的”,“分数”:0.99967843,“词”:“纽约”,“开始”:42,“结束”:55}),[{“entity_group”:“ORG”,“分数”:0.9996372,“词”:“砖”,“开始”:0,“结束”:10},{“entity_group”:“疯狂的”,“分数”:0.999588,“词”:“旧金山”,“开始”:23,“结束”:36}]]
表示这是一个返回类型,您可以使用一个数组
的结构体
字段,清单dict
条目的字段结构体
:
进口熊猫作为pd从pyspark.sql.functions进口pandas_udf@pandas_udf(字符串的数组< struct <词,entity_group字符串,分数浮动,开始整数,整数结束> >”)defner_udf(文本:pd。系列)- >pd。系列:返回pd。系列(ner_pipeline(文本。to_list(),batch_size=1))显示(df。选择(df。文本,ner_udf(df。文本)。别名(“实体”)))
优化性能
有几个关键方面来优化性能的UDF。首先是有效地使用每一个GPU,你可以调整通过改变大小批量发送到GPU的变形金刚。二是确保DataFrame well-partitioned利用整个集群。
最后,您可能希望缓存拥抱脸模型保存模型加载时间或进入成本。
选择一个批量大小
虽然上述udf应该和一个现成的工作batch_size
1,这可能不使用可用的资源来有效的工人。为了提高性能,优化批量大小的模型和硬件集群。砖建议尝试不同批量大小对集群的管道来找到最好的性能。阅读更多关于管道配料和其他性能选项在拥抱的脸上文档。
尝试找到一个足够大的批量大小,驱动器充分利用GPU但不会导致CUDA出的内存
错误。当你收到CUDA出的内存
错误在调优,你需要分离和重新接上笔记本释放内存使用的模型和数据的GPU。
通过查看现场监控GPU性能集群指标为一个集群,并选择一个度量,如gpu0-util
GPU处理器利用率或gpu0_mem_util
GPU内存利用率。
与阶段调度优化并行性
默认情况下,火花安排一个任务/ GPU在每台机器上。提高并行性,可以使用阶段告诉火花有多少任务调度运行/ GPU。例如,如果你想每GPU火花运行两个任务,您可以指定在以下方式:
从pyspark.resource进口TaskResourceRequests,ResourceProfileBuildertask_requests=TaskResourceRequests()。gpu(0.5)构建器=ResourceProfileBuilder()resource_profile=构建器。需要(task_requests)。构建抽样=df。withColumn(“预测”,loaded_model(结构体(*地图(上校,df。列))))。抽样。withResources(resource_profile)
重新分配数据使用所有可用的硬件
第二个考虑硬件的性能充分利用集群。一般来说,一个小的倍数GPU的数量在你的工人(GPU集群)或集群的核心员工人数(CPU集群)的作品。输入DataFrame可能已经有足够的分区利用集群的并行性。看到DataFrame包含多少个分区,使用df.rdd.getNumPartitions ()
。你可以重新分配DataFrame使用repartitioned_df=df.repartition (desired_partition_count)
。
缓存模型在DBFS或挂载点
如果你经常加载模型从不同或重新启动集群,您可能还希望缓存拥抱脸部模型DBFS根卷或在一个挂载点。这可以减少进入成本和减少负荷模型的时间在一个新的或重新启动集群。为此,设置TRANSFORMERS_CACHE
环境变量在代码在装货前的管道。
例如:
进口操作系统操作系统。环境(“TRANSFORMERS_CACHE”]=“/ dbfs / hugging_face_transformers_cache /”
或者,您也可以获得类似的结果记录MLflow与模型MLflow“变形金刚”的味道。