
최첨단 및 Easy LLM 최첨단 방법 (Qlora, DeepSpeed, GPTQ, Flash Arefection 2, FSDP 등)을 사용한 Finetuning
Boris Zubarev에 의해 개발되었습니다 | CV | LinkedIn | [email protected]
작업에 큰 언어 모델 (LLM)을 사용하고 있으며 고급 방법으로보다 효율적으로 교육하고 싶습니까? 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_stepsLoRA 로 모델을 훈련하면 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 있습니다.
당신은 더 큰 모델 (예 : Colab의 7B)을 훈련 시키지만 훈련 속도를 희생합니다.
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 허브에 저장됩니다. apply_lora 지정하면 LORA 가중치 만 저장되며 예를 들어 xllm 사용하여 기본 모델과 쉽게 융합 할 수 있습니다.use_flash_attention_2 추가하십시오wandb_project (W & B의 프로젝트 이름) 및 wandb_entity (W & B의 사용자 또는 조직 이름)를 지정하는 report_to_wandb 사용하는 것이 좋습니다.push_to_hub 의 경우, .env 파일에 Huggingface 허브에 사전에 로그인하거나 Token ( HUGGING_FACE_HUB_TOKEN )을 지정해야합니다. 마찬가지로 report_to_wandb 사용할 때는 W & B에 로그인해야합니다. .env 파일에 토큰 ( WANDB_API_KEY )을 지정하거나 명령 줄에 토큰을 입력하라는 메시지가 표시됩니다. Qlora
그라디언트 체크 패인팅
플래시주의 2
훈련을 안정화시킵니다
체크 포인트를 포옹 페이스 허브로 푸시하십시오
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 () multiple GPUs 교육 모델에는 DeepSpeed 필요합니다. DeepSpeed 사용하면 efficiently manage the resources of several GPUs during training 할 수 있습니다. 예를 들어, 각 GPU에 완전한 그라디언트 세트와 distribute the gradients and the state of the optimizer to several GPUs 할 수 있습니다. 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 프로토 타이핑 | 이 노트북에서는 도서관의 기본 사항을 배울 수 있습니다. | |
| llama2 & mistral ai 효율적인 미세 조정 | Qlora, Bnb Int4, Gradient Checkpointing 및 X — Llm을 사용한 Colab에서 7B 모델 교육 |
X—LLM 사용하면 프로토 타입 모델뿐만 아니라 내장 기능 및 사용자 정의를 통해 생산 준비 솔루션의 개발을 용이하게합니다.
X—LLM 사용하여 모델을 훈련시키기 쉽고 몇 가지 단계가 필요합니다.
Prepare - 데이터를 다운로드하고 준비하여 데이터와 모델을 준비하십시오. config.train_local_path_to_data 및 config.eval_local_path_to_data 에 로컬로 데이터를 저장합니다.Train - 이전 단계에서 준비된 데이터를 사용하여 모델을 훈련시킵니다.Fuse - 훈련 중에 Lora를 사용했다면 Lora가 퓨즈Quantize - 모델의 메모리 사용량을 정량화하여 최적화하십시오. 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 ./.envdeepspeed --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 ./.envpython3 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 ./.envpython3 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 에 콜백을 추가하십시오