XinferenceでローカルLLMを使う

# はじめに

手元にあるPCでLLMを動かす方法としては、[Ollama](https://ollama.com/)などが有名ですが、他にも様々なツールがあります。そのうちの一つである[Xinference](https://inference.readthedocs.io/en/latest/)を紹介します。

# Xinferenceとは

Xinferenceは様々なAIモデルの操作と統合を合理化するオープンソースプラットフォームです。LLMだけでなく、画像生成、音声認識、embedding、rerankのモデルにも対応しています。また、モデルのエンジンとして、[vllm](https://github.com/vllm-project/vllm)、[sglang](https://github.com/sgl-project/sglang)、[llama.cpp](https://github.com/ggerganov/llama.cpp)、[transformers](https://github.com/huggingface/transformers)に対応しているため、量子化モデル(gguf、awqなど)も動かす事ができます。

https://inference.readthedocs.io/en/latest/

https://github.com/xorbitsai/inference

* 良い点:
  * embeddingに加えて、rerankモデルも扱える
  * 複数のモデルエンジンに対応しているので、扱えるモデルが豊富
* イマイチな点:
  * 対応しているアプリが少ない
  * OpenAI互換APIは備えているものの、それだとrerankが使えない

## 使い方

### セットアップ

Dockerを使う方法が簡単です。

```sh
docker run -d \
  -e XINFERENCE_HOME=/data \
  -v </on/your/host>:/data \
  -p 9997:9997 \
  --gpus all \
  --name xinference \
  xprobe/xinference:latest \
  xinference-local -H 0.0.0.0
```

公式ドキュメントにある様に、huggingfaceのcacheを他のアプリなどと共有して容量を節約したい場合は下記が良いです。

```sh
docker run -d \
  -v </your/home/path>/.xinference:/root/.xinference \
  -v </your/home/path>/.cache/huggingface:/root/.cache/huggingface \
  -v </your/home/path>/.cache/modelscope:/root/.cache/modelscope \
  -p 9997:9997 \
  --gpus all \
  --name xinference \
  xprobe/xinference:latest \
  xinference-local -H 0.0.0.0
```

### モデル起動

http\://localhost:9997/ にアクセスし、Launch Model から希望のモデルを選択します。
![Launch Model](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/4271fcdc-7658-3ea6-9735-87c03d632bae.png)

モデルファイルの形式、モデルサイズ、量子化パラメータなどを選択します。
![モデル形式](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/0a47e81f-e98c-5227-9a1d-74e355b8a8ae.png)
![モデルサイズ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/8c03fa6b-d6f4-8267-7543-17921749d9c8.png)
![量子化パラメータ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/43c8745a-ceaf-83d1-5bd9-cee59257e685.png)
左下のロケットを押すとモデルのダウンロードが始まり、実行されます。
(2回目からはCachedと表示されてダウンロードは飛ばせます。)

実行中のモデルはRuuning Modelsから確認できます。
![Ruuning Models](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/a1b02781-2897-ea36-190a-be9d114119cf.png)

一覧にないモデルはRegister Modelから追加できます。
![Register Model](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/f11e7aea-3943-2774-17bf-bdbed8f2c96d.png)
中国製だからか言語選択が英語と中国語しかありません。しかし、Lanch Modelにはenとzh以外のタグもあるので、内部的には他の言語も設定できる様ですし、llamaの様にenのみのモデルでも日本語が使えたりするので、あまり気にしなくても良さそうです。

CLIからモデルを起動することもできます。
例:

```sh
docker exec -it xinference xinference launch -n llama-3-instruct -f ggufv2 -s 8 -q Q5_K_M
docker exec -it xinference xinference launch -n bge-m3 -t embedding
docker exec -it xinference xinference launch -n bge-reranker-v2-m3 -t rerank
```

起動中のモデルは以下のコマンドで確認できます。

```sh
$ docker exec -it xinference xinference list
UID               Type    Name              Format      Size (in billions)  Quantization
----------------  ------  ----------------  --------  --------------------  --------------
llama-3-instruct  LLM     llama-3-instruct  ggufv2                       8  Q5_K_M

UID     Type       Name      Dimensions
------  ---------  ------  ------------
bge-m3  embedding  bge-m3          1024

UID                 Type    Name
------------------  ------  ------------------
bge-reranker-v2-m3  rerank  bge-reranker-v2-m3
```

### チャット実行

Runnning ModelsからWeb UIを起動すると、チャットができます。お馴染みのGradioの画面ですね。
![Web UI](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/3318b4cb-42aa-7a37-d826-156f62c47898.png)
他にも、PythonやWeb APIから使う事ができます。詳しくは公式ドキュメントを参照してください。

# まとめ
Xinferenceの使い方を紹介しました。これ単体ではただの良くあるLLMアプリですが、rerankモデルが使えるのでRAGアプリと組み合わせると効果的です。この辺は次回以降紹介していきたいと思います。