使用擁抱臉變形金剛模型推理自然語言處理(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在每台機器上。提高並行性,可以使用階段告訴火花有多少任務調度運行/ 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“變形金剛”的味道。