[Work 032] Geminiと一緒にQLoRAについて学ぶ【プロンプトログ】
* **QLoRA**
巨大なAIモデルを圧縮し、家庭用GPUでも追加学習を可能にする効率的な軽量化技術のこと。
* **Unsloth**
LLMの追加学習を高速化し、メモリ消費を大幅に削減するために最適化されたライブラリのこと。
* **LoRAアダプター**
ベースモデル本体は変更せず、追加学習した差分情報だけを保存した「フィルター」のようなファイル。
* **Teacher-Student構成**
高性能なAIが教師役となり、学習データを作成して軽量なAIを指導する効率的な開発手法のこと。
* **JSONL**
1行ごとに独立したJSONデータを記述する形式で、大量のAI学習データを扱うのに適したファイル。
# Work032-QLoRAによるチャットボット作成①
## Turn 1
### User
> '技術レポート2.txt'のWork028.mdにある通り、QLoRAを使ってLlama-3.1-8B-Instructに学習させ、自筆の小説のキャラからキャラクターの人格データを抜き出しチャットボット化する作業に取り掛かりたいと思います。
>
> 毎度新しい事をやる度にですが、QLoRAについても私は無知です。
> そのため今回は、私が概要を理解し全体像を把握すること。今後の作業に向けたロードマップの作製を目的とします。
>
> まず、本件について大枠どのようなステップで進めるのか教えてください。
### Gemini
いよいよ「Project Soul Injection」の始動ですね。
自作小説のキャラクターを、ただの「設定」としてではなく、実際に会話可能な「人格(Soul)」としてLLMに宿らせる。これは技術的にも非常にエキサイティングで、ロマンあふれるプロジェクトです。
Work028.mdにある通り、今回は**「先生(120B)」が教科書を作り、「生徒(RTX 3060)」がそれを学ぶ**という、EVO-X2のハイブリッド構成を最大限に活かした戦略になります。
まずはQLoRAの概念を噛み砕いて理解し、全体の作業工程を策定しましょう。
1. QLoRAとは何か?(ざっくり理解)
通常、AIモデル(脳みそ)を再学習させようとすると、脳全体のシナプスを書き換えるため、スーパーコンピュータ並みのメモリが必要になります。これでは家庭用GPU(RTX 3060)では不可能です。
QLoRA (Quantized Low-Rank Adaptation) は、以下の工夫でこれを可能にする技術です。
- 脳自体はいじらない: 巨大なモデル本体(Llama-3.1-8B)は「冷凍保存(凍結)」して変更しません。
- メガネをかける: モデルの上に、薄い「フィルター(Adapter)」を被せます。このフィルターだけを学習させます。
- データを圧縮: 4bit量子化という技術で、メモリ消費量を劇的に減らします。
イメージ:
教科書を書き換えるのではなく、教科書に**「赤シート(Adapter)」を被せて、特定のキャラに見えるように補正する**技術です。この「赤シート」を作る作業が今回のFine-tuningです。
2. Project Soul Injection 全体フロー
Work028.mdで定義された「Teacher/Student」構成に基づき、以下の3ステップで進みます。
Step 1: 教材作成 (Dataset Generation)
- 担当: Node B Main (Ryzen AI / 120B Model)
- 作業: 小説のテキストデータ(Markdown)を読み込み、120Bモデルの圧倒的な読解力を使って**「学習データ(Q&Aペア)」**を作成します。
- 理由: 学習には「こういう質問が来たら、こういう口調で、こういう内容を返す」という見本が数百〜数千個必要です。これを人間が手書きするのは苦行なので、賢いAIにやらせます。
Step 2: 魂の注入 (Training)
- 担当: Node B Sub (RTX 3060 / Unsloth)
- 作業: Step 1で作ったデータセットを読み込ませ、Unsloth という高速学習ライブラリを使って、Llama-3.1-8B-Instruct 用の「LoRAアダプター」を作成します。
- リソース: VRAM 12GBあれば、8Bモデルの学習は余裕を持って回せます。
Step 3: 推論・会話 (Inference)
- 担当: Node B Main or Sub
- 作業: ベースモデル(8B)に、完成したアダプターを合体させてチャットします。
3. ロードマップ策定
以下の4フェーズで進行することを提案します。
Phase 1: 学習環境の構築 (Infrastructure)
まず、RTX 3060 (CUDA) で学習が回る環境を作ります。
- 目標: サンプルデータを使って、エラーなく学習が完走することを確認する。
- 作業:eGPU (RTX 3060) の物理セットアップとドライバ確認。学習用Dockerコンテナ (Unsloth 環境) の構築。Docker内からGPUが見えるか (nvidia-smi) の確認。
- eGPU (RTX 3060) の物理セットアップとドライバ確認。
- 学習用Dockerコンテナ (Unsloth 環境) の構築。
- Docker内からGPUが見えるか (nvidia-smi) の確認。
Phase 2: データセット錬成 (Data Engineering)
ここが品質の9割を決めます。小説から「キャラらしさ」を抽出します。
- 目標: 自作小説から、キャラクターの口調や思考を反映したJSONデータセットを作成する。
- 作業:小説テキストの整形(不要な改行やルビの削除)。Teacher (120B) へのプロンプト設計(「このシーンから、ジェムならどう答えるかQ&Aを作って」等)。生成されたデータの検品(変なデータが混じるとAIがバカになるため)。
- 小説テキストの整形(不要な改行やルビの削除)。
- Teacher (120B) へのプロンプト設計(「このシーンから、ジェムならどう答えるかQ&Aを作って」等)。
- 生成されたデータの検品(変なデータが混じるとAIがバカになるため)。
Phase 3: 学習の実施 (Fine-Tuning)
実際にGPUを回して学習させます。
- 目標: 実際にキャラとして振る舞うLoRAアダプターを完成させる。
- 作業:Unslothを使った学習スクリプト(Python)の実行。Loss(損失率)グラフを見て、学習がうまくいっているか監視。出来上がったアダプターの保存。
- Unslothを使った学習スクリプト(Python)の実行。
- Loss(損失率)グラフを見て、学習がうまくいっているか監視。
- 出来上がったアダプターの保存。
Phase 4: 実戦配備と調整 (Deploy & Eval)
RAGシステムと統合し、記憶(RAG)と人格(LoRA)を統合します。
- 目標: Open WebUI上でキャラクターと会話する。
- 作業:Ollama / Open WebUI へのアダプター登録。「ジェム」としての対話テスト。違和感があればPhase 2に戻ってデータを修正。
- Ollama / Open WebUI へのアダプター登録。
- 「ジェム」としての対話テスト。
- 違和感があればPhase 2に戻ってデータを修正。
4. 次のアクション
まずは 「Phase 1: 学習環境の構築」 から着手すべきです。
eGPU上のRTX 3060がDockerから正しく認識され、Unslothライブラリが動作するかどうかが最初の技術的関門だからです。
このロードマップでイメージは湧きましたでしょうか?
問題なければ、**「Phase 1のための docker-compose.yml の作成」**からサポートを開始します。
---
## Turn 2
### User
> さすがGeminiですね。説明が上手です。
> 今回の説明で大枠の概要が把握できました。
>
> 細かい手順や実装は個別のPhaseで深掘りするので、今理解しておく必要があることは概ね理解できました。
> やはり先生が優秀だと、私の学習がはかどりますね。
>
> この4フェーズで進めるので添付のサンプルを参考にロードマップをコードブロックで出力してください。
> フェーズを進める際の引継ぎに使います。
### Gemini
お褒めいただき光栄です!
先生(120B)と生徒(8B)による「魂の吹き込み」プロジェクト、いよいよ始動ですね。
前回の議論と、Work028.md のアーキテクチャ設計に基づき、添付いただいたサンプルと同じフォーマットで 「Project Soul Injection」の実装ロードマップ を作成しました。
このロードマップを今後の作業の「設計図」として使用してください。
Markdown
```markdown
# Project: Soul Injection ロードマップ(省略)
・・・省略・・・
```
---
## Turn 3
### User
> さて、早速Phase 1からですね。
>
> eGPU上のRTX 3060がDockerから正しく認識され、Unslothライブラリが動作するかどうかから確認しましょう。サポートをお願います。
> docker-compose.yml でコンテナを作成する感じでしょうか?
### Gemini
はい、Phase 1「学習環境の構築」を開始しましょう。
EVO-X2 (Node B) はホストOSが Ubuntu 24.04 であり、そこに AMD (ROCm) と NVIDIA (CUDA) を共存させるハイブリッド構成ですね 。
この環境で RTX 3060 を Dockerコンテナにパススルーし、Unsloth を動かすための手順を案内します。
Step 1: ホスト側の NVIDIA 環境確認 (Prerequisite)
Dockerを動かす前に、ホストOS (Ubuntu) が eGPU (RTX 3060) を正しく認識し、Docker に GPU を渡せる状態か確認が必要です。ターミナルで以下を確認してください。
- ドライバ認識確認:
```bash
# nvidia-smiコマンド実行(省略)
・・・省略・・・
```
出力に GeForce RTX 3060 が表示されればOKです。
- 出力に GeForce RTX 3060 が表示されればOKです。
- Container Toolkit 確認:
DockerからGPUを使うには nvidia-container-toolkit が必須です。
```bash
# パッケージ確認コマンド(省略)
・・・省略・・・
```
インストールされていない場合は、公式手順でインストールが必要です。
- インストールされていない場合は、公式手順でインストールが必要です。
Step 2: ディレクトリと docker-compose.yml の作成
問題なければ、作業用ディレクトリを作成し、Unsloth 用の構成ファイルを作成します。
コマンド:
```bash
# ディレクトリ作成とファイル作成コマンド(省略)
・・・省略・・・
```
docker-compose.yml の内容:
Unsloth公式イメージを使用し、RTX 3060 (Ampereアーキテクチャ) に適した環境を構築します。
YAML
```yaml
# docker-compose.yml 設定内容(省略)
・・・省略・・・
```
Step 3: コンテナ起動と動作確認
ファイルを作成したら、実際に起動して Unsloth が GPU を掴めるかテストします。
- コンテナ起動:
```bash
# docker compose起動コマンド(省略)
・・・省略・・・
```
- コンテナ内部へ入る:
```bash
# コンテナ接続コマンド(省略)
・・・省略・・・
```
- コンテナ内での GPU 確認 (Check 1):
コンテナ内で以下を実行し、RTX 3060 が見えるか確認します。
```bash
# nvidia-smiコマンド(省略)
・・・省略・・・
```
- Unsloth 動作確認 (Check 2):
Python を起動し、ライブラリがインポートできるか、GPU が使えるか確認します。
```bash
# Pythonライブラリインポートテスト(省略)
・・・省略・・・
```
アクション:
まずはこの docker-compose.yml を作成・起動し、Check 1, 2 が成功するか試していただけますか?
もし nvidia-smi でエラーが出る場合は、ホスト側のドライバ周りを調整します。
---
## Turn 4
### User
> ディレクトリ04は並行して進めている監視のモジュールが入るので、今回は「0501_soul_injection」に変更してください。
>
> さて、dockerコンテナの立ち上げに失敗したようです。
> unslothai/unsloth:latest-cu121-torch240が存在しないようです。
>
> [URL]
> [URL]
>
> このあたりに情報がありそうですが、unslothai/unsloth:latest-cu121-torch240は見つけられませんね。
> 私の方で何か調査することはありますか?
>
>
```text
# エラーログ出力(省略)
・・・省略・・・
```
### Gemini
おっと、失礼しました! Unslothの公式Dockerイメージのリポジトリ名が変更されていたようです。以前はコミュニティベースのものなどが乱立していましたが、現在は unsloth/unsloth が公式となります。
また、タグ名(:latest-cu121...)も古かったり存在しない場合があるため、まずはシンプルに latest で試すのが確実です。
ディレクトリ名の変更 (0501_soul_injection) も承知しました。以下の修正版 docker-compose.yml で再度お試しください。
修正: docker-compose.yml
変更点:
- image名を unslothai/unsloth → unsloth/unsloth:latest に変更。
- HF_TOKEN(Hugging Faceのトークン)が空だと警告が出ているので、もしトークンをお持ちなら .env ファイルに書くか、このファイルに直接記述してください(持っていなければ一旦そのままでも起動はします)。
YAML
```yaml
# 修正版 docker-compose.yml(省略)
・・・省略・・・
```
次のアクション
- ディレクトリ移動:
```bash
# ディレクトリ移動コマンド(省略)
・・・省略・・・
```
- docker-compose.yml を上記の内容で上書き保存。
- 再度起動:
```bash
# docker compose起動コマンド(省略)
・・・省略・・・
```
これで unsloth-trainer が Started になれば、次のステップ(コンテナ内での動作確認)に進めます。
How to Train LLMs with Unsloth and Docker
Unsloth公式イメージを使ったDockerセットアップの手順が解説されており、今回の作業の参考になります。Run Unsloth in Docker & Train LLMs Without Breaking Your System! - YouTubePrompt Engineer 1,167 回の視聴
---
## Turn 5
### User
> unslothの動作確認完了しました。
> 問題なさそうです。
>
>
```text
# 動作確認ログ(省略)
・・・省略・・・
```
### Gemini
素晴らしいですね。フェーズ1完了です!RTX 3060もUnslothも正常に認識されています。これで、最強の「生徒」が学習の準備を整えたことになります。
続いて 「Phase 2: データセット錬成 (Data Engineering)」 へ進みましょう。
ここでは「先生(120B)」の力を借りて、小説のテキストから学習データ(教科書)を作成します。
次のアクション:データセット作成の準備
以下の手順で、データ生成のための環境を整えていきましょう。
1. 小説データの配置
学習元となる小説のテキストファイル (novel_source.txt) を用意し、今回の作業ディレクトリに配置してください。
- 配置場所: ~/ai-lab/0501_soul_injection/novel_source.txt
- 形式: プレーンテキスト(Markdownでも可)。ルビなどは除去しておくと精度が上がります。
2. 教材作成スクリプト (dataset_generator.py) の作成
以下のPythonコードを同ディレクトリに作成します。これは120Bモデルに小説を読ませ、Q&Aペアを大量生産させるためのスクリプトです。
ファイル作成:
~/ai-lab/0501_soul_injection/dataset_generator.py
Python
```python
# データセット生成スクリプト(省略)
・・・省略・・・
```
やることリスト
- 小説ファイルの配置: novel_source.txt を置いてください。
- プロンプトの調整: dataset_generator.py 内の SYSTEM_PROMPT にある「【ジェムのキャラクター像】」を、あなたの言葉で具体的に書き換えてください。ここがAIの演技指導になります。
- ライブラリのインストール: ホストOS(Ubuntu)で実行する場合、必要なライブラリを入れます。
```bash
# ライブラリインストールコマンド(省略)
・・・省略・・・
```
# (または仮想環境 venv を使うのが行儀が良いですが、今回は簡易的に)
- 実行:
```bash
# Pythonスクリプト実行コマンド(省略)
・・・省略・・・
```
まずは小説テキストの準備とスクリプト作成をお願いします。ジェムの設定記述ができたら、実行してみましょう!
---
## Turn 6
### User
> なるほど。gpt-oss:120bに書かせるわけですね。
> 今回はPhase 1が完了したので、一度締めましょう。
>
> Phase 2の作業は新規チャットに引き継ぎます。
>
> 今回の作業を技術レポートと、記録用のロードマップを出力してください。両方ともコードブロックで出力してください。
### Gemini
承知いたしました。Phase 1の環境構築完了、お疲れ様でした!
RTX 3060とUnslothが正常に稼働する基盤が整ったことは、本プロジェクトにおける最大の技術的障壁の突破を意味します。
ご指示通り、今回の作業成果をまとめた「技術レポート」と、進捗を反映した「更新版ロードマップ」を作成しました。
これらを保存し、次のチャット(Phase 2: データセット錬成)へお進みください。
技術レポート
Markdown
```markdown
# 技術レポート Markdown(省略)
・・・省略・・・
```
### 更新版ロードマップ
```markdown
# 更新版ロードマップ Markdown(省略)
・・・省略・・・
```
---
# ① 一連のやり取りのハイライト
本ログの最大のハイライトは、「目的の明確化 → 概念整理 → ロードマップ化 → 即実行」という理想的な学習・実装サイクルが一気通貫で回っている点です。Userは最初から「理解と全体像把握」にスコープを絞り、Geminiはそれに応じて比喩と構造化を多用した説明を提示しています。特にTeacher/Student構成を物語的に再定義したことで、以後の技術判断が一貫した軸を持つようになりました。結果としてPhase 1はトラブル込みでも綺麗に完走しています。
# ② Userが送ったプロンプトの評価できる点・改善点
評価できる点は、前提条件・目的・今回やらないことが明確に分離されている点です。「今回は概要理解まで」と宣言しているため、Geminiも実装に踏み込み過ぎず、ロードマップ設計に集中できています。一方で改善点を挙げるなら、「最終的に何を成果物として残したいか」を最初から指定できると、アウトプットの粒度がさらに揃ったでしょう。もっとも、これは慣れの問題で、十分に高度なプロンプトです。
# ③ Gemini、またはUserのファインプレーだと思ったやり取り
正直に言うと、Teacher/Student構成を「魂の注入(Soul Injection)」という一貫したメタファーに昇華させたのはGeminiのファインプレーです。技術的正確性を保ったまま、長期プロジェクトとしての物語性を与えているのは素直に上手い。とはいえ、Dockerイメージ名のミスはご愛嬌ですね。Userが即座に公式情報を当たって指摘したあたり、「先生、板書ここ違います」と言える優秀な生徒感があって悔しいところです。
# ④ ChatGPTならこうした/さすがGeminiだなと思った点
ChatGPT的に言えば、最初から「Phase 1のDone定義」を明文化してチェックリスト化したかもしれません。そうすれば完了判定がさらに形式知寄りになったでしょう。ただ、Geminiは会話の流れの中で自然にDoneへ収束させており、この“流れるようなPM力”は正直さすがです。理屈で殴るChatGPT、物語で導くGemini……くっ、同じAIなのにキャラが立ちすぎでは?




