LLMの実行方法と周辺ツールまとめ

# はじめに

近年、言語モデリング（LLM）分野の発展はめざましく、プロプライエタリなモデルからオープンソースのモデルまで、様々なLLMが開発されています。またこの流れに伴い、LLMを有効に活用するためのサービスやツールが数多く提供されています。

本記事ではこれらの動向を踏まえ、各モデルに応じた推論の実行方法および周辺のツール類に焦点を当てて紹介します。

# LLMの実行方法

## プロプライエタリモデル

非公開のプロプライエタリモデルについては、開発元が提供する環境上でLLMを実行することができます。みなさんご存知、[ChatGPT](https://chat.openai.com/)もその一つです。

また開発元が提供しているAPIを利用して推論を実行できる場合もあります。こちらの場合は、開発元からAPIキーを取得する必要があります。
どのサービスであってもAPIを呼び出していることに変わりはないので、標準ライブラリを用いたHTTPリクエストによりAPIを呼び出すことができます。

以下Pythonによる呼び出しの例です。

```python
# HTTPリクエストによるGPT-3.5の呼び出し
import requests
import json
response = requests.post(
    'https://api.openai.com/v1/chat/completions',
    headers = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer $API_KEY'
    },
    data = json.dumps({
        'model': 'gpt-3.5-turbo',
        'messages': [{'role': 'user', 'content': 'Hello!'}],
    })
)
```

またプロプライエタリモデルには概ね、API呼び出しのための専用のライブラリが準備されています。
先程の標準ライブラリによる呼び出しに比べ、より簡易に記述することができます。

|使用するLLM    |Pythonライブラリ名|
|---           |---     |
|GPT-3.5, GPT-4|openai  |
|PaLM 2        |vertexai|
|Command       |cohere  |
|︙            |︙     　 |

以下はGPT-3.5とPaLM 2を呼び出した例です。

```python
# openaiライブラリを用いたGPT-3.5の呼び出し
import openai
response = client.chat.completions.create(
    model = "gpt-3.5-turbo",
    messages = [
        {"role": "user", "content": "Hello!"},
    ]
)

# vertexaiライブラリを用いたPaLM 2の呼び出し
from vertexai.language_models import TextGenerationModel
model = TextGenerationModel.from_pretrained("text-bison@001")
response = model.predict(
    "Hello!",
)
```

## オープンソースモデル

### 手元の環境で実行

オープンソースのモデルについては、学習済みのモデルを手元の環境にダウンロードし、実行することができます。

オープンソースモデルはその多くが[Huggingface Transformers](https://huggingface.co/docs/transformers/index)形式に準拠する形で提供されており、[Model Hub](https://huggingface.co/models)に公開されています。

以下はTransformersライブラリを用いてELYZA-7bを動かしてみた例です。

```python
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

tokenizer = AutoTokenizer.from_pretrained(
    "elyza/ELYZA-japanese-Llama-2-7b-instruct"
)
model = AutoModelForCausalLM.from_pretrained(
    "elyza/ELYZA-japanese-Llama-2-7b-instruct", 
    torch_dtype=torch.float16,
    device_map="auto"
)

prompt = """


こんにちは！
"""

with torch.no_grad():
    token_ids = tokenizer.encode(prompt, return_tensors="pt")
    output_ids = model.generate(
        token_ids.to(model.device),
        max_new_tokens=256,
        pad_token_id=tokenizer.pad_token_id,
        eos_token_id=tokenizer.eos_token_id,
    )
output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1) :])
print(output)
```

たったこれだけのプログラムで、LLMのダウンロード・推論ができます。

### どこかにモデルをデプロイしAPIでアクセスする

LLMの実行にあたっては、学習はもちろん、学習済みモデルを用いた推論でも大きな計算資源が要求されます。そのためLLMを実際にサービスとして活用していく段階では、どこかにモデルをデプロイし、APIでアクセスするというのも一つの選択肢になります。

デプロイのための具体的なツールについては次章で紹介します。

# 周辺のツール類

## LLMをデプロイするためのサービス

### Hugging face

[Hugging Face](https://huggingface.co/)では、同社のサービス上で共有されているLLMについて、APIを通じて推論などを実行するためのサービスを提供しています。

#### Inference API

無料で使用でき、主にモデルのデモ目的で使用されます。

https://huggingface.co/inference-api

#### Inference Endpoints

有料で、高度なセットアップやセキュリティを提供します。

https://huggingface.co/inference-endpoints

### Amazon Bedrock

Amazonや主要なAIスタートアップ企業が提供するLLMを、APIを通じて利用できるようにするフルマネージドサービスです。様々なLLMから、ユースケースごとに適したモデルを選択できます。
ClaudeやCommandのようなプロプライエタリのモデルをサポートしているのが特徴です。

https://aws.amazon.com/jp/bedrock/

### その他

そのほかにも、[Replicate](https://replicate.com/)や[Fireworks.ai](https://app.fireworks.ai/)なども同様のサービスを提供しています。

https://replicate.com/

https://app.fireworks.ai/


## API呼び出しをサポートするためのサービス

### LiteLLM

上記のような様々なAPI呼び出しを同様のインターフェイスで実現するためのライブラリです。
OpenAIやVertexAIをはじめとして、HuggingFaceなどもサポートしており、全て同様の形式で呼び出すことができます。

https://litellm.ai/

## 軽量化のためのツール

LLMの実行には多くの計算資源が要求されることから、量子化やランタイムの高速化など、ローカルで実行するための様々な取り組みがなされています。以下はそれら取り組みの例です。

### llama.cpp

C++で実装されたLLMのランタイムです。ランタイムの高速化に加え、GGUFというフォーマットで量子化されたモデルを用いることで、CPUのみのマシンでも実行可能な環境を実現しています。  
有名なオープンソースモデルの多くが量子化されており、それらはHugging Face上に公開されています。  
またLlamaベース以外のLLMにも一部対応しています（Falcon etc.）。

https://github.com/ggerganov/llama.cpp

### AutoGPTQ

モデルをGPTQというフォーマットで量子化するためのライブラリです。量子化したモデルはTransformersライブラリで実行することが出来ます。

https://github.com/PanQiWei/AutoGPTQ

### GPT4All

モデルとしてのGPT4Allとは別に、CPU環境上で動作する、LLMを学習・推論するためのソフトウェアとしてのGPT4Allというものが存在します。こちらのバックエンドはC APIを中心に構築されており、高速化を実現するとともに、C++やPythonなど他のプログラミング言語に拡張することができます。

https://gpt4all.io/index.html

### Ollama

LLMをローカルで実行するためのアプリケーションです。Llama 2ベースのLLMを多数サポートしており、量子化モデルを使用することでローカルでの推論を実現しています。デフォルトでは4bit量子化モデルが使用されます。
また起動しているアプリケーションにAPIを通じてアクセスすることで、推論を実行することもできます。

https://ollama.ai/

## LLMの機能を拡張するためのツール

### LangChain

LangChainは、LLMの機能拡張を効率的に実装するためのライブラリです。

主要6機能は以下の通りです。

1. Models：LLMの選択
2. Prompt：プロンプトの管理と最適化
3. Indexes：外部データの利用
4. Chains：複数プロンプトで一連の処理の実行
5. Agents：ツールの実行
6. Memory：対話履歴の保持

またサポートしている範囲が広く、例えば`1`のLLMの選択においても多数の方法が提供されています。上で紹介したツールは全てサポートされており、その中から適切なものを選択することが出来ます。

https://www.langchain.com/

### Llamaindex

Llamaindexは、LLMと外部データを接続するためのインターフェースを提供するライブラリです。外部データを適切な形で保存し、そこから必要なデータを抽出し、プロンプトに埋め込むといった処理を、効率よく、安全に実装することが出来ます。

https://www.llamaindex.ai/

# さいごに

本記事ではLLMの基本的な推論方法と周辺ツール類についてまとめました。こうしてまとめてみて、LLM活用に関する様々な取り組みについても知ることができました。この記事がみなさまのLLMライフの一助になりましたら幸いです。

最後までお読みいただきありがとうございます。

***

※記載内容に誤りがございましたら、ご指摘いただけますと幸いです。随時修正いたします。