ctransformers で Transformer の推論を高速化する
Published on
はじめに
近年、Transformer をベースとした言語モデルは、自然言語処理において言語生成、質問応答、テキスト分類などのタスクで大きな成果を収めることができるようになりました。しかし、これらのモデルはしばしば非常に大規模であり、数十億または数兆のパラメータを持っており、特に CPU 上で実行する場合には計算コストが非常に高くなるため、展開が困難でした。
ctransformers は、これらの大規模な言語モデルの展開をより効率的かつアクセス可能にするための Python ライブラリです。これは、最適化された C/C++ コードで実装された Transformer モデルに対する Python のバインディングを提供し、量子化や AVX 命令の使用などの技術を活用して CPU ハードウェア上での推論を大幅に高速化します。
ctransformers を使用すると、GPT-2、GPT-J、GPT-NeoX、Llama などのモデルをわずか数行の Python コードでロードして実行することができます。このライブラリは、さまざまなモデルに対する簡単な統一されたインターフェース、Hugging Face Hub と LangChain フレームワークとの統合、より細粒度な制御のための低レベル API のアクセスを提供しています。
ctransformers とは?
ctransformers は、内部的に GGML ライブラリを使用しており、これは CPU 上で ML モデルを実行するためのテンソルライブラリです。GGML は、特に量子化されたデータ型に対して行列乗算などの一般的な演算の効率的な実装を提供しています。GGML をモデル特有の最適化カーネルと組み合わせることで、ctransformers は印象的なパフォーマンスを実現することができます。
ctransformers の最も注目すべき応用の一つは、Llama 2 のようなオープンソースの大規模モデルをコンシューマーハードウェア上で実行できるようにすることです。これにより、大規模言語モデルのコスト効率的かつ環境に優しい展開が可能となり、より広範なユーザーとアプリケーションにアクセスしやすくなります。
この記事では、ctransformers の詳細な技術的内容、機能、パフォーマンス特性、および API について詳しく説明します。モデルのロード、テキストの生成、LangChain との統合のコード例を通じて、効率的な CPU 推論の将来における NLP と AI の意義やポテンシャルについても議論します。
ctransformers の主な機能:
- 統一されたインターフェースを提供してさまざまなモデルをロードおよび実行する
- Hugging Face Hub でのモデルの実行をサポート
- LangChain フレームワークとの統合
- より制御の細かい低レベル C API へのアクセス
- AVX 命令を使用した最適化された CPU 推論
ctransformers のインストール
ctransformers をインストールするには、単に pip を使用します:
pip install ctransformers
GPU をサポートする場合は、CT_CUBLAS
の環境変数を設定してインストールします:
CT_CUBLAS=1 pip install ctransformers --no-binary ctransformers
ctransformers の基本的な使用方法
モデルのロードと実行のための主なクラスは AutoModelForCausalLM
です。以下は、モデルのロード方法の例です:
from ctransformers import AutoModelForCausalLM
# ローカルファイルからのロード
llm = AutoModelForCausalLM.from_pretrained('path/to/ggml-model.bin', model_type='gpt2')
# Hugging Face Hub からのロード
llm = AutoModelForCausalLM.from_pretrained('marella/gpt-2-ggml')
model_type
引数は、ロードされるモデルのタイプを指定します。gpt2
、gptj
、gpt_neox
、dolly-v2
、starcoder
などのオプションがあります。
テキストの生成は、モデルを呼び出すだけです:
output = llm("AI is going to")
print(output)
より制御するためには、ジェネレーターインターフェースがあります:
tokens = llm.tokenize("AI is going to")
for token in llm.generate(tokens):
print(llm.detokenize(token))
ctransformers と LangChain の統合
ctransformers は、LangChain フレームワークでモデルを使用するためのラッパーを提供します:
from ctransformers.langchain import CTransformers
llm = CTransformers(model='marella/gpt-2-ggml')
# LangChain のプリミティブと一緒に使用する
from langchain import PromptTemplate, LLMChain
template = """質問: {question}
回答:"""
prompt = PromptTemplate(template=template, input_variables=['question'])
llm_chain = LLMChain(prompt=prompt, llm=llm)
question = "AI とは何ですか?"
print(llm_chain.run(question))
Llama モデルの実行
ctransformers は、GGML フォーマットでオープンソースの Llama モデルを実行することができます。以下は、Llama 2 モデルを使用する例です:
from ctransformers import AutoModelForCausalLM
model_id = "TheBloke/Llama-2-7B-GGML"
config = {
'max_new_tokens': 256,
'repetition_penalty': 1.1,
'temperature': 0.1
}
llm = AutoModelForCausalLM.from_pretrained(
model_id,
model_type="llama",
config=config
)
prompt = "周期表の最初の10個の元素を覚えるのを助ける詩を書いてください"
output = llm(prompt)
print(output)
これは、GGML フォーマットに変換された 7B パラメータの Llama 2 モデルをロードし、与えられたプロンプトから詩を生成します。
config
辞書を使用すると、最大トークン数、繰り返しペナルティ、温度などのさまざまな生成パラメータを指定できます。
まとめ
ctransformers は、最適化された C/C++ 実装を使用して CPU 上で大規模な言語モデルを簡単かつ効果的に実行する方法を提供します。シンプルな Python の API、Hugging Face Hub や LangChain との統合、さまざまなモデルのサポートなどを備えた強力なツールです。 CPU上でLlama 2のようなモデルを実行する能力は、大規模な言語モデルのコスト効果的かつ環境にやさしい展開のための新たな可能性を開拓します。オープンソースのトランスフォーマーモデルのエコシステムが成長する中で、ctransformersのようなライブラリは、それらをアクセス可能で実用的に使用する上で重要な役割を果たします。