模型推理使用hugging脸变换
文章展示使用Hugging脸变换器自然语言处理模型推理
hugging脸变换器提供管道类使用预培训模型推理变换管道支持广域NLP任务易用数据bricks
需求
ML流2.3
带Huging脸板的集群
变压器
库安装可用批量推理上头变压器
库预安装时间10.4LTSML广受欢迎的NLP模型对GPU硬件最有效使用,这样你就可以使用最近的GPU硬件取得最佳性能,除非使用专门优化用于CPUs模型
PandasUDFs分发Spark集群模型计算
实验预培训模型时可用熊猫UDFs包装模型并计算工人CPUs或GPUs熊猫UDFs向每位工人分发模型
并使用PandasUDF运行spark集群工人管道
导入熊猫原封pd发自变压器导入管道导入火炬发自pyspark.sql.functions导入熊猫+设备化=0if火炬.库达.可用性(b)其余-一号translation_pipeline=管道高山市任务设置="translation_en_to_fr",模型化=5基,设备化=设备化)Pandas_udf高山市串行)def翻译_udf高山市文本翻译:pd.串行)->pd.串行:翻译=[结果['translation_text'万事通For结果内translation_pipeline高山市文本翻译.to_list(b),批量大小=一号南都市返回pd.串行高山市翻译)
设置设备化
以这种方式确保GPUs使用,如果集群上有GPUs使用时使用GPUs
huggingFace管道翻译返回 Python列表插件
对象,每个带单键translation_text
并包含翻译文本值UDF提取结果翻译返回Pandas数列假设管道搭建时通过设置使用GPUs设备=0
spark自动重分派GPU使用工人节点
UDF翻译文本列时,可调用UDF选择
语句 :
文本翻译=[HuggingFace公司总部设在纽约市,数据机总部设在旧金山万事通df=点火.创建DataFrame高山市pd.数据Frame高山市文本翻译,列内=[文字类)显示器高山市df.选择高山市df.文本翻译,翻译_udf高山市df.文本翻译).化名高山市翻译))
返回复杂结果类型
使用pandasUDFs也可以返回更多结构化输出举例说,在命名实体识别中,管道返回列表插件
对象包含实体、区域、类型和关联评分相似翻译例子 返回类型Pandas_udf
名称实体识别的注解比较复杂
通过检验管道结果,例如对驱动程序运行管道,你可以得到返回类型使用感知
示例中使用下列代码
发自变压器导入管道导入火炬设备化=0if火炬.库达.可用性(b)其余-一号内流线=管道高山市任务设置=内人,模型化="Davlan/bert-base-multilingual-cased-ner-hrl",aggregation_strategy=简单化,设备化=设备化)内流线高山市文本翻译)
生成注解 :
[{{{实体组:ORG,数组:099933606,字类:抓脸,启动:0,端端:12},{{实体组:LOC,数组:099967843,字类:纽约市,启动:42号,端端:55号},{{{{}实体组:ORG,数组:996372,字类:数据架,启动:0,端端:10},{{实体组:LOC,数组:0999588,字类:旧金山,启动:23号,端端:36号} ]
表示返回类型时,可使用数组
联想struct系统
字段列表插件
项类字段struct系统
:
导入熊猫原封pd发自pyspark.sql.functions导入熊猫+Pandas_udf高山市数组
''
)defNer_udf高山市文本翻译:pd.串行)->pd.串行:返回pd.串行高山市内流线高山市文本翻译.to_list(b),批量大小=一号)显示器高山市df.选择高山市df.文本翻译,Ner_udf高山市df.文本翻译).化名高山市实体))
Tune性能
调优UDF性能有几个关键方面首先是有效使用每个GPU,通过修改变换者管道发送GPU批量大小可以调整第二点是确保DataFrame完全划分使用整个集群
最后,你或愿缓存Hugging脸模型以保存模型加载时间或反射成本
选择批量大小
上描述的UDF应用带批量大小
1中不得高效使用工人可使用的资源提高性能,批量大小与集群内模型和硬件相调Databricks建议试用多批量量管道查找最佳性能阅读更多有关管道批量并用性能选项huggingface文档
试找批量大小足够大,以便驱动全GPU使用CUDA外出联想内存
出错接受时CUDA外出联想内存
调试时出错时,你需要拆分并重新连接笔记本释放模型和GPU数据所用的存储器
监听GPU性能浏览直播集群度量集群选择量度,例如gpu0-unit
GPU处理器使用或gpu0_mem_u
GPU内存使用
Tune并行级调度
默认时,spark为每台机器安排一GPU任务增加并行性时,可使用级级调度来告诉spark每个GPU有多少任务运行举例说,如果想spark运行二任务/GPU, 您可以用下列方式指定此任务:
发自pyspark.resource导入TaskResourceRequests,ResourceProfileBuilder任务请求=TaskResourceRequests(b).资源库高山市哥浦,0.5)建设者=ResourceProfileBuilder(b)resource_profile=建设者.需求化高山市任务请求).构建dd=df.带Column高山市法理学,加载模式高山市struct系统高山市*地图显示高山市高山,df.列内)).dd.带资源高山市resource_profile)
重新划分数据使用所有可用硬件
第二项性能考量是充分利用集群硬件泛泛地说,小数GPU对您的员工(gPU集群)或核心数对您的集群中员工(cPU集群)效果良好输入DataFrame可能已经有足够的分区利用集群并行性查看多分区DataFrame使用df.rdd.getNumPartitions()
.可重划分数据Frame使用repartitioned_df=df.repartition(desired_partition_count)
.
DBFS或挂起点缓存模型
常加载不同或重开集群模型时,您可能还想缓存HuggingFace模型DBFS根卷或On挂起点.这会降低逆向成本并缩短模型加载新集群或重开集群的时间要做到这一点,设置TRANSFORMERS_CACHE
环境变量加载管道前编码
例举 :
导入ss系统ss系统.environ['TRANSFORMERS_CACHE'万事通='/dbfs/hugging_face_transformers_cache/'
或选,通过登录模型实现ML流MLFlor`transs'口味.