見出し画像

ArrowPro-7B-KUJIRA をCoreML変換

せっかくMacStudioを持っているのでCoreMLに変換してGPUやNPUの性能をフルに活かしてローカルLLMを使ってみようと思います。

変換するモデル

GPT-4oとClaude 3 Opusと一緒に作った変換ロジック

import coremltools as ct
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
import os
import numpy as np

# TensorFlowのバージョンを確認
import tensorflow as tf
print("TensorFlow version:", tf.__version__)

# モデルのパスを指定
model_name_or_path = "../LLMModels/ArrowPro-7B-KUJIRA"

# モデルパスの存在を確認
if not os.path.exists(model_name_or_path):
    raise FileNotFoundError(f"モデルパスが見つかりません: {model_name_or_path}")
else:
    print(f"モデルパスが見つかりました: {model_name_or_path}")

try:
    # トークナイザをロード
    tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)
    
    # モデルをロード
    model = AutoModelForCausalLM.from_pretrained(model_name_or_path, trust_remote_code=True)
    model.eval()  # 推論モードに設定

    # サンプル入力のトークンを生成
    input_text = "Hello, world!"
    inputs = tokenizer(input_text, return_tensors="pt")
    input_ids = inputs["input_ids"]  # int64のまま

    # トレースではなく、直接エクスポート
    class CustomWrapper(torch.nn.Module):
        def __init__(self, model):
            super(CustomWrapper, self).__init__()
            self.model = model
        
        def forward(self, input_ids):
            outputs = self.model(input_ids=input_ids)
            return outputs.logits

    wrapped_model = CustomWrapper(model)
    
    # トレースモデルを生成
    traced_model = torch.jit.trace(wrapped_model, input_ids)
    
    # CoreMLモデルに変換
    mlmodel = ct.convert(
        traced_model,
        convert_to="mlprogram",  # この行を追加
        inputs=[ct.TensorType(name="input_ids", shape=input_ids.shape, dtype=np.int64)]
    )

    # CoreMLモデルを保存
    mlmodel.save("ArrowPro-7B-KUJIRA.mlpackage")  # 拡張子を.mlpackageに変更
    
    print("モデルの変換と保存が成功しました。")
except Exception as e:
    print(f"モデルの変換中にエラーが発生しました: {e}")

ここに辿り着くまでに本当にいろいろありました。。。
途中で気づいたんですが、おそらく

こちらを使えばもっと楽に変換できたかもしれません。
今度やってみます。


モデルの変換と保存に成功しました、のメッセージが出た時本当に嬉しかった

量子化しない版のArrowPro-7B-KUJIRAはCPUだけだとめちゃめちゃ重かったです。多分5分くらいかかってました。
NPU使った場合はどうなるでしょうか?

試してみました

ライブラリの
pip install tensorflow==2.12.0
がずっと
インストールできなくて泣きそうになってたんですけど
pip install tensorflow-macos==2.12.0
にしたらできました!
いえい

import coremltools as ct
import numpy as np

# NPU対応のモデルを読み込み
model = ct.models.MLModel("ArrowPro-7B-KUJIRA.mlpackage")

# サンプル入力の準備
input_text = "Hello, world!"
input_ids = np.array([[1, 2, 3, 4, 5]], dtype=np.int32)  # 2次元のnumpy配列

# モデルの期待する入力型を確認
print("Expected inputs:", model.input_description)

# 推論の実行
try:
    output = model.predict({"input_ids": input_ids})
    # 出力の処理
    output_tensor = output["var_5268"]
    print("Output tensor shape:", output_tensor.shape)
    
    # 出力テンソルの処理例
    predicted_token_ids = np.argmax(output_tensor, axis=-1)
    print("Predicted token IDs:", predicted_token_ids)
    
    print("推論が完了しました。")
except RuntimeError as e:
    print(f"Error during prediction: {e}")

出力結果↓↓

Expected inputs: Features(input_ids)
Output tensor shape: (1, 5, 32000)
Predicted token IDs: [[28705 1 4066 166 28846]]
推論が完了しました。

これで一応できてはいるみたい
ただトークナイザがないから意味のない推論結果になっているらしい

トークナイザで詰まった
huggingfaceのは使えないらしい
今日はここまで

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