2024年4月17日水曜日

Llama.cppとOllamaを使ってCommand R+をローカルのMacbookで動かしAPEXアプリから呼び出す

巷で話題のCohere(Cohere For AI)のCommand R+を手元のMacbookで動かして、同じく手元のMacbookで動かしているAPEXアプリからアクセスしてみました。

動かしたMacbookのスペックは少し古いですが、M1 Max (64GB)です。

Apple MシリーズのマシンでLlama.cppを使ってCommand R+を動かしてみようと思い立ったきっかけは、npakaさんの以下の記事です。

Llama.cpp で Command R+ を試す

npakaさんの記事ではM3 Max (128GB)とのことです。実行するマシンがそれよりスペックが低いので、4ビット量子化のモデルの代わりに2ビット量子化のモデル(Q2_K - command-r-plus-Q2_K.gguf)を使っています。

以下のように動作しました。


APEXの環境はColimaを使って実行しています。

Oracle Database 23c FreeのコンテナだけでOracle APEXを実行する
データベース単体のコンテナへのOracle APEXのインストールを自動化する

API呼び出しができるように、データベースにACEを追加しています。
begin
  DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
    host => '*',
    ace => xs$ace_type(
        privilege_list => xs$name_list('connect'),
        principal_name => 'APEX_230200',
        principal_type => xs_acl.ptype_db));
  commit; 
end;
/
また、管理サービスインスタンスの設定に含まれるウォレット・パスを設定しています。ウォレット・パスに設定したディレクトリ以下にewallet.p12cwallet.ssoを配置しています。


APIサーバーは以下のコマンドで実行しています。

Llama.cppをコンパイルしたディレクトリより、

./server --model models/command-r-plus-Q2_K.gguf -c 2048

Llama.cppの代わりにOllamaも使ってみました。Ollamaは以下で実行します。

ollama run command-r-plus:104b-q2_K

以下の記事で作成したAPEXアプリケーションを使っています。

OpenAIのChat Completions APIを呼び出すAPEXアプリを作成する
https://apexugj.blogspot.com/2024/04/chat-with-generative-ai-sample-app-0.html

同じアプリケーションで、OpenAI、Llama.cppそれとOllamaを呼び出せるように、パラメータを置換文字列として設定するように変更しています。

ローカルのMacでLlama.cpp+Command R+(Q2_K)を動かして、APEXアプリから呼び出す際の設定です。

G_API_ENDPOINTとしてhttp://host.docker.internal:8080/v1/chat/completionsG_MODEL_NAMEとしてcommand-r-plus(おそらくLlama.cppではモデル名は見ていない)を指定しています。


OpenAIのAPIを呼び出したときの設定です。

G_API_ENDPOINThttps://api.openai.com/v1/chat/completionsG_MODEL_NAMEとしてgpt-3.5-turboを指定しています。OpenAIのAPIを呼び出すにはAPIキーの指定が必要なので、G_CREDENTIALとしてWeb資格証明OPENAI_API_KEYを指定します。Web資格証明はあらかじめ作成しておきます。


ローカルのMacでOllama+command-r-plus:104b-q2_Kを動かしたときの設定です。

G_API_ENDPOINThttp://host.docker.internal:11434/v1/chat/completionsG_MODEL_NAMEとしてcommand-r-plus:104b-q2_Kを指定しています。

G_API_ENDPOINTとしてhttp://host.docker.intrernal:11434/api/chatを指定すると、レスポンスの形式が少々変わります。


今回の作業は以上です。

MLXでも試してみたのですが、そちらの方はCommand R+を動かすにはリソースが足りず動きませんでした。Llama.cppではかろうじて動く感じです。