LLMTuneでLLaMA-30B (65B)をfine tuningする メモ


2023/7/13追記
マルチGUPにも対応した、こちらのライブラリがオススメです


概要

  • オープンLLMの教祖とも言える、LLaMA-65B(やその小規模version)をQLoRAでファインチューニングします

  • こちらのモジュールを使うだけですが、執筆時点で、要修正な箇所があります

  • どのLLMをファインチューニングするかは、色々と悩むところですが、やはりモデルサイズの大きさは正義なので、デカいものを試そうという発想です

関連モジュール(執筆時)

  • FalconTune

    • Falcon-40bをQLoRAするライブラリ。multi-GPU未対応?

      • Falconでもfine tuningしてみました (こちら)

  • MPTTune

    • MPT-7bをQLoRAするライブラリ。30bはまだ未対応だが、誰かが作ってくれそうです

セットアップ

検証環境

  • 手持ちubuntu with RTX-3090 x2 (※1枚しか使いません)

  • Google colab (A100)

レポジトリのクローン

git clone https://github.com/kuleshov-group/llmtune
cd llmtune

モデルのダウンロード
サーバーの転送速度が遅いので、早めの実行を推奨。

#好きなモデルを選んでダウンロード
wget https://huggingface.co/kuleshov/llama-13b-4bit/resolve/main/llama-13b-4bit.pt
wget https://huggingface.co/kuleshov/llama-30b-4bit/resolve/main/llama-30b-4bit.pt
wget https://huggingface.co/kuleshov/llama-65b-4bit/resolve/main/llama-65b-4bit.pt

モジュールの修正

2023/7/7時点で、module内にミスがあるので、修正する必要があります
ファイル: llmtune/engine/quant/algorithm/executor.py

修正点
・gptをgptqに変更

・torchをimport
修正後は以下の感じになります。

from llmtune.engine.quant.algorithm.gptq import GPTQ
from llmtune.engine.quant.algorithm.quantizer import Quantizer
import torch

@torch.no_grad()
def quantize_llama(model, dataloader, dev):
    print('Starting ...')
     ....

(このexecutor.pyファイル内に、args、find_layersなどの、未定義の変数がたくさんあるのが気になります。色々と怪しいライブラリです)

関連ライブラリのインストール

miniconda環境から作りました

conda create -n llama
conda activate llama
conda install pip

関連ライブラリのインストール

pip install -r requirements.txt

LLMTuneのインストール

(手持ちのubuntuではcompile errorが出ました。 コンパイラのバージョンを変えようかなと思っていたんですが、手持ちの24GB x2環境では動かない予感がしたので、中断しました)

手持ちのubuntu (cuda 11.5)ではコンパイルエラーが出ました。google colab (nvcc 11.8)ではコンパイルが通ったので、こちらをインストールして解決しました。

conda install -c "nvidia/label/cuda-11.8.0" cuda-nvcc

実際のインストール。Warningとか色々出ますが、無視しました。

python setup.py install


動作

マルチGPUには対応していないようなので、マルチGPUのマシンではvisible deviceを設定しておきます(そうしないと、勝手にマルチでloadingしはじめて、エラーが出ます)。

export CUDA_VISIBLE_DEVICES=0

推論
推論に、2-3分くらいかかったと思います。

llmtune generate --model llama-30b-4bit --weights llama-30b-4bit.pt --prompt "the pyramids were built by"

実行結果

<s>the pyramids were built by 30.000 people
The pyramids of the pharaohs of the 4th dynasty were built of 30 000 people.
According to the calculations that the pyramids of Giza were built by 30,000 people during the time of King Khufu, the famous pyramid of Giza, there are other people who believe that there are much fewer people in the work.
The pyramids were built of 30.000 people – according to the calculations of the ancient pyramids of Giza were built by 30,000 workers, the famous pyramid of Giza. Some have a view of the less amount of workers in the work.
It is estimated that about 30,000 people have contributed to the building of these pyramids for more than 20


ファインチューニング

練習用のデータセットを作ります。
これ以上長い文章にすると、RTX-3090 (24 GB)ではメモリエラーが出てしまいました。

test_finetune.json

[
    {
        "instruction": "What is LLMMeetUPTokyo?",
        "input": "",
        "output": "LLMMeetUPTokyo is a crazy meeting held by hackers."
    },
    {
        "instruction": "Who can use GPT-4 API?",
        "input": "",
        "output": "Everyone will be able to use it before long."
    }
]


学習
メモリ足りないエラーが頻発したので、バッチサイズを最小にします。

llmtune finetune --model llama-30b-4bit \
--weights llama-30b-4bit.pt \
--adapter test_lora \
--dataset dataset/test_finetune.json \
--mbatch_size 1 \
--batch_size 1 \

推論

llmtune generate --model llama-30b-4bit --weights llama-30b-4bit.pt \
--adapter test_lora  --instruction "Who can use GPT-4 API?"

結果はこちら。

# This line is just an input

"""

### Instruction:
A: The main feature of GPT-3 is ____

### Input:

…まともま回答が得られませんでした。
Llamaはあまりinstructionされていないモデル(?)なので、多量のinstructionをさせるところから始める必要がありそうです。


今後

llamaよりもfalconmptの方が評判がよさそうなので、そちらを試す予定です。コードも、今回のllmtuneをbrush upしている印象です。ただし、どちらもmulti gpuは非対応な模様。


この記事が気に入ったらサポートをしてみませんか?