跳轉到主要內容
工程的博客

開始使用NLP使用擁抱臉變形金剛管道

2023年2月6日 工程的博客

分享這篇文章

先進的自然語言處理(NLP)解鎖前所未有的機遇對企業價值的文本數據。自然語言處理可用於各種應用,包括文本摘要,命名實體識別(例如,人物和地點),情緒分類、文本分類、翻譯和回答問題。在許多情況下,您可以從機器學習模型,得到高質量的結果一直在以前訓練的大型文本數據集。許多這些pre-trained模型是可用的開源和免費使用。擁抱的臉這些模型是一個偉大的來源,他們的嗎變形金剛圖書館是一個易於使用的工具,還應用模型和適應他們自己的數據。還可以調整這些模型使用微調自己的數據。

例如,一個公司,一個支持團隊可以使用pre-trained模型提供人類可讀的文本的摘要幫助員工快速評估在支持情況下關鍵問題。這個公司還可以方便地培養世界級的分類算法的基礎上,隨時可用的基礎模型自動分類支持數據到他們內部分類法。

磚是一個很好的擁抱臉變壓器運行的平台。Beplay体育安卓版本先前的磚的文章討論了變壓器的使用pre-trained模型推理微調,但本文鞏固這些最佳實踐優化性能和易用性Lakehouse在處理變壓器。這個文檔包含內聯代碼示例和解釋這些最佳實踐,和磚也提供了完整的筆記本電腦的例子pre-trained模型推理微調

使用pre-trained模型

For many applications, such as sentiment analysis and text summarization, pre-trained models work well without any additional model training. Transformers管道包裝所需的各種組件推理文本到一個簡單的接口。對於許多NLP任務,這些組件包括一個記號賦予器和一個模型。管道編碼最佳實踐,因此很容易開始。例如,管道很容易使用GPU時可用,讓批處理的物品發送到GPU更好的吞吐量。

變形金剛進口管道進口火炬#使用GPU如果可用設備=0如果torch.cuda.is_available ()其他的- - - - - -1史書=管道(“摘要”設備=設備)

分發火花的推理,磚建議封裝一個管道熊貓UDF。火花有效使用廣播傳輸所需的任何對象熊貓udf對職工節點。火花也自動重新分配gpu的工人,所以您可以使用一個multi-GPU多機集群無縫。

進口熊貓作為pdpyspark.sql.functions進口pandas_udf@pandas_udf (“字符串”)defsummarize_batch_udf(文本:pd.Series)- > pd.Series:管=史書(texts.to_list(),截斷=真正的batch_size =1)摘要=[摘要[“summary_text”]總結管)返回pd.Series(總結)摘要= df.select (df。文本,summarize_batch_udf df.text .alias (“摘要”))

下麵是一個示例概要的快照維基百科文章樂隊能源果園。請注意,我們沒有清理維基百科標記之前通過史書。

生能源果園維基百科文本
生能源果園維基百科文本
輸出總結
輸出總結

本節演示了是多麼容易開始大規模使用擁抱臉變形金剛來處理文本數據磚。接下來的小節描述如何進一步優化這些模型的性能。

性能調優

有兩個關鍵方麵的調優性能UDF。首先,你想要有效地使用每一個GPU,你可以通過改變批量的大小調整尺寸的物品發送到GPU的變形金剛。第二,確保你的dataframe well-partitioned利用整個集群。

你的UDF應該和一個現成的工作batch_size為1。然而,這可能不是有效地利用可用的資源來的工人。改進的性能,您可以調整批量大小,您所使用的模型和硬件。磚建議嚐試不同批量大小對集群的管道來找到最好的性能。閱讀更多關於管道配料和其他性能選項在擁抱的臉上文檔。你可以通過查看現場監控GPU性能指標一個集群,如“Per-GPU利用率”或“Per-GPU內存利用率(%)”。

GPU的利用率
GPU的利用率

優化批量大小的目標是把它足夠大,這樣驅動器充分利用GPU但不會導致“CUDA記憶”錯誤。

充分利用集群的硬件,您可能需要重新分配你的火花DataFrame。一般的倍數GPU的數量在你的工人(GPU集群)或集群的核心員工人數(CPU集群)在實踐中是有效的。使用其他UDF使用UDF是相同的火花。例如,您可以使用它在一個select語句來創建一個列模型推理的結果。

示例= sample.repartition (32)摘要= sample.select(樣本。文本,summarize_batch_udf sample.text .alias (“摘要”))

包裝預構建的模型作為MLflow模型

存儲pre-trained模型作為MLflow模型使它更容易為批處理或部署模型實時推理。這也使得模型版本通過模型注冊,簡化了模型加載代碼推理工作負載。

第一步是創建一個自定義為您的管道模型,加載模型的封裝,初始化GPU使用量,和推理功能。

進口mlflowSummarizationPipelineModel(mlflow.pyfunc.PythonModel):defload_context(自我,上下文):設備=0如果torch.cuda.is_available ()其他的- - - - - -1自我。管道=管道(“摘要”,context.artifacts [“管道”),設備(設備)def預測(自我,上下文,model_input):文本= model_input.iloc [:,0].to_list ()#第一列管=自我。管道(texts, truncation=真正的batch_size =8)摘要=[摘要[“summary_text”]總結管)返回pd.Series(總結)

代碼密切相似的代碼創建和使用一個pandas_udf上麵列出。一個區別是,管道從文件加載MLflow模型可用的上下文。這是提供給MLflow登錄時一個模型。擁抱的臉變形金剛管道很容易將模型保存到一個本地文件的司機,然後傳遞到log_model函數MLflow pyfunc接口。

summarizer.save_pretrained (”。/管道”)mlflow.start_run ()作為運行:mlflow.pyfunc.log_model(工件= {“管道”:”。/管道”},artifact_path =“summarization_model”python_model = SummarizationPipelineModel ())

批處理使用MLflow模型推理

MLflow提供了一種簡便的接口,任何登錄或注冊模型加載到火花UDF。你可以查找一個模型的URI模式注冊或登錄實驗運行界麵。

logged_model_uri =f: /{run.info.run_id}/ summarization_model”loaded_model = mlflow.pyfunc。spark_udf(火花,model_uri = logged_model_uri result_type =“字符串”)摘要= df.select (df。標題、df。文本,loaded_model df.text .alias (“摘要”))

Fine-tuning models on a single machine using Transformers Trainer

有時pre-trained模型不滿足您的需要開箱即用的,你必須調整自己的數據模型。例如,您可能想要創建一個文本分類器基於一個基礎模型,將支持門票分為支持團隊的本體,或者您可能希望創建一個自定義垃圾郵件分類器在你的數據。

你不需要離開磚以微調您的模型。對於中等大小的數據集,您可以在單個機器上與GPU的支持。擁抱的臉變形金剛教練工具很容易設置和執行模型的訓練。對於更大的數據集,數據磚也支持分布式多機multi-GPU深度學習

流程如下:創建一個單獨的機器集群在GPU的支持下,準備和下載數據集的驅動程序,執行模型使用教練培訓,MLflow和日誌生成的模型。

準備和下載數據

先格式化你的訓練數據導入表中滿足教練的期望。對文本分類來說,這是一個表有兩列:文本列和列標簽。在我們的例如筆記本電腦我們加載一些垃圾短信數據:

準備和下載數據

擁抱臉變壓器提供AutoModelForSequenceClassification作為文本分類模型加載程序,預計整數id分類標簽。然而,您還必須指定映射的整數字符串標簽,標簽和回來。如果你有一個DataFrame字符串標簽,您可以收集這些信息如下:

標簽=sms.select (sms.label) .groupBy (sms.label)。()。收集()id2label={指數:row.label(指數,)列舉(標簽)}label2id={行。標簽:指數(指數,)列舉(標簽)}

然後創建整數id作為一個標簽欄pandas_udf:

pyspark.sql.functions進口pandas_udf進口熊貓作為pd@pandas_udf (“整數”)defreplace_labels_with_ids(標簽:pd.Series)- > pd.Series:返回labels.apply (λx: label2id [x])sms_id_labels = sms.select (replace_labels_with_ids sms.label .alias (“標簽”),sms.text)

將數據分為訓練/測試。

(火車、測試)= sms_id_labels.randomSplit ([0.8, 0.2])

然後,您可以使用數據集實用程序來創建培訓和評估數據集。指定一個DBFS緩存目錄可以有效地在未來下載數據集和重用它。

進口數據集train_dataset = datasets.Dataset.from_spark(火車,cache_dir =“/ dbfs /緩存/列車”)test_dataset = datasets.Dataset.from_spark(測試,cache_dir =“/ dbfs /緩存/測試”分=“測試”)

模型預計標記化的輸入,而不是下載的文本數據。以確保兼容性的基本模型,使用AutoTokenizer從基地加載模型。HuggingFace數據集允許您直接申請記號賦予器不斷的訓練和測試數據。

變形金剛進口AutoTokenizer
              記號賦予器= AutoTokenizer.from_pretrained (base_model)deftokenize_function(例子):返回記號賦予器(例子[“文本”),填充=截斷=真正的)train_tokenized = train_dataset。地圖(tokenize_function,成批的=真正的)

構建一個教練

教練類需要用戶提供指標、基本模型和配置培訓。默認情況下,培訓師將計算和使用損失作為指標,這不是很可判斷的。下麵是一個例子創建度量函數,將另外計算精度在模型訓練。

進口numpy作為np進口評估度量= evaluate.load (“準確性”)defcompute_metrics(eval_pred):分對數、標簽= eval_pred預測= np。argmax(分對數,軸= -1)返回metric.compute(= =預測,預測引用標簽)

對於文本分類,使用AutoModelForSequenceClassification加載文本分類的基本模型。你這裏提供類的數量和標簽映射。

變形金剛進口AutoModelForSequenceClassification模型= AutoModelForSequenceClassification.from_pretrained (base_model num_labels =2label2id = label2id id2label = id2label)

最後,你必須創建培訓配置。的TrainingArguments類允許輸出目錄的規範,評估策略、學習速率等參數

變形金剛進口TrainingArguments,教練training_output_dir =“sms_trainer”training_args = TrainingArguments (output_dir = training_output_dir evaluation_strategy =“時代”)

使用一個數據排序器批量輸入訓練和評估數據集。使用DataCollatorWithPadding違約給好的基線文本分類的性能。

變形金剛進口DataCollatorWithPaddingdata_collator = DataCollatorWithPadding(記號賦予器)

所有這些參數構建,您現在可以創建一個教練。

教練=教練(模型=模型,args = training_args,train_dataset = train_test_dataset [“訓練”),eval_dataset = train_test_dataset [“測試”),compute_metrics = compute_metrics,data_collator = data_collator,)

培訓和運行記錄模型

擁抱臉接口好MLflow,自動記錄指標在模型訓練使用MLflowCallback。但是,你必須自己日誌訓練模型。類似於上麵的示例中,磚建議包裝變形金剛管道中的訓練模型和使用MLflow pyfunclog_model功能。所以你需要一個自定義的模型類。

進口mlflow進口火炬pipeline_artifact_name =“管道”TextClassificationPipelineModel(mlflow.pyfunc.PythonModel):defload_context(自我,上下文):設備=0如果torch.cuda.is_available ()其他的- - - - - -1自我。管道=管道(“文本分類”,context.artifacts [管道_artifact_name], device=device)def預測(自我,上下文,model_input):文本= model_input [model_input.columns [0]].to_list ()管=自我。管道(texts, truncation=真正的batch_size =8)標簽=[預測[“標簽”]預測管)返回pd.Series(標簽)

包裝mlflow運行培訓,構建一個變形金剛管道從記號賦予器和訓練模型,編寫本地磁盤。最後,日誌MLflow的模型。

變形金剛進口管道model_output_dir =”。/ sms_model”pipeline_output_dir =”。/ sms_pipeline”model_artifact_path =“sms_spam_model”mlflow.start_run ()作為運行:trainer.train ()trainer.save_model (model_output_dir)管=管道(“文本分類”模型= AutoModelForSequenceClassification.from_pretrained (model_output_dir) batch_size =8記號賦予器=記號賦予器)pipe.save_pretrained (pipeline_output_dir)mlflow.pyfunc.log_model(工件= {pipeline_artifact_name:pipeline_output_dir}, artifact_path = model_artifact_path python_model = TextClassificationPipelineModel ())

加載模型推理一樣加載MLflow包裹pre-trained模型。

logged_model =“運行:/ {run_id} / {model_artifact_path}”格式(run_id = run.info.run_id model_artifact_path = model_artifact_path)#負荷模型作為引發UDF。覆蓋result_type如果模型不返回值的兩倍。sms_spam_model_udf = mlflow.pyfunc。spark_udf(火花,model_uri = logged_model result_type =“字符串”)測試= test.select(測試。文本、測試。標簽,sms_spam_model_udf test.text .alias (“預測”))顯示器(測試)

培訓和運行記錄模型

本節演示了如何直接使用擁抱臉變壓器教練api來調整一個新的文本分類問題的模型。你可以調整更多的NLP模型廣泛的任務,和AutoModel類自然語言處理提供一個很好的基礎。

結論

這篇文章演示了一些最佳實踐和顯示是多麼容易開始使用變形金剛磚NLP的任務。

推理的要點回憶:

  • 變形金剛管道使其易於使用的變壓器模型,
  • 如果需要重新分配你的數據利用完整的集群,
  • 您可以優化您的批量大小gpu的有效利用,
  • 火花自動分配GPU上考查GPU集群,
  • 熊貓udf廣播和批處理數據管理模型,和
  • 管道簡化測井MLflow變壓器模型。

單機模型的要點回憶培訓:

  • 變形金剛運動鞋提供了一個可訪問的方法來調整模型,
  • Prepare your datasets on Spark, mapping any labels to ids if needed for the modeling task, leaving tokenization to Transformers,
  • 使司機的文件係統可用的數據集,
  • 標記數據集使用AutoTokenizer加載正確的記號賦予器為模型,
  • 使用教練進行微調,
  • 從記號賦予器和調整模型,構造一個管道
  • 日誌模型MLflow使用自定義模型包裝管道。

磚繼續投資比例模型訓練和簡單方法推理磚。Stay tuned for improvements to data loading, distributed model training, and storing Transformers pipelines and models as MLflow models.

開始使用這些例子,進口這些筆記本使用pre-trained模型微調

免費試著磚

相關的帖子

看到所有工程的博客的帖子
Baidu
map