ที่เก็บนี้มีรหัสเพื่อทำซ้ำการวิจัยของเราที่อธิบายไว้ใน "การยัดเยียด: การฝึกอบรมรูปแบบภาษาใน GPU เดียวในหนึ่งวัน" เราทดลองกับโมเดลภาษาที่ทำให้โมเดลประเภท Bert มีการคำนวณที่ จำกัด สงสัยว่า "มันแย่แค่ไหน"?
คุณสามารถค้นหาบทความของเราได้ที่นี่: https://arxiv.org/abs/2212.14034 และบทคัดย่อด้านล่าง:
แนวโน้มล่าสุดในการสร้างแบบจำลองภาษาได้มุ่งเน้นไปที่การเพิ่มประสิทธิภาพผ่านการปรับขนาดและส่งผลให้สภาพแวดล้อมที่แบบจำลองภาษาการฝึกอบรมไม่สามารถเข้าถึงได้สำหรับนักวิจัยและผู้ปฏิบัติงานส่วนใหญ่ ในขณะที่ส่วนใหญ่ในชุมชนกำลังถามว่าจะผลักดันขีด จำกัด ของการคำนวณที่รุนแรงเราถามคำถามตรงข้าม:
เราจะไปได้ไกลแค่ไหนกับ GPU เดียวในวันเดียว?
เราตรวจสอบประสิทธิภาพดาวน์สตรีมที่ทำได้ด้วยรูปแบบภาษาที่ใช้หม้อแปลงที่ผ่านการฝึกอบรมอย่างสมบูรณ์ตั้งแต่เริ่มต้นด้วยการสร้างแบบจำลองภาษาที่สวมหน้ากากสำหรับวัน เดียว ใน GPU ผู้บริโภครายเดียว นอกเหนือจากการวิเคราะห์ส่วนประกอบเกือบทั้งหมดของท่อส่งล่วงหน้าสำหรับสถานการณ์นี้และจัดหาไปป์ไลน์ที่ปรับเปลี่ยนด้วยประสิทธิภาพใกล้กับเบิร์ตเราตรวจสอบว่าทำไมการปรับขนาดลงนั้นยากและการปรับเปลี่ยนที่ดีขึ้นจริงประสิทธิภาพในสถานการณ์นี้ เราให้หลักฐานว่าแม้ในการตั้งค่าที่ จำกัด นี้ประสิทธิภาพจะเป็นไปตามกฎหมายการปรับขนาดที่สังเกตได้ในการตั้งค่าขนาดใหญ่ ผ่านเลนส์ของกฎหมายการปรับขนาดเราจัดหมวดหมู่การปรับปรุงล่าสุดในการฝึกอบรมและสถาปัตยกรรมและหารือเกี่ยวกับข้อดีและการบังคับใช้ในทางปฏิบัติของพวกเขา (หรือขาดมัน) สำหรับการตั้งค่าการคำนวณที่ จำกัด
คุณต้องใช้ Pytorch 2.0 เพื่อเรียกใช้รหัสใหม่ หากคุณต้องการที่จะอยู่บน pytorch 1.*คุณสามารถชำระเงินแท็ก Last1.13release รุ่นใหม่ที่ผ่านการฝึกอบรมด้วย codebase ใหม่จะดีกว่า 1-2% สำหรับกาวด้วยงบประมาณเดียวกัน จุดตรวจสามารถพบได้ที่ https://huggingface.co/jonasgeiping/crammed-bert จุดตรวจสอบเก่าตอนนี้คือ https://huggingface.co/jonasgeiping/crammed-bert-legacy
นอกจากนี้การประมวลผลข้อมูลล่วงหน้าได้ดีขึ้นตอนนี้คุณสามารถสตรีมข้อมูลได้โดยตรงจาก HuggingFace จากการอัปโหลดที่ https://huggingface.co/datasets/jonasgeiping/the_pile_wordpiex32768_2efdb9d060d1ae95faf952
การตั้งค่า:
Run pip install . เพื่อติดตั้งการพึ่งพาทั้งหมด
torch (อย่างน้อยเวอร์ชัน 2.1)transformers , tokenizers , datasets , evaluatehydra-corepsutil , pynvml , safetensorseinops pip install . เพื่อติดตั้งแพ็คเกจและสคริปต์ทั้งหมดcurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh จากนั้น git clone https://github.com/google-research/deduplicate-text-datasets/tree/dev-v1 จากนั้นเรียกใช้ cargo install --target-dir ../cramming/dedupในการตรวจสอบการติดตั้งขั้นต่ำคุณสามารถเรียกใช้
python pretrain.py name=test arch=hf-bert-base train=bert-base data=sanity-check-2 dryrun=True impl.microbatch_size=2
คำสั่งนี้ประมวลผลชุดข้อมูลการตรวจสอบความมีสติขนาดเล็กและเรียกใช้ขั้นตอนการฝึกอบรมเดียว
ใช้สคริปต์ pretrain.py เพื่อ pretrain ด้วยการคำนวณที่ จำกัด ที่เก็บนี้ใช้ไฮดรา (https://hydra.cc/docs/intro/) ดังนั้นฟิลด์ทั้งหมดใน cramming/config สามารถแก้ไขได้ในบรรทัดคำสั่ง ตัวอย่างเช่น budget สามารถแก้ไขได้โดยการให้ budget=48 เป็นอาร์กิวเมนต์เพิ่มเติม (เพื่อทำงานเป็นเวลา 48 ชั่วโมง) หรืออัตราการเรียนรู้สามารถแก้ไขได้ผ่าน train.optim.lr=1e-4 ตรวจสอบโฟลเดอร์การกำหนดค่าเพื่อดูอาร์กิวเมนต์ทั้งหมด
ขั้นตอนแรกของคุณควรตรวจสอบแพ็คเกจที่ติดตั้ง ในการทำเช่นนั้นคุณสามารถเรียกใช้ python pretrain.py dryrun=True ซึ่งจะเรียกใช้การตรวจสอบสติเริ่มต้นสำหรับการทำซ้ำครั้งเดียว จากนั้นคุณสามารถเปิดใช้งานฟังก์ชั่นเพิ่มเติม ตัวอย่างเช่นปรับเปลี่ยนสถาปัตยกรรมเช่น arch=bert-original และ train=bert-original ในการฝึกอบรมรูปแบบภาษาจริงๆคุณต้องเปลี่ยนจากชุดข้อมูลตรวจสอบสติเป็นอย่างน้อย data=pile-readymade จากนั้นเลือกการตั้งค่าการฝึกอบรมที่ได้รับการปรับปรุงเช่น train=bert-o4 และเค้าโครงรุ่นที่ได้รับการปรับปรุงเช่น arch=crammed-bert
แหล่งข้อมูลจาก data.sources จะถูกอ่าน, เป็นมาตรฐานและ pretokenized ก่อนที่การฝึกอบรมจะเริ่มและแคชลงในฐานข้อมูล การโทรที่ตามมาด้วยการกำหนดค่าเดียวกันจะนำฐานข้อมูลนี้กลับมาใช้ใหม่ของลำดับโทเค็น โดยค่าเริ่มต้น tokenizer ใหม่จะถูกสร้างและบันทึกในระหว่างกระบวนการนี้ ตัวเลือกข้อมูลที่สำคัญคือ data.max_entries_in_raw_dataset ซึ่งกำหนดจำนวนข้อมูล ดิบ ที่จะโหลด ตัวอย่างเช่นสำหรับแหล่งข้อมูลขนาดใหญ่เช่น C4 จะมีการดาวน์โหลดชุดข้อมูลดิบเท่านั้น จากนั้น max_seq_in_tokenized_dataset คอขวดจำนวน การประมวล ผลจะถูกเก็บไว้ในฐานข้อมูล ตัวเลขนี้ควรมีขนาดใหญ่กว่าจำนวนลำดับที่คาดว่าจะอ่านภายในงบประมาณ
หมายเหตุเพิ่มเติม:
data=pile-readymadepython pretrain.py data=... dryrun=True ซึ่งวิ่งให้แห้งการฝึกอบรม แต่เรียกใช้การประมวลผลข้อมูลล่วงหน้าเต็มรูปแบบ การรันในภายหลังสามารถใช้ข้อมูลแคชได้อีกครั้งimpl.threads โดยเฉพาะอย่างยิ่งรหัสซ้ำซ้อนต้องใช้ RAM จำนวนมากbookcorpus-wikipedia เท่านั้นซึ่งประมวลผลล่วงหน้าค่อนข้างเร็วและจากนั้นดูที่ C4 ที่ผ่านการประมวลผลและกรองเต็มรูปแบบ สำหรับการอ้างอิงและหากคุณสนใจที่จะเปลี่ยนการฝึกอบรม/สถาปัตยกรรมเท่านั้นคุณสามารถค้นหาชุดข้อมูลที่ประมวลผลล่วงหน้าได้ที่นี่:
แหล่งข้อมูลเหล่านี้สามารถสตรีมได้ ในการทำเช่นนั้นให้ Simple Set data=pile-readymade
ข้อมูลที่ประมวลผลล่วงหน้านั้นสะดวกในการทำงานและฉันคิดว่าการปรับเปลี่ยนการประมวลผลข้อมูลและการกรองยังคงไม่ได้รับการสำรวจเมื่อเทียบกับการฝึกอบรมและสถาปัตยกรรมเนื่องจากสิ่งนี้ อาจมีการเพิ่มขึ้นด้วยข้อมูลที่ดีกว่าการปรับแต่งอื่น ๆ ดังนั้นในที่สุดคุณอาจต้องการพิจารณาตั้งค่ารหัสและสภาพแวดล้อมสำหรับการประมวลผลข้อมูลเต็มรูปแบบให้ทำงาน
ตอนนี้คุณสามารถค้นหาจุดตรวจสอบสำหรับเวอร์ชันสุดท้ายที่ผ่านการฝึกอบรมเกี่ยวกับ the-pile ที่ https://huggingface.co/jonasgeiping/crammed-bert
ในการประเมินแบบจำลอง pretrained เกี่ยวกับกาว (หรืองานกาว) ให้ใช้ eval.py สคริปต์นี้ค้นหาโมเดลที่บันทึกไว้ในไดเรกทอรีพื้นฐาน เมื่อพิจารณาจากชื่อของการรันก่อนหน้าสคริปต์นี้จะดึงจุดตรวจสอบล่าสุดที่บันทึกไว้ด้วยชื่อนี้แล้วเรียกใช้การประเมินผล
คุณสามารถบันทึกการทำงานไปยังบัญชีน้ำหนักและอคติของคุณ ในการทำเช่นนั้นเพียงแค่แก้ไข wandb.entity และ wandb.project บนบรรทัดคำสั่งหรือที่ cramming/config/wandb/default.yaml
เพื่อทำซ้ำสูตรสุดท้ายที่กล่าวถึงในกระดาษ Run
python pretrain.py name=amp_b8192_cb_o4_final arch=crammed-bert train=bert-o4 data=pile-readymade
เพื่อ pretrain และ
python eval.py eval=GLUE_sane name=amp_b8192_cb_o4_final eval.checkpoint=latest impl.microbatch_size=16 impl.shuffle_in_dataloader=True impl.compile_torch=False
เพื่อประเมินแบบจำลอง สูตรที่เรียกว่า "Crammed Bert" ในกระดาษสอดคล้องกับสถาปัตยกรรมที่เรียกว่า crammed-bert ในการกำหนดค่าซึ่งได้รับการฝึกฝนด้วยการตั้งค่าการฝึกอบรม bert-o4 บนข้อมูล the-pile
เพื่อประสิทธิภาพที่ดีที่สุดคุณจะต้องอยู่ใน Pytorch ล่าสุดทุกคืนและตั้งค่าตัวแปรตัวเหนี่ยวนำต่อไปนี้ (ซึ่งปรับเปลี่ยนการตั้งค่า torch.compile โดยใช้ตัวเหนี่ยวนำ):
max_autotune_gemm: Truemax_autotune_pointwise: Falsetriton.cudagraphs: Truetriton.cudagraph_trees: False Pretraining: GPU เดี่ยว, การตั้งค่าเบิร์ตดั้งเดิม:
python pretrain.py name=bert data=bookcorpus-wikipedia arch=bert-original train=bert-original budget=10000000
Multi-GPU การตั้งค่า Bert ดั้งเดิม:
torchrun --nproc_per_node=4 --standalone pretrain.py name=bert4gpu data=bookcorpus-wikipedia arch=bert-original train=bert-original budget=10000000 impl.fullgraph=false impl._inductor_vars.triton.cudagraphs=False
ประเมินจุดตรวจ HuggingFace (ในตัวอย่างนี้ใน RTE):
python eval.py eval=GLUE_sane eval/tasks=rte name=bert-finetuning eval.checkpoint=hf://bert-base-uncased impl.shuffle_in_dataloader=True impl.compile_torch=False impl.microbatch_size=16
ประเมินจุดตรวจสอบท้องถิ่น (ปิดการรวบรวมซึ่งคาดว่าจะมีรูปร่างคงที่ในขณะนี้):
python eval.py eval=GLUE_sane eval/tasks=rte name=NAME_OF_PRETRAINING_RUN eval.checkpoint=latest impl.shuffle_in_dataloader=True impl.compile_torch=False
การตรวจสอบสติสำหรับรหัสกระจายบน CPU:
CUDA_VISIBLE_DEVICES= torchrun --nproc_per_node=2 --standalone pretrain.py name=cpu_multi_check dryrun=True data=sanity-check-2 impl.dist_backend=gloo impl.fullgraph=false impl._inductor_vars.triton.cudagraphs=False
ตัวอย่างเพิ่มเติมสำหรับสูตรอาหารสามารถพบได้ในโฟลเดอร์ /scripts
ตัวเลือกต่อไปนี้จะเสีย/จำกัด/ทำงานกำลังดำเนินการ ใช้สิ่งเหล่านี้ขึ้นอยู่กับดุลยพินิจของคุณเอง แน่นอนว่าการมีส่วนร่วมใด ๆ ที่นี่ได้รับการชื่นชมอย่างมาก นอกจากนี้คุณยังสามารถส่งข้อความถึงฉันพร้อมคำถามเพิ่มเติมเกี่ยวกับประเด็นใด ๆ เหล่านี้หากคุณต้องการตรวจสอบ
Last1.13release หากคุณสนใจที่จะฟื้นฟูตัวเลือกเหล่านี้ อย่าลังเลที่จะเปิดคำขอดึงพร้อมอัปเดตไปยัง Codebase ใหม่โปรดอย่าลังเลที่จะติดต่อเราหากมีคำถามใด ๆ หรือเปิดปัญหาเกี่ยวกับ GitHub