Ollamaのモデルをファインチューニングする方法【LoRA基礎】

ローカルLLM

動作確認済み環境

本記事のコマンドは Ollama 0.30.8 で検証しています(2026年6月15日実測)。学習ツールのバージョンは PyPI から実取得した最新版、Ubuntu 環境は ubuntu:24.04 公式Dockerイメージで確認しています。

Ollamaでローカルに動かしているモデルを、自分のデータで追加学習(ファインチューニング)できたら——そう思ったことはありませんか。

結論から言うと、Ollama自体はモデルの学習機能を持っていません。学習は Unsloth や LLaMA-Factory といった外部フレームワークで行い、そこで作った「LoRA学習済みモデル」をGGUF形式に変換して、Modelfile経由でOllamaに取り込む——というのが正しい流れです。

本記事では、このワークフロー全体を「LoRA基礎」の観点で整理します。さらに、Ollamaが担当する「カスタムモデルの取り込み」部分は実際にOllama 0.30.8で動かして実測しました。Modelfileの構造・ollama createでのインポート・GGUFファイルの中身の確認まで、本物の出力を載せています。

この記事のポイント

  • Ollama自体はファインチューニングをしない。学習は Unsloth / LLaMA-Factory など外部フレームワークで行う
  • 流れは「LoRA学習 → アダプタをマージ → GGUFに変換 → Modelfileを書く → ollama create」の5ステップ
  • QLoRA(4bit量子化LoRA)を使えばVRAM 4GB〜の環境でも小さいモデルを学習できる
  • 実測:Ollama 0.30.8 で ollama create によりカスタムモデルを作成し、SYSTEMプロンプトとPARAMETERが反映されることを確認(2026-06-15)
  • 実測:学習ツールの最新版は unsloth 2026.6.7 / peft 0.19.1 / transformers 5.12.0(PyPIから取得、2026-06-15)

目次

  1. LoRAとは?なぜ全パラメータ更新より良いのか
  2. 全体ワークフロー:学習からOllamaインポートまで
  3. 必要なハードウェア:VRAMの目安
  4. 学習ツールのインストール(Unsloth)
  5. LoRA学習スクリプトの基本
  6. GGUFへの変換とファイルの確認
  7. Modelfileを書いてOllamaにインポートする
  8. インポート確認:ollama show / REST API
  9. よくあるエラーと対処法
  10. まとめ

LoRAとは?なぜ全パラメータ更新より良いのか

LoRA(Low-Rank Adaptation)は、大規模言語モデルを少ないVRAMで効率的にファインチューニングする手法です。「低ランク適応」と訳されます。

通常のファインチューニング(フルファインチューニング)では、数十億個あるモデルの全パラメータを更新します。7Bモデルでも学習時には数十GB、70Bモデルなら数百GBのVRAMが必要になり、個人のGPUではまず無理です。

これに対してLoRAは、元のモデルパラメータは凍結したまま、小さな「差分行列(アダプタ)」だけを学習します。この差分行列は元モデルと比べて圧倒的に小さいため、更新する変数の数が劇的に減り、VRAMを大幅に節約できます。学習が終わったらアダプタを元モデルにマージして、1つの完全なモデルに戻します。

著者アイコン
著者アイコン

「LoRA = 行列を低ランク近似して学習対象を減らす」が肝です。これをさらに4bit量子化と組み合わせて、ベースモデル自体もメモリを食わないようにしたのがQLoRA。家庭用GPUでファインチューニングが現実的になったのは、ほぼこのQLoRAのおかげです。

全体ワークフロー:学習からOllamaインポートまで

Ollamaでファインチューニング済みモデルを使うには、次の5ステップを踏みます。このうちOllamaが担当するのは最後の「取り込み」だけだ、という点を最初に押さえておくと混乱しません。

  1. ベースモデルの選択:Llama3.2、Qwen2.5、Gemma3 など、Hugging Faceで公開されているモデルを選ぶ
  2. LoRA学習:Unsloth / LLaMA-Factory などで自前のデータセットを使って学習(GPU環境)
  3. アダプタのマージ:学習した差分アダプタをベースモデルにマージして、完全なモデルを作る
  4. GGUF変換:llama.cpp または Unsloth で GGUF 形式(Ollamaが読めるフォーマット)に変換
  5. ollama create:Modelfileを書いてOllamaに登録し、推論を実行
LoRA学習からOllama取り込みまでの全体像(概念図)
LoRA学習からOllama取り込みまでの全体像(概念図)

注意:Ollamaは「推論」専用

Ollama(ollama.com)はモデルの推論(inference)を実行するツールであり、学習機能は含まれていません。①〜④(学習〜GGUF変換)にはPython環境とGPUが別途必要です。Ollamaがやってくれるのは⑤の取り込み・実行だけ、と理解してください。

必要なハードウェア:VRAMの目安

LoRA学習でいちばん効いてくるのがGPUのVRAM(ビデオメモリ)です。下表はモデルサイズ別の目安をまとめたものです。

モデルサイズ別VRAM目安(参考値)
モデルサイズ別VRAM目安(参考値)

注目したいのは、QLoRAを使えばQwen2.5 0.5Bクラスなら2GB程度のVRAMでも学習できるという点です。GeForce GTX 1650(VRAM 4GB)クラスの古いGPUでも試せます。手元にGPUがまったく無い場合でも、Google ColabのようなクラウドGPUを使えば無料枠で始められます。

本格的に学習を回すなら、GPUを時間課金で借りられるクラウドが現実的です。Vultr の Cloud GPU(A100・A40 など)は使った時間だけ課金されるので、小さいモデルの学習なら短時間で試せます。GPUクラウドの選び方は でも比較しています。

学習ツールのインストール(Unsloth)

今回は最も導入が簡単な Unsloth を例にします。Unslothは通常のLoRA学習と比べて学習が2〜5倍速く、VRAM使用量も最適化されているのが特徴です。

手順1:Ubuntu 24.04 にPython環境を用意する

学習環境のベースとして、ubuntu:24.04 公式Dockerイメージで必要なパッケージを実際に入れて確認しました。




ubuntu@linuxlab: ~
$ cat /etc/os-release | grep PRETTY_NAME
PRETTY_NAME=”Ubuntu 24.04.4 LTS”
$ sudo apt update && sudo apt install -y python3 python3-pip python3-venv git

$ python3 –version
Python 3.12.3
$ pip3 –version
pip 24.0
$ git –version
git version 2.43.0

実測環境:ubuntu:24.04(Ubuntu 24.04.4 LTS)で確認。Python 3.12.3 / pip 24.0 / git 2.43.0 がインストールされました。python3 -m venv も問題なく仮想環境を作成できます。

手順2:仮想環境を作ってUnslothをインストールする




ubuntu@linuxlab: ~/lora-training
$ python3 -m venv .venv
$ source .venv/bin/activate
(.venv) $ pip install unsloth
Collecting unsloth
Downloading unsloth-2026.6.7-py3-none-any.whl
Collecting peft>=0.19.0
Collecting transformers>=5.12.0
Successfully installed unsloth-2026.6.7 peft-0.19.1 transformers-5.12.0

2026年6月15日時点で、PyPIから取得した主要パッケージの最新バージョンは次のとおりです(PyPI JSON APIで実取得)。

LoRA学習ツールのPyPI最新版(実測)
LoRA学習ツールのPyPI最新版(実測)

ここで押さえておきたいのは役割分担です。unsloth が学習の高速化レイヤ、peft がLoRAの本体実装、transformers がモデル読み込み、bitsandbytes がQLoRAの4bit量子化、trl が教師あり微調整(SFT)を担当します。Unslothを入れると、これらの依存も一緒に入ります。

LoRA学習スクリプトの基本

Unslothを使った学習の最小構成スクリプトです。このコードはGPU環境で実行します(CPUのみの環境では現実的な時間で終わりません)。




ubuntu@gpu-server: ~/lora-training
(.venv) $ cat train_lora.py
from unsloth import FastLanguageModel
 
# 1. ベースモデルを4bit量子化で読み込む(QLoRA)
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = “unsloth/Llama-3.2-3B-Instruct-bnb-4bit”,
max_seq_length = 2048,
load_in_4bit = True,
)
 
# 2. LoRAアダプタを設定する
model = FastLanguageModel.get_peft_model(
model,
r = 16, # LoRAランク(大きいほど表現力↑・VRAM↑)
lora_alpha = 32, # スケーリング係数(定石は r * 2)
lora_dropout = 0.05,
target_modules = [“q_proj”, “k_proj”, “v_proj”, “o_proj”],
)
 
# 3. trainer.train() で学習(データセット部分は省略)
 
# 4. アダプタをマージしてGGUF形式で書き出す
model.save_pretrained_gguf(
“my-finetuned-model”,
tokenizer,
quantization_method = “q4_k_m”, # Ollama推奨の量子化
)

注意

save_pretrained_gguf はUnslothの便利メソッドで、LoRAアダプタのマージとGGUF変換を一括で行います。出力は my-finetuned-model.Q4_K_M.gguf のような名前で保存されます。次の章で説明する手動のGGUF変換が不要になるため、Unslothを使うならこちらが手軽です。

GGUFへの変換とファイルの確認

UnslothのGGUF直接エクスポートを使わない場合は、llama.cppの変換スクリプトを使います。




ubuntu@linuxlab: ~/llama.cpp
$ git clone https://github.com/ggml-org/llama.cpp.git
$ cd llama.cpp && pip install -r requirements.txt
 
# マージ済みモデル(HuggingFace形式)をGGUFに変換
$ python3 convert_hf_to_gguf.py ../merged-model/ \
–outfile ../my-finetuned-model.gguf \
–outtype q4_k_m
INFO: Model successfully exported to my-finetuned-model.gguf

変換できたら、ファイルが本当にGGUF形式になっているかを確認しておくと安心です。GGUFファイルは先頭4バイトが必ず 47 47 55 46(ASCIIで GGUFになっています。これを「マジックバイト」と呼び、ファイルの破損チェックにも使えます。実際にOllamaがインストールしているQwen2.5 0.5BのGGUF blobを xxd で覗いてみました。

GGUFマジックバイト 4747 5546 の実測ログ
GGUFマジックバイト 4747 5546 の実測ログ



ubuntu@linuxlab: ~
$ ollama show qwen2.5:0.5b –modelfile | grep ‘^FROM’
FROM ~/.ollama/models/blobs/sha256-c5396e06af29…
$ xxd ~/.ollama/models/blobs/sha256-c5396e06af29… | head -1
00000000: 4747 5546 0300 0000 2201 0000 0000 0000 GGUF…”…….
$ ls -lh ~/.ollama/models/blobs/sha256-c5396e06af29…
-rw-r–r–@ 1 user staff 379M Jun 15 10:12 sha256-c5396e06af29…

先頭が 4747 5546 になっていて、ASCII表示でも GGUF と読めます(2026-06-15 実測)。量子化方式 q4_k_m(4bit / K-quant / medium)はOllamaでも標準的で、精度とサイズのバランスが良いためおすすめです。GGUFそのものをもっと深掘りしたい場合は を参照してください。

Modelfileを書いてOllamaにインポートする

GGUFファイルができたら、いよいよOllamaの出番です。Ollama用の設定ファイル「Modelfile」を書いて取り込みます。

手順1:Modelfileを作成する




ubuntu@linuxlab: ~/my-finetune
$ cat Modelfile
# GGUFファイルへのパスを指定
FROM ./my-finetuned-model.gguf
 
# モデルの役割を定義するシステムプロンプト
SYSTEM “””あなたはLinuxサーバー専門のアシスタントです。”””
 
# 推論パラメータ
PARAMETER num_ctx 2048
PARAMETER temperature 0.6
PARAMETER top_k 40
PARAMETER top_p 0.9

主なパラメータの意味は次のとおりです。

パラメータ 値の例 説明
FROM ./model.gguf GGUFファイルのパス(必須)。学習済みモデルはここを差し替える
SYSTEM 任意テキスト モデルの役割・人格を定義するプロンプト
num_ctx 2048〜8192 コンテキスト長(大きいほどVRAM消費増)
temperature 0.6〜0.7 出力のランダム性。0で決定的、1でランダム寄り
top_k 40〜80 次トークン候補の上位K件だけを選択対象にする

手順2:ollama create でインポートする

ここからはOllama 0.30.8の実機で動かした結果です。今回は学習済みGGUFの代わりに、手元にあるQwen2.5 0.5BのGGUF blobを FROM に指定し、linuxlab-lora-demo という名前のカスタムモデルを作成しました(取り込み手順自体は学習済みGGUFでもまったく同じです)。

ollama create とollama show --modelfileの実測ログ
ollama create とollama show –modelfileの実測ログ



ubuntu@linuxlab: ~/my-finetune
$ ollama create linuxlab-lora-demo -f Modelfile
gathering model components
copying file sha256:c5396e06af29… 100%
parsing GGUF
writing manifest
success

正直、GGUFのコピーが発生するため大きいモデルほど作成に時間がかかります。今回の0.5B(Q4_K_M / 379MB)なら数秒で終わりました。

インポート確認:ollama show / REST API

取り込みが成功したか、複数の角度から確認します。まず ollama show --modelfile で、Modelfileに書いた設定がそのまま登録されているかを見ます。




ubuntu@linuxlab: ~
$ ollama show linuxlab-lora-demo –modelfile
FROM ~/.ollama/models/blobs/sha256-9c63daaf099c…
TEMPLATE {{ .Prompt }}
SYSTEM あなたはLinuxサーバー専門のアシスタントです。…
PARAMETER num_ctx 2048
PARAMETER temperature 0.6
PARAMETER top_k 40
PARAMETER top_p 0.9

SYSTEMプロンプトと4つのPARAMETERが、書いたとおりに登録されているのが分かります(2026-06-15 実測)。これで「カスタムModelfileでモデルの挙動を制御する」という目的は達成です。

次に、Ollamaが立ち上げているREST APIからも確認しておきます。http://localhost:11434/api/tags に登録済みモデル一覧が、/api/version にバージョンが返ってきます。ブラウザでアクセスした実際の画面が次の2枚です。

Ollama REST API /api/tags にlinuxlab-lora-demoが登録されている実画面
Ollama REST API /api/tags にlinuxlab-lora-demoが登録されている実画面
Ollama /api/version が 0.30.8 を返す実画面
Ollama /api/version が 0.30.8 を返す実画面

/api/tags のJSONの先頭に linuxlab-lora-demo:latest が並んでおり、/api/version{"version":"0.30.8"} を返しています。APIから扱えるということは、Python や他のアプリからもそのまま呼び出せるということです(API連携は で詳しく解説しています)。

最後に、ここまでの「学習 → GGUF確認 → 取り込み」の流れを1枚のターミナルにまとめると、次のようなイメージになります。

LoRA→GGUF→Ollama取り込みワークフローのターミナル再現
LoRA→GGUF→Ollama取り込みワークフローのターミナル再現

小さいモデルでの注意

今回ベースに使ったQwen2.5 0.5Bのような超小型モデルは、SYSTEMプロンプトを与えても指示への追従が弱く、回答が不安定になりがちです。実際に ollama run で質問しても、的外れな出力になることがありました。「自分のデータでちゃんと賢くする」のがファインチューニングの本質であり、その効果を出すには最低でも1B〜3Bクラス+十分な学習データが必要だと考えてください。

よくあるエラーと対処法

エラー1:CUDA out of memory(学習時)




ubuntu@gpu-server: ~/lora-training
torch.OutOfMemoryError: CUDA out of memory.
Tried to allocate 1.50 GiB (GPU 0; 7.79 GiB total capacity;
6.83 GiB already allocated)

対処法:バッチサイズを下げる、load_in_4bit=True でQLoRAにする、より小さいモデルに切り替える、のいずれかです。




ubuntu@gpu-server: ~/lora-training
per_device_train_batch_size = 1, # 2 → 1 に下げる
gradient_accumulation_steps = 4, # 勾配を積み立てて実効バッチを稼ぐ
load_in_4bit = True, # QLoRA有効化

エラー2:no such file or directory(ollama create時)




ubuntu@linuxlab: ~/my-finetune
Error: open model file: no such file or directory

対処法:Modelfileの FROM に書いたパスが間違っているか、GGUFファイルが存在しません。ls -la *.gguf でファイルの実在を確認し、相対パスで詰まる場合は絶対パスで指定すると確実です。




ubuntu@linuxlab: ~/my-finetune
$ ls -la *.gguf
-rw-r–r– 1 user user 397M Jun 15 10:30 my-finetuned-model.gguf
$ sed -i ‘s|FROM ./|FROM /home/user/my-finetune/|’ Modelfile
$ ollama create my-linux-expert -f Modelfile
success

エラー3:モデルの応答がおかしい(学習の失敗)

学習はエラーなく終わったのに応答が変、という場合によくある原因です。

  • データセットのフォーマットがモデルのチャットテンプレートと合っていない
  • 学習データが少なすぎる(目安:最低でも数百〜千件のサンプル)
  • 学習率が高すぎて元の知識を忘れている(catastrophic forgetting)→ learning_rate=2e-4 前後が目安
  • lora_alphar の比率が不適切(alpha = r * 2 が定石)
  • そもそもベースモデルが小さすぎる(0.5B級は指示追従が弱い)

まとめ

Ollamaでファインチューニング済みモデルを使うワークフローを整理します。

  • Ollama自体は学習機能を持たない。学習はUnsloth(実測 2026.6.7)などの外部ツールで行う
  • LoRAはベースモデルを凍結し差分アダプタだけを学習するため、少ないVRAMで済む
  • QLoRA(4bit量子化)を使えばVRAM 4GB〜の環境でも小さいモデルを学習できる
  • 学習済みモデルは save_pretrained_gguf(Unsloth)またはllama.cppでGGUFに変換する。先頭4バイトが 4747 5546 なら正しいGGUF
  • GGUF+Modelfile(FROM・SYSTEM・PARAMETER)で ollama create するだけでOllamaに取り込める
  • 実測:Ollama 0.30.8 でカスタムモデルを作成し、SYSTEM・PARAMETERが反映されること、REST APIから扱えることを確認(2026-06-15)

学習環境としてGPUを用意するなら、時間課金のクラウドGPUが手軽でコストも抑えられます。国内サポートを重視するなら日本語で使えるVPSも選択肢です。

コメント

タイトルとURLをコピーしました