ファインチューニングとローカルデプロイ
まずいつファインチューニングすべきかを考え、それから LoRA を手書きし、peft で小さなオープンソースモデルをファインチューニングし、メモリを見積もり、量子化を手書きし、Ollama で自分のパソコンで動かし、最後に vLLM のようなサービス用フレームワークが何を解決しているのかを理解します。
レッスン一覧
- 01ファインチューニングすべきとき、すべきでないとき
ファインチューニングは、モデルにあなたの業務を「覚えさせる」王道のように聞こえますが、たいてい最初の選択肢ではありません。この課では、プロンプト、RAG、ファインチューニングがそれぞれ何を変えられ、どれだけの代償がかかるのかを比べ、判断の順番を示します。
25 分 · 中級 - 02LoRA の原理を手書きで理解する
LLM をファインチューニングするとき、数十億個のパラメータを全部学習し直す必要があるのでしょうか。LoRA は元のパラメータを凍結し、そばに小さな行列を二つ加えるだけです。モジュール 09 の小さな GPT で LoRA を手書きし、パラメータの 1.5% だけを学習させてスタイルを変えます。
45 分 · 上級 - 03LoRA で小さなオープンソースモデルをファインチューニングする
本物のオープンソースモデルに替えます。transformers と peft で Qwen2.5-0.5B に LoRA を付け、CPU で十数秒のうちに自己紹介を変え、さらにファインチューニングがもたらす副作用をじっくり見ます。
45 分 · 上級 - 04自分のパソコンでモデルを動かす:Ollama と量子化
オープンソースモデルを自分のパソコンで動かします。まずモデルがどれだけのメモリを占めるかを見積もり、次に量子化を手書きして、重みを 8 ビット、4 ビット、2 ビットに圧縮するとどれだけ小さく、どれだけ悪くなるかを見て、最後に Ollama で動かします。
40 分 · 中級 - 05vLLM でモデルサービスをデプロイする
多くのユーザーに同時にサービスを提供するとき、問題は同じ GPU でいかに多くのリクエストを処理するかに変わります。小さな GPT でまとめて処理する効果を測り、それから vLLM が KV キャッシュをどう管理し、OpenAI 互換のサービスをどう起動するかを説明します。
35 分 · 上級
モジュール 09 では小さな GPT をゼロから学習させました。現実には、LLM をゼロから学習させることはほとんどなく、他の人が学習させたオープンソースモデルを使います。そのまま動かすか、それをもとにファインチューニングするかです。このモジュールはこの二つを扱います。
実験はすべてノートパソコンの CPU で行います。ファインチューニングするのはパラメータがわずか 5 億の Qwen2.5-0.5B-Instruct で、学習は十数秒で済みます。より大きなモデルには GPU が必要で、どれだけの GPU メモリが必要かの見積もり方も課の中で説明します。
なぜこの順番なのか
第 1 課ではまず冷や水を浴びせます。たいていの場合ファインチューニングは不要で、プロンプトと RAG のほうが向いています。本当に必要なときのために、第 2 課ではモジュール 09 の小さな GPT で LoRA を手書きし、原理を理解します。第 3 課では本物のオープンソースモデルに替えて、transformers と peft でやってみて、ファインチューニングの副作用もじっくり見ます。
後の二つの課はデプロイです。第 4 課ではまずメモリの見積もり方を身につけ、量子化を手書きし、それから Ollama で自分のパソコンでモデルを動かします。第 5 課では多くのユーザーに同時にサービスを提供するときの問題と、vLLM がそれをどう解決しているかを扱います。
コードは code/10-finetune-deploy/ にあります。第 2、4、5 課はモジュール 09 で学習させたモデルを使うので、先にモジュール 09 を終えておく必要があります。
修了の目安
- 要件を前に、プロンプト、RAG、ファインチューニングのどれを使うべきかを判断し、理由を説明できる。
- LoRA の層を手書きでき、なぜ B を 0 で初期化するのか、LoRA がなぜ元の重みにマージし直せるのかを説明できる。
peftでオープンソースモデルに LoRA を付けて学習させ、回答の部分でだけ損失を計算し、見たことのない質問と普通の質問で効果と副作用をチェックできる。- パラメータ数と精度から、モデルがどれだけのメモリを占めるかを見積もれ、KV キャッシュの計算方法を説明できる。
- 対称量子化とグループ量子化を説明でき、8 ビット、4 ビット、2 ビットでおおよそどんな影響が出るかを説明できる。
- Ollama でローカルモデルを動かし、第 1 部のコードを環境変数をいくつか変えるだけでそれを呼び出せるようにできる。
- モデルサービスがなぜリクエストをまとめて処理するのか、そしてスループットとレイテンシの間のトレードオフを説明できる。
このモジュールのコード
コードと実行結果は実際に動かしたときのまま載せているため、コメントと出力は中国語です。