
最先端のメソッド(Qlora、Deepspeed、GPTQ、Flash Atterness 2、FSDPなど)を使用して、最先端&Easy LLM 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 = 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います。
より大きなモデル(コラブの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」。トレーニング中、モデルのすべてのチェックポイントはハグFaceハブに保存されます。 apply_lora指定した場合、LORAの重みのみが保存されます。これは、たとえばxllmを使用して、メインモデルと簡単に融合できます。use_flash_attention_2を追加できる場合wandb_project (w&bのプロジェクト名)およびwandb_entity (W&Bのユーザーまたは組織名)を指定することも、 report_to_wandbを使用することをお勧めします。push_to_hubの場合、.envファイルのトークン( HUGGING_FACE_HUB_TOKEN )を事前にHuggingfaceハブにログインするか、指定する必要があることに注意してください。同様に、 report_to_wandbを使用する場合、W&Bにログインする必要があります。 .envファイルでトークン( WANDB_API_KEY )を指定するか、コマンドラインでトークンを入力するように求められます。 qlora
勾配チェックポイント
フラッシュ注意2
トレーニングを安定させます
チェックポイントをHuggingfaceハブに押します
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 )列車を実行します( 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効率的な微調整 | 7B Qlora、BNB INT4、勾配チェックポイント、X —LLMを使用したコラブでのモデルトレーニング |
X—LLM 、モデルのプロトタイプだけでなく、組み込み機能とカスタマイズを通じて生産対応ソリューションの開発を促進することもできます。
X—LLMを使用してモデルをトレーニングするのは簡単で、これらのいくつかのステップが必要です。
Prepare - データとモデルをダウンロードして準備することで、データとモデルの準備を整えます。 config.train_local_path_to_dataおよびconfig.eval_local_path_to_dataにconfig.train_local_path_to_dataにデータを保存します。Train - 前のステップで準備されたデータを使用してモデルをトレーニングしますFuse - トレーニング中にロラを使用した場合、ヒューズロラ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を使用して独自のプロジェクトを設定するには、2つのことを行う必要があります。
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にコールバックを追加します