web-llm - WebGPUの力を借りてLLMを動かす(中断中)
ブラウザを実行している端末のリソースを使ってLLMを動かせる
examplesにあるものを動かしてみたい
せっかくなら日本語のモデルを動かしてみたいのでその準備から
環境はUbuntu 22.04
これによれば以下の2つが必要
- TVM Unityコンパイラ
- Wasm ビルド環境
TVM Unityコンパイラ
以下の2択
- Prebuilt Package
- ソースからビルド
ここでCUDAのバージョンを勘違いをし、ソースからビルドする道を選ぶ
cmake 古かったのでアップデートした
LLVM 古かったのでアップデートした
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 などができる
Wasm ビルド環境
EMSDKのemccコマンドを使えるようにする必要あり
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ファイルができていればビルド成功
ここまで来て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ディレクトリにはモデルの重みやトーナイザーのファイルなど多数
ここから専門外の未知の領域へ突入
web-llmのexampleを見る限りモデルの置き方は以下がある
- ローカル
- Hugging Face
ローカルの方はhttpサーバーを起動するシェルスクリプトを動かすようす
比較的、書き換えるべきところがわかりやすいと感じた
next-simple-chatを試すことにした
asyncInitChatのモデルを変えれば良さそう
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をインストールした
有効にする設定も必要
ここでアクセスしていざチャットを始めると
別の方のトライした記録で起きていたエラーがこちらでも再現した
調べるとTVM Unityコンパイラのソースに問題があったそう
ソースを修正して、ビルドし直すところからやり直した
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のバージョンが古いせいだと考えられる
環境を再セットアップし直してチャレンジしたい
ドライバ, CUDA, cuDNNなどを整えてやり直し
しかし、モデルのcompileの段でこけてしまう
自分の環境のせいの線も消し切れないが
Google Colabでもエラーになるのでまだ動作が安定していないと考えられる
ワンクリックでコンパイルまでいけるnotebookができたので
これを定期的に試してみて開発の動向を確認していきたい