การวิเคราะห์ความหน่วงและหน่วยความจำของแบบจำลองหม้อแปลงสำหรับการฝึกอบรมและการอนุมาน
LLMAnalysis สูตรหรือสมการจำนวนมากลอยอยู่ในเอกสารบล็อก ฯลฯ เกี่ยวกับวิธีการคำนวณการฝึกอบรมหรือเวลาแฝงและหน่วยความจำสำหรับโมเดลภาษาขนาดใหญ่ (LLMs) หรือหม้อแปลง แทนที่จะทำคณิตศาสตร์เกี่ยวกับเอกสารหรือพิมพ์ในแผ่นงาน Excel let's automate the boring stuff with llm-analysis !
ด้วยโมเดลที่ระบุ, GPU, ประเภทข้อมูลและการกำหนดค่าแบบขนานการวิเคราะห์ LLM จะประเมินความหน่วงแฝงและการใช้หน่วยความจำของ LLM สำหรับการฝึกอบรมหรือการอนุมาน ด้วยการวิเคราะห์ LLM เราสามารถลองใช้การฝึกอบรม/การอนุมานที่แตกต่างกันในทางทฤษฎีและเข้าใจประสิทธิภาพของระบบได้ดีขึ้นสำหรับสถานการณ์ที่แตกต่างกัน
การวิเคราะห์ LLM ช่วยตอบคำถามเช่น:
feasible (ไม่ได้รับ oom) และ optimal (การเพิ่มปริมาณงานสูงสุดด้วยการตั้งค่าเวลาแฝง)time ที่ใช้กับการตั้งค่าที่กำหนดในการฝึกอบรมหรือการอนุมานและ cost (GPU-Hours)modeling change แบบจำลอง hardware improvement quantization parallelismตรวจสอบกรณีการใช้งานตัวอย่าง ด้วยการวิเคราะห์ LLM คุณสามารถทำการวิเคราะห์ได้ในไม่กี่นาที!
เพื่อติดตั้งการวิเคราะห์ LLM จาก PYPI:
pip install llm-analysisเพื่อติดตั้งการพัฒนาล่าสุด:
pip install --upgrade git+https://github.com/cli99/llm-analysis.git@main ในการติดตั้งจากแหล่งที่มาให้โคลน repo และเรียกใช้ pip install . หรือ poetry install (ติดตั้งบทกวีโดย pip install poetry )
LLMAnalysis ในการรวมการวิเคราะห์ LLM ในรหัสของคุณให้ใช้คลาส LLMAnalysis อ้างถึง Doc Llmanalysis สำหรับรายละเอียด
LLMAnalysis ถูกสร้างขึ้นด้วยตัวเลขประสิทธิภาพของ FLOPS และหน่วยความจำและคลาสการกำหนดค่าต่อไปนี้:
ModelConfig ครอบคลุมข้อมูลโมเดลเช่นความยาวลำดับสูงสุดจำนวนเลเยอร์หม้อแปลงจำนวนหัวความสนใจมิติที่ซ่อนอยู่ขนาดคำศัพท์GPUConfig ครอบคลุมการคำนวณ GPU และข้อกำหนดหน่วยความจำDtypeConfig ครอบคลุมจำนวนบิตที่ใช้สำหรับน้ำหนักแบบจำลองการเปิดใช้งานและการฝังParallelismConfig ครอบคลุม Tensor Parallelism ( tp ), Pipeline Parallelism ( pp ), ลำดับการขนาน ( sp ), ผู้เชี่ยวชาญด้านการขนาน ( ep ), และ Data Parallelism ( dp ) จากนั้น LLMAnalysis สามารถสอบถามได้ด้วยข้อโต้แย้งที่แตกต่างกันผ่านวิธีการฝึกอบรมและการอนุมาน
การวิเคราะห์ LLM มีฟังก์ชั่นการเข้าร่วมสองรายการรถไฟและอนุมานเพื่อความสะดวกในการใช้งานผ่านอินเทอร์เฟซบรรทัดคำสั่ง วิ่ง
python -m llm_analysis.analysis train --helpหรือ
python -m llm_analysis.analysis infer --helpเพื่อตรวจสอบตัวเลือกหรืออ่านเอกสารที่เชื่อมโยง อ้างถึงตัวอย่างเพื่อดูว่าพวกเขาใช้อย่างไร
train และ infer ใช้การแม็พการกำหนดค่าชื่อกับการกำหนดค่าล่วงหน้า ( model_configs , gpu_configs , dtype_configs ) และอาร์กิวเมนต์ผู้ใช้อินพุตอื่น ๆ เพื่อสร้าง LLMAnalysis และค้นหา
การแมปที่กำหนดไว้ล่วงหน้าจะถูกเติมที่รันไทม์จากรุ่น GPU และประเภทข้อมูลการกำหนดค่าข้อมูล json ภายใต้ Model_Configs, GPU_Configs และ DTYPE_CONFIGS ในการเพิ่มโมเดลใหม่ GPU หรือประเภทข้อมูลไปยังการแมปสำหรับการสืบค้นเพียงเพิ่มไฟล์คำอธิบาย json ลงในโฟลเดอร์ที่เกี่ยวข้อง
การวิเคราะห์ LLM ยังรองรับการดึง ModelConfig จากเส้นทางไฟล์ config json รุ่นหรือกอดหน้าด้วยชื่อรุ่น
python -m llm_analysis.analysis train --model_name=local_example_model.json ตรวจสอบการกำหนดค่าโมเดลภายใต้โฟลเดอร์ model_configsEleutherAI/gpt-neox-20b เป็น model_name เมื่อเรียก train หรือ infer ชั่นการเข้าร่วม python -m llm_analysis.analysis train --model_name=EleutherAI/gpt-neox-20b --total_num_gpus 32 --ds_zero 3 ด้วยวิธีนี้การวิเคราะห์ LLM อาศัย transformers เพื่อค้นหาการกำหนดค่าโมเดลที่สอดคล้องกันใน huggingface.co/models ซึ่งหมายถึงข้อมูลของรุ่นใหม่ที่มีอยู่หลังจากไลบรารี Transformers รุ่นบางรุ่นเท่านั้น หากต้องการเข้าถึงรุ่นล่าสุดผ่านชื่อของพวกเขาให้อัปเดตแพ็คเกจ transformers ที่ติดตั้ง รายการคำสั่งที่มีประโยชน์มีให้สำหรับการสืบค้นกับการแมปที่กำหนดไว้ล่วงหน้าเช่นเดียวกับการกอดใบหน้าหรือการกำหนดค่าการถ่ายโอนข้อมูล เรียกใช้ python -m llm_analysis.config --help สำหรับรายละเอียด
ตัวอย่างบางส่วน:
python -m llm_analysis.config get_model_config_by_name EleutherAI/gpt-neox-20b รับ ModelConfig จากการแมปที่มีประชากรตามชื่อหากไม่พบ LLM-analysis พยายามที่จะได้รับจาก Huggingface
โปรดทราบว่ารุ่น Llama ต้องการอย่างน้อย transformers-4.28.1 เพื่อดึงข้อมูลไม่ว่าจะเป็นการอัปเดตไปยังไลบรารี transformers ในภายหลังหรือใช้ ModelConfig ที่กำหนดไว้ล่วงหน้าสำหรับรุ่น LLAMA ( / ในชื่อรุ่นจะถูกแทนที่ด้วย _ )
python -m llm_analysis.config list_gpu_configsแสดงชื่อของการกำหนดค่า GPU ที่กำหนดไว้ล่วงหน้าทั้งหมดจากนั้นคุณสามารถสอบถามได้ด้วย
python -m llm_analysis.config get_gpu_config_by_name a100-sxm-80gb เพื่อแสดง GPUConfig ที่สอดคล้องกัน
การตั้งค่า Flops และประสิทธิภาพของหน่วยความจำเป็น 1 (ค่าเริ่มต้น) ให้ขอบเขตที่ต่ำกว่าของการฝึกอบรมหรือเวลาแฝงการอนุมานเนื่องจากจะถือว่าประสิทธิภาพฮาร์ดแวร์สูงสุด (ซึ่งไม่เคยเป็นกรณี) สามารถพบความเป็นจริงได้หรือประสิทธิภาพของหน่วยความจำโดยการเปรียบเทียบและการทำโปรไฟล์โดยใช้ขนาดอินพุตในโมเดล
หากมีการตั้งสมมติฐานเพื่อประสิทธิภาพของ Flops รายงานวรรณกรรมรายงานสูงถึง 0.5 สำหรับการฝึกอบรมแบบจำลองขนาดใหญ่และสูงถึง 0.7 สำหรับการอนุมาน 0.9 สามารถเป็นเป้าหมายที่ก้าวร้าวสำหรับประสิทธิภาพของหน่วยความจำ
การวิเคราะห์ LLM มีวัตถุประสงค์เพื่อให้การประเมินการใช้หน่วยความจำและเวลาแฝง lower-bound
การวิเคราะห์ LLM ในปัจจุบันครอบคลุม Tensor Parallelism (TP), Pipeline Parallelism (PP), Sequence Parallelism (SP), Parallelism ผู้เชี่ยวชาญ (EP), และ Data Parallelism (DP)
TP, PP และ SP ใช้รูปแบบของการขนานที่ใช้ใน Megatron-LM สำหรับการฝึกอบรมและ FasterTransformer สำหรับการอนุมาน
ในการวิเคราะห์การฝึกอบรม DP Sharding จะใช้ DeepSpeed ZeRO หรือ FSDP ds_zero ใช้เพื่อระบุกลยุทธ์การให้เศษ DP
| ds_zero | Deepspeed Zero | FSDP | การวาง |
|---|---|---|---|
| 0 | พิการ | no_shard | ไม่มีเศษ |
| 1 | ขั้นตอนที่ 1 | N/A | ชาร์ดเครื่องมือเพิ่มประสิทธิภาพ |
| 2 | ขั้นตอนที่ 2 | shard_grad_op | ชาร์ดไล่ระดับสีและสถานะของเครื่องมือเพิ่มประสิทธิภาพ |
| 3 | ขั้นตอนที่ 3 | full_shard | การไล่ระดับสีชาร์ด, สถานะเครื่องมือเพิ่มประสิทธิภาพ, พารามิเตอร์แบบจำลอง |
EP ขนานกับจำนวนผู้เชี่ยวชาญ MLP ในอุปกรณ์ ep_size เช่นจำนวนผู้เชี่ยวชาญต่อ GPU คือ total number of experts / ep_size ดังนั้นสำหรับโมดูล MLP จำนวนอุปกรณ์สำหรับมิติการทำให้เป็นคู่ขนานอื่น ๆ จะถูกหารด้วย ep_size เมื่อเทียบกับส่วนอื่น ๆ ของโมเดล
การสื่อสาร TP ถูกคำนวณเป็นการใช้ ring allreduce การสื่อสาร EP ถูกคำนวณเป็นการใช้ alltoall เวลาการสื่อสาร DP ถึงน้ำหนักแบบจำลองที่ไม่ได้รับเมื่อใช้ FSDP หรือ Deepspeed Zero นั้นถูกประเมินและเปรียบเทียบกับเวลาแฝงการคำนวณค่าที่ใหญ่กว่าของทั้งสองจะใช้สำหรับเวลาแฝงโดยรวม การสื่อสาร DP และ PP อื่น ๆ ถูกละเว้นในตอนนี้เช่นสมมติว่าการคำนวณที่สมบูรณ์แบบและการสื่อสารซ้อนทับกันซึ่งไม่เป็นความจริงเมื่อการสื่อสารไม่สามารถทับซ้อนกับการคำนวณเนื่องจากการพึ่งพาหรือเมื่อการสื่อสารยาวเกินไปที่จะซ่อนเนื่องจากการเชื่อมต่อระหว่างกันช้าหรือปริมาณข้อมูลขนาดใหญ่
การวิเคราะห์ LLM รองรับการปรับการเปิดใช้งานทั้งแบบเต็มและเลือก
| activation_recomputation | จุดตรวจสอบและคำนวณใหม่คืออะไร |
|---|---|
| 0 | ไม่มีการคำนวณการเปิดใช้งาน ต้องใช้หน่วยความจำจำนวนมากที่สุด |
| 1 | จุดตรวจการคำนวณความสนใจ (เมทริกซ์ qk^t คูณ, softmax, softmax dropout และความสนใจมากกว่า V. ) ในโมดูลความสนใจของชั้นหม้อแปลง ตามที่อธิบายไว้ในการลดการเปิดใช้งานการเปิดใช้งานในแบบจำลองหม้อแปลงขนาดใหญ่ |
| 2 | จุดตรวจสอบอินพุตไปยังโมดูลความสนใจในเลเยอร์หม้อแปลง ต้องมีการส่งต่อเป็นพิเศษในการให้ความสนใจ |
| 3 | จุดตรวจสอบอินพุตไปยังลำดับของโมดูล (Layernom-Attention-Layernom) ในชั้นหม้อแปลง ต้องมีการส่งต่อเพิ่มเติม (Layernom-Attention-Layernom) |
| 4 | การเปิดใช้งานการเปิดใช้งานเต็มรูปแบบจัดเก็บอินพุตไปยังชั้นหม้อแปลง ต้องใช้หน่วยความจำน้อยที่สุด ต้องมีการส่งต่อพิเศษของเลเยอร์ทั้งหมด |
ชนิดข้อมูลจะแสดงด้วยจำนวนบิตเพียง 32 (FP32, TF32), 16 (FP16, BF16), 8 (INT8) และ 4 (INT4) ชนิดข้อมูลบิตถูกสร้างแบบจำลองในตอนนี้
การปรับแต่งแบบจำลองนั้นเป็นแบบจำลองเดียวกัน (ควบคุมโดย total_num_tokens ที่ส่งผ่านไปยังฟังก์ชั่นการเข้า train ) เป็นการฝึกอบรมล่วงหน้าดังนั้นสมมติว่าการปรับแต่งแบบจำลองทั้งหมด (พารามิเตอร์ทั้งหมด) การปรับจูนพารามิเตอร์-ประสิทธิภาพ (PEFT) อยู่ในการสนับสนุนในอนาคต
การอนุมานถือว่าการทับซ้อนกันอย่างสมบูรณ์แบบของการคำนวณและการดำเนินการหน่วยความจำเมื่อคำนวณเวลาแฝงและการใช้หน่วยความจำสูงสุดซ้ำเมื่อคำนวณการใช้หน่วยความจำ
ตรวจสอบ Todos ด้านล่างเพื่อรับสิ่งต่อไปและติดตามความคืบหน้า! การมีส่วนร่วมหรือข้อเสนอแนะใด ๆ ยินดีต้อนรับอย่างมาก!
หากคุณใช้การวิเคราะห์ LLM ในงานของคุณโปรดอ้างอิง:
Cheng Li. (2023). LLM-Analysis: Latency and Memory Analysis of Transformer Models for Training and Inference. GitHub repository, https://github.com/cli99/llm-analysis.
หรือ
@misc{llm-analysis-chengli,
author = {Cheng Li},
title = {LLM-Analysis: Latency and Memory Analysis of Transformer Models for Training and Inference},
year = {2023},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/cli99/llm-analysis}},
}
ยินดีต้อนรับการมีส่วนร่วมและข้อเสนอแนะ
LLM-analysis ใช้ pre-commit เพื่อให้แน่ใจว่าการจัดรูปแบบรหัสสอดคล้องกัน สำหรับคำขอดึงที่มีการสนับสนุนรหัสโปรดติดตั้ง pre-commit ( pip install pre-commit ) รวมถึงตะขอที่ใช้แล้ว ( pip install ใน Repo) และจัดรูปแบบรหัส (ทำงานโดยอัตโนมัติ