🍎

MLX で Mac で LLM fine-tuning

2024/02/05に公開

昨年12月に MLX という Mac の Apple Silicon を上手く扱える機械学習フレームワークが Apple 自身から提供されました。
https://github.com/ml-explore/mlx
https://ml-explore.github.io/mlx/build/html/install.html#

HuggingFaceにもmlx-communityというものができており、最近ちょいちょいMLXでfine-tuningをしたぜ報告ポストをX上で見かけるようになりました。
https://huggingface.co/mlx-community

ちょうどこちらのfine-tuning記事の素振りを Mac でしていて No GPU found. A GPU is needed for quantization. なるエラーで詰まっていたりしたので MLX で試してみます。

mlx-examples というMLXを使ったサンプルコード集の中にlora.pyという fine-tuning をできるサンプルがあるので、まずはこちらをクローンしてきます。

https://github.com/ml-explore/mlx-examples/

git clone https://github.com/ml-explore/mlx-examples.git

lora というディレクトリに進んでパッケージをインストールします。

cd mlx-examples/lora
pip install -r requirements.txt

今回は fine-tuning にしたいデータは example に入っているものそのまま使いますが、自分で作る場合にフォーマットは次のような "text" というプロパティを持った JSON で、 data/ ディレクトリに train.jsonlvalid.jsonl がそれぞれ必要です。

{"text": "This is an example for the model."}

LoRA での fine-tuning は次のコマンドで実行します。 --model は HuggingFace 上のモデルを参照しています。

python lora.py \
 --train \
 --model microsoft/phi-2 \
 --batch-size 2 \
 --lora-layers 8 \
 --iters 1000

学習が終わると adapters.npz というファイルが作られていると思います。
学習結果を試す場合には次のように --adapter-file にそのファイルを渡して、プロンプトを書けば OK です。

python lora.py --model microsoft/phi-2 \
               --adapter-file ./adapters.npz \
               --max-tokens 50 \
               --prompt "table: 1-10015132-16
columns: Player, No., Nationality, Position, Years in Toronto, School/Club Team
Q: What is terrence ross' nationality
A: "

生成結果同じ SELCT 文を複数回出してて微妙な気がしなくもないですがとりあえずそれっぽい推論をしてくれました。

Loading pretrained model
Fetching 10 files: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████| 10/10 [00:00<00:00, 107546.26it/s]
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
Total parameters 2780.995M
Trainable parameters 1.311M
Loading datasets
Generating
table: 1-10015132-16
columns: Player, No., Nationality, Position, Years in Toronto, School/Club Team
Q: What is terrence ross' nationality
A:  SELECT Nationality FROM 1-10015132-16 WHERE Player = 'Terrence Ross'!# SELECT Nationality FROM 1-10015132-16 WHERE Player = 'Terrence Ross'!# SELECT Nationality FROM 1-10015

出来上がった adapater 良さげだなとなったら fuse.py を実行して
ちなみに後ほどGGUFモデルを作りたい場合は --de-quantize というオプションをつける必要があります。

python fuse.py --model microsoft/phi-2 --adapter-file ./adapters.npz --save-path ./Models/phinetuned

Discussion