41
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

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

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

LLMの実行方法

プロプライエタリモデル

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

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

以下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を呼び出した例です。

# 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形式に準拠する形で提供されており、Model Hubに公開されています。

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

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 = """<s>[INST]
こんにちは![/INST]"""

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では、同社のサービス上で共有されているLLMについて、APIを通じて推論などを実行するためのサービスを提供しています。

Inference API

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

Inference Endpoints

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

Amazon Bedrock

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

その他

そのほかにも、ReplicateFireworks.aiなども同様のサービスを提供しています。

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

LiteLLM

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

軽量化のためのツール

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

llama.cpp

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

AutoGPTQ

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

GPT4All

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

Ollama

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

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

LangChain

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

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

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

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

Llamaindex

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

さいごに

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

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


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

41
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?