
جرب العرض التوضيحي الجديد 40B LLMS في Kaggle
قم بتشغيل نماذج 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 واستخدامه بشكل طبيعي. للحصول على أفضل كفاءة للذاكرة ، اتصل بـ tp.tensor_parallel بينما لا يزال النموذج على وحدة المعالجة المركزية.
فيما يلي بعض حالات الاستخدام:
examples/training_flan-t5-xl.ipynb نموذج Flan-T5 الكامل للضبط على تلخيص النصtensor_parallel int8 LLM - صقل محول نموذج لغة كبير مع LLM.8BIT + TENSOR_PARALLING المعلمات المتقدمة إلى tensor_parallel :
device_ids: List[device] - أي الأجهزة التي يجب استخدامها ؛ الإعدادات الافتراضية لجميع وحدات معالجة الرسومات المتاحةoutput_device: device - مخرجات النموذج سيكون لها هذا الجهازtensor_parallel_config: tp.Config - استخدم استراتيجية التوازي المخصص ، راجع slicing_configs.pydistributed: bool - إذا كان torchrun صحيحًا ، فاستخدم Torch.sharded: bool - إذا كان ذلك صحيحًا ، فابحث عن جميع المعلمات القابلة للتدريب التي لم يتم تقسيمها بواسطة التوازي الموتر وتقسيمها باستخدام خوارزمية Zero -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 بشكل طبيعي ، يحتاج المرء إلى النموذج بأكمله في الذاكرة. يمكن أن يكون هذا مزعجًا ، ولكن هناك طريقة أخرى.
من الممكن تحويل state_dict من نموذج أساسي إلى tensor_parallel state_dict باستخدام دالة المساعد convert_state_dict . يمكن بعد ذلك إرسال مقال الدولة وتحميلها إلى النموذج:
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. هل يمكنني استخدام Tensor_Paralled في Google Colab؟
ج: كولاب لديه وحدة معالجة الرسومات واحدة ، لذلك لا جدوى من التوازي الموتر. ومع ذلك ، يقدم Kaggle T4 مجانًا لجميع الحسابات التي تم تحديدها للهاتف.
س: ما هو التوازي الموتر؟
ج: تقوم بتقسيم أوزان كل طبقة إلى أجزاء ، وضرب كل جزء على وحدة معالجة الرسومات منفصلة ، ثم جمع النتائج. اقرأ المزيد هنا
س: هل يجب أن أستخدم TensorParallel أم DataParallel ؟
ج: Tensorparalial مع النماذج الكبيرة ، dataParalal
س: كيف يمكن مقارنتها ضد CommonShardedDataparalled و Zero؟
ج: الصفر أفضل إذا كنت تستطيع وضع دفعة كبيرة ، فإن Tensorparalal
لماذا تستخدم tensor_parallel ...
alpaModel.parallelize() باختصار ، استخدم tensor_parallel للنماذج الأولية السريعة على جهاز واحد. استخدم DeepSpeed+Megatron أو ALPA لتدريبات التدريب بقيمة مليون دولار.
إذا واجهت أخطاء NCCL ، أو تعليق عشوائي ، فقد يكون لديك بعض أخطاء التعليمات البرمجية التي لا يتم عرضها بشكل صحيح. لتصحيح هذه الأخطاء ، نوصي بإعادة التشغيل باستخدام export TENSOR_PARALLEL_USE_NATIVE=1 أو على جهاز واحد.
إذا وجدت خطأ أو واجهت مشكلة ، فيرجى الإبلاغ عن ذلك إلى Tracker لدينا. سنبذل قصارى جهدنا للمساعدة ، ولكن قد يستغرق الأمر بعض الوقت قبل أن نصل إليه. يرجى إنشاء مشكلات فقط إذا كانت مشكلتك على وجه التحديد مع tensor_parallel . على سبيل المثال ، إذا كنت بحاجة إلى مساعدة في تثبيت transformers أو تحسين التعليمات البرمجية الخاصة بك ، فيرجى البحث عنها في مكان آخر.
نستخدم الأسود و isort لجميع طلبات السحب. قبل ارتكاب الكود الخاص بك ، ما عليك سوى تشغيل black . && isort . وستكون بخير.