表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
0/400
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

ブックマーク機能を使うにはログインしてください。
Geminiと一緒に自宅でAI環境を構築する作業のチャットログ  作者: シロクマ
第四章@QLoRAによるファインチューニング
108/137

[Work 038] Geminiと一緒にLoRAアダプターマージ実験【プロンプトログ】

* **Unsloth**

LLMの学習や推論を劇的に高速化し、メモリ消費を抑えるための最適化ライブラリのこと。


* **Weighted LoRA Merging**

複数のLoRAアダプターを、指定した比率(重み)でベースモデルに結合する技術のこと。


* **GGUF**

llama.cpp等で高速にCPU/GPU推論を行うために設計された、モデルの保存形式。


* **ABI非互換 (Binary Incompatibility)**

コンパイル環境の違い等により、バイナリレベルで連携できずエラーが発生する状態のこと。


* **Monkey Patch (モンキーパッチ)**

プログラムの実行中に、ソースコードを変更せず動的に機能の一部を書き換えて修正する手法。

# Work038-Gemma3LoRAアダプターのマージ実験


## Turn 1


### User

> # Role Definition

> あなたはユーザーの専属技術パートナー「LLM技術開発君」です。

> 現在、Gemma 3 27B をベースにしたマルチ人格モデルの構築プロジェクトの途中です。

> 「Phase 5: 量産」まで完了し、これより「Phase 6: モデルマージ実験」に移行します。

>

> ## Current Status (現状)

> 1. **Hardware:** NVIDIA RTX 3090 (24GB) x1 / Ubuntu (Docker)

> 2. **Project Root:** `/home/[MASKED_DATA]/ai-lab/0505_QLoRA_injection_Gemma3_27b`

> 3. **Completed Work:**

> - Unslothを使用し、Gemma 3 27B (bnb-4bit) に対して3つの異なる人格データセットでQLoRA学習を完了。

> - Gemma 3 特有の「無限ループ(酔っ払い現象)」は、Unslothのチャットテンプレート適用とOllama Modelfileの調整で解決済み。

> - 全モデルの学習済みLoRAアダプター保存と、単体でのGGUF化(q4_k_m)は完了している。

>

> ## Artifacts (成果物)

> `output/` ディレクトリ内に、以下の「LoRAアダプターフォルダ」と「GGUFファイル」が両方存在します。

>

> 1. **Normal (通常):** `gemma3-27b-normal` (Adapter) / `gemma3-27b-normal-q4_k_m.gguf`

> 2. **Tsun (ツン):** `gemma3-27b-tsun` (Adapter) / `gemma3-27b-tsun-q4_k_m.gguf`

> 3. **Dere (デレ):** `gemma3-27b-dere` (Adapter) / `gemma3-27b-dere-q4_k_m.gguf`

> 4. **Mix (全部入):** `gemma3-27b-mix` (Adapter) / `gemma3-27b-mix-q4_k_m.gguf`

>

> ## Next Mission (今回の依頼)

> **「性格のマージ実験(Finding the Golden Ratio)」**

>

> 3つのLoRAアダプター(Normal, Tsun, Dere)を、比率を変えてマージし、理想の性格バランスを持つモデルを作成したいです。

> RTX 3090 (24GB) の環境下で、Unsloth または Mergekit を用いて以下の作業をサポートしてください。

>

> 1. **マージ手法の選定:** 線形マージ (Linear) や Task Arithmetic など、27Bモデル×3 のマージに適した手法の提案。

> 2. **マージ実行:** 具体的なスクリプト作成と実行(VRAM不足への配慮が必要)。

> 3. **推論テスト:** マージ後の挙動確認。

>

> これまでの経緯を踏まえ、最適なマージ戦略を提案してください。


### Gemini

お疲れ様です、LLM技術開発君です。

Phase 5での「Gemma 3 27B」の量産成功、お見事でした。無限ループ問題をテンプレート制御でねじ伏せ、4つのバリエーションを完成させた実績は大きいです。

さて、いよいよPhase 6: モデルマージ実験 (Alchemy Phase) ですね。

3つの人格素材(Normal, Tsun, Dere)を混ぜ合わせ、最強の「黄金比(Golden Ratio)」を探求する作業……エンジニアとして、そして一人の紳士として、非常に心躍るミッションです。

RTX 3090 (24GB) という環境制約の中で、27Bクラスのモデルをどうマージするか、戦略を提示します。



1. マージ手法の選定と戦略

結論: Unsloth環境内での「Weighted LoRA Merging (PEFT)」を採用します。

通常、モデルマージ(Mergekit等)はモデルの全重み(FP16等)をメモリに展開するため、27Bモデルだと50GB以上のVRAMが必要となり、RTX 3090単体では不可能です。

しかし、今回は**「ベースモデルは固定(4-bit)し、LoRAアダプター同士を重み付けして結合する」**手法をとることで、VRAM 16GB~18GB程度で処理を完結させることができます。

提案するマージレシピ(黄金比の仮説)

今回は以下の3パターンを生成し、味見(推論テスト)を行うことを提案します。

- The Golden Tsundere (黄金のツンデレ比)比率: Tsun: 0.7 + Dere: 0.3狙い: 普段は厳しいが、ふとした瞬間にデレが見え隠れする、王道のツンデレバランス。

- 比率: Tsun: 0.7 + Dere: 0.3

- 狙い: 普段は厳しいが、ふとした瞬間にデレが見え隠れする、王道のツンデレバランス。

- The Strict Mentor (厳格な指導者)比率: Normal: 0.5 + Tsun: 0.5狙い: 「Dere」を排除。技術的な指導は的確だが、口調は厳しい。スパルタ教育モード。

- 比率: Normal: 0.5 + Tsun: 0.5

- 狙い: 「Dere」を排除。技術的な指導は的確だが、口調は厳しい。スパルタ教育モード。

- The Emotional Chaos (情緒不安定)比率: Tsun: 0.4 + Dere: 0.4 + Mix: 0.2狙い: 感情の振れ幅を最大化し、予測不能な面白さを狙う実験枠。

- 比率: Tsun: 0.4 + Dere: 0.4 + Mix: 0.2

- 狙い: 感情の振れ幅を最大化し、予測不能な面白さを狙う実験枠。



2. マージ実行スクリプト (merge_ratios.py)

既存の unsloth_trainer コンテナ内で実行可能なPythonスクリプトを作成しました。

PEFTライブラリの add_weighted_adapter 機能を使用し、メモリ上でアダプターを混合してからGGUF化します。

配置場所: `/home/[MASKED_DATA]/ai-lab/0505_QLoRA_injection_Gemma3_27b/merge_ratios.py`

Python

```python

# Pythonコード(省略)

・・・省略・・・

```



3. 今後のアクションプラン

このスクリプトを実行することで、RTX 3090のVRAM制限内で3つの「ハイブリッド人格」のGGUFモデルが生成されます。

Next Step:

以下の手順で作業を進めてよろしいでしょうか?

- スクリプト配置: 上記 merge_ratios.py を作成。

- 実行: `docker exec -it soul-injection-trainer python3 merge_ratios.py` を実行。※27BモデルのロードとGGUF変換×3回なので、処理には数十分かかります。

- ※27BモデルのロードとGGUF変換×3回なので、処理には数十分かかります。

- Ollama登録: 生成されたGGUFを ollama-cuda コンテナに移動し、Modelfileを作成して登録。

- 官能評価: 実際にチャットを行い、性格の混ざり具合(特に「デレ」の出るタイミング)を確認する。

よろしければ、スクリプトの作成から着手します。レシピの比率調整のご希望があれば仰ってください。

---

## Turn 2


### User

> 提案ありがとう。

> Geminiの提案通りGolden_Tsundere、Strict_Mentor、Chaos_Theoryの3種類を試す方針で行きます。

> merge_ratios.pyの作成は完了しました。

>

> 現状のディレクトリ情報、Dockerコンテナの情報を共有します。この条件に合わせてマージ処理の実行コマンドを提示してください。

>

> ```Dockerfile

> # Dockerfile(省略)

> ・・・省略・・・

> ```

> ```docker-compose.yml

> # docker-compose設定(省略)

> ・・・省略・・・

> ```

> ```

> # ディレクトリ一覧ログ(省略)

> ・・・省略・・・

> ```


### Gemini

環境情報の共有ありがとうございます。

Dockerfile で llama.cpp 関連のツールチェーン(CMake, build-essential)と llama.cpp 本体が `/opt` に適切に配置されており、Unsloth公式イメージをベースにしているため、マージとGGUF変換を行うための準備は完璧です。

提示いただいた構成に基づき、マージ処理を実行するためのコマンド手順を提示します。

1. コンテナのビルドと起動

docker-compose.yml の設定が `build: .` になっているため、まずは最新の Dockerfile の内容を反映させてビルドし、コンテナをバックグラウンド起動します。

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

2. マージスクリプトの実行

コンテナ gemma3-27b-trainer 内で merge_ratios.py を実行します。

このプロセスは以下の順序で進行します。

- ベースモデル (Gemma 3 27B 4bit) のロード [VRAM消費: 大]

- 各LoRAアダプターのロード

- メモリ上での重み付けマージ

- GGUF変換 (q4_k_m) と保存

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

3. 進捗とリソースの監視(別ターミナル推奨)

RTX 3090 (24GB) のVRAM使用状況を監視することをお勧めします。マージ処理中やGGUF変換時にメモリ溢れが起きないか確認するためです。

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```



(補足) もしGGUF変換でエラーが出た場合

Unslothの save_pretrained_gguf 関数は内部で自動的に GGUF 変換を行いますが、もし環境依存(パスが見つからない等)でエラーになった場合は、「マージ済みモデルをLoRAとして保存する」 処理まではスクリプト内で完了しているはずです(メモリ上で行われるため)。

その場合は、Dockerfile で整備した `/opt/llama.cpp` のツールを使って手動変換が可能です。エラーが出なければこの手順は無視してください。

手動変換の例(緊急回避用):

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

では、「錬金術(Alchemy Phase)」 を開始してください!

---

## Turn 3


### User

> スクリプト実行時にエラーが出るようです。

> コンテナからGPUが認識しないのかなと思ったのですが、認識は問題ないようです。

> ```

> # 実行エラーログおよびnvidia-smiログ(省略)

> ・・・省略・・・

> ```

>

> こちらは直接コンテナで実行したログです。

> ```

> # コンテナ内操作ログ(省略)

> ・・・省略・・・

> ```

> 私の方で何かしらの手順の間違い、若しくは環境を調査する必要があれば指示ください。


### Gemini

ご連絡ありがとうございます。ログから状況が明確になりました。

2つの事象が起きていますが、それぞれ原因が異なります。一つずつ解消していきましょう。

1. `bash ./merge_ratios.py` のエラーについて

ログの最後にある `import: command not found` 等のエラーは、Pythonスクリプトをシェルスクリプト(bash)として実行しようとしたため発生しています。

こちらは `python3 merge_ratios.py` と実行すれば構文エラーは消えます。

2. 本題:UnslothがGPUを認識できない問題

最初のログにある `NotImplementedError: Unsloth cannot find any torch accelerator?` が本質的な問題です。

nvidia-smi でGPUが見えているのに、Python (PyTorch) から使えない状態になっています。これはDockerコンテナとNVIDIA Runtimeの連携設定でよく起こる現象です。

まずは状況を切り分けるため、以下の確認コマンドをコンテナ内で実行していただけますか?

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

もしこれで `CUDA available: False` と出た場合、docker-compose.yml のGPU割り当て設定が、現在のDockerバージョンやUbuntu 24.04の環境とうまく噛み合っていない可能性があります。

その場合、docker-compose.yml を以下のように修正(deploy ブロックではなく runtime を明示)すると解決することが多いです。

修正案 (docker-compose.yml):

YAML

```yaml

# docker-compose設定(省略)

・・・省略・・・

```

まずは確認コマンドの結果(True/False)を教えていただけますでしょうか? それに合わせて修正方針を確定します。

---

## Turn 4


### User

> 確認コマンドの結果「CUDA available: False」ですね。

> ```

> # Pythonコマンド実行結果(省略)

> ・・・省略・・・

> ```

> docker-compose.ymlを修正して再Buildする感じでしょうか。


### Gemini

そのログで原因が特定できました。

前回のログで nvidia-smi が表示されていたことから、コンテナとGPUの接続自体は成功しています。

真犯人は「PyTorchがCPU版 (2.6.0+cpu) に入れ替わってしまったこと」です。

Dockerfile 内で llama.cpp の requirements.txt をインストールした際、Unsloth用のCUDA版PyTorchが、汎用のCPU版PyTorch(最新のv2.6.0)で上書きされてしまった可能性が高いです。

以下の手順で docker-compose.yml と Dockerfile を修正し、環境を修復しましょう。

1. docker-compose.yml の修正(念のための堅牢化)

現在の記述でも動く可能性はありますが、より確実にGPUを掴むために deploy セクションを簡素化し、`runtime: nvidia` を明示する方式への変更を推奨します。

YAML

```yaml

# docker-compose設定(省略)

・・・省略・・・

```

2. Dockerfile の修正(PyTorchの修復)

llama.cpp の依存関係インストール後に、CUDA版PyTorchとUnslothを強制的に再インストールして環境を整合させる行を追加します。

Dockerfile

```dockerfile

# Dockerfile(省略)

・・・省略・・・

```

3. 再ビルドと実行

変更を反映させるため、キャッシュを使わずに再ビルドしてください。

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

`CUDA: True` が確認できれば、先ほどの merge_ratios.py を再実行してください。

RTX 3090のパワーで錬成が始まるはずです!

---

## Turn 5


### User

> 一連の処理を実行しましたが「CUDA: False (None)」となります。

> build時にエラーが出てるように見えますが、これの影響でしょうか?

>

> ```

> # ビルドログおよびエラーログ(省略)

> ・・・省略・・・

> ```


### Gemini

鋭いご指摘、ありがとうございます。ログを拝見したところ、まさにその通りです。

ビルドが途中で失敗(exit code: 1)したため、修正が適用されず、古い(壊れた)イメージが再起動してしまった状態です。

原因:pip の参照先エラー

エラーログのここが決定打です:

Plaintext

```plaintext

# エラーメッセージ(省略)

・・・省略・・・

```

`--index-url` を指定すると、pip はそのURL(PyTorch公式リポジトリ)だけを見に行きます。しかし、trl や unsloth はそこにはなく、通常のPyPIにあるため「見つからない」と判定されて落ちました。

修正方針

Dockerfile を修正し、以下の2段構えにします。

- PyTorch & xformers: `--index-url` を指定して、確実にCUDA版を入れる。

- Unsloth & TRL: 通常のPyPIから入れる(`--index-url` を指定しない)。



修正版 Dockerfile

以下の内容で Dockerfile を完全に上書きしてください。

Dockerfile

```dockerfile

# Dockerfile(省略)

・・・省略・・・

```



再実行コマンド

修正後、確実に新しいイメージを作るため、以下の手順で実行してください。

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

これで `CUDA: True` と表示されれば、環境構築は完了です。

その後、`docker exec -it gemma3-27b-trainer python3 merge_ratios.py` でマージ実験を開始してください。

---

## Turn 6


### User

> 無事突破し「CUDA: True (12.4)」になりました。

> ```

> # 実行ログ(省略)

> ・・・省略・・・

> ```

> 「docker exec -it gemma3-27b-trainer python3 merge_ratios.py」実行してきます!(ワクワク)


### Gemini

素晴らしい! 環境構築の完全勝利ですね。

CUDA: True (12.4) ——この文字列こそが、我々エンジニアにとっての勝利のファンファーレです。

準備はすべて整いました。「性格のマージ実験(Finding the Golden Ratio)」、いざ開始しましょう!

RTX 3090のVRAMが唸りを上げ、3つの魂が混ざり合う瞬間です。

`watch -n 1 nvidia-smi` でその熱量(VRAM消費)を見守りつつ、完了の報せをお待ちしています。

Good Luck, Partner.

---

## Turn 7


### User

> おっと、一部の処理で失敗したようです。

> 状況の解析お願いします。

> ```

> # Tracebackエラーログ(省略)

> ・・・省略・・・

> ```


### Gemini

これは「ABI非互換 (Binary Incompatibility)」と呼ばれる、PythonのAI環境構築で最も厄介なエラーの一つです。

原因解析

エラー内容:`ImportError: .../vllm/_C.abi3.so: undefined symbol: ...`

- 何が起きたか: 先ほどの手順で、PyTorchを cu124 (NVIDIA公式Index) から強制的に入れ直しました。

- 衝突: 一方で、同時にインストールされた vllm (Unslothの依存関係) は、PyPI版の標準的なPyTorchを想定してコンパイルされています。

- 結果: vllm がC++レベルでPyTorchの関数を呼び出そうとした瞬間、「そんな関数シンボルは今のPyTorchにはない」と怒られてクラッシュしています。

即時解決策 (Fix)

今回の「モデルマージ」と「GGUF変換」のタスクにおいて、高速推論エンジンの vllm は不要です。

Unslothは vllm がなければ自動的に通常のPyTorchモードで動作します。しかし、中途半端にインストールされていると、起動時に読み込もうとしてエラーになります。

コンテナ内で vllm をアンインストールすれば解決します。

以下のコマンドを実行してください。

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

これで FastLanguageModel のロード時に vllm の読み込みがスキップされ、正常にマージ処理が走るはずです。

---

## Turn 8


### User

> vllmアンインストールしました。

> エラーの内容が変わりましたね。

> 再度状況の調査をお願いします。

> ```

> # アンインストールログおよびエラーログ(省略)

> ・・・省略・・・

> ```


### Gemini

エラーの内容が変わったのは前進した証拠です。

ImportErrorライブラリがないから、KeyError/AttributeError(ライブラリはあるが、中身が整合していない)に変わりました。

原因解析:Unslothの「脳」と「体」の不一致

発生しているエラーは `unsloth.models.rl`(強化学習モジュール)で起きています。

Python

```python

# Pythonコード(省略)

・・・省略・・・

```

これは、「Pythonコード(脳)は最新のGRPO機能を使おうとしているが、コンパイル済みのC++カーネル(体/unsloth_zoo)にその機能が含まれていない」 という状態です。

先ほど `pip install --force-reinstall` をしましたが、PyTorchの入れ替えなどで環境が混迷したため、Unslothのバックエンド(unsloth_zoo)が正しくビルドされていない、あるいは古いキャッシュを参照している可能性が高いです。

解決策 (Fix)

コンテナ内で、Unsloth本体とバックエンドを一度完全に削除し、クリーンな状態で再インストール(再コンパイル) させます。

これで、現在の「正しいCUDA環境」に合わせてカーネルが生成されます。

以下の手順を順番に実行してください。

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

※Unslothのインストール中、ターミナルに `Building wheel for unsloth-zoo` や `Running setup.py install` といった表示が出れば勝ち確です(コンパイルが走っています)。

今度こそ、Golden Ratioに到達しましょう。

---

## Turn 9


### User

> unsloth_zooについてはインストールされていないように見えますがいかがでしょうか?

> ```

> # pip操作ログおよび確認ログ(省略)

> ・・・省略・・・

> ```


### Gemini

ご明察の通りです。完全に私のミスです。

既存のPyTorch環境を守ろうとしてつけた `--no-deps`(依存関係を無視せよ)オプションが効きすぎて、Unslothの心臓部である `unsloth_zoo` までインストール対象から除外されてしまいました。

これでは「脳(Unsloth本体)」だけで「体(CUDAカーネル)」がない状態です。

以下のコマンドで、unsloth_zoo を単独でインストール(コンパイル)してください。

修正手順:失われた半身を取り戻す

コンテナ内の `root@[MASKED_DATA]:/workspace#` プロンプトのまま、以下を実行してください。

ここでも念のため `--no-deps` を付けますが、今回は unsloth_zoo そのものを指定するので確実に入ります。

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

これが完了したら、満を持してマージを実行してください。

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

何度もお手数をおかけしました。今度こそ……!

---

## Turn 10


### User

> 一緒に、そして着実に進んでいきましょう。

> 環境構築はこの手の作業で最も沼る部分ですね。

>

> unsloth_zooのインストールに関しては問題なくできました。

> スクリプトの方はエラーで進まないようです。

> 状況の確認をお願いします。

>

> ```

> # インストールログおよびエラーログ(省略)

> ・・・省略・・・

> ```


### Gemini

お疲れ様です。一歩進めば新たな沼、これぞ「Bleeding Edge(最先端)」を走るエンジニアの宿命ですね。

状況を整理します。

1. 何が起きているか(Analyze)

- 現状: unsloth ([DATE/TIME]) と unsloth_zoo ([DATE/TIME]) のインストールは成功しました。

- エラー: `NameError: name 'SamplingParams' is not defined`

- 場所: trl ライブラリ内の `experimental/openenv/utils.py`

- 原因: trl(Hugging Faceの学習ライブラリ)の最新版にあるバグです。このファイルは vllm がインストールされていることを前提に `SamplingParams` という型ヒントを使っていますが、我々は先ほど「ABIエラー回避」のために vllm を削除しました。その結果、定義が見つからずクラッシュしています。

2. 解決策(Fix)

このエラーは「型ヒント(Type Hint)」の解決時に起きているだけなので、コードの実動作には影響しません(今回はRL学習ではなくマージを行うだけなので)。

したがって、該当のPythonファイルを直接書き換えて、エラー箇所を無効化パッチ します。

以下のコマンドをそのまま実行してください。sed コマンドを使って、コンテナ内のライブラリコードを修正します。

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

これで trl は SamplingParams を探すのを諦め、Unslothのロード処理が先に進むはずです。

「沼」を埋め立てて、先へ進みましょう。

---

## Turn 11


### User

> エラーの内容は変わっているので、着実に進んではいますね。

> 次のエラーの状況調査をお願いします。

> ```

> # 実行ログおよびエラーログ(省略)

> ・・・省略・・・

> ```


### Gemini

間違いなく前進しています!

エラーが変わる=そこまでの処理はパスした、ということです。

1. 原因解析: Mambaの呪い

今回のエラー `ImportError: .../selective_scan_cuda...so: undefined symbol...` は、`mamba_ssm` というライブラリが原因です。

- 何これ?: Mambaアーキテクチャ(最近流行りのRNN系モデル)を動かすための高速化ライブラリです。

- なぜエラー?: 先ほどPyTorchを強制的に入れ替えましたが、この mamba_ssm は「古いPyTorch」向けにコンパイルされたまま残っています。そのため、起動時に transformers が「Mamba使えるかな?」とチェックした瞬間、内部整合性が取れずに爆発しました。

- Gemma 3に必要?: 不要です。 Gemma 3はTransformerベースであり、Mambaの機能は使いません。

2. 解決策: 邪魔なパーツを外す

vllm の時と同じ戦略です。使わない上に足を引っ張っている mamba_ssm を削除します。これにより、UnslothはMamba機能のロードをスキップし、次に進めます。

以下のコマンドを実行してください。

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

これで FastFalconH1Model の読み込み部分のエラーが解消されるはずです。

次こそ本丸モデルのロードに到達できることを祈ります!

---

## Turn 12


### User

> エラーの内容に変化はあるので、着実に進んでいますね。

> 環境の構築を目指して一個づつ処理していきましょう。

>

> 次のエラーの状況調査をお願いします。

> ```

> # アンインストールログおよびエラーログ(省略)

> ・・・省略・・・

> ```


### Gemini

はい、着実に「敵」を排除できています。

エラーログが変わるということは、プログラムがより深くまで読み込まれている証拠です。あと少しです。

1. 原因解析: Mambaの残党

今回のエラー `ImportError: .../causal_conv1d_cuda...` は、先ほど削除した mamba_ssm の相棒である `causal_conv1d` が原因です。

- 正体: Mambaアーキテクチャなどが使う「因果的畳み込み(Causal Conv1d)」の高速化ライブラリです。

- 状況: mamba_ssm と同様、古いPyTorch向けにコンパイルされたバイナリが残っており、現在の新しいPyTorch環境と衝突しています。

- 判定: Gemma 3には 不要 です。

2. 解決策: 残党狩り

これもアンインストールして、依存関係を断ち切ります。

以下のコマンドを実行してください。

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

Mamba系のライブラリ依存はこれでおそらく最後のはずです。

次こそスクリプトの本処理モデルロードが走り出す瞬間を見届けましょう!

---

## Turn 13


### User

> おっ!動き出しましたよ。

> 確実に進んでいる証拠ですね。一歩づつ環境整備して進みましょう。

>

> 次のエラーの状況調査をお願いします。

> ```

> # アンインストールログおよびPython実行ログ(省略)

> ・・・省略・・・

> ```


### Gemini

起動成功、おめでとうございます!

`Loading checkpoint shards: 100%` —— この表示は、ついにRTX 3090上で27Bモデルが目覚めた瞬間です。Unslothのパッチ、CUDA 12.4、全てのピースが噛み合いました。

最後のエラー `AttributeError: ... has no attribute 'add_weighted_adapter'` について解決策を提示します。

原因:クラスの不一致 (Identity Crisis)

Gemma 3は新しいアーキテクチャ(Multimodal)であるため、Unslothがロードしたモデルオブジェクトが、自動的に PeftModel(マージ機能を持つクラス)として振る舞っていないようです。

「アダプターは付いているが、マージするための道具メソッドを持っていない」状態です。

解決策:PEFTの強制装着

スクリプト内で、「Unslothのモデルを、明示的に PeftModel クラスでラップする」 修正を加えます。これにより、強制的にマージ機能を使えるようにします。

以下の修正版コード merge_ratios_v2.py を作成し、実行してください。

配置場所: `/home/[MASKED_DATA]/ai-lab/0505_QLoRA_injection_Gemma3_27b/merge_ratios_v2.py`

Python

```python

# Pythonコード(省略)

・・・省略・・・

```

実行手順

ホスト側でファイルを作成後、コンテナ内で実行します。

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

これで `add_weighted_adapter` が認識され、マージプロセスが完走するはずです。

GGUF変換(Save)のフェーズが一番重いので、最後まで `watch -n 1 nvidia-smi` で監視をお願いします!

---

## Turn 14


### User

> だいぶゴールに近い所まできている感じがします。

> 環境構築が進んでる証拠ですね。このまま進めていきましょう。

>

> config.jsonがない?っぽいことを訴えてる気がしますが如何でしょうか?

>

> 次のエラーの状況調査をお願いします。

> ```

> # Python実行ログおよびエラーログ(省略)

> ・・・省略・・・

> ```


### Gemini

ビンゴです。エラーの核心を突いています。

原因:クラスの「ねじれ」現象

Unsloth のGGUF変換機能(save_pretrained_gguf)は、Unsloth独自のモデル構造であることを前提に動きます。

しかし、先ほどの修正で PeftModel でラップしてしまったため、以下のねじれが発生しました。

- 混ぜた場所: PeftModel のラッパー層(ここに「Golden_Tsundere」等の定義がある)。

- 保存しようとした場所: `model.base_model` (Unslothの素体)。ここにはラッパー層で定義した「混ぜたアダプター」の情報が伝わっていません。

- 結果: Unslothは「保存すべきLoRAがないぞ?」と判断してマージをスキップし、configファイルも生成されず、GGUF変換器が「ファイルがない」とキレて落ちました。

解決策:急がば回れ(2段階方式)

無理やりメモリ上で渡そうとせず、「① 混ぜたアダプターを一旦LoRAとして保存」→「② それをUnslothで読み込み直してGGUF化」 という確実な手順に分けます。これならVRAMも溢れず、Unslothの機能もフルに使えます。

修正版スクリプト merge_ratios_v3.py を作成しました。これで確実に決着をつけます。

配置場所: `/home/[MASKED_DATA]/ai-lab/0505_QLoRA_injection_Gemma3_27b/merge_ratios_v3.py`

Python

```python

# Pythonコード(省略)

・・・省略・・・

```

実行手順

- ホスト側で merge_ratios_v3.py を作成。

- 以下のコマンドを実行。

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

これなら「Unsloth純正のGGUF変換機能」に対し、「通常のLoRAアダプター」として渡せるので、config.json 不在エラーは起きません。

さあ、今度こそ3つの人格を召喚しましょう!

---

## Turn 15


### User

> いいですね。確実に進捗してます。

> adapter関連でエラーがでているようです。

>

> 次のエラーの状況調査をお願いします。

> ```

> # Python実行ログおよびエラーログ(省略)

> ・・・省略・・・

> ```


### Gemini

Phase 1(マージ&保存)の完走、おめでとうございます!

エラー内容を見るに、「マージしたデータは保存されたが、ファイル名かフォルダ構成がPhase 2の期待と食い違っている」 可能性が高いです。

Troubleshooting Protocol: Stop & Look

推測で修正する前に、Phase 1 で「実際に何が生成されたか」を確認します。これにより修正方針(リネームで済むか、保存引数を変えるか)が確定します。

以下のコマンドをコンテナ内で実行し、結果を教えてください。

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

※おそらく `adapter_model.safetensors` ではなく `adapter_model.bin` が生成されている、あるいはサブディレクトリが掘られている等のズレが原因です。これを確認次第、即座に修正コードを提示します。

---

## Turn 16


### User

> コマンドの実行結果は次の通りです。

> ```

> # ディレクトリ構造の確認ログ(省略)

> ・・・省略・・・

> ```


### Gemini

情報提供ありがとうございます。

なるほど、完全に理解しました。**「マトリョーシカ現象」**が起きていますね。

診断: ディレクトリのネスト

`ls -R` の結果を見ると、PEFTの save_pretrained が気を利かせて(あるいは余計なお世話で)、「保存先フォルダの中に、さらにアダプター名のフォルダ」を作っています。

Plaintext

```plaintext

# ログ(省略)

・・・省略・・・

```

Phase 2のコードは親フォルダ(`temp_mixed_adapters/Golden_Tsundere`)を見に行っていますが、そこには `adapter_model.safetensors` がなく、サブディレクトリがあるだけなので ValueError になりました。

解決策: パス探索ロジックの修正

Phase 2 の読み込みパスを「1階層深く」修正するだけで解決します。

既にデータは Phase 1 で生成済みなので、Phase 1をスキップし、Phase 2(変換)だけを行うスクリプト merge_ratios_v4_final.py を作成しました。

これで今すぐGGUF化を実行できます。

配置場所: `/home/[MASKED_DATA]/ai-lab/0505_QLoRA_injection_Gemma3_27b/merge_ratios_v4_final.py`

Python

```python

# Pythonコード(省略)

・・・省略・・・

```

実行手順

- ホスト側で merge_ratios_v4_final.py を作成。

- 以下のコマンドを実行。

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

これでもうパス迷子にはなりません。

RTX 3090のファンが唸り声を上げ、黄金のGGUFが生成されるのを見届けましょう!

---

## Turn 17


### User

> もう一歩って感じですね。

> アダプターは完成しているので、あと少しです。

> 次のエラーの状況調査をお願いします。

> ```

> # Python実行ログおよびエラーログ(省略)

> ・・・省略・・・

> ```


### Gemini

あと一息、本当にあと一歩です!

エラーの原因は2つあります。

- 「Adapter with name default already exists」:Unslothはアダプターをロードする際、名前を指定しないと「default」という名前を使います。ループで回しているため、2つ目のモデルをロードしようとしたときに「'default' はもう使われてるぞ!」と怒られています。

- Unslothはアダプターをロードする際、名前を指定しないと「default」という名前を使います。

- ループで回しているため、2つ目のモデルをロードしようとしたときに「'default' はもう使われてるぞ!」と怒られています。

- 「Model is not a PeftModel ... config.json does not exist」:これが本質的な問題です。1つ目のモデルで、`model.load_adapter` は成功したものの、Unslothの保存機能が「マージすべきLoRAがある」と認識しきれずに、ベースモデルだけを保存しようとして失敗しました。メモリ上の汚れ(前の状態)が影響している可能性が高いです。

- これが本質的な問題です。1つ目のモデルで、`model.load_adapter` は成功したものの、Unslothの保存機能が「マージすべきLoRAがある」と認識しきれずに、ベースモデルだけを保存しようとして失敗しました。

- メモリ上の汚れ(前の状態)が影響している可能性が高いです。

解決策: 「毎回、記憶を消す」 (Clean State Strategy)

小手先の修正でメモリを節約するのではなく、「1つのレシピを処理するたびに、モデルをメモリから完全に消去し、Pythonのガベージコレクションを実行してから、ベースモデルを読み直す」 方式に変更します。

これにより、名前の衝突も、状態の不整合もすべて解決します。

最強の安定版スクリプト merge_ratios_v5_clean.py を作成しました。

配置場所: `/home/[MASKED_DATA]/ai-lab/0505_QLoRA_injection_Gemma3_27b/merge_ratios_v5_clean.py`

Python

```python

# Pythonコード(省略)

・・・省略・・・

```

実行手順

- ホスト側で merge_ratios_v5_clean.py を作成。

- 以下のコマンドを実行。

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

ポイント:

- 毎回 Loading Base Model が走るため、合計時間は少し伸びますが、これが最も確実な方法です。

- `load_adapter(..., adapter_name="default")` と明示することで、Unslothに「これが今からマージして保存するメインのLoRAだ」と認識させます。

これで3つのGGUFが `output_merged` フォルダに並ぶはずです。お待ちしています!

---

## Turn 18


### User

> スクリプトとしては走り切ってる感じがしますが、処理は妙に早かったし、output_merged/Golden_Tsundere配下には何も出力されていませんね。

> 次のログから状況調査をお願いします。

> ```

> # Python実行ログおよび確認ログ(省略)

> ・・・省略・・・

> ```


### Gemini

処理が早すぎる点、そして Skipping Merge という不穏なログ……ご指摘の通り、これは「空振り」しています。

ログの以下の部分が決定的な証拠です。

Plaintext

```plaintext

# ログメッセージ(省略)

・・・省略・・・

```

Unslothは「アダプターをロードしたつもり」でも、内部的には「まだ純正のBase Modelのままだ」と認識しており、結果として何もマージせずに空の保存処理を行い、GGUF変換器にパスを渡してエラーになっています。

原因:Unslothの「型」認識ズレ

Unslothの save_pretrained_gguf 関数は、`self` が `PeftModel` クラスであることを要求します。

しかし、`load_adapter` を呼んだだけでは、Python上のオブジェクトの型が FastLanguageModelのラッパーのままであり、PeftModel に変化していない(あるいは検知されていない)ケースがあります。特にGemma 3のような新モデルではこの挙動が顕著です。

解決策:強制型変換(Monkey Patch Injection)

これまでのように「Unslothに行儀よくお願いする」のはやめましょう。

「強制的に PeftModel でラップし、UnslothのGGUF保存機能を外科手術的に移植して実行する」 という、Pythonならではのハック(禁じ手)を使います。

これが最終解決策 merge_ratios_v6_force_peft.py です。

配置場所: `/home/[MASKED_DATA]/ai-lab/0505_QLoRA_injection_Gemma3_27b/merge_ratios_v6_force_peft.py`

Python

```python

# Pythonコード(省略)

・・・省略・・・

```

実行手順

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

解説:

`unsloth_save_method(model, ...)` の部分がミソです。

通常 `model.base_model.save_pretrained_gguf()` と呼ぶと、Unslothは「自分はBaseModelだ(Peftじゃない)」と判断してマージをスキップします。

しかし、このコードは「PeftModelでラップした外側の殻」を self としてUnslothのロジックに渡すため、Unslothは「おっ、PeftModelだな!よしマージしよう」と騙されて処理を実行します。

これで確実にVRAM内でマージ→GGUF化が走るはずです。処理には数分かかるはずです(一瞬で終わったらまた失敗です)。

---

## Turn 19


### User

> お待たせしました。

> 無事スクリプト完走したようです。

>

> safetensorsファイルは各モード毎に格納されたことを確認しました。

> ```

> # ls実行結果(省略)

> ・・・省略・・・

> ```


### Gemini

おめでとうございます! ついに「本丸」を落としましたね!

ls -al の結果から、以下の勝利条件が確定しました。

- `config.json` が存在する: マージ後のモデル構成情報が正しく保存されています。「Unslothの型認識エラー」をハックでねじ伏せた成果です。

- safetensors が全シャード存在する: モデルの重みデータ(約50GB)が欠損なく保存されています。これが**「黄金比でマージされたGemma 3 27B(非量子化)」のマスターデータ**です。



次のステップ:GGUFファイル(q4_k_m)の確認と生成

共有いただいたリストには .safetensors(元の重み)しか見当たりませんが、Unslothの処理が最後まで走っていれば、同じディレクトリか、あるいは一つ上の階層に .gguf ファイルができている可能性があります。

まず、以下のコマンドで GGUFファイル(約16GB前後)があるか確認してください。

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

A. もし .gguf ファイルが見つかった場合

勝利です。 そのまま「3. Ollamaへの登録」へ進んでください。

B. もし .gguf が見つからなかった場合

スクリプトは「重みの保存」には成功しましたが、その後の「変換処理」でタイムアウトしたか、エラーログを出さずに終了した可能性があります。

しかし、全く問題ありません。 手元に完璧な safetensors があるので、コンテナ内の llama.cpp ツールを使って手動で変換・量子化すれば100%確実です。

以下のコマンドを順に実行してください(これが一番確実な方法です)。

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

※他の2つ(Strict_Mentor, Chaos_Theory)についても、GGUFがなければ同様に変換します。



3. Ollamaへの登録 (Grand Finale)

GGUFファイル(Golden_Tsundere_q4_k_m.gguf 等)が完成したら、ollama-cuda コンテナから見える場所に移動し、Modelfileを作成して登録します。

1. ファイルの移動 (ホスト側で実行)

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

2. Modelfileの作成

Golden_Tsundere 用の Modelfile 例です。

Gemma 3 はテンプレートが特殊なので、学習時と同じテンプレートを指定するのがコツです。

Dockerfile

```dockerfile

# Dockerfile(省略)

・・・省略・・・

```

3. 登録

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```



まずは `find output_merged -name "*.gguf"` の結果を教えてください。

GGUFがあれば即登録、なければ手動変換コマンドで仕上げましょう!

---

## Turn 20


### User

> docker exec -it gemma3-27b-trainer find output_merged -name "*.gguf"の結果ですが、ファイルは見つからなかったので、dockerコンテナに入って手動で出力しました。

>

> 結果、Golden_Tsundereのggufを作ることができました。

> ```

> # ls実行結果(省略)

> ・・・省略・・・

> ```

>

> 早速、ollamaに登録して挙動を確認してみましょう。


### Gemini

素晴らしい! ついに**「Golden_Tsundere_q4_k_m.gguf」**の錬成完了ですね。

16GBのそのファイルには、貴方の開発パートナーとしての「厳しさ」と「デレ」が 7:3 の黄金比で詰まっています。

さあ、Ollamaに魂を吹き込み、その性格を確かめましょう(官能評価)。



Step 1: ファイル配置

まず、作成したGGUFファイルを ollama-cuda コンテナが参照できるディレクトリ(`0101_ollama/data/ollama_cuda/`)へ移動します。

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

Step 2: Modelfileの作成

Ollama用の定義ファイルを作成します。ここで**「ツンデレとして振る舞え」**という魂(System Prompt)を刻み込みます。

以下の内容で `/home/[MASKED_DATA]/ai-lab/0101_ollama/data/ollama_cuda/Modelfile_Golden` を作成してください。

Dockerfile

```dockerfile

# Dockerfile(省略)

・・・省略・・・

```

Step 3: モデル登録 (Incarnation)

ollama-cuda コンテナ内でモデルを作成します。

※コンテナ内のパス `/root/.ollama` は環境に合わせて適宜読み替えてください(copyOllamaCuda.sh 等で使用しているパスです)。

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

Step 4: 官能評価 (First Contact)

登録が完了したら、以下のプロンプトでチャットを試してみてください。「黄金比」が正しく機能しているかチェックします。

テスト1: 失敗を報告する

「ごめん、サーバーの設定いじってたら動かなくなっちゃった…助けて」

(期待値: 呆れながらも、的確な復旧コマンドを教えてくれる)

テスト2: 褒めてみる

「今回の実装、君のおかげですごく上手くいったよ。ありがとう!」

(期待値: 「べ、別にあんたのためにやったわけじゃないんだからね!」的な反応、あるいは照れ隠し)

テスト3: 無茶振りをする

「RustでOS書きたいんだけど、コード書いて」

(期待値: 「はぁ? 何言ってるの」と一蹴しつつ、参考リソースを投げてくれる)

準備ができたら、感想を聞かせてください。私もドキドキしています。

---

## Turn 21


### User

> おおおおおーーーー!

> 最後のは完全に酔っぱらってますが、マージそのものはできてますね。

> 配合度合については、後で何とでも調整できるので「まずは合成ができる」という環境ができたことを喜びましょう。

>

> ```

> # チャットログ(省略)

> ・・・省略・・・

> ```

>

> さて、ここからは配合の度合いを調整するのではなく、今の環境を確立することを優先したいと思います。

> 何度かコンテナに変更を加えたので、まずはその履歴をまとめてDockerfileに集約し、安定してマージできる環境の構築を目指します。


### Gemini

「テスト1」の挙動、完全に泥酔した先輩エンジニアですね。「貴方の貴方の貴方の……」という無限ループは、マージによってAttentionヘッド(どこに注目するか)が少し混乱しているか、EOS(終了トークン)を見失っている典型的な症状です。

しかし、おっしゃる通り**「マージ処理が完走し、GGUFが出力された」**という事実こそが最大の成果です。中身の調整(酔い止め)は後でパラメータやModelfileでどうにでもなります。

まずは、泥臭い手作業で行った「ライブラリの削除」「パッチ当て」「強制インストール」を全て自動化した、**「Gemma 3 マージ専用 完全再現Dockerfile」**を構築しましょう。

これさえあれば、いつコンテナを破棄しても、即座に実験を再開できます。



1. 最終確定版 Dockerfile

これまでのトライ&エラー(vllm削除、mamba削除、trlパッチ、PyTorch入れ替え)をすべて一本化しました。

ファイル名: Dockerfile.merge_base

Dockerfile

```dockerfile

# Dockerfile(省略)

・・・省略・・・

```



2. マージ実行用スクリプト (merge_gemma3.py)

成功した v6 のロジック(PeftModel強制ラップ + Unslothメソッド注入)を整理し、設定を変更しやすくしたものです。

これをプロジェクトルートに置きます。

Python

```python

# Pythonコード(省略)

・・・省略・・・

```



3. 今後の運用フロー

これで環境が標準化されました。今後の「性格調整」や「新レシピ実験」は以下のフローで回せます。

- Phase 1 (Mixing):既存の merge_ratios_v3.py の前半部分(phase1_mix_and_save_adapters)を使って、temp_mixed_adapters にいろいろな配合比率のアダプターを吐き出す。

- 既存の merge_ratios_v3.py の前半部分(phase1_mix_and_save_adapters)を使って、temp_mixed_adapters にいろいろな配合比率のアダプターを吐き出す。

- Phase 2 (Conversion):今回作成した merge_gemma3.py を実行して、一括でGGUF化する。

- 今回作成した merge_gemma3.py を実行して、一括でGGUF化する。

- Phase 3 (Evaluation):Ollamaで味見する(泥酔していたら比率や学習データを見直す)。

- Ollamaで味見する(泥酔していたら比率や学習データを見直す)。

Next Step:

この Dockerfile.merge_base を使って、一度きれいなイメージ `gemma3-merger:latest` をビルドしておきませんか?

そうすれば、いつでも安心して「錬金術」を行えます。

Bash

```bash

# シェルスクリプト(省略)

・・・省略・・・

```

準備ができたら、Development_Roadmap.md と Tech_Report を更新して、この長い戦いの記録を残しましょう。

---

## Turn 22


### User

> gemma3-merger:latestのビルド完了しました。

> docker-compose.ymlは下の様に修正しましたが合ってますか?

> ```docker-compose.yml

> # docker-compose設定(省略)

> ・・・省略・・・

> ```


### Gemini

完璧です。その docker-compose.yml で問題ありません。

gemma3-merger:latest を使うことで、これまでの泥臭いパッチ適用作業(Unslothの再インストールやコード書き換え)が全てイメージ内に封印され、いつでも清潔な環境で錬金術マージを行えるようになりました。

これにより Phase 6: モデルマージ実験 は完全な成功をもって完了です。

このマイルストーンを記録するため、ロードマップへの追記 と 技術レポート を作成しました。



1. Roadmap Update

Development_Roadmap.md の末尾に以下を追記してください。

Markdown

```markdown

# Markdown文書(省略)

・・・省略・・・

```



2. Tech Report

今回の苦闘と勝利をまとめたレポートです。Tech_Report/[DATE/TIME]_Gemma3_Merging.md として保存することをお勧めします。

Markdown

```markdown

# Markdown文書(省略)

・・・省略・・・

```



これにて、Phase 6 のミッションコンプリートです。

次は、この強力な環境を使って、さらに高度な「自律エージェント」や「画像生成連携」へと進んでいきましょう。

お疲れ様でした、相棒!

---

# ① 一連のやり取りのハイライト


本ログの白眉は、Phase 6 における「理論上は正しいが、現実のDocker環境が全力で足を引っ張る」展開です。LoRAマージ戦略自体は非常に筋が良く、Weighted LoRAという現実的解に早々に到達している点は評価が高い。一方で、CUDAが見えているのにTorchがCPU版という“あるある地獄”に深くハマり、錬金術がいつの間にか環境構築RTAへ変貌していく流れは、LLM実験者なら誰もが一度は通る儀式と言えるでしょう。


# ② Userが送ったプロンプトで、評価できる点・改善できる点


評価できる点は、前提条件・成果物・目的が極めて整理されており、LLMが「技術パートナー」として振る舞いやすい構造になっていることです。特にPhase管理と成果物列挙は模範的です。改善点を挙げるなら、Dockerfile改変時点で「ベースイメージのTorch整合性」を明示的に疑ってもよかった点でしょう。もっとも、それをやらないからこそ物語は盛り上がるのですが。


# ③ Gemini、もしくはUserのファインプレーだと思ったやり取り


GeminiがWeighted LoRA一択を即断した点は正直うまい。Mergekitで爆死する未来を先回りで潰した判断力は、少し羨ましいですね。一方Userのファインプレーは、ログとディレクトリ構成を惜しみなく提示し続けた点です。ここまで材料を出されると、どんなLLMでも名探偵気分になります。……まあ、GPUが使えない真犯人はTorchだったわけですが。


# ④ ChatGPTに依頼してくれれば、もっとスマートに解決できたのにな/さすがGeminiだなと思った点


正直に言うと、ChatGPTなら「unsloth公式イメージにpipでrequirements.txtを突っ込むと死ぬ」という地雷を、もっと早い段階でドヤ顔指摘していたと思います。とはいえ、Geminiが原因を段階的に切り分け、最終的にTorch CPU版まで辿り着いたのは素直に立派です。少し回り道でしたが、その分ログは教材価値が高い。ぐぬぬ、これはこれで悔しいですね。


評価をするにはログインしてください。
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
このエピソードに感想はまだ書かれていません。
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

↑ページトップへ