
Попробуйте новую демонстрацию 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 -Fine-Tune Full Flan-T5 модель при обобщении текстаtensor_parallel int8 LLM - адаптер -настройка большой языковой модели с llm.8bt + tensor_parallel Усовершенствованные параметры для tensor_parallel :
device_ids: List[device] - какие устройства использовать; по умолчанию ко всем доступным графическим процессорамoutput_device: device - Модель выходов будет иметь это устройствоtensor_parallel_config: tp.Config - Используйте пользовательскую стратегию параллелизма, см. slicing_configs.pydistributed: bool - Если True, используйте Torch.Sitributed Backend вместо потока (требует torchrun )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_parallel в Google Colab?
О: Колаб имеет один графический процессор, поэтому нет смысла в тензоре -параллелизме. Тем не менее, Kaggle предлагает два T4 бесплатно для всех проверяемых телефона.
Q: Что такое тензора параллелизма?
A: Вы разделяете веса каждого слоя на части, умножайте каждую часть на отдельном графическом процессоре, а затем собираете результаты. Прочитайте больше здесь
В: Должен ли я использовать TensorParallel или DataParallel ?
A: Tensorpararallel для больших моделей, DataParallel для более мелких
Q: Как это сравнивается с полностью сордамидатапараллелем и нолью?
О: Ноль лучше, если вы можете установить большую партию, Tensorparallel лучше для небольших партий
Зачем использовать tensor_parallel ...
alpaModel.parallelize() Короче говоря, используйте tensor_parallel для быстрого прототипирования на одной машине. Используйте DeepSpeed+Megatron или ALPA для обучения на миллион долларов.
Если вы испытываете ошибки NCCL или случайное подвес, у вас могут быть некоторые ошибки кода, которые не отображаются должным образом. Чтобы отлаживать эти ошибки, мы рекомендуем перезагрузить с помощью export TENSOR_PARALLEL_USE_NATIVE=1 или на одном устройстве.
Если вы нашли ошибку или столкнулись с проблемой, сообщите об этом на наш трекер. Мы сделаем все возможное, чтобы помочь, но это может занять некоторое время, прежде чем мы доберемся до этого. Пожалуйста, создайте проблемы, только если ваша проблема конкретно с tensor_parallel . Например, если вам нужна помощь в установке transformers или оптимизацию вашего кода, пожалуйста, обратитесь за ним в другом месте.
Мы используем Black и Isort для всех запросов на притяжение. Прежде чем совершить свой код, просто запустите black . && isort . И все будет в порядке.