GPU-accelerated情緒分析使用Pytorch和Huggingface磚
2021年的10月28日 在工程的博客
情緒分析通常用於分析情緒現在身體內的文本,從複習一下,電子郵件或微博。基於深度學習技術是最受歡迎的方法之一來執行這樣的分析。然而,這些技術往往非常計算密集型和經常需要使用gpu,取決於所使用的體係結構和嵌入。Huggingface (https://huggingface.co)已經建立一個框架與變壓器包使訪問這些嵌入的無縫和可再生的。在這個工作中,我說明了如何執行可伸縮的情緒分析通過使用Huggingface包內PyTorch磚和利用毫升運行時環境和基礎設施。
情緒分析
情感分析是一個過程,估算用戶的情緒的極性,(即用戶是否感覺積極的還是消極的從一個文檔或文本)。中性的情緒也可以有第三類占一個可能沒有表達出一種強烈的可能性有關主題積極或消極的情緒。情感分析是一種意見挖掘但不同於立場或檢測方麵,用戶的立場對某一方麵或特征提取。
例如,下麵的句子是壓倒性的積極的情緒:
“這家餐廳是偉大的”
然而,考慮一下下麵的句子:
“餐廳很棒,但位置可能更好”
很難估計情緒,但是用戶的立場對於餐館通常可以被看作是積極的,盡管他們的立場對於位置是負麵的。總而言之,情緒分析提供粗粒度的信息盡管姿態檢測提供了有關某些方麵的更多信息。
情緒分析可以用來確定對於特定產品客戶的情緒,公眾對事件的反應等。
類型的情緒分析
情緒分析可以執行使用lexicon-based技術或基於機器學習技術。Lexicon-based技術使用pre-labeled詞彙估計情緒從文本。各種技術用於聚合個人情緒的情緒分配給的。這類的一些流行的框架SentiNet和AFINN。維德NLTK,開源包,是另一個例子是專門用於分析社會媒體文章。基於機器學習情緒分析使用pre-trained嵌入以及深度學習(DL)架構來推斷文本的情感於一體。在這個博客中,我們將隻討論通過嵌入可以從Huggingface ML-based技術。情緒分析模型,由建築和嵌入,可以進行調整如果領域特定標簽的數據是可用的。通常的情況是,這種監督訓練可以提高性能即使隻有少量的帶安全標簽的數據是可用的。嵌入如艾爾摩,伯特和羅伯塔是可用的一些普遍語言嵌入。
介紹了變形金剛
Huggingface提供一個框架,旨在規範使用和共享模型的過程。這使它容易與各種不同的模型實驗通過一個易於使用的API。變形金剛包可供Pytorch和Tensorflow,然而我們在這篇文章中使用Python庫Pytorch。最簡單的方法使用變壓器包執行推理如下所示。
從變形金剛進口AutoModelForSequenceClassification從變形金剛進口AutoTokenize模型=“distilbert-base-uncased-finetuned-sst-2-english”記號賦予器= AutoTokenizer.from_pretrained(模型)= AutoModelForSequenceClassification.from_pretrained模型(模型)tokenized_text =記號賦予器(“Hello world”,填充=真正的return_tensors =“pt”)輸出=模型(tokenized_text [' input_ids '])pt_predictions = nn.functional.softmax(輸出。分對數,昏暗的=1)
看著上麵的示例中,我們注意到兩個進口記號賦予器和一個模型類。我們可以實例化這些通過指定某個pre-trained伯特等模型。你可以搜索一個模型在這裏。然後通過一個字符串序列記號賦予器標記並指定結果應該墊和張量作為Pytorch返回。我們的標記化的結果是一個對象提取編碼文本並將其傳遞給模型。模型的結果會通過一個softmax層的情緒分析規範化的結果作為一個情緒得分。
(多)GPU-enabled推理
推理的過程包括以下組件:
- Dataloader為批標記化的服務數據
- 執行推理的模型類
- 在GPU並行模型的設備
- 遍曆數據推理和提取結果
Dataloader
Pytorch使用Dataloader抽象提取批數據用於訓練或推理的目的。需要一個類的對象作為輸入,擴展了數據集的類。這裏我們稱之為類“TextLoader”。有必要在課上至少有兩種方法:
(一)__len__():返回整個數據的長度
(b) __getitem__():提取並返回一個元素的數據
模型=“distilbert-base-uncased-finetuned-sst-2-english”類TextLoader(數據集):def__init__(自我,文件=沒有一個變換=沒有一個target_transform =沒有一個記號賦予器=沒有一個):自我。文件=pd.read_json(file, lines=真正的)自我。文件=自我。文件自我。文件=tokenizer(列表(self.file [“full_text”]),填充=真正的截斷=真正的max_length =512年return_tensors =“pt”)自我。文件=自我。文件[“input_ids”]自我。變換=變換自我。target_transform = target_transformdef__len__(自我):返回len(self.file)def__getitem__(自我,idx):data = self.file [idx]返回(數據)
現在Dataloader接受這個類的對象實例命名為“數據”,隨著批量大小的數據加載在一個迭代。注意,我這裏有“洗牌”標誌設置為False,因為我們想保持數據的順序。
Dataloader自動處理數據的部門,它接收利用GPU的每個設備。如果數據不整除,它提供了選擇要麼刪除元素或墊一批與重複的數據點。這是你要記住,尤其是在推斷或預測的過程。
記號賦予器= AutoTokenizer.from_pretrained(模型)data = TextLoader(文件= = ' / PATH_TO /文件。txt”,記號賦予器=記號賦予器)train_dataloader = DataLoader(數據、batch_size = 120洗牌= False) #洗牌應該設置為False
模型類
模型類相當類似於上麵的代碼,我們看到,唯一的區別是,現在包裹在神經網絡。模塊類。初始化模型定義在__init__和遠期從Huggingface加載方法應用模型。
類SentimentModel(nn.Module):def__init__(自我):超級(自我SentimentModel) . __init__ ()自我。= AutoModelForSequenceClassification.from_pretrained模型(模型)def向前(自我,輸入):輸出= self.model (輸入)pt_predictions = nn.functional.softmax(輸出。分對數,昏暗的=1)返回(pt_predictions)
model3 = SentimentModel ()
模型並行化和GPU調度
在Pytorch,創建一個模型或變量,需要顯式地分派到GPU。這可以通過使用“文(cuda)方法。如果你有多個gpu,你甚至可以指定的設備id為“為了(cuda: 0)”。另外,為了從數據並行性和運行培訓或推理在所有集群GPU設備,必須包裝在“DataParallel”模型。
雖然這段代碼假定你有一個以上的GPU集群,如果情況並非如此,唯一的改變需要“device_ids”[0]或不指定參數(默認GPU設備將自動選擇)。
dev =cuda的如果dev = =“cpu”:設備= torch.device (“cpu”)device_staging =cpu: 0的其他的:設備= torch.device (cuda的)device_staging =的cuda: 0試一試:model3 = nn。DataParallel (model3 device_ids = [0,1,2,3])model3.to (device_staging)除了:torch.set_printoptions(閾值=10000年)
迭代循環
以下循環遍曆批次的數據,將數據傳輸到GPU設備之前通過模型傳遞數據。結果然後連接,這樣他們可以導出到一個數據存儲。
出=torch.empty (0,0)為數據在train_dataloader:輸入=data.to (device_staging)如果(len (出)==0):出=model3(輸入)其他的:輸出=model3(輸入)與torch.no_grad ():出=torch.cat ((出、輸出),0)文件=”/PATH_TO/FILE.txt”df = pd。read_json(文件,行= True) ['full_text'].numpy res = out.cpu () ()df_res = pd.DataFrame ({“文本”:df,“負麵”:res (:,0],“積極的”:res (:,1]})顯示器(df_res)
大量的文件可伸縮的推理
在上麵的示例中,數據從一個文件中讀,然而,在處理大量數據時,不太可能所有這些數據可以在一個單一文件。下麵顯示了整個代碼的變化強調使用Dataloader多個文件。
模型=“distilbert-base-uncased-finetuned-sst-2-english”defget_all_files():file_list = [“/道路/ FILE1”,“/道路/ FILE2”,/道路/ FILE3的]返回(file_list)類TextLoader(數據集):def__init__(自我,文件=沒有一個變換=沒有一個target_transform =沒有一個記號賦予器=沒有一個):自我。文件=pd.read_json(file, lines=真正的)自我。文件=自我。文件自我。文件=tokenizer(列表(self.file [“full_text”]),填充=真正的截斷=真正的max_length =512年return_tensors =“pt”)自我。文件=自我。文件[“input_ids”]自我。變換=變換自我。target_transform = target_transformdef__len__(自我):返回len(self.file)def__getitem__(自我,idx):data = self.file [idx]返回(數據)類SentimentModel(nn.Module):def__init__(自我):超級(自我SentimentModel) . __init__ ()自我。= AutoModelForSequenceClassification.from_pretrained模型(模型)def向前(自我,輸入):輸出= self.model (輸入)pt_predictions = nn.functional.softmax(輸出。分對數,昏暗的=1)返回(pt_predictions)dev =cuda的如果dev = =“cpu”:設備= torch.device (“cpu”)device_staging =cpu: 0的其他的:設備= torch.device (cuda的)device_staging =的cuda: 0記號賦予器= AutoTokenizer.from_pretrained(模型)all_files = get_all_files ()model3 = SentimentModel ()試一試:model3 = nn。DataParallel (model3 device_ids = [0,1,2,3])model3.to (device_staging)除了:torch.set_printoptions(閾值=10000年)為文件在all_files:data = TextLoader(文件=文件,編譯器=記號賦予器)train_dataloader = DataLoader(數據,batch_size =120年洗牌=假)#洗牌應該設置為False
= torch.empty (0,0)為數據在train_dataloader:輸入= data.to (device_staging)如果(len= =0):= model3 (輸入)其他的:輸出= model3 (輸入)與torch.no_grad ():=火炬。貓((輸出),0)df = pd。read_json(文件,行=真正的)[“full_text”].numpy res = out.cpu () ()df_res = pd.DataFrame ({“文本”:df,“負麵”:res (:,0),“積極的”:res (:,1]})
結論
我們討論了如何使用Huggingface框架執行使用Pytorch情緒分析。此外,它展示了如何使用gpu加速這個推理過程。磚的使用平台的運行時容易毫升和可用性的gpu方便試驗Beplay体育安卓版本和部署這些解決方案。
更多細節,請查看附加的筆記本!