
Coba demo 40b llms baru di kaggle
Jalankan model Pytorch besar pada beberapa GPU dalam satu baris kode dengan speedup linier yang berpotensi.
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 Versi stabil terbaru (disarankan):
pip install tensor_parallel
Versi Edge Bleeding:
pip install https://github.com/BlackSamorez/tensor_parallel/archive/main.zip
Cukup bungkus model pytorch Anda dengan tp.tensor_parallel dan gunakan secara normal. Untuk efisiensi memori terbaik, hubungi tp.tensor_parallel saat model masih di CPU.
Berikut beberapa kasus penggunaan:
examples/training_flan-t5-xl.ipynb -model flan-t5 penuh fine-tune pada ringkasan tekstensor_parallel int8 LLM - adaptor -tuning model bahasa besar dengan llm.8bit + tensor_parallel Parameter lanjutan ke tensor_parallel :
device_ids: List[device] - perangkat mana yang akan digunakan; default untuk semua GPU yang tersediaoutput_device: device - output model akan memiliki perangkat initensor_parallel_config: tp.Config - Gunakan strategi paralelisme khusus, lihat slicing_configs.pydistributed: bool - jika benar, gunakan backend torch.distributed alih -alih threading (membutuhkan torchrun )sharded: bool - Jika benar, temukan semua parameter yang dapat dilatih yang tidak dibagi dengan paralelisme tensor dan membaginya menggunakan algoritma nol -3.sharded_param_names: List[str] - nama parameter yang harus dicek dengan cara ini, default = ditemukan secara otomatis Untuk menyimpan model sehingga dapat digunakan dalam konteks non tensor_parallel , Anda harus menggunakan pembungkus konteks 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/" ) Kode semacam itu menyimpan model seolah -olah tidak pernah terpecah. Ini bekerja dengan mengumpulkan bagian model selama ciptaan state_dict .
Biasanya, untuk biasanya membuat dan mengirim model tensor_parallel , seseorang membutuhkan seluruh model dalam memori. Ini bisa merepotkan, tetapi ada cara lain.
Dimungkinkan untuk mengonversi state_dict dari model dasar menjadi tensor_parallel state_dict yang sesuai menggunakan fungsi helper convert_state_dict . Dikt negara kemudian dapat dikirim dan dimuat ke dalam model:
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 )Dengan ini tidak lebih dari satu bagian dari model perlu dimuat ke dalam memori sekaligus.
T: Saya tidak memiliki server multi-GPU. Bisakah saya menggunakan Tensor_Parallel di Google Colab?
A: Colab memiliki satu GPU, jadi tidak ada gunanya paralelisme tensor. Namun, Kaggle menawarkan dua T4 secara gratis untuk semua akun yang diverifikasi telepon.
T: Apa itu paralelisme tensor?
A: Anda membagi bobot setiap lapisan menjadi beberapa bagian, kalikan setiap bagian pada GPU terpisah, lalu kumpulkan hasilnya. Baca lebih lanjut di sini
T: Haruskah saya menggunakan TensorParallel atau DataParallel ?
A: Tensorparallel untuk model besar, dataparallel untuk yang lebih kecil
T: Bagaimana cara membandingkannya dengan FullShardedDataParallel dan Nol?
A: Zero lebih baik jika Anda bisa memasukkan batch besar, tenorparallel lebih baik untuk batch kecil
Mengapa menggunakan tensor_parallel ...
alpaModel.parallelize() Singkatnya, gunakan tensor_parallel untuk prototipe cepat pada satu mesin. Gunakan Deepspeed+Megatron atau ALPA untuk pelatihan jutaan dolar berjalan.
Jika Anda mengalami kesalahan NCCL, atau gantung acak, Anda mungkin memiliki beberapa kesalahan kode yang tidak ditampilkan dengan benar. Untuk men -debug kesalahan ini, kami merekomendasikan restart dengan export TENSOR_PARALLEL_USE_NATIVE=1 atau pada satu perangkat.
Jika Anda menemukan bug atau mengalami masalah, silakan laporkan ke pelacak masalah kami. Kami akan melakukan yang terbaik untuk membantu, tetapi mungkin butuh waktu sebelum kami sampai ke sana. Harap buat masalah hanya jika masalah Anda khusus dengan tensor_parallel . Misalnya, jika Anda memerlukan bantuan menginstal transformers atau mengoptimalkan kode Anda, silakan cari di tempat lain.
Kami menggunakan hitam dan isort untuk semua permintaan tarik. Sebelum melakukan kode Anda, cukup jalankan black . && isort . Dan Anda akan baik -baik saja.