Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

Androidで動かすGPT、しかしRAM=6GBでは動かない。

Android NDKを用いてコンパイルすることで、C/C++プログラムをAndroidで実行することができる。つまり、Alpaca.cppのchatプログラムも実行可能ということだ。この投稿では、そのビルドから実行までの作業を紹介する。

しかし注意が一つ。作業前にAndroid端末のRAM容量を調べて欲しい。chatプログラムの実行に際し、言語モデルをメモリにロードしようとする。これを保持するために8~12GBのRAMが必要なのだ。

この投稿末尾に掲載した動画は、プログラムがAndroidによって強制終了されている様子だ。これはエラーでもバグによるクラッシュでもなく、RAMの容量不足によるロード失敗によって生じている。使用端末はMicrosoft Surface Duo、搭載しているRAM容量は6GBだ。
成功事例がネット上で報告されてはいるものの、全ての事例で使用端末が明らかにされているわけではない。おそらく多くの場合は、Pixel 7 Proのような最新、ハイクラスのモデルだろう。

Linuxであれば、swapの活用*1によって、このような事態を回避できるのだが、root権限のないAndroidでは、この方法が使えないのだ。

2023-04-07 - To non-Japanese reader

I found that some non-Japanese readers read this post with machine translation. Although I am not sure that which my English or translated English is better for you, here is the other post written in English. I wish it will bring better reading experience to you.
impsbl.hatenablog.jp

ビルド環境

この投稿ではLinuxを用いている。Windowsでも同様の作業は可能なのだが、WSL上*2で作業することをお勧めする。CMakeとmakeの事前準備が厄介なのだ。

この投稿では、次の環境を用いている。

GitHubに掲載されている指示に従って、Alpaca 7Bモデルをダウンロードする。そのサイズは4GBだ。このサイズのファイルをダウンロードするために、GitHubページでは、次の方法が提示されている。この投稿ではBitTorrentを用いた。

実行ファイルのビルド

Android NDKが次のフォルダに保存されているとする。

/opt/android-ndk-r25c/

この前提では、"android.toolchain.cmake"のパスは次のようになる。

/opt/android-ndk-r25c/build/cmake/android.toolchain.cmake

ソースコードは次のフォルダに保存されているとする。

~/work/alpaca-android/

このフォルダで次のコマンドを実行すると、"build"フォルダに実行ファイル"chat"が生成される。

mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=/opt/android-ndk-r25c/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-23 -DCMAKE_C_FLAGS=-march=armv8.4a+dotprod ..
make

Termux

Androidで"chat"を実行するには、ターミナル・アプリケーションが必要だ。この投稿ではTermuxを用いている。このアプリケーションをGitHub、あるいはF-Droidから入手する。Google Playから入手してはいけない事情*7がある。

github.com f-droid.org

Termuxはストレージの参照権限を必要とする。まずAndroidの設定から、権限を割り当てる。
基本的にTermuxは自分自身のフォルダ配下しかコントロールすることができない。具体的には次のフォルダだ。

/data/data/com.termux/files/home

Android内のストレージを参照するため、次のコマンドを実行する。フォルダ配下に"storage"フォルダが生成され、そこにAndroidの内部ストレージマウントされる。

termux-setup-storage

ファイルのコピーから実行まで

Termuxから"chat"を実行するには、その配下へ保存する必要がある。"chat"を実行するまでには、次の過程を経ることになる。

  1. 実行ファイル"chat"とAlpacaモデルをAndroid端末へコピーする。ここでは"Download"フォルダ配下の"alpaca"フォルダとする。
  2. そこからTermuxへコピーする。
  3. ファイル"chat"に実行権限を割り当てる。
  4. "chat"を実行するには、その配下へ保存する必要がある。

一連のコマンドは次のようになる。

mkdir alpaca
cp storage/shared/Download/aplaca/* ./alpaca/.
cd alpaca/
chmod 777 chat
./chat

余談

そして不幸なことに、メモリ不足によって、この実行プロセスが強制終了されるのだった。

rootを取り、swapを設定して動く可能性もあるかもしれないが、ここは素直に端末の買い替えを検討すべきところなのだろう。

twitter.com