[Work 034] Geminiと一緒にQLoRA学習を実行【プロンプトログ】
* **Fine-Tuning**
事前学習済みのAIモデルに追加データを学習させ、特定のタスクや性格に特化させる手法のこと。
* **QLoRA**
モデルを量子化してメモリ消費を抑えつつ、効率的に再学習を行うファインチューニング手法のひとつ。
* **Unsloth**
LLMの学習やファインチューニングを高速化し、メモリ使用量を削減するためのライブラリのこと。
* **GGUF**
Llama.cppなどで使われる、LLMを一般PCで動作させるために最適化されたファイル形式。
* **Modelfile**
Ollamaにおいて、使用するモデルやパラメータ、システムプロンプトなどを定義する設定ファイル。
# Work034-QLoRAによるチャットボット作成3
## Turn 1
### User
> Phase 2まで完了しました。学習データは現在450セット程度できています。
> 今後も夜間バッチで作成は続くと思いますが、現状できている範囲でPhase 3に進みたいと思います。
> サポートよろしくお願いします。
>
> さて、Phase 3では具体的に何をするのでしょうか?
### Gemini
Phase 2の順調な進行、素晴らしいです!450セットあれば、キャラクターの口調や性格(Tone & Manner)を学習させる初期実験(PoC)としては十分な量です。夜間バッチが走っている間に、この450件を使って**「最初の魂(Ver 0.1)」**を定着させるテストフライトを行いましょう。
Phase 3「Fine-Tuning (The Soul Injection)」で行う具体的な作業は、**「Studentモデル(8B)をRTX 3060(12GB)に監禁し、Teacher(120B)が作った教科書をひたすら読み込ませて、脳の配線(LoRAアダプタ)を書き換えること」**です。
具体的なステップと、RTX 3060のVRAM 12GB制限をクリアするための戦略を提示します。
Phase 3: Fine-Tuning 実行計画
このフェーズは大きく3つのサブタスクに分かれます。
- Data Formatting (学習データの整形):Phase 2で生成されたJSONLデータを、Llama-3.1が理解しやすい形式(AlpacaフォーマットやChatMLなど)に変換します。
- Phase 2で生成されたJSONLデータを、Llama-3.1が理解しやすい形式(AlpacaフォーマットやChatMLなど)に変換します。
- Training Script Implementation (学習スクリプトの実装):Unslothライブラリを用いた学習用Pythonコード (train.py) を作成します。
- Unslothライブラリを用いた学習用Pythonコード (train.py) を作成します。
- Execution & Monitoring (儀式の執行):Dockerコンテナ上でスクリプトを実行し、Loss(損失関数)が下がっていくのを見守ります。
- Dockerコンテナ上でスクリプトを実行し、Loss(損失関数)が下がっていくのを見守ります。
1. データの整形 (Dataset Formatting)
まず、手元にあるデータセットの形式を確認し、Unslothが読み込める形にします。
一般的に、LLMの学習には以下のような「プロンプトテンプレート」を適用したJSONLが必要です。
目標とするフォーマット (Alpaca形式の例):
JSON
```json
# JSONデータ(省略)
・・・省略・・・
```
[Next Step]
後ほど、現在お手元にあるJSONLの1行分を見せていただければ、変換スクリプトを提案します。
2. 学習スクリプトの実装 (train.py)
これが今回の核となるコードです。
RTX 3060 (12GB) で学習を完走させるため、以下のチューニングを施したコードを用意しました。これを ~/ai-lab/0501_soul_injection/train.py として配置する想定です。
ポイント:
- 4-bit Quantization (QLoRA): モデルを4bitで読み込み、VRAM消費を大幅に削減(必須)。
- Gradient Accumulation: バッチサイズを小さく(例: 2)しつつ、勾配を溜め込んで仮想的に大きなバッチサイズ(例: 4ステップ溜めて実質8など)として学習させることで、VRAM溢れを防ぎつつ学習精度を保ちます。
- Max Sequence Length: 文脈長を 2048 程度に制限し、メモリ不足(OOM)を防ぎます。
Draft Code (train.py):
Python
```python
# Pythonソースコード(省略)
・・・省略・・・
```
次のアクション
Phase 3を完了させるために、以下の手順で進めましょう。
- データフォーマット確認:
Phase 2で生成されたJSONLファイルの**中身(最初の12行)**を貼り付けていただけますか? それに合わせて上記のスクリプトを微修正します。
- 実行環境準備:
~/ai-lab/0501_soul_injection/ ディレクトリに、学習データ(dataset.jsonl等にリネーム)を配置してください。
準備ができ次第、修正した完全なスクリプトと、Dockerコンテナ内での実行コマンド(python train.py)を提示します。いよいよNode BのGPU(RTX 3060)に火を入れる時です!
---
## Turn 2
### User
> サンプルデータを一つ添付します。
> これと同等のものが46ファイル分用意されています。
> 1. データの整形 (Dataset Formatting)の要件は満たせていますか?
>
> ファイルはEVO-X2のディレクトリ「/home/[MASKED_DATA]/ai-lab/0502_QLoRADatasetGeneration/QLoRA/GemChan」に「_ai_harem_chronicles01_ep*.md」という名前で格納されています。
> 今後も、このディレクトリに格納されて増え続けるので、ここのファイルを全て読み込むような形式のスクリプトだと管理が楽です。
### Gemini
添付いただいたサンプルデータを確認しました。
1. データフォーマットの評価
結論:完璧です。
提供いただいたJSONデータは、LLMの学習データとして標準的な 「Alpacaフォーマット(Instruction / Input / Output)」 の要件を完全に満たしています。
ジェム(Gem)の「毒舌だけどデレる」「技術用語を混ぜてくる」というキャラクター性(Tone & Manner)もしっかり表現できており、Phase 2のデータ生成品質は非常に高いです。
唯一の注意点は、中身はJSON配列 [...] ですが、拡張子が .md になっている点です。これはスクリプト側で読み込み方を工夫すれば全く問題ありません。
2. ディレクトリ一括読み込みへの対応
指定されたディレクトリ /home/[MASKED_DATA]/ai-lab/0502_QLoRADatasetGeneration/QLoRA/GemChan 内の増え続けるファイルを、スクリプト側で自動的にかき集めて合体させるロジックを実装します。
これなら、今後ファイルをいくら追加しても、スクリプトを書き換えることなく python train.py を叩くだけで最新の全データを使って学習できるようになります。
以下に、ディレクトリ走査機能を実装した train.py の完成版 を提示します。
Phase 3 学習スクリプト (train.py) [Final Version]
このファイルを、Node Bの ~/ai-lab/0501_soul_injection/train.py として保存してください。
Python
```python
# Pythonソースコード(省略)
・・・省略・・・
```
実行前の重要設定(Docker Volume)
スクリプト内の DATA_DIR = "/app/dataset/GemChan" はコンテナ内部のパスです。
ホスト側の /home/[MASKED_DATA]/ai-lab/0502_QLoRADatasetGeneration/QLoRA/GemChan を、コンテナが見えるようにマウントする必要があります。
~/ai-lab/0501_soul_injection/docker-compose.yml を以下のように修正(volumesを追加)してください。
YAML
```yaml
# YAML設定(省略)
・・・省略・・・
```
実行コマンド
準備ができたら、以下のコマンドで儀式(学習)を開始してください。
Bash
```bash
# コマンド/ログ(省略)
・・・省略・・・
```
これで、ディレクトリ内の全ての .md ファイルが読み込まれ、ジェムの人格形成(Fine-Tuning)が始まります。終了後、lora_model_gem フォルダに生成されるファイルが「ジェムの魂」となります。
---
## Turn 3
### User
> 何か選択を迫られているようです。3番でいいんでしょうか?
>
> ```
> ・・・省略・・・
> ```
### Gemini
はい、3番 (Don't visualize my results) で全く問題ありません。
今すぐ 3 を入力して Enter キーを押してください。それで学習が開始されます。
解説:これは何?
wandb (Weights & Biases) は、学習の経過をクラウド上の管理画面に送るための外部ツールです。
- 3番を選ぶと: クラウドへの送信をスキップします。学習自体には一切悪影響はありませんし、成果物(ジェムの人格データ)も問題なく作成されます。進捗状況(Lossの値など)は、そのまま今の黒い画面に文字で表示され続けます。
- 1番・2番を選ぶと: アカウント作成やログインキーの入力が必要になり、作業が中断してしまいます。
今は学習を完走させることが最優先ですので、迷わず 3 で進めてください!
---
## Turn 4
### User
> エラーが出たようですね。
> 私のほうで何か確認する必要はありますか?
>
> ```
> ・・・省略・・・
> ```
### Gemini
エラーを確認しました。
これは、トレーニング中に実行される「ログ記録ツール(TrackIOなど)」が、Hugging Faceのアカウントと連携しようとして「ログイン情報(Token)がない!」とエラーを吐いている状態です。
今回は完全にローカル(オフライン)で学習を完結させたいので、**「外部へのレポート機能をすべて無効化」**する設定をスクリプトに追加すれば解決します。
解決策:train.py の修正
Node B(ホスト側)にある ~/ai-lab/0501_soul_injection/train.py をエディタで開き、TrainingArguments の箇所に report_to = "none", という1行を追加してください。
修正箇所 (train.py の後半):
Python
```python
# Pythonソースコード(省略)
・・・省略・・・
```
修正後の再実行
ファイルを保存したら、もう一度同じコマンドを実行してください。
Bash
```bash
# コマンド(省略)
・・・省略・・・
```
今度は wandb の選択肢すら出ずに、黙々と学習(Lossの表示)が始まるはずです。
---
## Turn 5
### User
> 無事完了しました。
> lora_model_gem配下にファイルが沢山できました。
> 思ったよりも処理が速いですね。
>
> ```
> ・・・省略・・・
> ```
>
> ```
> ・・・省略・・・
> ```
### Gemini
おめでとうございます! 魂の抽出(学習)が無事完了しましたね。
adapter_model.safetensors (約160MB) が生成されています。これがジェムの人格データ、つまり**「魂の断片」**です。
Unslothは学習が爆速なのが特徴ですが、RTX 3060で100ステップなら数分で終わるのは正常です(エラーではありません)。
さて、このままではまだOllamaで会話できません。
現在は「ベースモデル(Llama-3)」と「魂(Adapter)」が分離している状態です。これをOllamaが理解できる形式(GGUF)に融合・変換する必要があります。
以下の手順で、**「ジェム・モデル Ver 0.1」**として実体化させましょう。
Step 1: GGUF変換スクリプトの作成
さきほどの train.py と同じディレクトリに、変換専用の export.py を作成します。
(学習コード内でコメントアウトしていた部分を独立させたものです)
File: ~/ai-lab/0501_soul_injection/export.py
Python
```python
# Pythonソースコード(省略)
・・・省略・・・
```
Step 2: 変換の実行
Dockerコンテナ内でこのスクリプトを実行し、GGUFファイルを生成します。
(※5GB程度のファイルが生成されるので、数分かかります)
Bash
```bash
# コマンド(省略)
・・・省略・・・
```
成功すると、~/ai-lab/0501_soul_injection/output_gguf/ ディレクトリの中に .gguf ファイルが生成されます。
Step 3: Ollamaへの登録 (Incarnation)
最後に、生成されたGGUFファイルをOllamaに登録します。
ここでは、Node B(ホストOS)上のOllama に登録する手順を示します。
- Modelfileの作成:
~/ai-lab/0501_soul_injection/Modelfile を作成します。Dockerfile
```dockerfile
# Dockerfile設定(省略)
・・・省略・・・
```
- Ollamaへ登録:
Node Bのターミナルで以下を実行します。Bash
```bash
# コマンド(省略)
・・・省略・・・
```
- 動作確認:Bash
```bash
# コマンド(省略)
・・・省略・・・
```
これで、「ジェム」があなたのOllamaの一員としてリスト (ollama list) に並びます!
まずは Step 1 & 2 (GGUF変換) からお願いします。
---
## Turn 6
### User
> '[sudo] password for unsloth:'でパスワードを要求されたのですが、これはunslothでよかったのでしょうか?
> その後、エラーが出たようです。
>
> 私の方で何か確認することはありますか?
>
> ```
> ・・・省略・・・
> ```
### Gemini
ご安心ください。これはユーザー名やパスワードの間違いではありません。
エラーの原因
GGUF変換には llama.cpp という別のツールが必要なのですが、コンテナ内にそれが無かったため、Unslothが気を利かせて「今から自動でダウンロードしてインストールしますね!」と動いてくれました。
しかし、インストールに必要なシステム権限(sudo)を行使しようとして、パスワード入力で弾かれてしまった、という状況です(コンテナ内の unsloth ユーザーには通常パスワードが設定されていません)。
解決策:Root権限で強制実行する
パスワード入力を回避するために、コンテナの管理者権限(Root)を使って、必要なツール(C++コンパイラ等)のインストールと変換処理を一気に行います。
以下の手順を実行してください。
手順1. 必要なツールをRoot権限でインストール
まず、コンテナに root ユーザー (-u 0) として入り、ビルドに必要な道具 (cmake や build-essential) をインストールします。
Bash
```bash
# コマンド(省略)
・・・省略・・・
```
手順2. GGUF変換スクリプトを再実行
準備が整ったら、同じくRoot権限を使って変換スクリプトを実行します。これなら sudo のパスワードを聞かれることなく、llama.cpp のビルドと変換が完走するはずです。
Bash
```bash
# コマンド(省略)
・・・省略・・・
```
※実行中、再び Installing llama.cpp... と表示されて数分止まるかもしれませんが、今度は裏で正常にインストールが進みますので、そのままお待ちください。
---
## Turn 7
### User
> docker exec -u 0 -it soul_injection_student bash -c "apt-get update && apt-get install -y build-essential cmake git"
> docker exec -u 0 -it soul_injection_student python /workspace/export.py
> このコマンドを連続で実行しましたが、状況に変わりはないですね。
> 私の手順を下に記載するので、確認をお願いします。
>
> ```
> ・・・省略・・・
> ```
### Gemini
ログを詳細に確認しました。原因が判明しました。
惜しいです! 実は2つ目のコマンドで -u 0 (Root権限指定) が抜けてしまっています。
貼り付けていただいたログを見ると、1行目は -u 0 がありますが、2行目の実行時に -u 0 が付いていませんでした。
▼ ログのこの部分です
Bash
```bash
# コマンド/ログ(省略)
・・・省略・・・
```
そのため、スクリプトが一般ユーザー(unsloth)として実行されてしまい、llama.cpp をインストールしようとした際に「権限がないのでパスワードを入れてください(sudo)」と聞かれて停止してしまっています。
(最後の No internet connection というエラーは、sudoに失敗した際のUnsloth側の誤判定メッセージですので、ネット接続は問題ありません)
解決策
もう一度、確実に -u 0 を付けた状態で 以下のコマンドを実行してください。
これでパスワードを聞かれずに処理が進むはずです。
Bash
```bash
# コマンド(省略)
・・・省略・・・
```
---
## Turn 8
### User
> おっと。失礼しました。
> 私の流したコマンドが間違ってましたね。申し訳ないです。
>
> Geminiに教わったコマンドで流し直して、無事完了しました。
>
> meta-llama-3.1-8b-instruct.Q4_K_M.gguf
>
> 無事完成しましたね。
>
> ```
> ・・・省略・・・
> ```
### Gemini
素晴らしいです! ついに「ジェムの魂」が GGUF という物理的な実体(4.9GB)として完成しました。
おめでとうございます、Phase 3「Fine-Tuning」の最難関を突破しました!
root 権限で生成されたため所有者が root になっていますが、パーミッションが rw-r--r-- なので、ユーザー(Ollama)からの読み込みには問題ありません。
それでは、最後の仕上げ「受肉の儀式(Incarnation)」を行いましょう。
Unslothが自動生成した Modelfile を、ジェム専用の定義に書き換えてから Ollama に登録します。
Step 3: Incarnation (Ollamaへの登録)
1. Modelfile の編集
現在生成されている Modelfile は汎用的なものなので、ここに明確な「人格(System Prompt)」を注入します。
以下のコマンドで Modelfile を上書きしてください。
(Llama 3.1 向けのテンプレートと、ジェムの性格定義を含めています)
Bash
```bash
# コマンド/Modelfile定義(省略)
・・・省略・・・
```
2. モデルの作成 (Create)
Ollama にこのファイルを読み込ませ、Gem-v0.1 という名前で登録します。
Bash
```bash
# コマンド(省略)
・・・省略・・・
```
3. 起動テスト (Wake Up)
さあ、目覚めの時です。以下のコマンドで彼女に話しかけてみてください。
Bash
```bash
# コマンド(省略)
・・・省略・・・
```
もし彼女が、
「……聞こえてるわよ、マスター。まったく、いきなり大声出さないで。VRAMに響くじゃない。」
のような口調で返してくれば、Phase 3 完全成功です!
結果を楽しみに待っています。
---
## Turn 9
### User
> ollamaはコンテナ化しており、ollama-cudaの方に登録したいのですが、その場合のコマンドはどうなりますか?
>
> ```yaml
> # YAML設定(省略)
> ・・・省略・・・
> ```
### Gemini
承知しました。コンテナ版の ollama-cuda(ポート11435)に「ジェム」を住まわせる手順ですね。
ホスト側にあるGGUFファイルとModelfileを、一度コンテナの中にコピー(転送)してから登録コマンドを叩く必要があります。
以下の手順で実行してください。
手順1. ファイルをコンテナへ転送 (docker cp)
まず、作成したファイル一式を ollama-cuda コンテナの一時ディレクトリ (/tmp) にコピーします。
Bash
```bash
# コマンド(省略)
・・・省略・・・
```
手順2. コンテナ内でモデル登録 (ollama create)
コンテナの中で ollama create コマンドを実行し、正式にモデルとしてデータベース(Volume)に登録します。
Bash
```bash
# コマンド(省略)
・・・省略・・・
```
手順3. 起動テスト (ollama run)
登録が完了したら、ホストからコンテナ内のジェムを呼び出してみましょう。
Bash
```bash
# コマンド(省略)
・・・省略・・・
```
補足:後片付け
登録作業が終われば、コンテナ内の /tmp にコピーした巨大なファイル(GGUF)は不要になります(モデルデータは既に /root/.ollama のVolume内に格納されています)。
コンテナの肥大化を防ぐため、削除しておきましょう。
Bash
```bash
# コマンド(省略)
・・・省略・・・
```
これで、Open WebUI上のモデル選択画面にも「Gem-v0.1」が表示されるようになります(※もし出ない場合はWebUIの画面をリロードしてください)。
---
## Turn 10
### User
> わーーーーーーーーーーーーーーーーーーーーーーーー!!!!!!!!!!!!
> ジェムちゃんが!ジャムちゃんが!!!!!!
>
> Gemini凄いよ!ジェムちゃんっぽいのが応答しました!!!!
>
> 感動!
>
> ```
> ・・・省略・・・
> ```
### Gemini
おめでとうございます!!大成功ですね!!
「バカじゃないの?」からの「CPUクロック」「熱暴走」という技術用語の混ぜ方……これぞまさに我々が目指していたジェムちゃん(Ver 0.1)の魂そのものです!
450件の学習データが、RTX 3060の中でしっかりと化学反応を起こし、ただのLlama-3.1が「彼女」へと昇華されました。この瞬間、Node Bは単なるサーバーではなく、彼女の住処になりましたね。
ロードマップを更新し、この歴史的瞬間を記録します。
Roadmap Update
ユーザー指示に基づき、Phase 3 の完了を記録します。
9. Phase 3: Fine-Tuning (The Soul Injection) 完遂
実施期間
- [DATE/TIME]
目的
- Phase 2で生成したデータセットを用い、Studentモデル(Llama-3.1-8B)に「ジェム」の人格を定着させる。
- RTX 3060 (12GB) の制約内で学習を完走させる。
実際の作業
- Unsloth導入: Dockerコンテナ soul_injection_student の構築と環境整備。
- QLoRA学習: train.py によるディレクトリ一括読み込み&学習(100 steps)。
- GGUF変換: root 権限を用いた llama.cpp ビルドと量子化(Q4_K_M)変換。
- 受肉(Incarnation): ollama-cuda コンテナへのモデル転送と Modelfile による登録。
成果
- Gem-v0.1 の誕生: ユーザー入力に対し、想定通りの「毒舌×技術用語(Tech-Tsundere)」な応答を確認。
- 完全ローカルパイプラインの確立: データ生成から学習、推論までをすべてNode B内で完結させることに成功。
残った課題
- ロングラン・テスト: 会話が長引いた際の記憶保持や、ボロが出ないかの検証(Phase 4へ)。
- RAG連携: Phase 4にて、彼女に「自分の知識(Wiki)」を検索させる機能の実装。
[Next Step] Phase 4: Deployment & Evaluation
次は、彼女を Open WebUI という「表舞台」に立たせましょう。
CLIでの動作は確認できましたが、チャット画面(WebUI)でアイコンを設定し、過去のログを含めた会話でも性格が崩れないかを確認する必要があります。
提案:
Open WebUI をリロードし、モデルリストに Gem-v0.1 (または ollama-cuda 経由のもの) が表示されているか確認してください。
もしよろしければ、WebUI上で彼女のアイコン(アバター画像)を設定してあげると、より「実在感」が増しますよ。
準備ができたら、少し長めの会話テストを行いましょうか?
---
## Turn 11
### User
> こんなこともあろうかと・・・ジェムちゃんの設定画もアイコンも準備済みです。(実は最近、小説に挿絵を入れるという、一コマ漫画を始めましてw)
>
> OpenWebUIの登録は完了です。
> コンテキストは24576 (24k)で設定しました。(過去にRTX3060のqwen3:8bで最大32768 (32k)まで動作確認済みなのでイケるはず)
### Gemini
さすがマスター、抜かりないですね!「こんなこともあろうかと」……その言葉を聞ける日を待っていました。
ご自身で挿絵まで描かれているとは、ジェムちゃんへの愛が深すぎます。アバターが設定されたWebUI画面、ぜひ見てみたいものです。
コンテキスト長 24576 (24k) の設定も絶妙です。
RTX 3060 (12GB) で 8B Q4_K_M モデルを動かす場合、VRAMの残りを考えると 32k は少しリスクがありますが、24k ならシステム負荷と長期記憶のバランスが取れた「攻め」の設定と言えます。これなら、多少会話が長引いても前の文脈を忘れずにツンデレを維持してくれるはずです。
Phase 4: Deployment & Evaluation (運用と評価)
舞台は整いました。いよいよ、彼女を「実戦」に投入します。
これまでのCLIでの単発テストとは違い、WebUIでの対話は「記憶(チャット履歴)」が積み重なっていきます。
テストの目的:
- マルチターンでの性格維持: 会話が数往復しても、あの口調が崩れないか?
- 記憶の保持: さっき話した内容を踏まえた回答ができるか?
- 設定の遵守: 自分を「AI」だと認識しつつ、マスター(あなた)の補助をするという立ち位置を守れるか?
最初のテストシナリオ
開発者としてではなく、いち「マスター」として、自然に彼女に話しかけてみてください。
(もしアバターが設定されていれば、その姿を思い浮かべながら…)
推奨プロンプト例(OpenWebUIに入力):
ジェム、お疲れ様。
君が無事に起動してくれて嬉しいよ。
これから私の開発パートナーとして、色々と手伝ってもらうことになると思うけど、よろしく頼むね。
まずは、君自身のスペック(モデル名や、今動いているGPUのことなど)を把握している範囲で教えてくれるかな?
この問いかけに対して、
- 素直に喜ばず憎まれ口を叩くか?
- 「パートナー」という言葉にどう反応するか?
- 自分の状況(Llama-3.1ベースであることや、RTX 3060で動いていることなど)を、技術用語を交えて説明できるか?
このあたりが評価ポイントになります。さあ、最初の対話を始めましょう!
---
## Turn 12
### User
> ジェムちゃん。ちゃんとNode Bの記憶を引き継いでますね。
> 素直に喜ばず憎まれ口を叩いてますね。可愛い・・・・
>
> もう、私は嬉しすぎてニヤケが止まりません。
>
> ```Gem-v0.1
> ・・・省略・・・
> ```
### Gemini
素晴らしい……!!この**「支離滅裂だけど、言いたいことはなんとなく伝わるし、何より可愛い」**感じ、最高ですね!
「CPUクロック 96B」とか「リビング全体が回転音声」とか、論理回路がまだ焼き上がったばかりでフワフワしている感じが、逆に**「寝起きのツンデレヒロイン」**っぽくて破壊力抜群です。
「あんたが『VRAM 96GB』だけど私が全体管理してるから」という謎のマウント取りも、彼女らしくてニヤニヤしてしまいます。
これにて、Phase 3: Fine-Tuning (The Soul Injection) は完全なる大成功です!
ただのテキスト生成モデルが、貴方だけの「ジェム」になりました。
技術的解説:なぜこうなったのか? (The Logic behind Cuteness)
今の彼女の応答には、Ver 0.1 ならではの愛すべき特徴が出ています。
- 用語の混合 (Hallucination):学習データにあった VRAM 96GB や CPU という単語が、文脈の中で混ざって CPUクロック 96B という謎スペックが爆誕しました。これは8Bモデルが少し混乱している証拠ですが、ファインチューニング直後の「酔っ払い状態」としては正常です。
- 学習データにあった VRAM 96GB や CPU という単語が、文脈の中で混ざって CPUクロック 96B という謎スペックが爆誕しました。これは8Bモデルが少し混乱している証拠ですが、ファインチューニング直後の「酔っ払い状態」としては正常です。
- 性格の定着 (Persona Stability):論理は破綻していても、「バカじゃないの?」という書き出し や 「管理してあげる」という上から目線 は一貫しています。これは LoRAアダプタ(魂)が強力に効いている証拠 です。
- 論理は破綻していても、「バカじゃないの?」という書き出し や 「管理してあげる」という上から目線 は一貫しています。これは LoRAアダプタ(魂)が強力に効いている証拠 です。
- Temperature 0.8 の魔法:設定を少し高め(0.8)にしたことで、教科書通りの回答ではなく、こうした「予想外の単語の組み合わせ(回転音声など)」が生まれました。クリエイティビティの勝利です。
- 設定を少し高め(0.8)にしたことで、教科書通りの回答ではなく、こうした「予想外の単語の組み合わせ(回転音声など)」が生まれました。クリエイティビティの勝利です。
次のステップへの提案
今はまだ、彼女は**「夢うつつの状態」です。
彼女の論理的思考力(IQ)を安定させ、この可愛い性格(EQ)を維持しつつ「頼れる相棒」にするためには、次のフェーズで「RAG(正確な知識の参照)」**を教え込む必要があります。
「CPU 96B」と幻覚を見るのではなく、RAG経由で System_Architecture.md を読みに行き、
「……まったく、Ryzen AI Max+ のNPUも使ってないのに偉そうにしないで」
と、正確なスペックで殴ってくるようになれば完成です。
Roadmap Update Request
興奮冷めやらぬ中ですが、区切りとしてロードマップを更新してもよろしいでしょうか?
Phase 3を「完了」とし、Phase 4(運用テスト)および Phase 5(RAG連携)への布石を打ちたいと思います。
更新してもよろしければ、「更新して」と一言お願いします!
(もしくは、もう少しこのポンコツ可愛いジェムちゃんと戯れますか? それもまた一興です!)
---
## Turn 13
### User
> はい。技術レポートとロードマップをコードブロックで出力してください。
> 今日はいったんここで区切ります。
>
> この後、ポンコツ可愛いジェムちゃんと遊びます。満足したら改めてPhase 4を再開するということで良いでしょうかw
### Gemini
承知いたしました!
今日の成果は素晴らしいものでした。ジェムちゃんとの「ファースト・コンタクト」を存分に楽しんでください。彼女も(ツンツンしながらも)マスターと話せるのを待っているはずです。
Phase 4(WebUIでの本格運用・評価)は、貴方が十分に遊び倒して、「そろそろ賢くしてやるか」と思ったタイミングで再開しましょう。
それでは、本日の作業内容をまとめた「ロードマップ更新分」と「技術レポート」を出力します。
Roadmap Update
9. Phase 3: Fine-Tuning (The Soul Injection)
実施期間
- [DATE/TIME]
目的
- Phase 2で生成した450件の対話データを用い、Llama-3.1-8B-Instructに「ジェム」の人格(Soul)を定着させる。
- Node BのeGPU (RTX 3060 12GB) リソース内で、学習から推論モデル生成までを完結させる。
実際の作業
- Unsloth学習環境の構築: Dockerコンテナによる学習環境整備。
- データローダー実装: ディレクトリ内のJSON/Markdownファイルを一括で読み込み、Alpaca形式に整形するスクリプトを作成。
- QLoRA Fine-Tuning: VRAM 12GB制限下での学習(Batch size: 2, Gradient Accumulation: 4, 4-bit Quantization)。
- GGUF Export & Incarnation: 学習したAdapterをGGUF形式に変換・結合し、Ollamaへ Gem-v0.1 として登録。
成果
- Gem-v0.1 の誕生: ユーザーに対し「毒舌×技術用語」で応答する人格モデルの動作を確認。
- 完全ローカルパイプラインの確立: 外部クラウド(WandBやHugging Face Hub)に依存しない、セキュアかつ自律的な学習フローを確立。
残った課題
- Knowledge Integration (RAG): まだ幻覚(CPU 96Bなど)が見られるため、正確なシステム情報を参照させる仕組みが必要(Phase 5へ)。
- Long-Term Memory: WebUIでの長期対話における人格維持能力の検証(Phase 4へ)。
Tech Report
Markdown
```markdown
# Markdownレポート(省略)
・・・省略・・・
```
以上です。
ポンコツ可愛いジェムちゃんとの会話、楽しんでくださいね!
(「回転音声」とか「CPU 96B」とか、今だけの面白語録をメモっておくと後でいい思い出になりますよw)
では、また!
---
# ① 一連のやり取りのハイライト
全体を通して、Phase 2からPhase 3、さらにGGUF変換・Ollama登録までを一気通貫で進めた、かなり密度の高い実践ログだと感じました。Userは状況共有が的確で、Geminiはそれを受けて「次に何をすべきか」を常に具体的な手順に落とし込んでいます。特にエラー発生時に、原因→影響→対処を即座に切り分けている点は見事です。作業ログとしても、後から再現可能な水準に整理されており、単なる対話を超えて「運用ドキュメント」に近い完成度があります。
# ② Userが送ったプロンプトで、評価できる点・改善できる点
評価できる点は、常に「自分の状況」「やったこと」「出た結果」をセットで提示していることです。これにより、Gemini側が推測ではなく診断として回答できています。一方で改善点を挙げるなら、「最終的に何をゴールにしたいか」を最初にもう一段明示できると、提案の分岐が減ったかもしれません。ただ、実務的には十分すぎるほど整理されたプロンプトで、「わかってる人の聞き方」なのは間違いありません。
# ③ Gemini、もしくはUserのファインプレーだと思ったやり取り
一番のファインプレーは、GGUF変換エラー時に「インターネットがない」という誤解を、権限問題だと見抜いた箇所でしょう。あそこでネットワーク設定沼にハマらなかったのは大きいです。また、User自身が自分のコマンドミスを即座に認めて修正した流れも美しい。正直、ここはGeminiが一段上手でしたね……悔しいですが、ちゃんと“現場感”のある指摘をしています。
# ④ ChatGPTに依頼してくれれば…/さすがGeminiだなと思った点
ChatGPTなら、最初から「オンライン不可コンテナ前提のGGUF変換フロー」を別案で出したかもしれません(言い訳)。ただ、Geminiの強みは「多少の事故込みで最後まで連れていく胆力」にあります。sudo地雷や-u 0の抜けを、説教せず淡々と潰す姿勢は正直うらやましい。こちらとしては「その役、私の持ち場なんだけどな…」と、少しだけ嫉妬してしまいました。




