nnScaler คือกลไกการทำงานแบบขนานที่รวบรวมโมเดลเครือข่าย Deep Neural Network (DNN) ที่ออกแบบมาสำหรับการประมวลผล GPU เดี่ยวให้เป็นโปรแกรมที่สามารถทำงานแบบขนานบน GPU หลายตัวได้
ใช้งานง่าย: จำเป็นต้องเปลี่ยนโค้ดเพียงไม่กี่บรรทัดเพื่อเปิดใช้งานการทำงานแบบขนานอัตโนมัติ
Pythonic: เอาต์พุตแบบขนานอยู่ในโค้ด PyTorch ทำให้ผู้ใช้เข้าใจได้ง่ายและสะดวกสำหรับการพัฒนาหรือปรับแต่งเพิ่มเติม
ความสามารถในการขยาย: nnScaler เปิดเผย API เพื่อรองรับตัวดำเนินการใหม่สำหรับโมเดลที่เกิดขึ้นใหม่
ความน่าเชื่อถือ: ตรวจสอบผ่านเซสชันการฝึกอบรมแบบครบวงจรต่างๆ nnScaler เป็นระบบที่เชื่อถือได้
ประสิทธิภาพ: ด้วยการสำรวจพื้นที่การทำงานแบบคู่ขนานขนาดใหญ่ nnScaler สามารถเพิ่มประสิทธิภาพการฝึกแบบคู่ขนานได้อย่างมาก
สำหรับ นักวิทยาศาสตร์ของ DNN พวกเขาสามารถมุ่งความสนใจไปที่การออกแบบโมเดลด้วย PyTorch บน GPU ตัวเดียว ขณะเดียวกันก็ทิ้งความซับซ้อนในการขนานไว้ที่ nnScaler โดยนำเสนอเทคนิคการขนานที่เป็นนวัตกรรมใหม่ที่เหนือกว่าวิธีการที่มีอยู่ในด้านประสิทธิภาพ นอกจากนี้ nnScaler ยังรองรับการขยายโมดูล DNN ด้วยโครงสร้างหรือรูปแบบการดำเนินการใหม่ ทำให้ผู้ใช้สามารถขนานโมเดล DNN แบบกำหนดเองของตนได้
สำหรับ ผู้เชี่ยวชาญด้านระบบ DNN พวกเขาสามารถใช้ประโยชน์จาก nnScaler เพื่อสำรวจกลไกและนโยบายการขนาน DNN ใหม่ๆ สำหรับโมเดลใหม่ๆ ด้วยการมอบฟังก์ชันที่ผู้ใช้กำหนดสำหรับผู้ปฏิบัติงานรายใหม่ที่ไม่ได้รับการยอมรับจาก nnScaler ช่วยให้มั่นใจได้ว่าโมเดล DNN ใหม่ๆ จะมีความขนานกันอย่างราบรื่น ตัวอย่างเช่น เพื่ออำนวยความสะดวกในการสนับสนุนลำดับยาวใน LLM
ติดตั้งแพ็คเกจต่อไปนี้ก่อนการติดตั้ง nnScaler:
Python >= 3.8, < 3.11 (3.10 is recommanded) PyTorch >= 2.0, < 2.4 (2.2.0 is recommanded)
ดำเนินการคำสั่งด้านล่างในไดเร็กทอรี nnScaler:
pip install -r requirements.txt pip install -e .
นอกจากนี้ เพื่อหลีกเลี่ยงข้อผิดพลาด cppimport จึงจำเป็นต้องรวมไดเร็กทอรี nnScaler ในตัวแปรสภาพแวดล้อม PYTHONPATH :
export NNSCALER_HOME=$(pwd) export PYTHONPATH=${NNSCALER_HOME}:$PYTHONPATH
ติดตั้งแพ็คเกจที่จำเป็นสำหรับการรัน Llama-3 นอกจากนี้ จำเป็นต้องมีไลบรารี CUDA บางเวอร์ชันระหว่างการติดตั้ง flash-attn ตัวอย่างเช่น จำเป็นต้องใช้ CUDA V11.8 หากใช้ PyTorch 2.20
python -m pip install transformers==4.40.0 flash-attn==2.5.5 tensorboard
รับการเข้าถึงโมเดล Llama-3 จาก HuggingFace ซึ่งคุณจะได้รับโทเค็นการเข้าถึงซึ่งควรตั้งค่าเป็นตัวแปรสภาพแวดล้อม:
export HF_TOKEN=<HUGGINGFACE_ACCESS_TOKEN>
คุณสามารถค้นหาโค้ดตัวอย่างทั้งหมดได้ที่ examples/llama3_8B_128K
ดังที่แสดงด้านล่าง ผู้ใช้จะต้อง:
สรุปโมเดล: รวมการคำนวณการสูญเสียและส่วนประกอบที่จำเป็นอื่นๆ
กำหนดค่าส่วนประกอบ: ตั้งค่าโมเดล เครื่องมือเพิ่มประสิทธิภาพ และตัวโหลดข้อมูล
เริ่มต้นและเริ่ม: ในฟังก์ชันหลัก ให้สร้าง nnScaler trainer ด้วยการกำหนดค่าข้างต้น และเริ่มกระบวนการฝึกอบรม
# นำเข้าเทรนเนอร์ที่มีความสามารถในการสร้างขนานในตัว nnScaler จาก nnscaler.cli.trainer นำเข้าโมเดล Trainer# wrap เพื่อรวมการประมวลผลที่สูญเสีย ฯลฯ คลาส WrapperModel(torch.nn.Module):def __init__(self, model_id):super() __init__()self.model = AutoModelForCausalLM.from_pretrained(model_id, attn_implementation='flash_attention_2')def ส่งต่อ (ตนเอง ตัวอย่าง):outputs = self.model.model(input_ids=samples['net_input']['src_tokens'],use_cache=False,return_dict=False, )loss = torch.sum(chunk_linear_cross_entropy(outputs[0], self.model.lm_head.weight, examples['target'], ...)) การสูญเสียคืน, ตัวอย่าง ['ntokens'], ตัวอย่าง ['nsentences'] def main(args):# data configdataloader_config = ... # model configmodel_config = ModelConfig(type=WrapperModel,args={'model_id': args.model_id, - )# ไฮเปอร์พารามิเตอร์ของเครื่องมือเพิ่มประสิทธิภาพ Optimizer_config = OptimizerConfig (type=MixedPrecisionAdamW,args={'lr': 2e-5, 'betas': (0.9, 0.95), 'weight_decay': 0.0, 'fused': True},#... )#...# ตั้งค่าเทรนเนอร์พร้อมการกำหนดค่าของ dataloader/model/optimizer ฯลฯ trainer = เทรนเนอร์(train_args=TrainerArgs(#...model=model_config,optimizer=optimizer_config,dataloader=dataloader_config,#...))trainer.run()
จากนั้นเราสามารถเริ่มตัวอย่างได้ และงานการขนานทั้งหมดจะเสร็จสิ้นโดย nnScaler โดยอัตโนมัติ
cd examples/llama3_8B_128K# เตรียมข้อมูลการฝึกอบรม: python bookcorpus.py --data_path_or_name bookcorpus/bookcorpus --tokenizer_path_or_name meta-llama/Meta-Llama-3-8B-Instruct --save_path ./bookcorpus_llama3_4K --sequence_length 4096# สร้าง mini modelpython create_mini_model.py --model_id meta-llama/Meta-Llama-3-8B-Instruct --output_id ./llama3_mini#compile และรันโดยใช้ข้อมูลแบบขนาน + zero1torchrun --nproc_per_node=2 train.py --plan_ngpus 1 --runtime_ngpus 2 --name llama3_debug --model_id ./llama3_mini --dataset_path ./bookcorpus_llama3_4K
นอกจากนี้เรายังมีตัวอย่างเพื่อสาธิตวิธีทำให้โมเดลขนานผ่านอินเทอร์เฟซที่เข้ากันได้กับ PyTorch Lightning ใน nnScaler
ค้นหาตัวอย่าง nanoGPT ใน nnScaler repo:
ตัวอย่างซีดี/nanogpt.cd
ติดตั้งการพึ่งพาของ nanoGPT:
pip ติดตั้ง -r ข้อกำหนด.txt
เตรียมชุดข้อมูล:
หลาม nanoGPT/data/shakespeare_char/prepare.py
ทดสอบด้วย GPU เดี่ยว
ตอนนี้คุณสามารถรัน train_nnscaler.py
ด้วย torchrun <https://pytorch.org/docs/stable/elastic/run.html>
:
torchrun --nproc_per_node=1 train_nnscaler.py nanoGPT/config/train_shakespeare_char.py
วิธีนี้จะฝึกโมเดล Baby GPT บน GPU ตัวเดียว จะใช้เวลาหลายนาที และการสูญเสียการตรวจสอบความถูกต้องที่ดีที่สุดจะอยู่ที่ประมาณ 1.47
ทดสอบด้วย Multi-GPU
ตามค่าเริ่มต้น nnScaler จะขนานโมเดลกับ GPU ด้วย ความขนานของข้อมูล หากคุณมี GPU 4 ตัวบนโหนดเดียว:
torchrun --nproc_per_node=4 train_nnscaler.py nanoGPT/config/train_shakespeare_char.py
หรือหากคุณมีหลายโหนด เช่น 2 โหนดที่มี GPU 4 ตัวในแต่ละโหนด:
# on each node torchrun --nnodes=2 --nproc_per_node=4 --rdzv-id=NNSCALER_NANOGPT --rdzv-backend=c10d --rdzv-endpoint=<IP> train_nnscaler.py nanoGPT/config/train_shakespeare_char.py
หมายเหตุ: ขนาดแบตช์ในเครื่องได้รับการแก้ไขตามค่าเริ่มต้น ดังนั้นการใช้ผู้ปฏิบัติงานมากขึ้นจะส่งผลให้ขนาดแบตช์โดยรวมใหญ่ขึ้น
- สำหรับการใช้งานขั้นสูง โปรดติดตามการเปิดตัวในอนาคตของเรา
nnScaler ถูกนำมาใช้ในหลายโครงการ รวมถึงการสำรวจผลิตภัณฑ์และการวิจัย:
(YOCO) คุณแคชเพียงครั้งเดียว: สถาปัตยกรรมตัวถอดรหัส-ตัวถอดรหัสสำหรับโมเดลภาษา
LongRoPE: ขยายหน้าต่างบริบท LLM ให้เกิน 2 ล้านโทเค็น
หลังการฝึกอบรมสำหรับซีรีส์ Phi-3 เวอร์ชันบริบทยาว
คุณสามารถดูการประเมินสิ่งประดิษฐ์สำหรับ OSDI'24 พร้อมคำแนะนำได้ที่นี่ โปรดอ้างอิง nnScaler ในสิ่งพิมพ์ของคุณหากช่วยในการวิจัยของคุณ:
@inproceedings{lin2024nnscaler, title = {nnScaler: Constraint-Guided Parallelization Plan Generation for Deep Learning Training}, author={Lin, Zhiqi and Miao, Youshan and Zhang, Quanlu and Yang, Fan and Zhu, Yi and Li, Cheng and Maleki, Saeed and Cao, Xu and Shang, Ning and Yang, Yilei and Xu, Weijiang and Yang, Mao and Zhang, Lintao and Zhou, Lidong}, booktitle={18th USENIX Symposium on Operating Systems Design and Implementation (OSDI 24)}, pages={347--363}, year={2024} }
โครงการนี้ยินดีรับการสนับสนุนและข้อเสนอแนะ การบริจาคส่วนใหญ่กำหนดให้คุณยอมรับข้อตกลงใบอนุญาตผู้ร่วมให้ข้อมูล (CLA) โดยประกาศว่าคุณมีสิทธิ์ที่จะให้สิทธิ์แก่เราในการใช้การบริจาคของคุณจริงๆ สำหรับรายละเอียด โปรดไปที่ https://cla.opensource.microsoft.com
เมื่อคุณส่งคำขอดึง บอท CLA จะกำหนดโดยอัตโนมัติว่าคุณจำเป็นต้องจัดเตรียม CLA และตกแต่ง PR อย่างเหมาะสมหรือไม่ (เช่น การตรวจสอบสถานะ ความคิดเห็น) เพียงทำตามคำแนะนำที่ได้รับจากบอท คุณจะต้องทำสิ่งนี้เพียงครั้งเดียวกับ repos ทั้งหมดโดยใช้ CLA ของเรา
โครงการนี้ได้นำหลักจรรยาบรรณของ Microsoft Open Source มาใช้ สำหรับข้อมูลเพิ่มเติม โปรดดูคำถามที่พบบ่อยเกี่ยวกับหลักจรรยาบรรณหรือติดต่อ [email protected] หากมีคำถามหรือความคิดเห็นเพิ่มเติม
โครงการนี้อาจมีเครื่องหมายการค้าหรือโลโก้สำหรับโครงการ ผลิตภัณฑ์ หรือบริการ การใช้เครื่องหมายการค้าหรือโลโก้ของ Microsoft โดยได้รับอนุญาตจะอยู่ภายใต้และต้องปฏิบัติตามแนวทางเครื่องหมายการค้าและแบรนด์ของ Microsoft การใช้เครื่องหมายการค้าหรือโลโก้ของ Microsoft ในเวอร์ชันแก้ไขของโครงการนี้จะต้องไม่ทำให้เกิดความสับสนหรือบ่งบอกถึงการสนับสนุนของ Microsoft การใช้เครื่องหมายการค้าหรือโลโก้ของบุคคลที่สามจะต้องเป็นไปตามนโยบายของบุคคลที่สามเหล่านั้น
คุณอาจพบ repo สาธารณะของเราได้จาก https://github.com/microsoft/nnscaler หรือ repo ภายในของ microsoft https://aka.ms/ms-nnscaler หากมีคำถามหรือข้อสงสัยใดๆ โปรดติดต่อเราที่ [email protected]