Sign In
Free Sign Up
  • English
  • Español
  • 简体中文
  • Deutsch
  • 日本語
Sign In
Free Sign Up
  • English
  • Español
  • 简体中文
  • Deutsch
  • 日本語

Hugging FaceからLLMをファインチューニングする方法

大規模言語モデル(LLM)は、transformers (opens new window)と膨大なトレーニングデータのおかげで、優れたパフォーマンスを持つ多機能な機能を備えています。通常、LLMは汎用的なものであり、単一の目的でトレーニングされていません。例えば、GPT-4 (opens new window)は言語翻訳、テキスト生成、質問応答など、さまざまな機能を提供することができます。

特定のアプリケーションでは、例えば医療のためのチャットボットや未代表言語のための言語翻訳など、専門のモデルが必要です。幸いなことに、LLM(および他のトランスフォーマーベースのモデル)の強力な機能の1つは、適応能力です。したがって、モデルをゼロからトレーニングする代わりに、既存のLLMモデルを取り上げ、トレーニングデータでファインチューニングすることができます。

ファインチューニングは、大規模言語モデル(LLM)の領域では重要であり、多くの方法があります。そのため、ファインチューニングについてのトピックに深く入り込むために、プロンプトエンジニアリングやRAGなどの他の方法と比較するために、いくつかのブログを割り当てます。最初のブログでは、Hugging Faceのtransformersライブラリを使用したファインチューニングのプロセスを探り、次のブログでは汎用モデルをファインチューニングするためのOpenAIの使用に焦点を当てます。

# LLMのファインチューニング

ファインチューニングは、完全または部分的に行うことができます。LLMのサイズが非常に大きいため、完全にファインチューニングすることは不可能であり、Performance Efficient fine-tuning(一般的にはPEFT (opens new window)として知られています)は、LLMのファインチューニングによく使用される一般的なテクニックです。 PEFTはHugging Faceで十分なサポートがあるため、目的のためにHugging Faceモデルを使用します。

# 事前学習済みモデルの読み込み

Hugging Faceには、便利なライブラリやモジュールがいくつかあります。

  • Supervised Fine Tuning(SFT)
  • Performance Efficient Fine Tuning(PEFT)
  • AutoTokenizer

事前学習済みモデルとして、オープンソースのモデルを使用することができます。ここでは、サイズが小さくパフォーマンスが素晴らしいFalcon-7b (opens new window)を使用します。

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
from peft import LoraConfig

modelID = "tiiuae/falcon-7b"

# データセットの準備

SFT(トレーニングに間もなく使用する予定です)では、Hugging Faceハブのデータセットを直接使用することができます。そこにはたくさんのデータセットが用意されています。例えば、プロンプトにはOpen Assistanceデータセット (opens new window)を使用します。

注意:

ファインチューニングに使用するデータセットがHugging Faceハブで利用できない場合は、アカウントを使用してアップロードすることができます。

dataset = load_dataset("timdettmers/openassistant-guanaco", split="train")

# 要件に応じてモデルを変更する

部分的なファインチューニングに加えて、重みのサイズをさらに削減するために量子化も使用することができます。

quantizationConfig = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_compute_dtype=torch.float16,
    bnb_4bit_quant_type="nf4"
)

model = AutoModelForCausalLM.from_pretrained(modelID, quantization_config=quantizationConfig)

トークナイザも読み込みます。

tokenizer = AutoTokenizer.from_pretrained(modelID)
tokenizer.add_special_tokens({'pad_token': '<PAD>'})

注意:

大規模言語モデル(LLM)を読み込んでファインチューニングするには、かなりの計算能力が必要です。このモデルでは、Google Colab Proを使用し、A100 GPUを使用しました。

Boost Your AI App Efficiency now
Sign up for free to benefit from 150+ QPS with 5,000,000 vectors
Free Trial
Explore our product

# モデルのファインチューニング

これで、トレーナーを初期化する準備が整いました。SFTのコンストラクタには、以下のような引数があります。

  • model:事前学習済みモデル
  • train_dataset:ファインチューニングデータセット
  • dataset_text_field:テキストフィールド、通常は「text」です
  • max_seq_length:最大シーケンス長
  • tokenizer:テキストのためのトークナイザ
trainer = SFTTrainer(
        model=model,
        train_dataset=dataset,
        dataset_text_field="text",
        max_seq_length=512,
        tokenizer=tokenizer,
        packing=True,
    )

そして、トレーニングを開始できます。

trainer.train()

トレーニングが完了したら、いくつかの推論を行うために、対応するパイプラインを呼び出す必要があります。

from transformers import pipeline
pipeline = pipeline(
    "text-generation",
    model=model,
    tokenizer=AutoTokenizer.from_pretrained(model),
    device_map="auto",
)

例えば、次のプロンプトを使用して推論を行いました。

sequences = pipeline(
   "おそらく、この惑星で最もおいしい果物はカシューナッツ(生の形で)です。ブラジルや他の熱帯地域で見つかり、その味は比類のないものです。あなたはどう思いますか、サム? \\n サム:",
    max_length=200,
    do_sample=True,
    top_k=10,
    num_return_sequences=1
)

for seq in sequences:
    print(f"結果:{seq['generated_text']}")

以下のような出力が得られました(言語モデルの確率的な性質により、結果は異なる場合があります):

結果:おそらく、この惑星で最もおいしい果物はカシューナッツ(生の形で)です。ブラジルや他の熱帯地域で見つかり、その味は比類のないものです。あなたはどう思いますか、サム?
サム:おいしいと言ってもいいでしょう。少しナッツのような甘い味がありますが、非常に心地よい、バターのような味となめらかな食感があります。これは私のお気に入りの果物の1つで、手いっぱい食べることができます。
あなたが今まで行った中で最高の場所はどこですか?
サム:ああ、これは難しい質問です。非常に難しい答えです。
難しい答えですか?
サム:私はかなりの数の国に行ったことがありますが、おそらく私のお気に入りの場所はガラパゴス諸島です。数週間そこに滞在し、景色がとても好きでした。
あなたが今まで行った中で最悪の場所はどこですか?
サム:おそらく私が見た中で最もひどい場所はベルリンです。

# LLMのファインチューニングの実世界の応用

ファインチューニングは、産業がAIを使用する方法を変え、より手頃な価格で使いやすくしています。連続的なコストが必要なRetrieval-Augmented Generation(RAG)とは異なり、ファインチューニングはオープンソースのモデルを一度カスタマイズするだけで、追加の費用なしに済みます。これにより、完全な制御が可能になり、追加のインフラストラクチャは不要になります。PaLMやFinGPTなどの例は、ファインチューニングされたモデルがどれだけ強力で柔軟であるかを示しています。

  • 顧客サービスの自動化:特定の顧客サービスビジネス向けにモデルをファインチューニングすることで、一般的な会話を単に模倣するのではなく、ビジネスの文脈でクエリを理解し応答するチャットボットを作成することができます。このアプローチは、外部リソースの使用を回避し、用語や顧客の質問を本当に理解する24時間365日の顧客サポートを提供し、全体的な顧客体験と満足度を向上させます。

  • 言語翻訳サービス:ファインチューニングにより、開発者は言語モデルを言語翻訳タスクに特化させることができ、一般的なワンサイズフィットオールのアプローチを回避することができます。これにより、国際ビジネスや旅行において言語の壁をより効果的に乗り越えることができます。外部APIの継続的なコストは必要ありません。

  • 個別の教育:ファインチューニングにより、学習教材を各学生のスピードと学習スタイルに合わせて調整するAIパワードプラットフォームを作成することが可能になります。教育機関がモデルを所有することで、追加のコストなしに学習教材を継続的に進化させ、適応させることができます。これにより、教育がより個別化され、効果的になります。

これらの例は、ファインチューニングされたLLMが実世界の問題を解決し、日常生活を向上させるために適用できることを示しています。ファインチューニングされたモデルの適応性と効率性は、将来さらに革新的な応用を約束しています。

Join Our Newsletter

# 結論

LLMの機能は、特定のタスクにファインチューニングすることで活用することができます。Hugging Faceや部分的なファインチューニング、量子化などのPEFT技術など、多くのライブラリやモデルが利用可能になったことで、LLMのファインチューニングはより簡単で手頃なものになっています。

現在、多くの組織が大規模言語モデル(LLM)のAPIを使用してAIアプリケーションを開発しており、ベクトルデータベースはコンテキスト埋め込みの効率的なストレージと検索を提供することで重要な役割を果たしています。MyScale (opens new window)は、コスト、精度、速度などのすべての要素を考慮して、AIアプリケーションに特化して設計されたベクトルデータベースです。開発者にとってはSQLのみが必要なため、非常に使いやすいです。

ファインチューニングは、大規模言語モデル(LLM)の最適化において重要な役割を果たし、多様な方法が提供されています。次回のブログでは、OpenAIを使用して汎用モデルをファインチューニングする方法について探求します。

関連記事MyScaleで専門のベクトルデータベースを凌駕する (opens new window)

フィードバックや提案がある場合は、MyScaleの**Discord (opens new window)**までお気軽にご連絡ください。

Keep Reading
images
専門のベクトルデータベースに未来を築くべきではない

AIの台頭に伴い、ベクトルデータベースは大規模で高次元のデータを効率的に格納、管理、検索する能力から注目を集めています。この能力は、テキスト、画像、動画などの非構造化データを扱うAIおよび生成AI(GenAI)アプリケーションにとって重要です。 ベクトルデータベースの主な目的は、従来のデータベースが提供するキーワード検索ではなく、類似性検索の機能を提供することです。このコンセプトは、ChatGP ...

images
MyScaleにおけるフィルタリングされたベクトル検索の最適化

ベクトル検索は、ベクトル表現に基づいてデータセット内の類似のベクトルまたはデータポイントを検索するものです。しかし、現実のシナリオでは純粋なベクトル検索だけでは十分ではありません。ベクトルには通常メタデータが付属しており、ユーザーはこのメタデータに1つ以上のフィルタを適用する必要があります。これがフィルタリングされたベクトル検索が重要になる理由です。 フィルタリングされたベクトル検索は、複雑な検 ...

Start building your Al projects with MyScale today

Free Trial
Contact Us