huggingface的transformers框架,囊括了BERT、GPT、GPT2、ToBERTa、T5等眾多模型,同時支持pytorch和tensorflow 2,代碼非常規范,使用也非常簡單,但是模型使用的時候,要從他們的服務器上去下載模型,那么有沒有辦法,把這些預訓練模型下載好,在使用時指定使用這些模型呢?答案是肯定的。本文就是要講明白這個問題。
1. 總覽
總體是,將所需要的預訓練模型、詞典等文件下載至本地文件夾中 ,然后加載的時候model_name_or_path參數指向文件的路徑即可。
2. 手動下載配置、詞典、預訓練模型等
首先打開網址:https://huggingface.co/models 這個網址是huggingface/transformers支持的所有模型,目前大約一千多個。搜索gpt2(其他的模型類似,比如bert-base-uncased等),並點擊進去。
進入之后,可以看到gpt2模型的說明頁,如下圖圖1,點擊頁面中的list all files in model,可以看到模型的所有文件。
通常我們需要保存的是三個文件及一些額外的文件,第一個是配置文件;config.json。第二個是詞典文件,vocab.json。第三個是預訓練模型文件,如果你使用pytorch則保存pytorch_model.bin文件,如果你使用tensorflow 2,則保存tf_model.h5。
額外的文件,指的是merges.txt、special_tokens_map.json、added_tokens.json、tokenizer_config.json、sentencepiece.bpe.model等,這幾類是tokenizer需要使用的文件,如果出現的話,也需要保存下來。沒有的話,就不必在意。如果不確定哪些需要下,哪些不需要的話,可以把圖1中類似的文件全部下載下來。
以下圖1為例,我們需要“右鍵”-“另存為”的文件是,config.json、vocab.json、pytorch_model.bin(或tf_model.h5)以及額外文件merges.txt。
下載到本地文件夾gpt2,同時這些名稱務必注意保證與圖1中的名稱完全一致。下圖圖2是gpt2文件下載至本地,又從本地上傳至我的服務器的樣例。圖中紅色框是必須的,綠色框是二選一,pytorch及tensorflow 2模型二選一使用,其他文件是非必須的。
圖1:下載配置、詞典、預訓練模型等
圖2:我下載gpt2模型至本地,又從本地上傳至服務器的截圖。其中紅色框是必須的,綠色框是二選一的,其他的是非必須的。其中merges.txt只有圖1中出現這個文件才需要下載,沒有的時候不用下載。
3. 使用下載好的本地文件
使用的時候,非常簡單。huggingface的transformers框架主要有三個類model類、configuration類、tokenizer類,這三個類,所有相關的類都衍生自這三個類,他們都有from_pretained()方法和save_pretrained()方法。
from_pretrained方法的第一個參數都是pretrained_model_name_or_path,這個參數設置為我們下載的文件目錄即可。
樣例一:
下面的代碼是使用GPT2去預測一句話的下一個單詞的樣例。這里的pytorch版本的,如果是tensorflow 2版本的,GPT2LMHeadModel.from_pretrained的參數需要額外加入from_tf=True。
import torch from transformers import GPT2Tokenizer, GPT2LMHeadModel # 從下載好的文件夾中加載tokenizer # 這里你需要改為自己的實際文件夾路徑 tokenizer = GPT2Tokenizer.from_pretrained('/dfsdata2/yucc1_data/models/huggingface/gpt2') text = 'Who was Jim Henson ? Jim Henson was a' # 編碼一段文本 # 編碼后為[8241, 373, 5395, 367, 19069, 5633, 5395, 367, 19069, 373, 257] indexed_tokens = tokenizer.encode(text) # 轉換為pytorch tensor # tensor([[ 8241, 373, 5395, 367, 19069, 5633, 5395, 367, 19069, 373, 257]]) # shape為 torch.Size([1, 11]) tokens_tensor = torch.tensor([indexed_tokens]) # 從下載好的文件夾中加載預訓練模型 model = GPT2LMHeadModel.from_pretrained('/dfsdata2/yucc1_data/models/huggingface/gpt2') # 設置為evaluation模式,去取消激活dropout等模塊。 # 在huggingface/transformers框架中,默認就是eval模式 model.eval() # 預測所有token with torch.no_grad(): # 將輸入tensor輸入,就得到了模型的輸出,非常簡單 # outputs是一個元組,所有huggingface/transformers模型的輸出都是元組 # 本初的元組有兩個,第一個是預測得分(沒經過softmax之前的,也叫作logits), # 第二個是past,里面的attention計算的key value值 # 此時我們需要的是第一個值 outputs = model(tokens_tensor) # predictions shape為 torch.Size([1, 11, 50257]), # 也就是11個詞每個詞的預測得分(沒經過softmax之前的) # 也叫做logits predictions = outputs[0] # 我們需要預測下一個單詞,所以是使用predictions第一個batch,最后一個詞的logits去計算 # predicted_index = 582,通過計算最大得分的索引得到的 predicted_index = torch.argmax(predictions[0, -1, :]).item() # 反向解碼為我們需要的文本 predicted_text = tokenizer.decode(indexed_tokens + [predicted_index]) # 解碼后的文本:'Who was Jim Henson? Jim Henson was a man' # 成功預測出單詞 'man' print(predicted_text)
樣例二:
huggingface/transformers官方樣例,使用gpt2進行文本生成。https://github.com/huggingface/transformers/tree/master/examples/text-generation
此處一樣使用將model_name_or_path參數改為文件夾的路徑即可。
python run_generation.py \ --model_type=gpt2 \ --model_name_or_path=/dfsdata2/yucc1_data/models/huggingface/gpt2
掌握了以上方法后,transformers庫、文檔里的其他樣例都是一樣的操作,無非是換個路徑及模型。
4. 我下載好的一些預訓練模型
大家按照上面的方法進行下載,並使用即可。
我自己也下載了一些常用的模型,上傳到百度網盤了,后期我自己使用到一些其他模型也會更新上去,如果大家想使用可以照着下面圖3的辦法獲得鏈接即可。
目前分享的鏈接里有的模型有:bert-base-cased、bert-base-uncased、bert-base-multilingual-cased、bert-base-multilingual-uncased、albert-base-v2、gpt2、microsoft/DialoGPT-small、microsoft/DialoGPT-medium、microsoft/DialoGPT-large、openai-gpt、roberta-base、xlm-roberta-base、xlm-roberta-large等。
圖3:關注並回關鍵字:huggingface,可以下載我分享的一些下載好的模型文件
5. 基本原理
使用的基本原理也非常簡單,from_pretrained的參數pretrained_model_name_or_path,可以接受的參數有幾種,short-cut name(縮寫名稱,類似於gpt2這種)、identifier name(類似於microsoft/DialoGPT-small這種)、文件夾、文件。
對於short-cut name或identifier name,這種情況下,本地有文件,可以使用本地的,本地沒有文件,則下載。一些常用的short-cut name,可以從這個鏈接查看:https://huggingface.co/transformers/pretrained_models.html。
對於文件夾,則會從文件夾中找vocab.json、pytorch_model.bin、tf_model.h5、merges.txt、special_tokens_map.json、added_tokens.json、tokenizer_config.json、sentencepiece.bpe.model等進行加載。所以這也是為什么下載的時候,一定要保證這些名稱是這幾個,不能變。
對於文件,則會直接加載文件。
官方給的樣例,通常都是short-cut name,這里操作就是替換成下載好文件的文件夾。至此,我們完成了模型、詞典等各種文件的本地加載。