📲

rinna-3.6bをiPhoneでも動かす

2023/06/11に公開

前回に引き続きmlc-llmを使ってrinna/japanese-gpt-neox-3.6b-instruction-ppoをiPhoneでも動かしてみました.

こんな感じで動きます↓
https://twitter.com/kkatsuyoshi/status/1667834921602412544

https://huggingface.co/rinna/japanese-gpt-neox-3.6b-instruction-ppo
https://github.com/mlc-ai/mlc-llm

前提

  • 前回の記事でモデルのconvertができる状態になっている
  • iOSの開発環境が入っている
  • メモリがたくさん載っている最近のiPhoneを持っている

事前準備

rustupが必要なため,一旦rustをuninstallしてからrustup-initをinstall.初期設定のためrustup-initを実行し,パスの設定を行う.

brew uninstall rust
brew install rustup-init
rustup-init
source "$HOME/.cargo/env"

iPhone用convert

メモリの量に合わせて量子化オプションを調整.最近のiPhoneならq4f16_0で動くはず.

python3 build.py                                    \
    --model japanese-gpt-neox-3.6b-instruction-ppo  \
    --quantization q4f16_0                          \
    --target iphone                                 \
    --max-seq-len 768

ファイルの修正

メモリを確保できずに初期化できない場合があるので一旦小さくする.

./ios/MLCChat/ModelState.swift
@@ -44,7 +44,7 @@ class ModelState : ObservableObject, Identifiable {
     
     func reloadChatStateWithThisModel() {
         // TODO(tvm-team) consider log optional model name
-        let estimatedVRAMReq = modelConfig.estimated_vram_req ?? 4000000000;
+        let estimatedVRAMReq = modelConfig.estimated_vram_req ?? 2000000000;
         let modelName = modelConfig.display_name ?? modelConfig.local_id.components(separatedBy: "-")[0];
         self.chatState.mainReload(
             modelName: modelName,

モデルの設定を修正する.prefixは指定した量子化オプションに合わせる

./ios/MLCChat/app-config.json
@@ -1,18 +1,13 @@
 {
     "model_libs": [
-        "vicuna-v1-7b-q3f16_0",
-        "RedPajama-INCITE-Chat-3B-v1-q4f16_0"
+        "japanese-gpt-neox-3.6b-instruction-ppo-q4f16_0"
     ],
     "model_list": [
         {
-            "model_url": "https://huggingface.co/mlc-ai/mlc-chat-vicuna-v1-7b-q3f16_0/resolve/main/",
-            "local_id": "vicuna-v1-7b-q3f16_0"
+            "model_url": "",
+            "local_id": "japanese-gpt-neox-3.6b-instruction-ppo-q4f16_0"
         }
     ],
     "add_model_samples": [
-        {
-            "model_url": "https://huggingface.co/mlc-ai/mlc-chat-RedPajama-INCITE-Chat-3B-v1-q4f16_0/resolve/main/",
-            "local_id": "RedPajama-INCITE-Chat-3B-v1-q4f16_0"
-        }
     ]
 }

同様にモデル名を合わせる.

./ios/prepare_params.sh
@@ -2,11 +2,13 @@
 set -euxo pipefail
 
 # NOTE: this is optional, prepackage weight into app
+mkdir -p dist
 rm -r dist
 mkdir -p dist
 
 declare -a builtin_list=(
-    "RedPajama-INCITE-Chat-3B-v1-q4f16_0"
+    "japanese-gpt-neox-3.6b-instruction-ppo-q4f16_0"
+    # "RedPajama-INCITE-Chat-3B-v1-q4f16_0"
     # "vicuna-v1-7b-q3f16_0"
     # "rwkv-raven-1b5-q8f16_0"
     # "rwkv-raven-3b-q8f16_0"

ビルド

mlc-llmのiosで実行.

cd ios
./prepare_libs.sh
./prepare_params.sh 

include先のシンボリックリンクがずれているので修正し,tokenizer.jsonをコピー.この際,上記同様にモデル名を合わせる.

ln -fs ../../3rdparty/tvm build/tvm_home
cp ../tokenizer/tokenizer.json dist/japanese-gpt-neox-3.6b-instruction-ppo-q4f16_0

最後に,XCodeを使って実機向けにbuild→runすることで,実機にて動作するところまで確認できました.
量子化すると,どうしてもレスポンスの「言葉の質」が低下しているように感じますね.

Discussion