
嘗試在Kaggle中的新40B LLMS演示
在多個GPU上以一條潛在的線性加速運行多個GPU上的大型Pytorch型號。
import transformers
import tensor_parallel as tp
tokenizer = transformers . AutoTokenizer . from_pretrained ( "facebook/opt-13b" )
model = transformers . AutoModelForCausalLM . from_pretrained ( "facebook/opt-13b" ) # use opt-125m for testing
model = tp . tensor_parallel ( model , [ "cuda:0" , "cuda:1" ]) # <- each GPU has half the weights
inputs = tokenizer ( "A cat sat" , return_tensors = "pt" )[ "input_ids" ]. to ( "cuda:0" )
outputs = model . generate ( inputs , num_beams = 5 )
print ( tokenizer . decode ( outputs [ 0 ])) # A cat sat on my lap for a few minutes ...
model ( input_ids = inputs , labels = inputs ). loss . backward () # training works as usual 最新穩定版本(推薦):
pip install tensor_parallel
出血邊緣版本:
pip install https://github.com/BlackSamorez/tensor_parallel/archive/main.zip
只需將pytorch型號與tp.tensor_parallel包裝並正常使用。為了獲得最佳內存效率,請在模型仍在CPU上時致電tp.tensor_parallel 。
以下是一些用例:
examples/training_flan-t5-xl.ipynb在文本摘要中微調完整的flan-t5型號tensor_parallel int8 LLM使用llm.8bit + tensor_parallel的適配器調整大語言模型高級參數到tensor_parallel :
device_ids: List[device] - 要使用的設備;默認為所有可用的GPUoutput_device: device - 模型輸出將具有此設備tensor_parallel_config: tp.Config使用自定義並行策略,請參閱slicing_configs.pydistributed: bool如果為true,請使用Torch.Distribed Backend而不是線程(需要torchrun )sharded: bool如果是的,請找到所有不被張量並行性拆分的可訓練參數,並使用零3算法將它們分開。sharded_param_names: List[str] - 應該以這種方式碎片的參數名稱,默認=自動找到為了保存模型,可以在非tensor_parallel上下文中使用,您應該使用save_tensor_parallel上下文包裝器。
import torch
import transformers
import tensor_parallel as tp
model = tp . tensor_parallel (
transformers . AutoModelForCausalLM . from_pretrained ( "facebook/opt-13b" ),
)
# A whole lot of trainig...
with tp . save_tensor_parallel ( model ):
torch . save ( model . state_dict (), "/tmp/" )
# or
model . save_pretrained ( "/tmp/" )這樣的代碼保存了模型,就好像從未分開。它通過在state_dict創建期間收集模型零件來起作用。
通常,要通常創建並調度tensor_parallel模型,一個人需要內存中的整個模型。這可能很麻煩,但是還有另一種方法。
可以使用助手函數convert_state_dict將基本模型的state_dict轉換為相應的tensor_parallel state_dict 。然後可以將狀態DICE分配到模型中:
import accelerate
import transformers
import tensor_parallel as tp
# Initialize a weightless tensor_parallel model from MyModel
with accelerate . init_empty_weights ():
model = tp . TensorParallel (
MyModel (),
device_ids = [ 0 , 1 ] # and prepare it to be put on GPUs 0 and 1
)
# Load partial state_dict for MyModel
state_dict = torch . load ( "my_model_part_1_of_5.bin" )
# Convert it into a tensor_parallel state_dict
tensor_parallel_state_dict = tp . convert_state_dict (
state_dict ,
tensor_parallel_config = model . tensor_parallel_config ,
world_size = len ( model . devices ),
)
# Dispatch the partial state_dict (load_state_dict doesn't work with meta so here I use accelerate)
device_map = tp . infer_sharded_device_map ( model )
for param_name , param in state_dict . items ():
module_name = param_name
while len ( module_name ) > 0 and module_name not in device_map :
module_name = "." . join ( module_name . split ( "." )[: - 1 ])
param_device = device_map [ module_name ]
accelerate . utils . set_module_tensor_to_device ( model , param_name , param_device , value = param )有了這一模型的一部分不超過一部分,就需要一次加載到內存中。
問:我沒有多GPU服務器。我可以在Google Colab中使用Tensor_parally嗎?
答: Colab有一個GPU,因此張量並行性沒有意義。但是,Kaggle免費為所有電話驗證的帳戶免費提供兩個T4。
問:什麼是張量並行性?
答:您將每一層的權重分為一部分,將每個零件乘以單獨的GPU,然後收集結果。在這裡閱讀更多
問:我應該使用TensorParallel還是DataParallel ?
答:對於大型型號的張量,較小的模型的數據平行
問:它如何與全沙dataparallear和零進行比較?
答:如果您可以安裝大批量,則零是更好
為什麼要使用tensor_parallel ...
alpaModel.parallelize()簡而言之,請使用tensor_parallel在一台計算機上快速進行原型製作。使用DeepSpeed+Megatron或ALPA進行數百萬美元的培訓。
如果您遇到NCCL錯誤或隨機懸掛,則可能會出現一些未正確顯示的代碼錯誤。要調試這些錯誤,我們建議使用export TENSOR_PARALLEL_USE_NATIVE=1或在單個設備上重新啟動。
如果您發現錯誤或遇到問題,請向我們的問題跟踪器報告。我們將盡力提供幫助,但是我們可能需要一些時間才能實現。僅當您的問題專門使用tensor_parallel時,請創建問題。例如,如果您需要幫助安裝transformers或優化代碼,請在其他地方查找。
我們將黑色和ISORT用於所有拉請求。在進行代碼之前,只需運行black . && isort .你會沒事的。