Llama-2 (7B) をファインチューニングしてChatGPTを超える方法

Built for Speed: ~10ms Latency, Even Under Load
Blazingly fast way to build, track and deploy your models!
- Handles 350+ RPS on just 1 vCPU — no tuning needed
- Production-ready with full enterprise support
大規模言語モデル(LLM)はますます強力になりつつあり、チャットボット、テキスト生成、質問応答など、さまざまなタスクに利用されています。しかし、LLMのトレーニングには費用とリソースがかかります。このブログ記事では、より小さなLLM(7B)をファインチューニングして、ChatGPTよりも優れた性能を発揮させる方法をご紹介します。
ファインチューニングとは、特定のデータセットでLLMをトレーニングし、特定のタスクでの性能を向上させるプロセスです。このケースでは、2つの数値を乗算するために7B LLMをファインチューニングします。
では、単純な乗算タスクにおける異なる大規模言語モデルの性能から見ていきましょう。例:458*987 = 452046。
まず、Metaが最近リリースしたモデルLlama-2-7Bを見てみましょう。TrueFoundryにLlama-2をデプロイし、TrueFoundryのLangchain統合機能で試してみました。その結果がこちらです。

ご覧の通り、このタスクではあまり良い性能を発揮していません(モデルのサイズを考えると、これは予想通りでもあります)。では、最先端のモデルが同じタスクでどのように機能するか見てみましょう。
ChatGPT(GPT3.5 Turbo)の結果を見てみましょう。

さて、回答(451,086)は実際の正解(452,046)に非常に近いですが、正解ではありません。
別のプロンプト(段階的な計算を実行させて、どうなるか見てみましょう)で試してみましょう。
0:00/1×
乗算用のカスタムプロンプトを使用したChatGPT
しかし、やはり誤った結果にたどり着きました:450,606 🤨
最後に、最先端の(GPT-4)を試して、このタスクでどのように機能するか確認してみましょう。

正解(452,046)に非常に近く、誰にとっても正解に見えるかもしれません。しかし、明らかに、この回答は間違っています。
なぜLLMは単純な乗算タスクにおいて性能が低いのでしょうか?
この質問に対する答えは非常に単純です。 それに向けて「訓練」されているわけではありません。
LLMは膨大なテキストとコードのデータセットで学習されますが、このデータは必ずしも数学的推論に役立つように構造化されているわけではありません。例えば、データには足し算、引き算、掛け算、割り算といった数学的概念の明示的な表現が含まれていない場合があります。このため、LLMがこれらの演算を正しく実行する方法を学習することは困難になる可能性があります。
そこで、LLMに数学的演算を実行させるように学習させることが可能かどうかを考えました。実験を行ったところ、その結果は非常に有望でした!
Llama-2 7Bに掛け算を学習させるためのファインチューニング
データセットの作成
まず手始めに、40,000行のプロンプトと指示からなるデータセットを作成しました。私たちは、筆算による掛け算の方法で踏む正確な手順を模倣しようとしました。この方法では、被乗数と乗数をそれぞれの桁に分解し、被乗数の各桁と乗数の各桁を掛け合わせ、その結果を位取りに基づいて適切な位置に配置します。最後に、すべての個々の積を合計して最終結果を得ます。
こちらがプロンプトの例です。
あなたは、掛け算の質問に詳細な回答を提供する役立つアシスタントです。以下の数学の問題について、筆算による掛け算の方法を用いて徹底的な説明を必ず提供してください。
質問の答えがわからない場合は、誤った情報を共有しないでください。5244 * 1932 は何ですか?
そしてこちらが回答の例です。
筆算による掛け算の方法を用いて5244 * 1932を掛ける手順は次のとおりです。
ステップ1:5244を個々の桁に分解します。5(千の位)、2(百の位)、4(十の位)、4(一の位)。
ステップ2:同様に、1932を個々の桁に分解します。1(千の位)、9(百の位)、3(十の位)、2(一の位)。
- 4(最初の数の一の位から) * 2(2番目の数の一の位から) = 8 -> 左に0桁シフトします(2番目の数の一の位と掛けているため)、結果として8を得ます
- 4(最初の数の一の位から) * 3(2番目の数の十の位から) = 12 -> 左に1桁シフトします(2番目の数の十の位と掛けているため)、結果として120を得ます
- 4(最初の数の一の位から) * 9(2番目の数の百の位から) = 36 -> 左に2桁シフトします(2番目の数の百の位と掛けているため)、結果として3600を得ます
- 4(最初の数の一の位から) * 1(2番目の数の千の位から) = 4 -> 左に3桁シフトします(2番目の数の千の位と掛けているため)、結果として4000を得ます
- 4(最初の数の十の位から) * 2(2番目の数の一の位から) = 8 -> 左に1桁シフトします(2番目の数の一の位と掛けているため)、結果として80を得ます
- 4(最初の数の十の位から) * 3(2番目の数の十の位から) = 12 -> 左に2桁シフトします(2番目の数の十の位と掛けているため)、結果として1200を得ます
- 4(最初の数の十の位から) * 9(2番目の数の百の位から) = 36 -> 左に3桁シフトします(2番目の数の百の位と掛けているため)、結果として36000を得ます
- 4(最初の数の10の位から)* 1(2番目の数の1000の位から)= 4 -> 左に4桁シフト(2番目の数の1000の位と乗算しているため)して40000を得る
- 2(最初の数の100の位から)* 2(2番目の数の1の位から)= 4 -> 左に2桁シフト(2番目の数の1の位と乗算しているため)して400を得る
- 2(最初の数の100の位から)* 3(2番目の数の10の位から)= 6 -> 左に3桁シフト(2番目の数の10の位と乗算しているため)して6000を得る
- 2(最初の数の100の位から)* 9(2番目の数の100の位から)= 18 -> 左に4桁シフト(2番目の数の100の位と乗算しているため)して180000を得る
- 2(最初の数の100の位から)* 1(2番目の数の1000の位から)= 2 -> 左に5桁シフト(2番目の数の1000の位と乗算しているため)して200000を得る
- 5(最初の数の1000の位から)* 2(2番目の数の1の位から)= 10 -> 左に3桁シフト(2番目の数の1の位と乗算しているため)して10000を得る
- 5(最初の数の1000の位から)* 3(2番目の数の10の位から)= 15 -> 左に4桁シフト(2番目の数の10の位と乗算しているため)して150000を得る
- 5(最初の数の1000の位から)* 9(2番目の数の100の位から)= 45 -> 左に5桁シフト(2番目の数の100の位と乗算しているため)して4500000を得る
- 5(最初の数の1000の位から)* 1(2番目の数の1000の位から)= 5 -> 左に6桁シフト(2番目の数の1000の位と乗算しているため)して5000000を得る
さて、これらの結果をすべて合計します。
8 + 120 + 3600 + 4000 + 80 + 1200 + 36000 + 40000 + 400 + 6000 + 180000 + 200000 + 10000 + 150000 + 4500000 + 5000000 の合計は 10131408 です。
次に、乗算のために2つの数字をランダムに選択してプロンプトと応答のペアを生成するPythonスクリプトを作成しました。40,000行のデータセットを構築しました。
モデルのファインチューニング
さて、データセットの準備ができたら、モデルをファインチューニングする必要があります。
私たちは、Metaのファインチューニングされたチャットバリアント(70億パラメータ)である Llama-2 をベースモデルとして使用しています。
ファインチューニングは、 QLoraファインチューニング をBitsAndBytesおよびPeftライブラリを使用して行いました。使用したLoRA設定は次のとおりです。
LoraConfig(
lora_alpha=16,
lora_dropout=0.1,
r=64,
bias="none",
task_type="CAUSAL_LM",
target_modules=[
"q_proj",
"k_proj",
"v_proj",
"o_proj",
],
)
40,000行のデータセットをA100 40GB GPUマシンで学習させるのに、約8時間かかりました。
最後に、ファインチューニングされたモデルを TrueFoundry に再度デプロイしました。その結果がこちらです。

ついに!ファインチューニングされたモデルが、結果を正しく計算できることがわかります。
結論
算術演算はLLMを使用するタスクではありませんが、この例は、特定のタスク向けに適切にファインチューニングされた「小さな」LLM(70億パラメータ)が、「大きな」LLM(GPT3.5 turbo - 1750億パラメータやGPT-4など)を特定のタスクにおいていかに上回ることができるかを示しています。
小型でファインチューニングされたモデルは、推論コストが低く、専門的なタスクに優れており、お使いのクラウドに簡単にデプロイできます!
Llama 2のファインチューニングに関する詳細なブログ記事を公開しました。
TrueFoundry AI Gateway delivers ~3–4 ms latency, handles 350+ RPS on 1 vCPU, scales horizontally with ease, and is production-ready, while LiteLLM suffers from high latency, struggles beyond moderate RPS, lacks built-in scaling, and is best for light or prototype workloads.


















.webp)
.webp)


.png)

.png)














