Open7

web-llm - WebGPUの力を借りてLLMを動かす(中断中)

kale_corekale_core

ブラウザを実行している端末のリソースを使ってLLMを動かせる
examplesにあるものを動かしてみたい
https://github.com/mlc-ai/web-llm

せっかくなら日本語のモデルを動かしてみたいのでその準備から
環境はUbuntu 22.04

kale_corekale_core

https://llm.mlc.ai/docs/compilation/compile_models.html

これによれば以下の2つが必要

  • TVM Unityコンパイラ
  • Wasm ビルド環境

TVM Unityコンパイラ

https://llm.mlc.ai/docs/install/tvm.html#install-tvm-unity

以下の2択

  • Prebuilt Package
  • ソースからビルド

ここでCUDAのバージョンを勘違いをし、ソースからビルドする道を選ぶ

cmake 古かったのでアップデートした
https://qiita.com/sunrise_lover/items/810977fede4b979c382b

LLVM 古かったのでアップデートした
https://qiita.com/yoshiyasu1111/items/3815af53a25b3b1df0f4

condaでビルドするのがいいらしい
pyenvでcondaに相当する環境をインストール

pyenv install anaconda3-2022.10
git clone --recursive https://github.com/mlc-ai/relax.git tvm-unity && cd tvm-unity
pyenv local anaconda3-2022.10
conda env remove -n tvm-build-venv
conda create -n tvm-build-venv -c conda-forge \
    "llvmdev>=15" \
    "cmake>=3.24" \
    git

(ここで一度 シェル再起動)
conda activate tvm-build-venv
rm -rf build && mkdir build && cd build
# specify build requirements in `config.cmake`
cp ../cmake/config.cmake .

# controls default compilation flags
echo "set(CMAKE_BUILD_TYPE RelWithDebInfo)" >> config.cmake
# LLVM is a must dependency
echo "set(USE_LLVM \"llvm-config --ignore-libllvm --link-static\")" >> config.cmake
echo "set(HIDE_PRIVATE_SYMBOLS ON)" >> config.cmake

cmake .. && cmake --build . --parallel $(nproc)

buildディレクトリにlivtvm.so などができる

kale_corekale_core

Wasm ビルド環境

https://llm.mlc.ai/docs/install/emcc.html

EMSDKのemccコマンドを使えるようにする必要あり
https://emscripten.org/docs/getting_started/downloads.html#installation-instructions-using-the-emsdk-recommended

git clone https://github.com/emscripten-core/emsdk.git
cd emsdk
git pull
./emsdk install latest
./emsdk activate latest
source ./emsdk_env.sh
(追記しておく)
echo "source ~/emsdk/emsdk_env.sh">>~/.bashrc

TVMの場所を環境変数にセットしておく

export TVM_HOME=~/tvm-unity

簡単なスクリプトを使って、webフォルダでmakeするみたい

git clone https://github.com/mlc-ai/mlc-llm.git --recursive
cd mlc-llm
./scripts/prep_emcc_deps.sh

${TVM_HOME}/web/dist/wasmに
bcファイルができていればビルド成功

kale_corekale_core

ここまで来てMLCビルドのステップに入れる

TVMをインストールしよう

conda create -n mcm-build-venv
conda activate mcm-build-venv
conda install python
cd ~/tvm-unity/python
pip install -e .

PyTorchのインストールは今まで間違ってCUDA12を入れていたことがわかった
CUDA11.7用を入れるとビルドがうまく動くようになった

cd ~/mlc-llm
pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2
python3 -m mlc_llm.build --help

モデルとしてrinna株式会社Youri 7BをWebGPU用にビルドする

python3 -m mlc_llm.build --hf-path rinna/youri-7b-chat --target webgpu --quantization q4f16_1

distディレクトリにyouri-7b-chat-q4f16_1ができる
paramsディレクトリにはモデルの重みやトーナイザーのファイルなど多数

kale_corekale_core

ここから専門外の未知の領域へ突入
web-llmのexampleを見る限りモデルの置き方は以下がある

  • ローカル
  • Hugging Face

ローカルの方はhttpサーバーを起動するシェルスクリプトを動かすようす
比較的、書き換えるべきところがわかりやすいと感じた
next-simple-chatを試すことにした
asyncInitChatのモデルを変えれば良さそう

chat_ui.ts
            await this.chat.reload("youri-7b-chat-q4f16_1", undefined, {
                "model_list": [
                    {
                        "model_url": "https://huggingface.co/kale4eat/mlc-youri-7b-chat-q4f16_1/resolve/main/youri-7b-chat-q4f16_1/params/",
                        "local_id": "youri-7b-chat-q4f16_1"
                    },
                ],
                "model_lib_map": {
                    "youri-7b-chat-q4f16_1": "https://huggingface.co/kale4eat/mlc-youri-7b-chat-q4f16_1/resolve/main/youri-7b-chat-q4f16_1/youri-7b-chat-q4f16_1-webgpu.wasm",
                },
            });

このあたりよくわかっていないがコマンドを繰り返して最終的には起動できた

./scripts/prep_deps.sh
cd examples/next-simple-chat
npm install
npm run build
npm run dev

WebGPUに対応しているFirefox Nightyをインストールした
有効にする設定も必要
https://onagat.hatenablog.com/entry/2020/06/15/014540

ここでアクセスしていざチャットを始めると
別の方のトライした記録で起きていたエラーがこちらでも再現した
調べるとTVM Unityコンパイラのソースに問題があったそう
https://github.com/mlc-ai/web-llm/issues/216
ソースを修正して、ビルドし直すところからやり直した

kale_corekale_core

web-llmのexampleをgenerate エラー
慣れないTypeScriptのデバッグ環境準備は困難を極め、
しばらく解決の糸口をつかむことはできなかった
しかし、最近になってリポジトリの修正やビルド手順変更が入るなど、
大幅にテコ入れあったもよう
再度、挑戦する


まず、TVM Unityコンパイラのソースからのビルドをやり直す
MLCビルドの新しい手順も確認していく

MLC LLM Python

python3 -m pip install --pre -U -f https://mlc.ai/wheels mlc-chat-nightly-cu117 mlc-ai-nightly-cu117

重み変換

mlc_chat convert_weight  ./dist/models/youri-7b-chat --quantization q4f16_1 -o dist/mlc-youri-7b-chat-q4f16_1/params

ここで私のPC特有の問題発生
CUDAのバージョンが古いせいだと考えられる
環境を再セットアップし直してチャレンジしたい

kale_corekale_core

ドライバ, CUDA, cuDNNなどを整えてやり直し
しかし、モデルのcompileの段でこけてしまう
自分の環境のせいの線も消し切れないが
Google Colabでもエラーになるのでまだ動作が安定していないと考えられる
ワンクリックでコンパイルまでいけるnotebookができたので
これを定期的に試してみて開発の動向を確認していきたい