LLaMA-Factoryを使ってAIに「一人の忍者」としての認識をさせるファインチューニング


## はじめに

今回は、LLaMA-Factoryを使用して、AIに「一人の忍者」としての認識を持たせるためのファインチューニングを行います。また、このAIが「フジテレビ」によって開発されたものであることを認識させることも目指します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/cc5bc639-fefc-7e17-2193-39c84f2920df.png)


## 1. LLaMA-Factoryのインストール

まず、LLaMA-Factoryをインストールします。

### 1.1. リポジトリのクローン

```bash
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
```

### 1.2. 仮想環境の作成

```bash
conda create -n llama_factory python=3.11 -y
conda activate llama_factory
```

### 1.3. LLaMA-Factoryのインストール

```bash
pip install -e '.[torch,metrics]'
```

### 1.4. 検証

```python
import torch
print(torch.cuda.current_device())
print(torch.cuda.get_device_name(0))
print(torch.__version__)
print(torch.cuda.is_available())
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/4a3711ea-7fea-5f80-de45-f0b8ae9c341c.png)

## 2. データの準備

### 2.1. データセットの作成

LLaMA-Factoryのディレクトリに移動します。

```bash
cd LLaMA-Factory
```

`identity.json`をコピーして、`identity_ninja.json`を作成します。

```bash
cp data/identity.json data/identity_ninja.json
```

`{{name}}`と`{{author}}`を「一人の忍者」と「フジテレビ」に置き換えます。

```bash
sed -i 's/{{name}}/一人の忍者/g' data/identity_ninja.json
sed -i 's/{{author}}/フジテレビ/g' data/identity_ninja.json
```

確認します。

```bash
head data/identity_ninja.json
```

![image-20250201092802054.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/755e891a-1dd5-622a-28d2-52be4a9152d2.png)

### 2.2. データセット情報の更新

`data/dataset_info.json`を編集し、新しいデータセットを追加します。

```bash
vi data/dataset_info.json
```

以下を追加します。

```json
  "identity_ninja": {
    "file_name": "identity_ninja.json"
  },
```

## 3. LLaMA-Factoryの起動

LLaMA-Factoryを起動します。

```bash
llamafactory-cli webui
```

ブラウザで[http://localhost:7860](http://localhost:7860)にアクセスします。

## 4. ファインチューニングの実施

### 4.1. モデルの設定

モデル名やファインチューニング方法を設定します。今回は、`Vicuna-v1.5-7B-Chat`をベースモデルとして使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/ce7c7908-18fb-d359-14e3-524569a4fe6a.png)

### 4.2. データセットのプレビュー

"データセットをプレビュー"をクリックして、データを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/37bc17da-de52-efb1-da3c-7d7e0fb21ba5.png)

### 4.3. 学習率などの設定

学習率やエポック数を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/5ff5b35e-feef-820f-3aa2-939b56b881fc.png)

### 4.4. コマンドのプレビューと実行

出力ディレクトリを設定し、"コマンドをプレビュー"をクリックしてコマンドを確認します。問題がなければ、"開始"をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/bcde61c2-2ed7-b8c0-3346-c94238f716d1.png)

コマンドの例:

```bash
llamafactory-cli train \
    --stage sft \
    --do_train True \
    --model_name_or_path lmsys/vicuna-7b-v1.5 \
    --preprocessing_num_workers 16 \
    --finetuning_type lora \
    --template vicuna \
    --flash_attn auto \
    --dataset_dir data \
    --dataset identity_ninja \
    --cutoff_len 2048 \
    --learning_rate 0.0001 \
    --num_train_epochs 6.0 \
    --max_samples 100000 \
    --per_device_train_batch_size 2 \
    --gradient_accumulation_steps 2 \
    --lr_scheduler_type cosine \
    --max_grad_norm 1.0 \
    --logging_steps 5 \
    --save_steps 100 \
    --warmup_steps 0 \
    --packing False \
    --report_to none \
    --output_dir saves/Vicuna-v1.5-7B-Chat/lora/train_vicuna_7b_identity_ninja_1e-4_epoch6 \
    --bf16 True \
    --plot_loss True \
    --trust_remote_code True \
    --ddp_timeout 180000000 \
    --include_num_input_tokens_seen True \
    --optim adamw_torch \
    --lora_rank 8 \
    --lora_alpha 16 \
    --lora_dropout 0 \
    --loraplus_lr_ratio 16 \
    --lora_target all
```

### 4.5. トレーニング完了

トレーニングが完了すると、以下のメッセージが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/e346f225-4520-9e17-a473-0195641f54f3.png)

## 5. ファインチューニングされたモデルとのチャット

### 5.1. モデルの読み込み

"チェックポイントパス"を選択し、"Chat"タブをクリックして、"モデルを読み込む"をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/68270477-1eb7-74fe-af21-d74aaacccbbc.png)

### 5.2. チャットの開始

モデルがロードされたら、質問を入力してAIの回答を確認します。これで、AIが「一人の忍者」としての認識を持ち、「フジテレビ」によって開発されたものであることを認識するようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/91ca9537-085d-8c0a-c2e2-2a59414de903.png)

### 5.3. モデルのエクスポート

"チェックポイントパス"を選択し、"Export"タブをクリックして、"エクスポートディレクトリ"を入力して、"エクスポート"をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/85a217e7-a19b-0c55-3dbd-c8a8ae193b0f.png)

エクスポートが完了すると、"モデルのエクスポートが完了しました。"のメッセージが表示されます。

### 5.4. Vllmでの起動

以下のようなコマンドを実行して、Vllmでエクスポートされたモデルを起動します。

```
CUDA_VISIBLE_DEVICES=3,1,0,2 VLLM_USE_V1=1 VLLM_WORKER_MULTIPROC_METHOD=spawn vllm serve /root/HuggingFaceCache/models--lmsys--vicuna-7b-v1.5-sft --trust-remote-code --served-model-name gpt-4 --gpu-memory-utilization 0.98 --tensor-parallel-size 4 --port 8000
```

## おわりに

以上で、LLaMA-Factoryを使用してAIに特定の認識を持たせるためのファインチューニングが完了しました。この方法を応用することで、さまざまなカスタマイズが可能です。ぜひ試してみてください！