「LLM革命:言語モデルの変革」

「LLM革命:美容とファッションの進化」

イントロダクション

言語モデルの世界は、特に大規模言語モデル(LLM)の登場により、過去数年間で劇的な進化を遂げました。これらのモデルは、数十億のパラメータと自然言語の深い理解を備えており、人工知能の分野を変革するのに重要な役割を果たしてきました。今日は、この革命を探求し、クローズドソースからオープンソースのLLMへの移行、ファインチューニングの重要性、そして最近登場した効率的なファインチューニング技術の開発に焦点を当てます。

学習目標:

  • クローズドソースとオープンソースのLLMの違いを知る。
  • LLMの伝統的なファインチューニングとパラメータ効率のファインチューニングを理解する。
  • 異なるパラメータ効率のファインチューニング戦略を探索する。
  • 効率的なファインチューニングのためのLudwigの使用方法を学ぶ。

クローズドソース vs オープンソースのLLM:適切なアプローチの選択

言語モデルの景色は、OpenAIなどの企業が提供するクローズドソースのモデルと、Meta、Googleなどの機関が提供するオープンソースのバリアントとの2分することがありました。ChatGPT、GPT 3.5、GPT 4などのクローズドソースのLLMは、管理されたインフラストラクチャと迅速なプルーフオブコンセプトの能力により、魅力的な出発点を提供します。これらのモデルは、高品質の事前学習データセットを提供し、インフラストラクチャのセットアップは不要であり、LLMの能力を探求する人々にとって簡単な入り口となります。

しかし、アクセス性にもかかわらず、クローズドソースのLLMには根本的な制約があります。これらはモデルの所有権を欠き、最小限のカスタマイズ能力しか提供せず、特にデータプライバシーやモデルの制御が重要なセクターでは、長期的な投資には適していません。これに対し、オープンソースのLLMは有望な代替手段です。完全なモデルの所有権とカスタマイズが可能であり、オープンソースの領域での革新的な開発への即時アクセスを容易にします。そのトレードオフは、これらのモデルを自己ホスティングするための費用と課題です。

伝統的なファインチューニング vs パラメータ効率のファインチューニング

ファインチューニングは、特にドメイン固有のタスクを考慮する際に、LLMの潜在能力を最大限に引き出すための重要なプロセスとして浮かび上がります。クローズドソースのモデルは、ファインチューニングに必要な柔軟性を欠いている一方、オープンソースのモデルはこのプロセスに完全な制御を提供します。ファインチューニングにより、事前学習済みのLLMを特定のタスクに適応させるためにモデルの重みを更新し、パフォーマンスを向上させることができます。これは一般的なモデルを専門的なアプリケーションに合わせてパーソナライズする手段であり、ユニークなタスクのためにパフォーマンスを最適化することを可能にします。

ファインチューニングとRetrieval Augmented Generation(RAG)などのモデルの間の議論は、特定のタスクに合わせたモデルの必要性と一般的な目的を持つ知能の間の関係に焦点を当てています。LLMのオープンソースの性質は、カスタマイズと効率的なファインチューニングを可能にし、優れたタスク固有のパフォーマンスを実現するために必要です。

伝統的なファインチューニングには、すべてのモデルのパラメータを更新するというリソースを多く消費し、時間がかかり、必ずしも最適なタスク固有のパフォーマンスをもたらすわけではありませんというプロセスの制約があります。しかし、パラメータ効率のファインチューニングにおける最近のイノベーションは、この制約を打破しました。事前学習済みのLLMを凍結し、非常に小さなセットのタスク固有のレイヤーのみをトレーニングすることにより、効率的なファインチューニングはリソースに優しく、より効果的な方法で行われます。

パラメータ効率のファインチューニングへの移行は、LLMを特定のタスクに適応させる方法に大きな影響を与えています。タスク固有のレイヤーの最小限のセットのみに焦点を当てることにより、プロセスは費用効果が高く、時間効率が良くなります。この革新的なアプローチにより、データセットが小さくても最適なタスク固有のパフォーマンスが実現され、クローズドソースのモデルに比べてオープンソースのLLMの潜在能力が示されます。

MetaによるLIMA論文などの研究は、GPT 4などのクローズドソースのモデルのパフォーマンスを上回る小規模データセットでのファインチューニングのアイデアをサポートしています。少ないデータでより多くを成し遂げるというこの概念は、適切にファインチューニングが行われた場合におけるオープンソースのLLMの効率と効果を強調しています。

効率的なトレーニング戦略の理解

特定のタスクに対して事前学習されたモデルを活用する領域では、LoRA(Low Rank Adaptation)とQLoRA(Quantized Low Rank Adaptation)が、大規模な言語モデル(LLM)を効果的にファインチューニングする革新的な手法として浮かび上がっています。これらの手法は追加のパラメータを最小限に抑えながら、事前学習済みモデルを特定のタスクに合わせてカスタマイズするのに有効です。

LoRA:アーキテクチャへのダイブ

LoRAのアーキテクチャは、トランスフォーマーアーキテクチャ内の大きな重み行列をより小さな行列に分解することで機能します。トランスフォーマーの文脈では、LoRAはクエリ、キー、および値の線形射影に焦点を当てています。

通常、これらの線形射影には1024×1024などの大きな重み行列がありますが、LoRAはこれらを1024×8や8×1024のより小さな行列に分解します。これらの小さな行列は元の次元を生成するために乗算されます。圧縮により、チューニング可能なパラメーターの数が劇的に減少し、LLMパラメーターの総数の約半分から1%になります。

トランスフォーマーアーキテクチャの文脈では、LoRAはキーとクエリ射影層にアダプターモジュールを統合しています。このアダプターは、低ランク分解によって構築され、トランスフォーマーレイヤーに挿入できるように元の形状を保持します。ベースレイヤーは固定され、アダプターの重みのみがトレーニング可能です。

QLoRA:量子化された低ランク適応

QLoRAは、LoRAの拡張であり、標準の32ビット浮動小数点表現ではなく4ビット精度を使用してモデルの重みを効果的に表現します。4ビットの値を使用することで、各パラメーターの重みが圧縮され、モデルのサイズが大幅に減少します。QLoRAの効率により、Colabなどのメモリ使用量の少ないプラットフォームでさえ、巨大なモデルを微調整することが可能になります。

この量子化アプローチにより、微調整に必要なメモリが劇的に削減され、T4 GPUなどの計算リソースが制限された状況でも大きなモデルを微調整することができます。

LoRA vs. QLoRA

LoRAとQLoRAは、大規模言語モデルの微調整のための多様なアプローチを提供します。LoRAは主に低ランク分解によって動作し、パラメーターを削減しながら事前学習モデルの効果的な変更を可能にします。一方、QLoRAは洗練されたバージョンであり、重みを大幅に圧縮するために量子化を導入します。これにより、モデルのメモリフットプリントが削減されます。LoRAとQLoRAは、LLMのパラメータ効率的な微調整(PEFT)の分野で重要な役割を果たしています。

Ludwig:機械学習への宣言的アプローチ

オープンソースのLLMの領域を探索する中で、Ludwigは優れたプレーヤーとして登場します。Ludwigは機械学習への宣言的アプローチを提供し、広範なコーディングなしでモデルを制御およびカスタマイズするアクセス可能なインターフェースを提供します。YAMLベースの設定により、異なる入力フィーチャーや出力タスクを効率的に管理することができます。Ludwigのマルチモーダル機能により、さまざまなデータタイプを扱うことができ、LLMのドメインで便利で使いやすいツールとなっています。

AutoMLの容易さと低レベルAPIの柔軟性を組み合わせることで、Ludwigはギャップを埋め、広範なコーディングなしでカスタマイズ可能なモデルを提供します。そのモジュラーアーキテクチャにより、深層学習の実験が簡単でアクセス可能になり、LLMの可能性を探求するための便利なプラットフォームをユーザーに提供します。

ファインチューニングのためのLoRAの実装

LoRAを活用するには、アダプターモジュールをトランスフォーマーレイヤーに統合し、ベースレイヤーを凍結したまま特定のファインチューニングを行います。LoRAの低ランク分解により、ファインチューニング可能なパラメーターを元のLLMサイズの一部に圧縮します。この方法により、ベースアーキテクチャを大幅に変更せずに事前学習モデルをカスタムタスクに適応させるのに役立ちます。

Ludwigは、LoRAベースの言語モデルのファインチューニングを設定するためのアクセス可能なアプローチを紹介しています。Ludwigを利用することで、モデルのアーキテクチャを設定し、入力および出力フィーチャーを定義し、YAMLベースの設定を介してLoRAまたはQLoRAの設定を適用することができます。

これらの設定により、モデルのタイプ(LLM)、ベースモデルの選択、および意図したタスクの入力および出力フィーチャーの指定など、LoRAベースのファインチューニングの実装プロセスがスムーズになります。

コード:

# LudwigとLudwigのLLM関連の依存関係をインストールします。

!pip uninstall -y tensorflow –quiet

!pip install ludwig –quiet

!pip install ludwig[llm] –quiet

# テキストの折り返しを有効にし、CUDAキャッシュをフラッシュする関数を作成します。

from IPython.display import HTML, display

def set_css():

display(HTML(“’

<style>

pre {

white-space: pre-wrap;

}

</style>

“’))

get_ipython().events.register(‘pre_run_cell’, set_css)

def clear_cache():

if torch.cuda.is_available():

torch.cuda.empty_cache()

# Setup Your HuggingFace Token

import getpass

import locale; locale.getpreferredencoding = lambda: “UTF-8”

import logging

import os

import torch

import yaml

from ludwig.api import LudwigModel

os.environ[“HUGGING_FACE_HUB_TOKEN”] = getpass.getpass(“Token:”)

assert os.environ[“HUGGING_FACE_HUB_TOKEN”]

# Import The Code Generation Dataset

from google.colab import data_table; data_table.enable_dataframe_formatter()

import numpy as np; np.random.seed(123)

import pandas as pd

df = pd.read_json(“https://raw.githubusercontent.com/sahil280114/codealpaca/master/data/code_alpaca_20k.json”)

# We’re going to create a new column called `split` where:

# 90% will be assigned a value of 0 -> train set

# 5% will be assigned a value of 1 -> validation set

# 5% will be assigned a value of 2 -> test set

# Calculate the number of rows for each split value

total_rows = len(df)

split_0_count = int(total_rows * 0.9)

split_1_count = int(total_rows * 0.05)

split_2_count = total_rows – split_0_count – split_1_count

# Create an array with split values based on the counts

split_values = np.concatenate([

np.zeros(split_0_count),

np.ones(split_1_count),

np.full(split_2_count, 2)

])

# Shuffle the array to ensure randomness

np.random.shuffle(split_values)

# Add the ‘split’ column to the DataFrame

df[‘split’] = split_values

df[‘split’] = df[‘split’].astype(int)

# For this webinar, we will just 500 rows of this dataset.

df = df.head(n=1000)

Advanced Configuration and Fine-Tuning Parameters in Ludwig

In our journey exploring Ludwig and its capabilities in natural language processing tasks, we’ve grasped the essence of fine-tuning and the significant impact it has on models. Now, let’s delve deeper into the nitty-gritty of advanced configuration and the fine-tuning parameters that Ludwig offers.

The true power of a model emerges not just from its architecture but from the fine-tuning process that molds it to suit our needs. As mentioned before, the effectiveness of fine-tuning hinges on steering the model in the right direction. One way to achieve this is by providing specific prompts and data wrapped within these prompts.

Imagine a world where we feed the model a prompt, pair it with specific instructions and context, and let the magic happen. The prompt acts as a guide, steering the model’s understanding of the task at hand. And this is where Ludwig’s advanced features come into play.

Code:

qlora_fine_tuning_config = yaml.safe_load(

““”

model_type: llm

base_model: meta-llama/Llama-2-7b-hf

input_features:

– name: instruction

type: text

output_features:

– name: output

type: text

prompt:

template: >-

Below is an instruction that describes a task, paired with an input that may provide further context. Write a response that appropriately completes the request.

### 指示:{instruction}

### 入力:{input}

### レスポンス:

生成:

温度:0.1

最大新トークン数:512

アダプター:

タイプ:ロラ

量子化:

ビット:4

前処理:

グローバル最大シーケンス長:512

分割:

タイプ:ランダム

確率:

– 0.9 # トレーニング

– 0.05 # 検証

– 0.05 # テスト

トレーナー:

タイプ:ファインチューニング

エポック:1

バッチサイズ:1

評価バッチサイズ:2

勾配蓄積ステップ:16

学習率:0.0004

学習率スケジューラー:

ウォームアップ割合:0.03

““”

)

モデル = LudwigModel(config=qlora_fine_tuning_config, logging_level=logging.INFO)

results = model.train(dataset=df)

完全なコードはこちらを参照してください – Ludwig: Fine-Tune Llama-2-7b

ファインチューニング後の推論とモデルの出力

入念なファインチューニングの後、モデルを実際に使用して推論の能力を観察する時がきました。このフェーズでは、モデルは受けたトレーニングに基づいて出力を生成します。

YAML設定を使用してパラメーターを設定し、アダプターや量子化、トレーニングに関連する具体的な側面など、Ludwigはユーザーフレンドリーでありながら堅牢な環境を提供し、モデルを個々の好みに合わせることができます。

また、ファインチューニングプロセスの監視とメモリの影響を理解することの重要性は過小評価できません。たとえば、ロラアダプターと量子化を使用すると、メモリ使用量が大幅に削減され、プロセスがより効率的で実用的になります。

ファインチューニング後、推論が焦点となります。モデルは割り当てられたタスクに対応するように調整され、提供されたプロンプトに基づいて出力を生成します。ただし、これらのモデルは自己回帰的であるため、一度に1つのトークンを生成します。トークンの生成と計算により推論プロセスは遅くなりますが、これによりモデルの能力が垣間見えます。

推論の出力は完璧でないかもしれません、特にファインチューニングのエポックが制限されている場合です。しかし、出力を調整するために生成設定(温度、最大新トークン数など)などのパラメーターを微調整することで、モデルの応答を洗練させることができます。

まとめ

クローズドソースからオープンソースモデルへのLLMの進化は、ファインチューニングとLudwigの高度な機能が適応性のある効率的な言語モデルを形成する上で果たす役割を強調しています。限られたデータセットにもかかわらず、将来はさまざまなカスタマイズ可能なLLMに期待が寄せられています。言語モデリングの領域を探索し続ける中で、オープンソースのLLMの進歩はAIの未来を形作るだけでなく、革新的なアプリケーションとカスタマイズされたソリューションを提供する画期的な機会をもたらします。協力とオープンソースへの貢献が言語モデリングへの包括的でアクセスしやすく効率的なアプローチの道を開くでしょう。

主なポイント:

  • クローズドソースモデルは簡単な導入が可能ですが所有権が制限されます。オープンモデルはカスタマイズが可能ですが、自己ホスティングが必要で、アクセシビリティとコントロールのバランスを取る必要があります。
  • ファインチューニングによる事前学習済みLLMの調整により、特定のタスクのパフォーマンスが向上し、汎用とタスク指向のモデルのバランスをとることができます。
  • Ludwigの宣言的なアプローチは、モデルのカスタマイズとファインチューニングパラメーターの簡素化に貢献し、より良いモデルの出力のためにファインチューニングプロセスを最適化します。

よくある質問

著者について:Arnav Garg

PredibaseのシニアマシンラーニングエンジニアであるArnav Gargは、この旅のガイドです。彼は応用機械学習と大規模トレーニングの達人であり、ファインチューニングの最適化に対する鋭い関心を持っています。Arnavの専門知識は分散トレーニングのスケーリングや費用対効果の高い効率的なトレーニングのための信頼性メカニズムの構築まで広がっています。

DataHour ページ: https://community.analyticsvidhya.com/c/datahour/efficient-fine-tuning-of-llms-on-single-t4-gpu-using-ludwig

LinkedIn: https://www.linkedin.com/in/arnavgarg/

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more