LLMの迷宮を辿る:オープンソースLLMおよびその先に関する包括的ガイド
こんにちは、@raksparadoxです。
AIの開発速度が非常に速いため、全てのトレンドを追いかけることはほぼ不可能に思えます。数十の新しいオープンソースの基盤モデルがあり、さらにこれらのモデルを基にして、マージング、ファインチューニング、コンテキスト拡張など様々な技術を用いて数千の洗練されたバージョンが構築されています。Hugging Face、オープンソースモデルのハブでは、現在500,000以上のモデルをホストしています!
この記事では、次に「Goliath-longLORA-120b-rope8–32k-fp16-GPTQ」のようなものに出会ったとき、その特徴を理解できるように、さまざまなオープンソースLLMについてのクラッシュコースを提供します。
事前学習と基本モデル
大規模言語モデル(LLM)は、膨大なデータセット(数テラバイト)に基づいて学習された重要なディープラーニングモデルで、このプロセスは事前学習と呼ばれています。これらの学習セッションには数百万ドルの費用がかかるため、これらのプロジェクトを実施できるリソースを持つ企業や組織はほんのわずかです。現在、これらのモデルのほとんどは、文脈を与えられた次のトークンを予測するために学習されています(因果的言語モデリング)、これにより、特に補完タスクで効果的になります。この費用のかかる学習フェーズが完了すると、自然言語を理解し、世界モデルとして機能する強力なモデルが得られます。こちらはイリヤ・スツケーヴァーさんが世界モデルの概念とLLMがそれをどのように学習するかを説明するビデオです。
一度学習されると、基本モデル(ファンデーションモデルとしても知られています)は、文を完成させたり、コードを生成するのが得意になります。現在、様々な組織によってリリースされた数十のオープンソース基本モデルがあります。しかし、これらのモデルのほとんどはトランスフォーマーアーキテクチャに基づいています(RWKVのような例外も存在します)。さらに、トランスフォーマーベースのモデルのほとんどは、EleutherAIのGPT-NeoやMetaのLLaMAコードベースを使用してモデルを学習します。ここに、いくつかの注目すべき基本モデルとそれらをリリースした組織の非網羅的なリストがあります:
Organization | Model Name | Sizes (in Billion) |
---|---|---|
Meta | Llama and Llama2 series | 7/13/34/65/70 |
Mistral | Mistral and Mixtral | 7/8x7B (MoE) |
MosaicML | MPT series | 7/30 |
EleutherAI | Pythia suite and GPTxNeo | various |
StabilityAI | StableLM | 1.3/7 |
tiiuae | Falcon series | 7/40/180 |
01-ai | Yi series | 6/34 |
AlibabaCloud | Qwen series | 1.8/7/14/72 |
Microsoft | Phi series | 1.3/1.5 |
InternLM | InternLM | 7/20 |
DeepSeekAI | deepseek | 7/67 |
Gemma | 2/7 |
これらのモデルは優れた基盤として機能するため、基本モデルとして知られています。一つの使用例は、特定の言語のためにLLMの性能を向上させることを目指す場合、これらのモデルを出発点として使用することです。
したがって、Mistral-7B-OpenOrca-oasst_top1_2023–08–25-v2-GPTQという名前のモデルに出会った場合、そのモデルはMistral 7Bを基礎として使用して構築されたことを示しています。
SFT
前のセクションでは、基本的な大規模言語モデル(LLM)の学習方法について説明しました。現在、これらの基本モデルが人間の方法に合わせられる方法を探ります。これにより、指示に従ったり、会話に参加したり、私たち人間に魅力的な反応を生成することができます。
2022年末にChatGPT 3.5がリリースされた後、世界中で大きな話題となり、多くの組織がオープンソースの方法で類似のモデルを作成しようとしました。Metaが先導して、2023年2月にLLaMAと呼ばれるLLMをリリースしました。これは事前学習されたモデルで、4つのサイズ(7B、13B、33B、65B)で利用可能でした。これらは完成タスクには対応できる基本モデルでしたが、ChatGPTのようにチャットや指示に従う機能は備えていませんでした。しかし、LLaMAのリリースから1ヶ月以内に、スタンフォード大学がLLaMAを指示に従う学習を施した論文を発表し、ChatGPT 3.5に似たモデルを作成しました。それはAlpacaと名付けられ、方法はChatGPTを使用して合成指示データセットを作成し、基本モデルを合わせるためにSupervised Fine-Tuning(SFT)を利用することでした。プロジェクトのホームページで技術的な詳細を読むことができます。
プロジェクトのホームページからの図
これは、オープンソースの指示に従う/チャットLLMに向けた重要な進歩でした。Alpacaプロジェクトは、ChatGPTに似たモデルを作成するために1,000ドル未満を費やしたと報じられています。このプロジェクトで使用されたデータセットはAlpacaとして知られるようになり、多くのモデルを学習して指示に従わせるのに使用されました。その後、モデル開発組織(Metaを含む)は、基本モデルと指示にチューニングされたモデルの両方をリリースし始めました。
MistralAIによるBaseとInstructモデル
Alpacaの後、指示/チャットチューニングのためにいくつかの他のデータセットが作成されました。以下はその中のいくつかの注目すべきものです:
Dataset Name | Organization |
---|---|
alpaca | tatsu-lab |
dolphin | cognitivecomputations |
lmsys-chat-1m | lmsys |
databricks-dolly-15k | databricks |
OpenOrca | Open-Orca |
ultrachat_200k | HuggingFaceH4 |
oasst1 | OpenAssistant |
GuanacoDataset | JosephusCheung |
現在、様々な組織は基本モデルをファインチューニングして、指示に従う/チャットモデルを作成することができます。先に述べたデータセット以外にも、いくつかの組織は上記の方法を使用して無検閲/ロールプレイングLLMを学習しています。しかし、彼らが使用しているデータセットをまだオープンソース化していません。これらの有名な例の一つが、Nous-Hermesシリーズのモデルです。
実用的な使用例として、QAや指示データセットを持っている場合、指示に従う/チャット用に監視されたファインチューニング(SFT)を使用して既に学習されたモデルから始めることを検討すべきです。チャット/指示に従うデータセットを使用して任意のLLMをファインチューニングする方法についてガイダンスを探している場合、プロセスを詳細に説明している素晴らしいブログ投稿があります。
最終的に、dolphin-2.0-mistral-7B-GGUFという名前のモデルに出会った場合、それは誰かがDolphinデータセットでMistral 7Bモデルをファインチューニングしたことを示しています。
RLHF
指示に従うモデルを持つと、性的または暴力的な内容を含む任意のことに対して簡単に指示に従うことができます。したがって、賢明な人々はLLMを有用で、誠実で、無害であるように調整すべきだと考えました。AIの安全性と倫理についての全体的な議論がありますが、その螺旋には降りません。これは、RLHFまたは人間のフィードバックからの強化学習と呼ばれるプロセスを通じて行われます。
OpenAIからのこの有名な図は、事前学習からRLHFへのプロセスを説明しています
OpenAIはPPOを使用しました
RLHFには2つの有名な方法があります。OpenAIによって使用された近位方策最適化(PPO)と、この論文で紹介されたより最近の直接選好最適化(DPO)です(スタンフォードに感謝!)。DPOとPPOはアルゴリズムは異なりますが、LLMの出力を人間が好むものに合わせるという同じタスクを実行します。
以下はRLHF用のいくつかの有名なデータセットです。
Dataset Name | Organization |
---|---|
hh-rlhf | AnthropicAI |
stack-exchange-preferences | HuggingFaceH4 |
summarize_from_feedback | OpenAI |
orca_dpo_pairs | Intel |
例として、hh-rlhfデータセットからの一例を紹介します。
RLHFデータの例
ちなみに、これの影響でChatGPTが
DPOやPPOを使用してRLHFを行った後、私たちは人間の好みに合わせたモデルを持っています。ですので、次にdolphin-2.6-mistral-7B-dpo-laser-GPTQという名前のモデルを見かけたとき、それは誰かがmistral 7bをdolphinで学習し、最終モデルを合わせるためにDPOを使用したことを意味します。
LoRA and PEFT
スタンフォードによるアルパカの論文の後でも、LLMの指示チューニングには数百ドルかかり、それは依然として独立研究者、改造愛好家、趣味の人々にとって禁じ手の高価さです。そのため、2021年の古い論文が名声を得ました。この論文では、1%未満のパラメータを使用してモデルを微調整する方法を紹介し、LoRAを使用した微調整を、消費者用GPU上でLLMを微調整する安価で有名な方法としています。
時間が経つにつれて、他のパラメータ効率的な微調整方法が開発されましたが、LoRAは最も有名な方法の一つとして残っています。PEFTライブラリを使用して、さまざまな方法を探索することができます。
したがって、llama-2–7B-Guanaco-QLoRA-AWQのようなモデルに出会った場合、このモデルはllama2–7Bに基づいており、QLoRA(LoRAのバージョン)を使用してGuanacoデータセットで微調整されていることを意味します。
Quantization
効率的なトレーニングと同時に、コミュニティはLLMのサイズを縮小し、推論を高速化しようとしていました。そうすることで、最終的にエッジデバイス上で実行できるようになります。ここで、量子化が非常に有用な技術として登場しました。研究者たちは、モデルを8ビットや4ビットでロードしても、性能が著しく低下しないことを発見しました。しかし、モデルのサイズはそれぞれ半分と四分の一に縮小されました。
量子化の基本的な考え方はかなりシンプルです:高精度表現(通常は標準の32ビット浮動小数点)から、8ビットや4ビットなどの低精度データ型への重みとアクティベーションの変換を含みます。これを行うことで、LLMは2倍から4倍小さくなり、推論速度は数倍に増加します。以下は、最も使用されている量子化方法のリストです。GPUではなくCPU上で量子化されたモデルを実行するのに役立つ方法も含んでいます。さらに、これらの方法の一部は、Hugging Faceを使用してトランスフォーマーをロードする際にオンザフライで使用できますが、他の方法では、使用する前にモデルを量子化されたバージョンに変換する必要があります。
BitsandBytes
bitsandbytesライブラリは、Hugging Faceによって公式にサポートされているカスタムCUDA関数を周りの軽量Pythonラッパーであり、モデルを別途変換する必要なく4ビットおよび8ビットでモデルをロードするために使用できます。これはQLoRAと共に利用されます。QLoRAを使用して、A100 40GB GPU上で最大65BのLLMをファインチューニングすることが可能です!QLoRAとbitsandbytesを使用して、単一のA100を使用してMixtral8x7Bをファインチューニングすることもできます。
model = AutoModelForCausalLM.from_pretrained(
model_name,
load_in_8bit=True)
以下は、Hugging FaceのLLMを8ビットで初期化する方法を示すシンプルなスニペットです。load_in_8bit=True
をload_in_4bit=True
に置き換えることで、同じことが4ビットについても行われます。
GPTQ and AWQ
GPTQとAWQはモデルを量子化するために異なるアルゴリズムを使用します。しかし、GPTQまたはAWQで量子化されたモデルを使用するには、まずモデルをそれぞれの形式に変換する必要があり、これには計算リソースが必要になります。しかし、これらの方法は単にbitsandbytesを使用するよりも効率的です。GPTQとAWQの両方がモデルを4ビットに量子化することができます。GPTQは2ビット、3ビット、8ビットの量子化もサポートしています。しかし、GPTQと比較して、AWQはより新しく、より効率的な方法です。
したがって、llama-2–7B-Guanaco-QLoRA-AWQと名付けられたモデルは、llama2–7Bに基づき、Guanacoデータセットを使用してQLoRAでファインチューニングされ、AWQを使用して4ビットに量子化されていることを示しています。
GGUF | GGML and llama.cpp
Georgi Gerganovさんによって開発されたGGMLは、機械学習用に設計されたテンソルライブラリであり、GGUFの前身です。llama.cppは純粋にC++で書かれたライブラリで、LLMの推論を実行します(llama.cppという名前は最初、C++でLlamaを実行するプロジェクトとして始まりましたが、現在では他の多くのモデルもサポートしています)。llama.cppを使用すると、Hugging Face上の任意のモデルをGGML|GGUF形式に変換できます。当初、llama.cppはCPU上での推論に最適化されていましたが、現在ではCPU、GPU、シリコン上での高速推論をサポートしています。これは、iPadやラップトップを含むエッジデバイス上でLLMを実行するための最も有名なライブラリと言えるかもしれません。
llama.cppは1.5/2/3/4/5/8ビットへの量子化を提供します。モデルはllama.cppで使用するために学習後に量子化する必要があります。したがって、dolphin-2_6-phi-2-GGUFという名前のモデルを見かけた場合、それはphi-2基本モデルがdolphinデータセットを使用してファインチューニングされ、GGUF形式に量子化されたことを意味します。
ここで、TheBlokeに注目したいと思います。彼はオープンソースソフトウェア(OSS)コミュニティのために素晴らしい仕事をしており、私たちが使用するために3500以上のモデルを量子化してくれました。特定のモデルを量子化された形式で使用したい場合、TheBlokeがすでに希望する形式(GGUF、AWQ、またはGPTQであれ)でそれを量子化している可能性が高いです。
Context Length Extension
当初、LLMはキー値(KV)キャッシュの二次的な増加のために、短いコンテキスト長、2~4kトークンを持っていました。したがって、オープンソースコミュニティはコンテキスト長を増やすために懸命に働きました。コンテキスト長が増えると、モデルははるかに有用になります。これを達成するための最も有名な方法は、Rotary Positional Embedding (RoPE) スケーリングとして知られています。LLMは各トークンに対して位置埋め込みを持っているため、4096コンテキスト長のモデルでは、最初のトークンがID 1を持ち、次に2...4096まで続きます。KaiokenDev(素晴らしいOSS貢献者)は、これらの位置埋め込みを因子でスケーリングダウンすることにより、簡単にLLMのコンテキスト長を増やすことができることを発見しました。実際には、たった2行のコードで実現しました!
class ScaledRotaryEmbedding(torch.nn.Module):
def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None):
super().__init__()
inv_freq = 1.0 / (base ** (torch.arange(0, dim, 2).float().to(device) / dim))
self.register_buffer("inv_freq", inv_freq)
max_position_embeddings = 8192
# Build here to make `torch.jit.trace` work.
self.max_seq_len_cached = max_position_embeddings
t = torch.arange(
self.max_seq_len_cached,
device=self.inv_freq.device,
dtype=self.inv_freq.dtype,
)
# These two lines:
self.scale = 1 / 4
t *= self.scale
現在、この方法の多くの変種があります。それには、NTK-Aware Scaled RoPEやYaRNが含まれますが、それらはすべて上記の考えから派生しています。
コンテキストの長さを増やす別の方法は、LongLoRAと呼ばれる下記の論文で紹介されています。これは、モデルのために特別なLoRAをファインチューニングすることで機能します。
ですから、Yarn-Llama-2–7B-128K-AWQという名前のモデルに出会った場合、それはLlama-2–7Bに基づき、そのコンテキスト長をYarnを使用して128Kに拡張し、AWQを使用して量子化されたことを意味します。
Model Merging
コンピュータビジョンの世界では、2つのモデルを統合してより良いものを作る技術が広く使用されています。LLMにとって、これは最新かつかなり有望な開発です。LLMを統合するに関する研究論文は2023年6月以来存在していますが、実装は挑戦的でした。これはMergeKitライブラリで簡素化されました。LLMを統合するための主要なアルゴリズムには、SLERP、TIES、DARE、およびPassthroughがあります。これらの方法のいくつかは、複数のモデルを統合して、異国的な数のパラメータを持つモデル(例えば、2つの7Bパラメータモデルから9Bパラメータモデルを作成する)を生成することができ、しばしばフランケンシュタインモデルと呼ばれます。Hugging Faceには、すべての方法を説明する優れた記事があります。
これらのモデルの統合は非常に強力なものとなるため、最近では統合されたモデルがLLMのリーダーボードを支配しています。
さて、最終的に、名前だけを見てGoliath-LongLoRA-120B-RoPE8–32K-FP16-GPTQが何を意味するかを判断できます。120Bのサイズの基礎モデルが存在しないため、このモデルはいくつかのモデルを統合し、LongLoRAとRoPEを使用してコンテキスト長を32Kに増加させ、GPTQを使用して量子化されたものです。
終わりに
オープンソースの大規模言語モデルを通じた私たちの探検を締めくくるにあたり、LLMを通じた旅は、まるで巨大で多次元のジグソーパズルを組み立てるようなものであることが明らかです。事前学習、ファインチューニング、量子化、そしてモデルの統合の芸術といった概念を表す各ピースと共に、私たちは略語の森を抜け、データの海を渡り、計算の複雑さの山を登ってきました。しかし恐れることはありません、勇敢な探検家よ。このガイドからの知識を武器に、今やあなたは世界のGoliath-longLORA-120b-rope8–32k-fp16-GPTQに立ち向かうために、より良く装備されています。
ですので、次に技術の驚異よりも秘密のコードのように聞こえるLLMと直面したとき、その難解な名前の背後には、理解され、習得され、そしておそらくは友達になることを待っているただのツールがあることを思い出してください。これからの多くの発見に乾杯し、あなたのAIの冒険が啓蒙的であると同時に楽しいものであることを願っています。ハッピーモデリング!
結論を書くのが面倒だったので、結論はGPT4で生成しました。
読んでいただきありがとうございます!
もしこのガイドが役に立ったと思われたら、X(ツイッター)やGithub、LinkedIn(または全部!)でフォローしてください。
Discussion