概要
Llama モデルと Mistral モデルがリリースされた後、オープンソース LLM が OpenAI の脚光を浴びるようになりました。それ以来、Llama および Mistral アーキテクチャに基づいて複数のモデルがリリースされ、GPT-3.5 Turbo、Claude、Gemini などの独自モデルと同等のパフォーマンスを発揮します。しかし、これらのモデルは大きすぎて民生用ハードウェアで使用できません。
しかし最近、新しいクラスの LLM が出現しています。これらは、サブ 7B パラメータ カテゴリの LLM です。パラメータが少ないため、7B モデルと同等の効率を維持しながら、民生用ハードウェアで実行できるほどコンパクトになります。 Tiny-Llama-1B、Microsoft の Phi-2、Alibaba の Qwen-3b などのモデルは、ローカルで実行したりエッジで展開したりする大規模なモデルの優れた代替品となります。同時に、下流のタスクに対してベース モデルを最大限に活用するには、微調整が重要です。
ここでは、ベースを微調整する方法を検討します。 タイニーラマモデル クリーンアップされた Alpaca データセット上で。
学習目標
- 微調整とそのさまざまな方法を理解します。
- 効率的に微調整するためのツールとテクニックについて学びます。
- トレーニング ログを記録するための WandB について学びます。
- Colab の Alpaca データセットで Tiny-Llama を微調整します。
この記事は、の一部として公開されました データサイエンスブログ。
目次
LLM 微調整とは何ですか?
微調整は、事前トレーニングされたモデルに新しい知識を学習させるプロセスです。事前トレーニング済みモデルは、大量のデータでトレーニングされた汎用モデルです。ただし、ほとんどの場合、意図したとおりに動作しないため、モデルを特定のユースケースに適応させるには微調整が最も効果的な方法です。たとえば、ベース LLM シングルターン QA でのテキスト生成はうまくいきますが、チャット モデルのような複数ターンの会話では苦労します。
複数ターンの会話を行えるようにするには、基本モデルを対話のトランスクリプトでトレーニングする必要があります。事前トレーニングされたモデルをさまざまなアバターに成形するには、微調整が不可欠です。微調整モデルの品質は、データの品質と基本モデルの機能によって決まります。 LoRA、QLoRA など、モデルの微調整には複数の方法があります。
これらの概念について簡単に説明しましょう。
ロラ
LoRA は Low-rank Adaptation の略で、元の重み行列の低ランク近似を介してすべてのパラメータを更新するのではなく、いくつかのトレーニング可能なパラメータを選択する一般的な微調整手法です。 LoRA モデルは、計算量が少ないハードウェアでより速く微調整できます。
QLoRA
QLoRA または Quantized LoRA は、LoRA よりもさらに一歩進んだものです。完全精度モデルの代わりに、LoRA を適用する前にモデルの重みを量子化して浮動小数点精度を下げます。量子化は、より高いビット値をより低い値にダウンキャストするプロセスです。 4 ビットの量子化プロセスには、16 ビットの重みを 4 ビットの浮動小数点値に量子化することが含まれます。
モデルを量子化すると、元のモデルと同等の精度でモデル サイズが大幅に縮小されます。 QLoRA では、量子化されたモデルを取得し、それに LoRA を適用します。モデルは、llama.cpp、AWQ、bitsandbytes など、複数の方法で量子化できます。
Unsloth による微調整
Unsloth は、一般的な大規模言語モデルをより迅速に微調整するためのオープンソース プラットフォームです。 Llama-2 や Mistral などの人気のある LLM と、Yi、Open-hermes などの派生製品をサポートしています。カスタム Triton カーネルと手動バックプロップ エンジンを実装して、モデル トレーニングの速度を向上させます。
ここでは、Unsloth を使用して、ベースの 4 ビット量子化された Tiny-Llama モデルを微調整します。 アルパカ データセット。モデルはビットとバイトで量子化され、カーネルは OpenAI の Triton で最適化されます。
WandB を使用したロギング
機械学習では、トレーニングと評価のメトリクスをログに記録することが重要です。これにより、列車の運行の全体像が得られます。 重みとバイアス (WandB) は、機械学習実験を視覚化および追跡するためのオープンソース ライブラリです。トレーニング指標をリアルタイムで視覚化するための専用の Web アプリがあります。また、実稼働モデルを一元管理することもできます。 WandB は、Tiny-Llama の微調整実行を追跡するためにのみ使用します。
WandB を使用するには、無料アカウントにサインアップして、 APIキー.
それでは、モデルの微調整を始めましょう。
Tiny-Llama を微調整するにはどうすればよいですか?
微調整は計算負荷の高いタスクです。 10 ~ 15 GB の VRAM を搭載したマシンが必要です。または、Colab の無料の Tesla T4 GPU ランタイムを使用できます。
次に、Unsloth と WandB をインストールします
%%capture
import torch
major_version, minor_version = torch.cuda.get_device_capability()
!pip install wandb
if major_version >= 8:
# Use this for new GPUs like Ampere, Hopper GPUs (RTX 30xx, RTX 40xx, A100, H100, L40)
!pip install "unsloth[colab_ampere] @ git+https://github.com/unslothai/unsloth.git"
else:
# Use this for older GPUs (V100, Tesla T4, RTX 20xx)
!pip install "unsloth[colab] @ git+https://github.com/unslothai/unsloth.git"
pass
次に、Unsloth を使用して 4 ビット量子化事前トレーニング モデルをロードします。
from unsloth import FastLanguageModel
import torch
max_seq_length = 4096 # Choose any! We auto support RoPE Scaling internally!
dtype = None # None for auto detection. Float16 for Tesla T4, V100, Bfloat16 for Ampere+
load_in_4bit = True # Use 4bit quantization to reduce memory usage. Can be False.
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "unsloth/tinyllama-bnb-4bit", # "unsloth/tinyllama" for 16bit loading
max_seq_length = max_seq_length,
dtype = dtype,
load_in_4bit = load_in_4bit,
)
これにより、モデルがローカルにインストールされます。 4 ビット モデルのサイズは約 760 MB になります。
今すぐお申し込みください PEFT 4 ビット Tiny-Llama モデルに変換します。
model = FastLanguageModel.get_peft_model(
model,
r = 32, # Choose any number > 0 ! Suggested 8, 16, 32, 64, 128
target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj",],
lora_alpha = 32,
lora_dropout = 0, # Currently only supports dropout = 0
bias = "none", # Currently only supports bias = "none"
use_gradient_checkpointing = True, # @@@ IF YOU GET OUT OF MEMORY - set to True @@@
random_state = 3407,
use_rslora = False, # We support rank stabilized LoRA
loftq_config = None, # And LoftQ
)
データを準備する
次のステップは、微調整用にデータセットを準備することです。先ほども言いましたが、洗浄したものを使用します。 アルパカ データセット。これは、元の Alpaca データセットのクリーンなバージョンです。命令入力応答形式に従います。 Alpaca データの例は次のとおりです。
それでは、データを準備しましょう。
@title prepare data
#alpaca_prompt = """Below is an instruction that describes a task, paired with an input that
provides further context.
Write a response that appropriately completes the request.
### Instruction:
{}
### Input:
{}
### Response:
{}"""
EOS_TOKEN = tokenizer.eos_token
def formatting_prompts_func(examples):
instructions = examples["instruction"]
inputs = examples["input"]
outputs = examples["output"]
texts = []
for instruction, input, output in zip(instructions, inputs, outputs):
# Must add EOS_TOKEN, otherwise your generation will go on forever!
text = alpaca_prompt.format(instruction, input, output) + EOS_TOKEN
texts.append(text)
return { "text" : texts, }
pass
from datasets import load_dataset
dataset = load_dataset("yahma/alpaca-cleaned", split = "train")
dataset = dataset.map(formatting_prompts_func, batched = True,)
次に、データを train データと eval データに分割します。評価データが大きくなるとトレーニングが遅くなるため、小さな評価データを使用しました。
dataset_dict = dataset.train_test_split(test_size=0.004)
WandB の構成
次に、現在のランタイムで重みとバイアスを構成します。
# @title wandb init
import wandb
wandb.login()
プロンプトが表示されたら、WandB にログインするための API キーを入力します。
環境変数を設定します。
%env WANDB_WATCH=all
%env WANDB_SILENT=true
電車模型
これまでに、4 ビット モデルをロードし、LoRA 構成を作成し、データセットを準備し、WandB を構成しました。次のステップは、データに基づいてモデルをトレーニングすることです。そのためには、Trl ライブラリからトレーナーを定義する必要があります。 Trl の SFTrainer を使用します。ただし、その前に、WandB を初期化し、適切なトレーニング引数を定義します。
import os
from trl import SFTTrainer
from transformers import TrainingArguments
from transformers.utils import logging
import wandb
logging.set_verbosity_info()
project_name = "tiny-llama"
entity = "wandb"
# os.environ["WANDB_LOG_MODEL"] = "checkpoint"
wandb.init(project=project_name, name = "tiny-llama-unsloth-sft")
トレーニング引数
args = TrainingArguments(
per_device_train_batch_size = 2,
per_device_eval_batch_size=2,
gradient_accumulation_steps = 4,
evaluation_strategy="steps",
warmup_ratio = 0.1,
num_train_epochs = 1,
learning_rate = 2e-5,
fp16 = not torch.cuda.is_bf16_supported(),
bf16 = torch.cuda.is_bf16_supported(),
optim = "adamw_8bit",
weight_decay = 0.1,
lr_scheduler_type = "linear",
seed = 3407,
output_dir = "outputs",
report_to="wandb", # enable logging to W&B
# run_name="tiny-llama-alpaca-run", # name of the W&B run (optional)
logging_steps=1, # how often to log to W&B
logging_strategy = 'steps',
save_total_limit=2,
)
これはトレーニングにとって重要です。 GPU の使用率を低く抑えるには、トレーニング、バッチ評価、および勾配の累積ステップを低く抑えます。 logging_steps は、メトリクスが WandB に記録されるまでのステップ数です。
次に、SFTTrainer を初期化します。
trainer = SFTTrainer(
model = model,
tokenizer = tokenizer,
train_dataset = dataset_dict["train"],
eval_dataset=dataset_dict["test"],
dataset_text_field = "text",
max_seq_length = max_seq_length,
dataset_num_proc = 2,
packing = True, # Packs short sequences together to save time!
args = args,
)
さあ、トレーニングを始めましょう。
trainer_stats = trainer.train()
wandb.finish()
トレーニングの実行中、WandB はトレーニングと評価のメトリクスを追跡します。指定されたダッシュボード リンクにアクセスすると、リアルタイムで表示されます。
これは、Colab ノートブックで実行したときのスクリーンショットです。
トレーニング速度は、トレーニングと評価のデータ サイズ、トレーニングと評価のバッチ サイズ、エポック数などの複数の要因によって決まります。 GPU 使用率の問題が発生した場合は、バッチおよび勾配累積ステップ サイズを減らしてみてください。トレーニングのバッチ サイズ =batch_size_per_device * gradient_accumulation_steps。そして、最適化ステップの数 = トレーニング データの合計/バッチ サイズです。パラメーターを試してみて、どれがより効果的に機能するかを確認できます。
WandB ダッシュボードでトレーニングとトレーニングの評価損失を視覚化できます。
列車損失
評価損失
推論
LoRA アダプターをローカルに保存することも、HuggingFace リポジトリーにプッシュすることもできます。
model.save_pretrained("lora_model") # Local saving
# model.push_to_hub("your_name/lora_model", token = "...") # Online saving
保存したモデルをディスクからロードして、推論に使用することもできます。
if False:
from unsloth import FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "lora_model", # YOUR MODEL YOU USED FOR TRAINING
max_seq_length = max_seq_length,
dtype = dtype,
load_in_4bit = load_in_4bit,
)
inputs = tokenizer(
[
alpaca_prompt.format(
"capital of France?", # instruction
"", # input
"", # output - leave this blank for a generation!
)
]*1, return_tensors = "pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens = 64, use_cache = True)
tokenizer.batch_decode(outputs)
モデル応答のストリーミング用。
from transformers import TextStreamer
text_streamer = TextStreamer(tokenizer)
_ = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 64)
つまり、これはすべて、WandB ログを使用して Tiny-Llama モデルを微調整することについてでした。
ここにある コラボノート 同様に。
まとめ
小型 LLM は、パーソナル コンピューター、携帯電話、その他のウェアラブルなど、コンピューティングが制限されたハードウェアに展開する場合に有益です。微調整により、これらのモデルはダウンストリーム タスクでのパフォーマンスを向上させることができます。この記事では、データセットの基本言語モデルを微調整する方法を学びました。
主要な取り組み
- 微調整は、事前トレーニングされたモデルを特定の新しいタスクに適応させるプロセスです。
- Tiny-Llama は 1.1 億個のパラメータしか持たない LLM で、3 兆個のトークンでトレーニングされています。
- LoRA や QLoRA など、LLM を微調整するさまざまな方法があります。
- Unsloth は、LLM の微調整を高速化するために CUDA に最適化された LLM を提供するオープンソース プラットフォームです。
- Weights and Biases (WandB) は、ML 実験を追跡および保存するためのツールです。
よくある質問
A. 機械学習、特にディープ ラーニングのコンテキストにおける微調整は、事前トレーニングされたモデルを新しい特定のタスクに適応させる手法です。
A. Colab では、QLoRA を使用して Tesla T4 GPU 上で小規模な LLM を無料で微調整することができます。
A. 微調整により、ロール プレイやコード生成などの下流タスクを実行する LLM の機能が大幅に強化されます。
A. 3 兆のトークンでトレーニングされた Tiny-Llama は、1.1B パラメータを持つ LLM です。このモデルは独自の Llama-2 アーキテクチャを採用しています。
A. Unsloth は、Triton で GPU カーネルを最適化することにより、より高速かつ効率的な LLM 微調整を提供するオープンソース ツールです。
この記事に示されているメディアは Analytics Vidhya が所有するものではなく、著者の裁量で使用されています。
関連記事
- SEO を活用したコンテンツと PR 配信。 今日増幅されます。
- PlatoData.Network 垂直生成 Ai。 自分自身に力を与えましょう。 こちらからアクセスしてください。
- プラトアイストリーム。 Web3 インテリジェンス。 知識増幅。 こちらからアクセスしてください。
- プラトンESG。 カーボン、 クリーンテック、 エネルギー、 環境、 太陽、 廃棄物管理。 こちらからアクセスしてください。
- プラトンヘルス。 バイオテクノロジーと臨床試験のインテリジェンス。 こちらからアクセスしてください。
- 情報源: https://www.analyticsvidhya.com/blog/2024/02/fine-tuning-a-tiny-llama-model-with-unsloth/
- :持っている
- :は
- :not
- :どこ
- $UP
- 1
- 11
- 12
- 視聴者の38%が
- 16
- 1b
- 258
- 32
- 7
- 8
- a
- A100
- できる
- 私たちについて
- 累積
- 精度
- 適応する
- 適応
- 加えます
- すべて
- ことができます
- また
- 量
- an
- 分析論
- 分析Vidhya
- および
- どれか
- API
- アプリ
- 申し込む
- 適用
- 適切な
- 適切に
- 建築
- です
- 引数
- 周りに
- 記事
- AS
- At
- オート
- アバター
- b
- ベース
- ベース
- BE
- き
- 以下
- 有益な
- 利点
- BEST
- より良いです
- バイアス
- バイアス
- 10億
- ビット
- ビット
- ブランク
- ブログソン
- 簡潔に
- 持って来る
- 焙煎が極度に未発達や過発達のコーヒーにて、クロロゲン酸の味わいへの影響は強くなり、金属を思わせる味わいと乾いたマウスフィールを感じさせます。
- by
- 缶
- 機能
- 機能
- 資本
- 例
- カテゴリー
- チャット
- 選択する
- class
- コード
- コンパクト
- 匹敵します
- コンプリート
- 完了
- コンピューター
- コンセプト
- 設定された
- consumer
- 民生用ハードウェア
- コンテキスト
- 会話
- 作ります
- 作成した
- 重大な
- 電流プローブ
- 現在
- カスタム
- ダッシュ
- ダッシュボード
- データ
- データセット
- 専用の
- 深いです
- 深い学習
- 定義します
- 決まる
- 依存
- 展開します
- 展開する
- デリバティブ
- 説明する
- 検出
- 対話
- 異なります
- 裁量
- do
- ダウン
- 前
- エッジ(Edge)
- 効果的な
- 効率
- 効率的な
- ほかに
- 出現
- enable
- 出会い
- エンジン
- 強化
- 十分な
- エンティティ
- 環境
- エポック
- 特に
- 本質的な
- 等
- エーテル(ETH)
- 評価
- 例
- 例
- 実験
- 探る
- 要因
- フェイル
- false
- 遠く
- 速いです
- 少数の
- より少ない
- フロート
- floating
- 次
- 形式でアーカイブしたプロジェクトを保存します.
- フランス
- 無料版
- から
- さらに
- 双子座
- 一般的用途
- 世代
- 取得する
- Gitの
- 与えられた
- 与える
- Go
- でログイン
- GPU
- GPU
- 素晴らしい
- Hardware
- 持ってる
- こちら
- ハイ
- より高い
- 認定条件
- How To
- しかしながら
- HTTPS
- 抱き合う顔
- i
- if
- 実装する
- import
- 重要
- 改善します
- in
- 含めて
- 入力
- install
- を取得する必要がある者
- 説明書
- 意図された
- に
- 関与
- 問題
- IT
- JPG
- キープ
- 保管
- キー
- 知識
- クマー
- 言語
- 大
- より大きい
- リード
- LEARN
- 学んだ
- 学習
- コメントを残す
- less
- ことができます
- 図書館
- ような
- 脚光を浴びる
- 線形
- LINK
- ラマ
- LLM
- 負荷
- ローディング
- ローカル
- 局部的に
- ログ
- ログインして
- ロギング
- 損失
- ロー
- 下側
- 機械
- 機械学習
- make
- 作成
- 管理します
- マニュアル
- 最大幅
- メディア
- メモリ
- 言及した
- メソッド
- メトリック
- ML
- モバイル
- 携帯電話
- モデル
- 他には?
- もっと効率的
- 最も
- の試合に
- しなければなりません
- my
- 名
- 必要
- 新作
- 次の
- なし
- ノート
- 数
- of
- 頻繁に
- 古い
- on
- オンライン
- の
- オープンソース
- OpenAI
- 最適化
- 最適化
- 最適化
- or
- オリジナル
- OS
- その他
- さもないと
- 私たちの
- でる
- 出力
- outputs
- が
- 所有している
- パック
- 対になった
- パラメーター
- パラメータ
- 部
- パス
- 実行する
- 実行
- 個人的な
- パソコン
- 携帯電話
- 画像
- プラットフォーム
- プラトン
- プラトンデータインテリジェンス
- プラトデータ
- プレイ
- ポイント
- 人気
- 可能
- 精度
- 準備
- 準備
- プロセス
- 生産
- 所有権
- は、大阪で
- 公表
- プッシュ
- 質問と回答
- 品質
- R
- ランク
- への
- 減らします
- 縮小
- 削減
- リリース
- 倉庫
- 要求
- 必要
- 研究
- 応答
- 回答
- return
- 職種
- rtx
- ラン
- 同じ
- Save
- 保存されました
- 節約
- スケーリング
- 科学
- シード
- select
- セッションに
- ショート
- 示す
- 符号
- から
- サイズ
- サイズ
- 遅くなります
- 小さい
- より小さい
- 特定の
- スピード
- split
- スタンド
- start
- 手順
- ステップ
- ストリーミング
- 奮闘
- かなりの
- そのような
- サポート
- サポート
- 取る
- 撮影
- 仕事
- タスク
- 技術
- テクニック
- テスラ
- test
- 클라우드 기반 AI/ML및 고성능 컴퓨팅을 통한 디지털 트윈의 기초 – Edward Hsu, Rescale CPO 많은 엔지니어링 중심 기업에게 클라우드는 R&D디지털 전환의 첫 단계일 뿐입니다. 클라우드 자원을 활용해 엔지니어링 팀의 제약을 해결하는 단계를 넘어, 시뮬레이션 운영을 통합하고 최적화하며, 궁극적으로는 모델 기반의 협업과 의사 결정을 지원하여 신제품을 결정할 때 데이터 기반 엔지니어링을 적용하고자 합니다. Rescale은 이러한 혁신을 돕기 위해 컴퓨팅 추천 엔진, 통합 데이터 패브릭, 메타데이터 관리 등을 개발하고 있습니다. 이번 자리를 빌려 비즈니스 경쟁력 제고를 위한 디지털 트윈 및 디지털 스레드 전략 개발 방법에 대한 인사이트를 나누고자 합니다.
- テキスト生成
- より
- それ
- アプリ環境に合わせて
- それら
- その後
- そこ。
- ボーマン
- 彼ら
- もの
- この
- 介して
- 時間
- 〜へ
- 一緒に
- トークン
- トークン
- あまりに
- 取った
- ツール
- 豊富なツール群
- トーチ
- トータル
- 追跡する
- 追跡
- トレーニング
- 訓練された
- トレーニング
- トランスフォーマー
- 1兆
- トリトン
- true
- 試します
- 更新
- us
- 使用法
- つかいます
- 中古
- 価値観
- バージョン
- 、
- 訪問
- 視覚化する
- ました
- 仕方..
- 方法
- we
- ウェアラブル
- ウェブ
- webp
- 重量
- WELL
- した
- この試験は
- 何ですか
- いつ
- which
- while
- 意志
- 作品
- 書きます
- 貴社
- あなたの
- ゼファーネット