DeepInfraと公式Pythonライブラリの詳細解説:AIモデル推論を手軽に🚀

AI / 機械学習

近年、大規模言語モデル(LLM)をはじめとするAIモデルの進化は目覚ましいものがあります。しかし、これらの高性能なモデルを実際にアプリケーションに組み込んで利用するには、専門的な知識や高価な計算リソース(GPUなど)が必要となり、多くの開発者にとってハードルが高いものでした。

そんな課題を解決するために登場したのが、DeepInfraです。DeepInfraは、様々なオープンソースのAIモデルを、手軽かつ低コストで利用できるサーバーレスの推論プラットフォームです。本記事では、DeepInfraの概要とその公式Pythonライブラリの使い方について、詳しく解説していきます。

DeepInfraとは?🤔

DeepInfraは、2022年9月に設立された、AI推論(Inference)に特化したクラウドサービスです。開発者は、複雑なインフラ管理(ML Ops)や高価なGPUの購入・運用から解放され、シンプルなAPIを通じて最新のAIモデルを利用できます。

主な特徴は以下の通りです。

  • サーバーレス: インフラの管理やスケーリングをDeepInfra側が自動で行うため、開発者はアプリケーション開発に集中できます。
  • 低コスト: 従量課金制(トークン数または実行時間ベース)を採用しており、使った分だけ支払うシンプルな料金体系です。初期費用や長期契約は不要です。
  • 高速・低レイテンシ: モデルは複数のリージョンにデプロイされ、自動スケーリングにより、常に高速な推論速度と低い遅延(レイテンシ)を維持します。
  • 豊富なモデル: MetaのLlama 3、Mistral、GoogleのGemma、Qwenなど、100種類以上の最新かつ人気のオープンソースモデルに対応しています。テキスト生成、画像生成、音声認識、埋め込み(Embeddings)など、多様なタスクに対応するモデルが利用可能です。
  • 簡単なAPI: REST APIや、OpenAI互換のAPIエンドポイントを提供しており、既存のツールやライブラリ(LangChain, LlamaIndex, OpenAI公式ライブラリなど)との連携も容易です。
  • カスタムモデル対応: ファインチューニングしたモデルやLoRAアダプターを使用したモデルのホスティングにも対応しており、特定のユースケースに合わせたカスタマイズが可能です。

DeepInfraは、特にコストを抑えつつAI機能をアプリケーションに組み込みたい中小企業や個人開発者にとって、非常に魅力的な選択肢となっています。2023年11月には、800万ドルのシードラウンド資金調達を発表し、今後の成長が期待されています。

💡 推論 (Inference) とは?

学習済みのAIモデルを使って、新しいデータに対して予測や分類、生成などのタスクを実行することです。例えば、学習済みの大規模言語モデルに質問文(プロンプト)を入力し、回答文を生成させるプロセスが推論にあたります。AIモデルの開発は「学習」と「推論」のフェーズに分けられ、DeepInfraはこの「推論」部分をサービスとして提供しています。

DeepInfra Pythonライブラリの紹介🐍

DeepInfraは、より簡単にAPIを利用できるように、いくつかの公式・非公式ライブラリを提供しています。その中でも、Python開発者向けには、主に以下の選択肢があります。

  • OpenAI Pythonライブラリの利用: DeepInfraはOpenAI互換のAPIエンドポイントを提供しているため、既存の`openai` Pythonライブラリをそのまま利用できます。これは、特にLLMや埋め込みモデルを扱う場合に推奨される方法です。
  • LangChain / LlamaIndex 統合: LangChainやLlamaIndexといった人気のLLMアプリケーションフレームワークには、DeepInfra用のインテグレーションが用意されています。これらのフレームワークを使っている場合は、簡単にDeepInfraをバックエンドとして利用できます。
  • 非公式 `deepinfra` Pythonライブラリ: GitHub (ovuruska/deepinfra-python) で開発されている非公式のラッパーライブラリも存在します。これはDeepInfraのネイティブAPIをよりPythonicに扱えるように設計されています。(2024年3月21日にPyPIにバージョン0.1.0が公開されています)
  • 直接HTTPリクエスト: ライブラリを使わず、`requests`などのHTTPクライアントライブラリを使って直接APIを呼び出すことも可能です。

本記事では、最も一般的なユースケースであるOpenAI Pythonライブラリを利用する方法を中心に解説します。この方法は、多くの開発者にとって馴染み深く、移行も容易なためです。

🔗 参考リンク

利用開始までのステップ 🚀

1. アカウント作成とAPIキーの取得

まず、DeepInfraのウェブサイト (https://deepinfra.com/) にアクセスし、アカウントを作成します。GitHubアカウントでのログインが簡単です。

ログイン後、ダッシュボードの「API Keys」セクション (https://deepinfra.com/dash/api_keys) に移動し、「New API Key」をクリックして新しいAPIキーを生成します。キーには分かりやすい名前をつけておきましょう。生成されたAPIキーは後で使用するため、安全な場所にコピーしておいてください。このキーは第三者に漏洩しないよう注意が必要です。

新規登録ユーザーには、通常、無料クレジット(例:1時間分のサーバーレスGPUコンピューティング)が付与されるため、いくつかのモデルを試すことができます。

2. 必要なライブラリのインストール

OpenAI互換APIを利用するため、`openai`ライブラリをインストールします。

pip install openai

もし、LangChainやLlamaIndexを使う場合は、それぞれのDeepInfraインテグレーション用パッケージもインストールしてください。

# LangChainの場合
pip install langchain-community langchain-openai

# LlamaIndexの場合
pip install llama-index-llms-deepinfra

(注意: 2025年4月時点の情報に基づいています。パッケージ名は変更される可能性があるため、各ライブラリの公式ドキュメントを確認してください。)

3. 認証の設定

APIキーをプログラムに設定する方法はいくつかありますが、最も一般的なのは環境変数を使用する方法です。

ターミナルで以下のコマンドを実行するか、`.env`ファイルなどに設定します。

export DEEPINFRA_API_TOKEN='YOUR_API_KEY_HERE'

Pythonスクリプト内で直接設定することも可能です(セキュリティには注意が必要です)。

import os
from openai import OpenAI

# 環境変数から読み込む場合 (推奨)
# os.environ['DEEPINFRA_API_TOKEN'] = 'YOUR_API_KEY_HERE' # スクリプト内で設定する場合

# または、クライアント初期化時に直接渡す
api_key = "YOUR_API_KEY_HERE" # または os.getenv("DEEPINFRA_API_TOKEN")

client = OpenAI(
    api_key=api_key,
    base_url="https://api.deepinfra.com/v1/openai" # DeepInfraのOpenAI互換エンドポイントを指定
)

重要なのは、`OpenAI`クライアントを初期化する際に、`api_key`にDeepInfraのAPIキーを、そして`base_url`にDeepInfraのOpenAI互換エンドポイント (`https://api.deepinfra.com/v1/openai`) を指定することです。これにより、`openai`ライブラリがDeepInfraのサーバーと通信するようになります。

基本的な使い方:テキスト生成 (Chat Completion) 💬

最も一般的なユースケースである、チャット形式のテキスト生成(Chat Completion)を試してみましょう。ここでは、Metaの`Llama-3-8B-Instruct`モデルを使用します。

import os
from openai import OpenAI

# APIキーの設定 (環境変数 DEEPINFRA_API_TOKEN を設定済みと仮定)
api_key = os.getenv("DEEPINFRA_API_TOKEN")
if not api_key:
    raise ValueError("APIキーが設定されていません。環境変数 DEEPINFRA_API_TOKEN を設定してください。")

# DeepInfraクライアントの初期化
client = OpenAI(
    api_key=api_key,
    base_url="https://api.deepinfra.com/v1/openai"
)

# 使用するモデルIDを指定
model_id = "meta-llama/Meta-Llama-3-8B-Instruct"

try:
    # Chat Completion APIを呼び出す
    chat_completion = client.chat.completions.create(
        model=model_id,
        messages=[
            {"role": "system", "content": "あなたは親切なAIアシスタントです。"},
            {"role": "user", "content": "DeepInfraについて簡単に教えてください。"}
        ],
        max_tokens=150, # 最大生成トークン数
        temperature=0.7, # 生成のランダム性 (0に近いほど決定的)
        stream=False # ストリーミングを無効にする (Trueにすると逐次結果が返る)
    )

    # 結果の表示
    if chat_completion.choices:
        assistant_message = chat_completion.choices[0].message.content
        print("AIの応答:")
        print(assistant_message)

        # 使用量情報の表示 (コスト見積もりなど)
        print("\n使用量:")
        print(f" プロンプトトークン数: {chat_completion.usage.prompt_tokens}")
        print(f" 生成トークン数: {chat_completion.usage.completion_tokens}")
        print(f" 合計トークン数: {chat_completion.usage.total_tokens}")
        # コスト見積もりはモデルや契約によって異なるため、DeepInfraの料金ページを参照してください
        if hasattr(chat_completion.usage, 'estimated_cost'):
             print(f" 見積もりコスト: {chat_completion.usage.estimated_cost}")

    else:
        print("応答がありませんでした。")

except Exception as e:
    print(f"エラーが発生しました: {e}")

このコードは、OpenAI APIを使ったことがある方にはお馴染みの形式です。`client.chat.completions.create`メソッドを使用し、以下の主要なパラメータを指定します。

  • `model`: 使用するDeepInfra上のモデルIDを指定します。利用可能なモデルはDeepInfraのウェブサイトで確認できます。モデル名の形式は `ベンダー名/モデル名` (例: `meta-llama/Meta-Llama-3-8B-Instruct`) や、単に `モデル名` (DeepInfraがホストする場合) となります。
  • `messages`: 会話履歴をリスト形式で渡します。`role`には `system` (AIの役割設定), `user` (ユーザーの発言), `assistant` (AIの発言) があります。
  • `max_tokens`: 生成されるテキストの最大トークン数を制限します。
  • `temperature`: 出力のランダム性を制御します。値を低くすると(例: 0.2)、より決定的で一貫性のある応答になります。高くすると(例: 1.0)、より多様で創造的な応答になりますが、時に不正確になる可能性もあります。
  • `stream`: `True`に設定すると、応答が一度に返されるのではなく、トークンが生成されるたびに逐次的に返されます。リアルタイム性が求められるアプリケーション(チャットボットなど)に有効です。

応答オブジェクト (`chat_completion`) には、生成されたテキスト (`choices[0].message.content`) や、使用したトークン数などの情報 (`usage`) が含まれます。

ストリーミング応答の処理

`stream=True` を指定した場合、応答はイテレータとして返されます。各要素(チャンク)には、生成されたトークンの一部が含まれています。

import os
from openai import OpenAI

api_key = os.getenv("DEEPINFRA_API_TOKEN")
if not api_key:
    raise ValueError("APIキーが設定されていません。")

client = OpenAI(
    api_key=api_key,
    base_url="https://api.deepinfra.com/v1/openai"
)

model_id = "meta-llama/Meta-Llama-3-8B-Instruct"

try:
    stream = client.chat.completions.create(
        model=model_id,
        messages=[{"role": "user", "content": "Pythonで簡単なWebサーバーを立てるコードを書いてください。"}],
        stream=True,
        max_tokens=300
    )

    print("AIの応答 (ストリーミング):")
    full_response = ""
    for chunk in stream:
        if chunk.choices and chunk.choices[0].delta and chunk.choices[0].delta.content:
            content_part = chunk.choices[0].delta.content
            print(content_part, end="", flush=True) # flush=Trueで即時表示
            full_response += content_part
    print("\n--- ストリーミング終了 ---")
    # print("\n完全な応答:\n", full_response) # 必要であれば完全な応答を後で利用

except Exception as e:
    print(f"\nエラーが発生しました: {e}")

ストリーミングを使用すると、ユーザーは最初の応答を早く受け取ることができるため、体感速度が向上します。長いテキストを生成する場合に特に有効です。各チャンクの`choices[0].delta.content`に生成されたテキストの一部が含まれています。

DeepInfraはテキスト生成以外にも様々なモデルを提供しており、Pythonライブラリを通じて利用できます。

Stable Diffusionなどの画像生成モデルも利用可能です。DeepInfraは専用の推論エンドポイントを提供しているため、`openai`ライブラリではなく、`requests`などを使って直接APIを呼び出すか、非公式ライブラリを使うのが一般的です。(将来的にOpenAI互換APIでサポートされる可能性もあります)

以下は`requests`を使った例です (注意: このエンドポイントや形式はモデルによって異なります)。

import requests
import json
import os
import base64
from io import BytesIO
# from PIL import Image # 画像表示に使う場合

api_key = os.getenv("DEEPINFRA_API_TOKEN")
if not api_key:
    raise ValueError("APIキーが設定されていません。")

# 例: Stable Diffusionモデルのエンドポイント (モデルによって異なる)
model_id = "stabilityai/stable-diffusion-xl-1024-v1-0" # 例
inference_url = f"https://api.deepinfra.com/v1/inference/{model_id}"

headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json"
}

payload = {
    "input": {
        "prompt": "A photo of an astronaut riding a horse on the moon",
        "negative_prompt": "blurry, low quality, text, signature",
        "num_inference_steps": 25,
        "guidance_scale": 7
        # その他のパラメータはモデルドキュメント参照
    }
}

try:
    response = requests.post(inference_url, headers=headers, json=payload)
    response.raise_for_status() # エラーチェック

    result = response.json()

    if 'images' in result and result['images']:
        # 画像データは通常Base64エンコードされている
        image_data_base64 = result['images'][0]
        image_data = base64.b64decode(image_data_base64)
        print("画像生成に成功しました!")

        # 画像をファイルに保存する場合
        with open("generated_image.png", "wb") as f:
            f.write(image_data)
        print("画像を generated_image.png として保存しました。")

        # Pillowを使って表示する場合 (別途 pip install Pillow が必要)
        # img = Image.open(BytesIO(image_data))
        # img.show()

    elif 'error' in result:
         print(f"エラーが発生しました: {result['error']}")
    else:
        print("予期しない応答形式です:", result)


except requests.exceptions.RequestException as e:
    print(f"APIリクエストエラー: {e}")
    if e.response is not None:
        print("応答内容:", e.response.text)
except Exception as e:
    print(f"予期せぬエラー: {e}")

画像生成モデルは、入力 (`input`) の形式がモデルごとに異なる場合が多いです。DeepInfraの各モデルページにある「API」セクションで、必要なパラメータを確認してください。

テキストの埋め込みベクトル(意味的な特徴を捉えた数値ベクトル)を生成するモデルも、OpenAI互換APIで利用できます。セマンティック検索や類似文書検索、クラスタリングなどに活用できます。

import os
from openai import OpenAI

api_key = os.getenv("DEEPINFRA_API_TOKEN")
if not api_key:
    raise ValueError("APIキーが設定されていません。")

client = OpenAI(
    api_key=api_key,
    base_url="https://api.deepinfra.com/v1/openai"
)

# 例: BAAIの汎用埋め込みモデル
model_id = "BAAI/bge-large-en-v1.5" # 例、利用可能な埋め込みモデルを確認してください

try:
    response = client.embeddings.create(
        input = ["DeepInfraはAI推論プラットフォームです。", "東京の天気は晴れです。"],
        model= model_id
    )

    # 各テキストに対応する埋め込みベクトルを取得
    embedding1 = response.data[0].embedding
    embedding2 = response.data[1].embedding

    print(f"1つ目のテキストの埋め込みベクトルの次元数: {len(embedding1)}")
    # print("埋め込みベクトル1 (最初の10要素):", embedding1[:10])
    print(f"2つ目のテキストの埋め込みベクトルの次元数: {len(embedding2)}")
    # print("埋め込みベクトル2 (最初の10要素):", embedding2[:10])

    # コサイン類似度などを計算してテキスト間の意味的な近さを測ることができる
    # (別途 numpy などが必要)
    # import numpy as np
    # cos_sim = np.dot(embedding1, embedding2) / (np.linalg.norm(embedding1) * np.linalg.norm(embedding2))
    # print(f"\nテキスト間のコサイン類似度: {cos_sim}")

    print("\n使用量:")
    print(f" プロンプトトークン数: {response.usage.prompt_tokens}")
    print(f" 合計トークン数: {response.usage.total_tokens}")


except Exception as e:
    print(f"エラーが発生しました: {e}")

`client.embeddings.create`メソッドを使用し、`input`にテキストのリストを、`model`に埋め込みモデルのIDを指定します。

DeepInfraは上記以外にも、自動音声認識 (ASR: Whisperなど)、物体検出、トークン分類など、多様なモデルを提供しています。これらの多くは専用の推論APIエンドポイント (`https://api.deepinfra.com/v1/inference/{model_id}`) を持ちます。

基本的な使い方は画像生成の例と同様で、`requests`ライブラリなどを用いて、各モデルのAPIドキュメントに従ってリクエストを送信します。非公式の`deepinfra` Pythonライブラリ (ovuruska/deepinfra-python) は、これらのタスク用のメソッドを提供している場合があり、より便利に利用できる可能性があります。

料金体系について 💰

DeepInfraの料金体系は、使用するモデルの種類によって異なりますが、主に2つのタイプがあります。

  1. トークン課金: 主に大規模言語モデル(LLM)で採用されています。入力トークン数と出力(生成)トークン数に基づいて課金されます。料金は通常「100万トークンあたり」で表示されます(例: $0.03 / 1M input tokens)。
  2. 時間課金: 画像生成モデルや一部の特殊なモデルなどで採用されています。モデルが推論を実行していた時間(秒またはミリ秒単位)に基づいて課金されます。

共通しているのは、従量課金制である点です。利用した分だけ料金が発生し、初期費用や最低利用料金、長期契約の縛りはありません。これにより、スモールスタートが可能で、需要に応じて柔軟にスケールアップ・ダウンできます。

具体的な料金はモデルごとに設定されており、DeepInfraの料金ページ (https://deepinfra.com/pricing) で詳細を確認できます。人気のあるモデルサイズ(例: 7B/8B, 13B, 70B パラメータ)ごとに料金が比較されており、性能とコストのバランスを考慮してモデルを選択できます。例えば、2025年4月時点の情報では、Llama-3.1-8B-Instructは100万入力トークンあたり$0.03、Llama-3.1-70B-Instructは$0.23といった料金設定が見られます。これは、OpenAIなどのプロプライエタリなモデルと比較して、大幅に安価な場合があります。

また、使用量に応じて自動的に適用される割引(Usage Tiers)も用意されており、利用が増えるほど単価が安くなる可能性があります。カスタムLLMをデプロイするための専用GPUインスタンス(A100, H100など)のオプションも提供されており、こちらは分単位の課金となります。

⚠️ 注意

料金体系や具体的な価格は変更される可能性があります。常に公式サイトで最新の情報を確認するようにしてください。

まとめ ✨

DeepInfraは、最新のオープンソースAIモデルを手軽かつ低コストで利用可能にする強力なプラットフォームです。サーバーレスアーキテクチャによりインフラ管理の手間を省き、シンプルなAPI(特にOpenAI互換API)を通じて、Pythonをはじめとする様々な言語から簡単にAI機能をアプリケーションに組み込むことができます。

公式の`openai` Pythonライブラリを使えば、既存のコード資産を活かしつつ、バックエンドをDeepInfraに切り替えることも比較的容易です。テキスト生成、画像生成、埋め込みなど、多様なAIタスクに対応するモデルが揃っており、従量課金制の料金体系は多くの開発者にとって魅力的でしょう。

AIを活用したアプリケーション開発のハードルを下げ、イノベーションを加速させるDeepInfraとそのPythonライブラリ(またはその利用法)を、ぜひ試してみてはいかがでしょうか。😊

コメント

タイトルとURLをコピーしました