🌊

mlc-llm on WSLでモデルの変換を行う

2023/11/21に公開

これまでのあらすじ

mlc-llmという、色々な環境でLLM推論をさせることができるプロジェクトがある。
https://llm.mlc.ai/docs/compilation/compile_models.html
先日、このmlc-llmの中の「web-llm」という、ブラウザで推論させる技術での推論を試した。
https://zenn.dev/saldra/articles/c5473bb01c9b15
前回の記事では推論までは成功したが、モデルの変換をWindowsで行うことに失敗したので、今回はWSL上で環境構築を行い、mlcモデルへの変換を実施、mlc-llm上で推論させることを目標とする。

環境構築

tvmのインストール
https://llm.mlc.ai/docs/install/tvm.html#install-tvm-unity

インストール確認のためにpython -c "import tvm; print(tvm.__file__)"を実施、以下エラーが発生。
OSError: libnvrtc.so.12: cannot open shared object file: No such file or directory
https://www.hinomaruc.com/check-torch-and-mxnet-on-google-colab-gpu/

cudaの問題であることがわかったので、これに従ってcudaを再度使えるようにする
https://tech.garilog.com/wsl-cuda-ubuntu/#index_id7
nvcc --versionでnvccのpathが通っていることを確認し、再度挑戦。
python -c "import tvm; print(tvm.__file__)"

/home/saldra/mlc-llm/.venv/lib/python3.10/site-packages/tvm/__init__.py

いけた。以下も確認する
python -c "import tvm; print(tvm._ffi.base._LIB)"

コンパイル

次にコンパイルしてみる
python -m mlc_llm.build --hf-path togethercomputer/RedPajama-INCITE-Chat-3B-v1 --target cuda --quantization q4f16_1
以下のエラーが発生

No such file or directory: 'nvcc'

venvにactivateしたらnvccのパスが通らなくなっていることを確認。同様の人が解決策を置いてくれていた。
https://discuss.tvm.apache.org/t/filenotfounderror-errno-2-no-such-file-or-directory-nvcc-nvcc/690/4
venvを読み込んだ後にexport PATH=/usr/local/cuda/bin:$PATHすれば良さそう。やってみたらnvcc読み込めた。

もう一度コンパイルしたらエラー。

  File "/home/saldra/mlc-llm/.venv/lib/python3.10/site-packages/torch/serialization.py", line 815, in load
    return _legacy_load(opened_file, map_location, pickle_module, **pickle_load_args)
  File "/home/saldra/mlc-llm/.venv/lib/python3.10/site-packages/torch/serialization.py", line 1033, in _legacy_load
    magic_number = pickle_module.load(f, **pickle_load_args)
_pickle.UnpicklingError: invalid load key, 'v'.

issueを漁ったところ、git-lfsがないとそうなるらしい。
https://github.com/mlc-ai/mlc-llm/issues/756

pip install git-lfs
rm -rf dist
python -m mlc_llm.build --hf-path togethercomputer/RedPajama-INCITE-Chat-3B-v1 --target cuda --quantization q4f16_1

全然反応がないように見えるが、根気よく待つ。

できたっぽいので、 ls dist/RedPajama-INCITE-Chat-3B-v1-q4f16_1で確認する

RedPajama-INCITE-Chat-3B-v1-q4f16_1-cuda.so  mod_cache_before_build.pkl  params

推論

mlc_chatで試してみる。
https://llm.mlc.ai/docs/deploy/rest.html
pip install --pre -U -f https://mlc.ai/wheels mlc-chat-nightly-cu122 mlc-ai-nightly-cu122
test_inference.py

from mlc_chat import ChatModule
from mlc_chat.callback import StreamToStdout

cm = ChatModule(model="dist/RedPajama-INCITE-Chat-3B-v1-q4f16_1/params",device="cuda")
cm.generate(prompt="What is the meaning of life?", progress_callback=StreamToStdout(callback_interval=2))

きちんと動いたことが確認できた

The meaning of life is a philosophical question that has been discussed since ancient times. The short answer is that there is no single meaning of life, as each life has different purposes and values. However, there are general themes and ideas that have been proposed as possible meanings of life, such as the pursuit of happiness, the search for truth, and the experience of awe.

おまけ

試行錯誤中、torchのバージョンを下げている
pip install --upgrade torch==2.0.0 --index-url https://download.pytorch.org/whl/cu118

Discussion