
ลองสาธิต 40B LLMS ใหม่ใน Kaggle
เรียกใช้รุ่น Pytorch ขนาดใหญ่บน GPU หลายตัวในรหัสเดียวด้วยการเร่งความเร็วเชิงเส้น
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 ในขณะที่รุ่นยังคงอยู่ใน CPU
นี่คือกรณีการใช้งานบางอย่าง:
examples/training_flan-t5-xl.ipynb ปรับแต่งแบบจำลอง Flan-T5 แบบ Fine Flan-T5 ในการสรุปข้อความtensor_parallel int8 LLM - อะแดปเตอร์ปรับรุ่นภาษาขนาดใหญ่ด้วย llm.8bit + tensor_parallel พารามิเตอร์ขั้นสูงไปยัง tensor_parallel :
device_ids: List[device] - อุปกรณ์ใดที่จะใช้; ค่าเริ่มต้นสำหรับ GPU ที่มีอยู่ทั้งหมดoutput_device: device - เอาต์พุตรุ่นจะมีอุปกรณ์นี้tensor_parallel_config: tp.Config - ใช้กลยุทธ์การขนานที่กำหนดเองดู slicing_configs.pydistributed: bool - ถ้าเป็นจริงให้ใช้คบเพลิงแบ็กเอนด์แจกจ่ายแทนการทำเกลียว (ต้องใช้ torchrunsharded: bool - ถ้าเป็นจริงให้ค้นหาพารามิเตอร์ที่สามารถฝึกอบรมได้ทั้งหมดที่ไม่ได้แยกกันโดยการขนานของเทนเซอร์และแยกพวกเขาโดยใช้อัลกอริทึม ZERO -3sharded_param_names: List[str] - ชื่อพารามิเตอร์ที่ควรได้รับการทำลายด้วยวิธีนี้, default = พบโดยอัตโนมัติ ในการบันทึกแบบจำลองเพื่อให้สามารถใช้ในบริบทที่ไม่ใช่ tensor_parallel คุณควรใช้ wrapper บริบท 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 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 )ด้วยสิ่งนี้ไม่เกินหนึ่งส่วนของโมเดลจะต้องโหลดลงในหน่วยความจำในครั้งเดียว
ถาม: ฉันไม่มีเซิร์ฟเวอร์ Multi-GPU ฉันสามารถใช้ tensor_parallel ใน Google Colab ได้หรือไม่?
ตอบ: Colab มี GPU เดียวดังนั้นจึงไม่มีจุดใน Tensor Parallelism อย่างไรก็ตาม Kaggle เสนอ T4 สองรายการฟรีสำหรับบัญชีที่ตรวจสอบแล้วทุกบัญชี
ถาม: เทนเซอร์คู่ขนานคืออะไร?
ตอบ: คุณแบ่งน้ำหนักของแต่ละชั้นออกเป็นชิ้นส่วนคูณแต่ละส่วนใน GPU แยกต่างหากจากนั้นรวบรวมผลลัพธ์ อ่านเพิ่มเติมที่นี่
ถาม: ฉันควรใช้ TensorParallel หรือ DataParallel หรือไม่?
ตอบ: Tensorparallel สำหรับรุ่นขนาดใหญ่ dataParallel สำหรับรุ่นที่เล็กกว่า
ถาม: มันเปรียบเทียบกับ FoolthEdedDataparallel และศูนย์ได้อย่างไร?
ตอบ: ศูนย์จะดีกว่าถ้าคุณสามารถใส่ชุดใหญ่ tensorparallel จะดีกว่าสำหรับชุดขนาดเล็ก
ทำไมต้องใช้ tensor_parallel ...
alpaModel.parallelize() ในระยะสั้นให้ใช้ tensor_parallel สำหรับการสร้างต้นแบบอย่างรวดเร็วบนเครื่องเดียว ใช้ DeepSpeed+Megatron หรือ ALPA สำหรับการฝึกอบรมล้านดอลลาร์
หากคุณพบข้อผิดพลาดของ NCCL หรือการแขวนแบบสุ่มคุณอาจมีข้อผิดพลาดของรหัสบางอย่างที่ไม่แสดงอย่างถูกต้อง ในการดีบักข้อผิดพลาดเหล่านี้เราขอแนะนำให้รีสตาร์ทด้วย export TENSOR_PARALLEL_USE_NATIVE=1 หรือบนอุปกรณ์เดียว
หากคุณพบข้อผิดพลาดหรือพบปัญหาโปรดรายงานไปยังตัวติดตามปัญหาของเรา เราจะพยายามอย่างเต็มที่เพื่อช่วยเหลือ แต่อาจต้องใช้เวลาสักครู่ก่อนที่เราจะไปถึงมัน โปรดสร้างปัญหาเฉพาะในกรณีที่ปัญหาของคุณโดยเฉพาะกับ tensor_parallel ตัวอย่างเช่นหากคุณต้องการความช่วยเหลือในการติดตั้ง transformers หรือเพิ่มประสิทธิภาพรหัสของคุณโปรดค้นหาที่อื่น
เราใช้สีดำและ iSort สำหรับคำขอดึงทั้งหมด ก่อนที่จะใช้รหัสของคุณเพียงแค่เรียกใช้ black . && isort . และคุณจะสบายดี