見出し画像

git pull というコマンドとQwenの実行:mlx-exampleにて

mlx-examplesがアップデートされているとのことで、ローカルファイルをアップデートする方法をGPT-4に教えてもらいました。
また、mlxアーキテクチャで、Qwenを実行してみました。


ローカルファイルのアップデート方法

もちろんです!ローカルのファイルに変更をコミットする必要がなく、単にローカルリポジトリをリモートのGitHubリポジトリの最新の変更で更新したい場合、そのプロセスは簡単です。以下、簡略化した手順です:

  1. ターミナルまたはコマンドプロンプトを開きます。

  2. ローカルプロジェクトディレクトリに移動します。


cd path/to/your/project


3. リモートリポジトリからの更新をローカルブランチにプルします。

git pull

以上です!`git pull` コマンドは実際には `git fetch` に続いて `git merge` を実行するもので、リモートリポジトリの現在のブランチから最新の変更を取得して、ローカルブランチにマージします。

ローカルで変更を加えていない場合や、ローカルの未コミットの変更が破棄されても構わない場合、プル操作はマージコンフリクトなしで進むはずです。

ローカルの変更が影響を受けないようにしたい場合は、プルする前にそれらをスタッシュできます:

git stash
git pull
git stash pop

これにより、一時的に変更を保存し、リモートから最新の更新でブランチを更新した後、更新されたブランチの上に変更を再適用します。`git stash pop` した後にコンフリクトが発生した場合は、手動で解決する必要があります。


Qwenの実行

以下でエラーが出てる理由は先に下記のコマンドを実行してなかったからです。忘れずに、先に実行してください。

pip install -r requirements.txt

さて、qwenのllmを動かしてみようと思います。
手順書通り以下を実行したら、エラーがでました。

python convert.py

ImportError: This modeling file requires the following packages that were not found in your environment: transformers_stream_generator. Run `pip install transformers_stream_generator`

書かれている通り、`pip install transformers_stream_generator`を実行してから、再度、convert.pyを動かしました。 Qwen/Qwen-1_8B. のダウンロードが終わって、コンバートできたようです。

(mlxenv) qwen % cd mlx_model
(mlxenv) mlx_model % ls
config.json weights.npz

まずはヘルプをみてみます。

python qwen.py --help

(mlxenv) qwen % python qwen.py --help
usage: qwen.py [-h] [--model-path MODEL_PATH] [--tokenizer TOKENIZER]
[--prompt PROMPT] [--max-tokens MAX_TOKENS] [--temp TEMP]
[--seed SEED]

Qwen inference script

options:
-h, --help show this help message and exit
--model-path MODEL_PATH
The path to the model weights and config
--tokenizer TOKENIZER
The tokenizer to be used, defaults to Qwen/Qwen-1_8B
--prompt PROMPT The message to be processed by the model
--max-tokens MAX_TOKENS, -m MAX_TOKENS
Maximum number of tokens to generate
--temp TEMP The sampling temperature.
--seed SEED The PRNG seed

defaultのプロンプトは何も引数つけずでいいとかいてあったので、試します。

python qwen.py

今度は下記のエラー。

ImportError: This modeling file requires the following packages that were not found in your environment: tiktoken. Run `pip install tiktoken`

pipして、再度実行。

(mlxenv) qwen % python qwen.py
qwen.tiktoken: 100%|███████████████████████| 2.56M/2.56M [00:00<00:00, 5.18MB/s]
蒙古国的首都是乌兰巴托(Ulaanbaatar)
冰岛的首都是雷克雅未克(Reykjavik)
埃塞俄比亚的首都是亚的斯亚贝巴(Addis Abeba)
印度尼西亚的首都是雅加加(Yangga)
日本的首都是东京(Tokio)
南非的首都是比勒陀利(Pretoria)
俄罗斯的首都是莫斯科(Moscow)
土耳其的首都是安卡拉(Ankara)
美国的首都是华盛顿(Washington)
加拿大首都是渥太華(Ottawa)
中国首都是北京市(Peking)
印度尼西亚的

readmeに模範応答が書かれてませんでしたが、多分いいのかな?
qwen.pyのスクリプトをみたら、 default="蒙古国的首都是乌兰巴托(Ulaanbaatar)\n冰岛的首都是雷克雅未克(Reykjavik)\n埃塞俄比亚的首都是",があったので、これへの応答だと思います。

という段階で、requirements をつかってなかったことに気づきました。
あらためて、

pip install -r requirements.txt

一応すべてはいっていたようです。

さて、プロンプトを追加して文章生成を実行。

(mlxenv) qwen % python qwen.py --prompt "Tell me about Japan."
Tell me about Japan. Japan is a beautiful and fascinating place. It is a land of contrasts, with its ancient traditions and modern technology. It is a land of contrasts, with its ancient traditions and modern technology. It is a land of contrasts, with its ancient traditions and modern technology. It is a land of contrasts, with its ancient traditions and modern technology. It is a land of contrasts, with its ancient traditions and modern technology. It is a land of contrasts, with its ancient traditions and modern technology. It is
(mlxenv) qwen %

微妙?

Tell me a math joke. Why did the square go to school? To get smarter.
(mlxenv) qwen % python qwen.py --prompt "日本語を喋って"
日本語を喋って、日本語を話す。 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
(mlxenv) qwen %

1.8Bのモデルですから、こんなものでしょうか。
PoeにあるQwen-72B-chatは、かなり日本語ができますので、近いうちに量子化して試してみたいです。

ダウンロードと変換のスクリプトをGPT-4に解説してもらったのが以下です。

このスクリプトは、HuggingfaceモデルをMLXモデルに変換し、オプションで量子化も行うPythonスクリプトです。`argparse`モジュールを使用して、コマンドラインから引数を受け取ることができます。

以下の引数が使用できます:

- `--model`: 変換するHuggingfaceモデルの名前を指定します。デフォルトでは`"Qwen/Qwen-1_8B"`となっています。
- `--mlx-path`: MLXモデルを保存するパスを指定します。デフォルトでは`"mlx_model"`となっています。
- `-q` / `--quantize`: このフラグを指定すると、量子化されたモデルを生成します。指定しない場合、量子化は行われません。
- `--q-group-size`: 量子化におけるグループサイズを指定します。デフォルトでは`64`となっています。
- `--q-bits`: 量子化におけるビット数を指定します。デフォルトでは`4`ビットとなっています。

実行例:

```bash
python script.py --model "Qwen/Qwen-1_8B" --mlx-path "path_to_save_mlx_model" --quantize --q-group-size 128 --q-bits 8
```

このコマンドは、デフォルトのHuggingfaceモデル`"Qwen/Qwen-1_8B"`を、指定したパス`"path_to_save_mlx_model"`にMLXモデルとして保存するためのものです。また、`--quantize`フラグにより量子化を行い、`--q-group-size`と`--q-bits`で量子化のパラメータをそれぞれ128と8に設定しています。

スクリプトが量子化処理を含むため、量子化を行わない場合は`--quantize`フラグを省略してください。その他の引数もデフォルト値が用意されているため、必要に応じて変更することができます。

単純に -h をつけるだけでもヘルプが出ますね。

(mlxenv) qwen % python convert.py -h
usage: convert.py [-h] [--model MODEL] [--mlx-path MLX_PATH] [-q]
[--q-group-size Q_GROUP_SIZE] [--q-bits Q_BITS]

Convert Qwen model to npz

options:
-h, --help show this help message and exit
--model MODEL The huggingface model to be converted
--mlx-path MLX_PATH The path to save the MLX model.
-q, --quantize Generate a quantized model.
--q-group-size Q_GROUP_SIZE
Group size for quantization.
--q-bits Q_BITS Bits per weight for quantization.
(mlxenv) qwen %

グループサイズについてもGPT-4に教えてもらいました。

量子化とは、モデルの重みを低ビット表現に変換するプロセスで、モデルのサイズを削減し、実行速度を向上させる効果がありますが、精度が低下する可能性もあります。グループサイズとは、量子化を適用する際の重みのグループ内の要素の数を指定するパラメータです。

### グループサイズの意味:

モデルの重みは多くの数値で構成されており、量子化ではこれらの数値を効率的に圧縮します。グループサイズが大きいほど、一度に量子化される重みの数が多くなります。例えば、グループサイズが64の場合、64個の重みが同じ量子化パラメータ(スケールやオフセット)を共有します。

### グループサイズの影響:

- **グループサイズが大きい場合:** 重みの圧縮率が高くなり、モデルのサイズが小さくなりますが、精度が低下する可能性が高くなります。
- **グループサイズが小さい場合:** 量子化の影響が少なく、精度をある程度維持できますが、圧縮率と実行速度の向上は限定的です。

### グループサイズの決め方:

1. **モデルの精度要件を考慮する:**
最初に、どれくらいの精度が許容されるかを考えます。高精度が必要な場合は、グループサイズを小さくすることを検討する必要があります。

2. **実験を行う:**
異なるグループサイズでモデルを量子化し、それぞれの精度とパフォーマンスを評価します。実験を通じて、最適なグループサイズを見つけます。

3. **モデルのサイズと速度を評価する:**
実際のデプロイメント環境におけるモデルのサイズと速度も重要です。リソースが限られている環境では、より高い圧縮率を目指す必要があるかもしれません。

4. **トレードオフを理解する:**
グループサイズを決める際には、精度とサイズのトレードオフを理解し、アプリケーションのニーズに応じてバランスを取る必要があります。

5. **ドキュメントを参照する:**
使用している量子化ライブラリのドキュメントを参照して、推奨されるグループサイズや他のユーザーの経験を確認します。

量子化は複雑なプロセスであり、最適なグループサイズはモデルのアーキテクチャや使用するデータセット、そしてアプリケーションの要件によって異なります。そのため、上記のステップを繰り返して最適な値を見つけることが一般的です。

どこかに、このパラメーター数の時に、この量子化にするには、このグループサイズがいいよという表があると嬉しいですね。


#AI #AIとやってみた #やってみた #mlx #LLM #MacbookPro #Qwen

この記事が参加している募集

やってみた

AIとやってみた

この記事を最後までご覧いただき、ありがとうございます!もしも私の活動を応援していただけるなら、大変嬉しく思います。