Cutting Edge & Easy LLM finetuning โดยใช้วิธีการขั้นสูงที่สุด (Qlora, Deepspeed, GPTQ, Flash Attention 2, FSDP ฯลฯ )
พัฒนาโดย Boris Zubarev | CV | LinkedIn | [email protected]
คุณใช้ โมเดลภาษาขนาดใหญ่ (LLMs) สำหรับงานของคุณและต้องการฝึกอบรมพวกเขาอย่างมีประสิทธิภาพมากขึ้นด้วยวิธีการขั้นสูงหรือไม่? ต้องการมุ่งเน้นไปที่ข้อมูลและการปรับปรุงมากกว่าการเข้ารหัสซ้ำ ๆ และใช้เวลานานสำหรับการฝึกอบรม LLM?
x - llm เป็นวิธีแก้ปัญหาของคุณ เป็นไลบรารีที่ใช้งานง่ายที่ปรับปรุงการเพิ่มประสิทธิภาพการฝึกอบรมดังนั้นคุณสามารถ มุ่งเน้นไปที่การปรับปรุงโมเดลและข้อมูลของคุณ ด้วย เทคนิคการฝึกอบรมที่ทันสมัย X-LLM ได้รับการออกแบบมาเพื่อประสิทธิภาพโดยวิศวกรที่เข้าใจความต้องการของคุณ
X— LLM เหมาะอย่างยิ่งไม่ว่าคุณจะ เตรียมพร้อมสำหรับการผลิต หรือต้องการ เครื่องมือสร้างต้นแบบที่รวดเร็ว
W&B
Yi-34B
, Mistal AI
, Llama 2
, Zephyr
, OpenChat
, Falcon
, Phi
, Qwen
, MPT
และอีกมากมาย X—LLM
ถูกทดสอบบน Python 3.8+, Pytorch 2.0.1+ และ Cuda 11.8
pip install xllm
เวอร์ชันซึ่งรวมถึง deepspeed
, flash-attn
และ auto-gptq
:
pip install " xllm[train] "
รุ่น xllm
เริ่มต้นแนะนำสำหรับการพัฒนาท้องถิ่น xllm[train]
แนะนำสำหรับการฝึกอบรม
CUDA เวอร์ชัน: 11.8
Docker: huggingface/transformers-pytorch-gpu:latest
from xllm import Config
from xllm . datasets import GeneralDataset
from xllm . experiments import Experiment
# Init Config which controls the internal logic of xllm
# QLoRA example
config = Config (
model_name_or_path = "HuggingFaceH4/zephyr-7b-beta" ,
apply_lora = True ,
load_in_4bit = True ,
)
# Prepare the data
train_data = [ "Hello!" ] * 100
train_dataset = GeneralDataset . from_list ( data = train_data )
# Build Experiment from Config: init tokenizer and model, apply LoRA and so on
experiment = Experiment ( config = config , train_dataset = train_dataset )
experiment . build ()
# Run Experiment (training)
experiment . run ()
# # [Optional] Fuse LoRA layers
# experiment.fuse_lora()
# [Optional] Or push LoRA weights to HuggingFace Hub
experiment . push_to_hub ( repo_id = "YOUR_NAME/MODEL_NAME" )
Config
ค่าควบคุม xllm
อย่างไรเพิ่มเติมเกี่ยวกับการกำหนดค่า
config = Config (
model_name_or_path = "openchat/openchat_3.5" ,
apply_lora = True ,
)
config = Config (
model_name_or_path = "openchat/openchat_3.5" ,
apply_lora = True ,
lora_rank = 8 ,
lora_alpha = 32 ,
lora_dropout = 0.05 ,
raw_lora_target_modules = "all" ,
# Names of modules to apply LoRA. A comma-separated string, for example: "k,q,v" or "all".
)
ในการฝึกอบรมโมเดล QLoRA
เราต้องโหลดโมเดลกระดูกสันหลังโดยใช้ห้องสมุด bitsandbytes
และน้ำหนัก INT4 (หรือ INT8)
config = Config (
model_name_or_path = "01-ai/Yi-34B" ,
apply_lora = True ,
load_in_4bit = True ,
prepare_model_for_kbit_training = True ,
)
config = Config (
model_name_or_path = "01-ai/Yi-34B" ,
apply_lora = True ,
load_in_4bit = True ,
prepare_model_for_kbit_training = True ,
llm_int8_threshold = 6.0 ,
llm_int8_has_fp16_weight = True ,
bnb_4bit_use_double_quant = True ,
bnb_4bit_quant_type = "nf4" ,
)
ก่อนหน้านั้นคุณต้องเข้าสู่ Huggingface Hub
หรือเพิ่ม API Token
ลงในตัวแปรสภาพแวดล้อม
config = Config (
model_name_or_path = "HuggingFaceH4/zephyr-7b-beta" ,
push_to_hub = True ,
hub_private_repo = True ,
hub_model_id = "BobaZooba/AntModel-7B-XLLM-Demo-LoRA" ,
save_steps = 25 ,
)
save_steps
LoRA
แล้วน้ำหนัก LoRA
เท่านั้นที่จะถูกบันทึกไว้ ก่อนหน้านั้นคุณต้องเข้าสู่ระบบ W&B
หรือเพิ่ม API Token
ลงในตัวแปรสภาพแวดล้อม
config = Config (
model_name_or_path = "HuggingFaceH4/zephyr-7b-beta" ,
report_to_wandb = True ,
logging_steps = 5 ,
wandb_project = "xllm-demo" ,
)
สิ่งนี้จะช่วยให้ใช้ less GPU memory
ในระหว่างการฝึกอบรมนั่นคือคุณจะสามารถเรียนรู้ได้มากกว่าที่ไม่มีเทคนิคนี้ ข้อเสียของเทคนิคนี้ทำให้ขั้นตอนข้างหน้าช้าลงนั่นคือ slowing down training
คุณจะได้รับการฝึกอบรมแบบจำลองขนาดใหญ่ (เช่น 7b ใน colab) แต่ด้วยค่าใช้จ่ายของความเร็วในการฝึกอบรม
config = Config (
model_name_or_path = "HuggingFaceH4/zephyr-7b-beta" ,
use_gradient_checkpointing = True ,
)
สิ่งนี้จะเพิ่มความเร็วในการฝึกอบรมและการใช้หน่วยความจำ GPU แต่ไม่ทำงานกับทุกรุ่นและ GPU คุณต้องติดตั้ง flash-attn
สำหรับสิ่งนี้ สามารถทำได้โดยใช้:
pip install "xllm[train]"
config = Config (
model_name_or_path = "meta-llama/Llama-2-7b-hf" ,
use_flash_attention_2 = True ,
)
apply_lora
) ช่วยลดค่าใช้จ่ายในการฝึกอบรมอย่างมากและยิ่งไปกว่านั้นยังช่วยให้การต่อสู้กับหายนะหายไปอย่างมีประสิทธิภาพload_in_4bit
และ prepare_model_for_kbit_training
ด้วยกัน นอกจากนี้ยังช่วยลดการใช้หน่วยความจำอย่างมีนัยสำคัญuse_gradient_checkpointing
วิธีนี้ยังช่วยลดการใช้หน่วยความจำอย่างมาก แต่ด้วยค่าใช้จ่ายในการชะลอการฝึกอบรมpush_to_hub
และ hub_private_repo
นอกจากนี้ยังระบุชื่อรุ่นใน hub_model_id
และ save_steps
ตัวอย่าง: "Bobazooba/supadupallama-7b-lora" ในระหว่างการฝึกอบรมทุกจุดตรวจสอบของโมเดลของคุณจะถูกบันทึกไว้ใน HuggingFace Hub หากคุณระบุ apply_lora
แล้วน้ำหนัก LORA เท่านั้นที่จะถูกบันทึกไว้ซึ่งคุณสามารถหลอมรวมกับรุ่นหลักได้อย่างง่ายดายเช่นโดยใช้ xllm
use_flash_attention_2
report_to_wandb
, ยังระบุ wandb_project
(ชื่อโครงการใน W & B) และ wandb_entity
(ชื่อผู้ใช้หรือองค์กรใน W & B)push_to_hub
คุณต้องเข้าสู่ฮับ HuggingFace ล่วงหน้าหรือระบุโทเค็น ( HUGGING_FACE_HUB_TOKEN
) ในไฟล์. ENV ในทำนองเดียวกันเมื่อใช้ report_to_wandb
คุณจะต้องเข้าสู่ระบบ W & B คุณสามารถระบุโทเค็น ( WANDB_API_KEY
) ในไฟล์. ENV หรือคุณจะได้รับแจ้งให้ป้อนโทเค็นบนบรรทัดคำสั่ง Qlora
จุดตรวจการไล่ระดับสี
ความสนใจแฟลช 2
การฝึกอบรมเสถียร
จุดตรวจสอบไปยัง HuggingFace Hub
รายงาน W&B
config = Config (
model_name_or_path = "meta-llama/Llama-2-7b-hf" ,
tokenizer_padding_side = "right" , # good for llama2
warmup_steps = 1000 ,
max_steps = 10000 ,
logging_steps = 1 ,
save_steps = 1000 ,
per_device_train_batch_size = 2 ,
gradient_accumulation_steps = 2 ,
max_length = 2048 ,
stabilize = True ,
use_flash_attention_2 = True ,
apply_lora = True ,
load_in_4bit = True ,
prepare_model_for_kbit_training = True ,
use_gradient_checkpointing = True ,
push_to_hub = False ,
hub_private_repo = True ,
hub_model_id = "BobaZooba/SupaDupaLlama-7B-LoRA" ,
report_to_wandb = False ,
wandb_project = "xllm-demo" ,
wandb_entity = "bobazooba" ,
)
การดำเนินการนี้มีไว้สำหรับรุ่นที่มีอะแดปเตอร์ LORA เท่านั้น
คุณสามารถระบุอย่างชัดเจนเพื่อหลอมรวมแบบจำลองหลังการฝึกอบรม
config = Config (
model_name_or_path = "HuggingFaceH4/zephyr-7b-beta" ,
apply_lora = True ,
fuse_after_training = True ,
)
แม้ว่าคุณจะใช้ Qlora
config = Config (
model_name_or_path = "HuggingFaceH4/zephyr-7b-beta" ,
apply_lora = True ,
load_in_4bit = True ,
prepare_model_for_kbit_training = True ,
fuse_after_training = True ,
)
หรือคุณสามารถหลอมรวมตัวเองหลังจากการฝึกอบรม
experiment . fuse_lora ()
DeepSpeed
เป็นสิ่งจำเป็นสำหรับรูปแบบการฝึกอบรมใน multiple GPUs
DeepSpeed
ช่วยให้คุณ efficiently manage the resources of several GPUs during training
ตัวอย่างเช่นคุณสามารถ distribute the gradients and the state of the optimizer to several GPUs
แทนที่จะจัดเก็บชุดการไล่ระดับสีที่สมบูรณ์และสถานะของเครื่องมือเพิ่มประสิทธิภาพในแต่ละ GPU การเริ่มต้นการฝึกอบรมโดยใช้ DeepSpeed
สามารถเกิดขึ้นได้จาก command line
เท่านั้น
train.py
from xllm import Config
from xllm . datasets import GeneralDataset
from xllm . cli import cli_run_train
if __name__ == '__main__' :
train_data = [ "Hello!" ] * 100
train_dataset = GeneralDataset . from_list ( data = train_data )
cli_run_train ( config_cls = Config , train_dataset = train_dataset )
Run Train (ในพารามิเตอร์ num_gpus
ระบุ GPU มากเท่าที่คุณมี)
deepspeed --num_gpus=8 train.py --deepspeed_stage 2
คุณยังสามารถผ่านพารามิเตอร์อื่น ๆ ได้
deepspeed --num_gpus=8 train.py
--deepspeed_stage 2
--apply_lora True
--stabilize True
--use_gradient_checkpointing True
ชื่อ | การแสดงความคิดเห็น | การเชื่อมโยง |
---|---|---|
X - LLM Prototyping | ในสมุดบันทึกนี้คุณจะได้เรียนรู้พื้นฐานของห้องสมุด | |
LLAMA2 & MISTRAL AI การปรับจูนอย่างมีประสิทธิภาพ | การฝึกอบรมรุ่น 7B ใน Colab โดยใช้ Qlora, BNB Int4, ด่านตรวจไล่ระดับสีและ x - llm |
X—LLM
เปิดใช้งานโมเดลต้นแบบไม่เพียง แต่ยังอำนวยความสะดวกในการพัฒนาโซลูชันพร้อมการผลิตผ่านความสามารถในตัวและการปรับแต่งในตัว
การใช้ X—LLM
เพื่อฝึกอบรมแบบจำลองนั้นง่ายและเกี่ยวข้องกับขั้นตอนเหล่านี้ไม่กี่ขั้นตอน:
Prepare
- เตรียมข้อมูลและโมเดลให้พร้อมด้วยการดาวน์โหลดและเตรียมความพร้อม บันทึกข้อมูลในเครื่องเป็น config.train_local_path_to_data
และ config.eval_local_path_to_data
หากคุณใช้ชุดข้อมูล evalTrain
- ใช้ข้อมูลที่เตรียมไว้ในขั้นตอนก่อนหน้าเพื่อฝึกอบรมแบบจำลองFuse
- ถ้าคุณใช้ Lora ในระหว่างการฝึกอบรมฟิวส์ LoraQuantize
- เพิ่มประสิทธิภาพการใช้หน่วยความจำของโมเดลของคุณโดยการหาปริมาณ โปรดจำไว้ว่างานเหล่านี้ใน X—LLM
เริ่มต้นจากบรรทัดคำสั่ง ดังนั้นเมื่อคุณพร้อมที่จะไปการเปิดตัวโครงการเต็มรูปแบบของคุณจะมีลักษณะเช่นนี้:
python3 MY_PROJECT/cli/prepare.py
--dataset_key MY_DATASET
--model_name_or_path mistralai/Mistral-7B-v0.1
--path_to_env_file ./.env
deepspeed --num_gpus=8 MY_PROJECT/cli/train.py
--use_gradient_checkpointing True
--deepspeed_stage 2
--stabilize True
--model_name_or_path mistralai/Mistral-7B-v0.1
--use_flash_attention_2 False
--load_in_4bit True
--apply_lora True
--raw_lora_target_modules all
--per_device_train_batch_size 8
--warmup_steps 1000
--save_total_limit 0
--push_to_hub True
--hub_model_id MY_HF_HUB_NAME/LORA_MODEL_NAME
--hub_private_repo True
--report_to_wandb True
--path_to_env_file ./.env
python3 MY_PROJECT/cli/fuse.py
--model_name_or_path mistralai/Mistral-7B-v0.1
--lora_hub_model_id MY_HF_HUB_NAME/LORA_MODEL_NAME
--hub_model_id MY_HF_HUB_NAME/MODEL_NAME
--hub_private_repo True
--force_fp16 True
--fused_model_local_path ./fused_model/
--path_to_env_file ./.env
python3 MY_PROJECT/cli/quantize.py
--model_name_or_path ./fused_model/
--apply_lora False
--stabilize False
--quantization_max_samples 128
--quantized_model_path ./quantized_model/
--prepare_model_for_kbit_training False
--quantized_hub_model_id MY_HF_HUB_NAME/MODEL_NAME_GPTQ
--quantized_hub_private_repo True
--path_to_env_file ./.env
ตอนนี้ไลบรารี X—LLM
ให้คุณใช้ชุดข้อมูลโซดาเท่านั้น เราได้ตั้งค่าด้วยวิธีนี้เพื่อวัตถุประสงค์ในการสาธิต แต่เรากำลังวางแผนที่จะเพิ่มชุดข้อมูลเพิ่มเติมในไม่ช้า คุณจะต้องหาวิธีการดาวน์โหลดและจัดการชุดข้อมูลของคุณ พูดง่ายๆคือคุณดูแลข้อมูลของคุณและ X—LLM
จัดการส่วนที่เหลือ เราได้ทำแบบนี้อย่างมีวัตถุประสงค์เพื่อให้คุณมีพื้นที่เหลือเฟือเพื่อสร้างสรรค์และปรับแต่งเนื้อหาของหัวใจของคุณ
คุณสามารถปรับแต่งชุดข้อมูลของคุณในรายละเอียดเพิ่มฟิลด์เพิ่มเติม ทั้งหมดนี้จะช่วยให้คุณสามารถใช้งานใด ๆ ในพื้นที่ของ Supervised Learning
และ Offline Reinforcement Learning
ในเวลาเดียวกันคุณมีวิธีง่าย ๆ ในการส่งข้อมูลสำหรับการสร้างแบบจำลองภาษา
from xllm import Config
from xllm . datasets import GeneralDataset
from xllm . cli import cli_run_train
if __name__ == '__main__' :
train_data = [ "Hello!" ] * 100
train_dataset = GeneralDataset . from_list ( data = train_data )
cli_run_train ( config_cls = Config , train_dataset = train_dataset )
ในการตั้งค่าโครงการของคุณเองโดยใช้ X—LLM
คุณต้องทำสองสิ่ง:
X—LLM
ลงในโครงการของคุณเมื่อเสร็จสิ้นโครงการของคุณจะไปได้ดีและคุณสามารถเริ่มดำเนินการตามขั้นตอนที่คุณต้องการ (เช่นเตรียมฝึกอบรมและอื่น ๆ )
หากต้องการจัดการกับการสร้างโครงการของคุณด้วย X—LLM
ลองดูวัสดุด้านล่าง
X—LLM
และพอดีกับโครงการของคุณเอง ไลบรารี X—LLM
ใช้การตั้งค่าการกำหนดค่าเดียวสำหรับทุกขั้นตอนเช่นการเตรียมการฝึกอบรมและขั้นตอนอื่น ๆ ได้รับการออกแบบในแบบที่ช่วยให้คุณเข้าใจคุณสมบัติที่มีอยู่ได้อย่างง่ายดายและสิ่งที่คุณสามารถปรับได้ Config
มีการควบคุมเกือบทุกส่วนของแต่ละขั้นตอน ต้องขอบคุณการกำหนดค่าคุณสามารถเลือกชุดข้อมูลของคุณตั้งค่าตัวรวบรวมของคุณจัดการประเภทของการหาปริมาณในระหว่างการฝึกอบรมตัดสินใจว่าคุณต้องการใช้ LORA หรือไม่หากคุณต้องการส่งด่านตรวจไปที่ HuggingFace Hub
และอีกมากมาย
เส้นทางการกำหนดค่า: src.xllm.core.config.Config
หรือ
from xllm import Config
คุณมีความยืดหยุ่นในการปรับแต่งหลายแง่มุมของการฝึกอบรมโมเดลของคุณ: ข้อมูลวิธีการประมวลผลข้อมูลเทรนเนอร์กำหนดค่าวิธีการโหลดโมเดลจะเกิดอะไรขึ้นก่อนและหลังการฝึกอบรมและอื่น ๆ อีกมากมาย
เรามีส่วนประกอบพร้อมใช้งานสำหรับทุกส่วนของท่อ xllm
คุณสามารถสลับส่วนประกอบบางอย่างทั้งหมดเช่นชุดข้อมูลคอลเลเตอร์เทรนเนอร์และการทดลอง สำหรับส่วนประกอบบางอย่างเช่นการทดลองและการกำหนดค่าคุณมีตัวเลือกในการสร้างสิ่งที่มีอยู่แล้ว
สร้างสิ่งที่เย็นด้วย x - llm? กรุณาติดต่อฉันที่ [email protected] ฉันชอบที่จะได้ยินจากคุณ
เขียนถึงเราเพื่อให้เราสามารถเพิ่มโครงการของคุณ
พิจารณาเพิ่มป้ายลงในการ์ดรุ่นของคุณ
สำหรับโครงการ GitHub:
[ < img src = " https://github.com/BobaZooba/xllm/blob/main/static/images/xllm-badge.png " alt = " Powered by X—LLM " width = " 175 " height = " 32 " / > ](https://github.com/BobaZooba/xllm)
สำหรับการกอดการ์ดรุ่นฮับหน้า:
[ < img src = " https://cdn-uploads.huggingface.co/production/uploads/6074d5f1134c000d1ae10d42/JudU3rrPP5i87CfwINANO.png " alt = " Powered by X—LLM " width = " 175 " height = " 32 " / > ](https://github.com/BobaZooba/xllm)
มันจะเป็นแบบนี้:
ในขณะนี้เราไม่มีการทดสอบการรวมอย่างต่อเนื่องที่ใช้ GPU อย่างไรก็ตามเราอาจพัฒนาการทดสอบประเภทนี้ในอนาคต อย่างไรก็ตามเป็นสิ่งสำคัญที่ควรทราบว่าสิ่งนี้จะต้องใช้เวลาในการลงทุนในการพัฒนารวมถึงเงินทุนสำหรับการบำรุงรักษาเครื่อง
Experiment