1. 主要ページへ移動
  2. メニューへ移動
  3. ページ下へ移動

QES ブログ

記事公開日

AOAIをフル活用!Pythonで並行処理を実現し、AIを爆速化

  • このエントリーをはてなブックマークに追加
最近、AIの進化は目覚ましいものがありますよね。Azure OpenAI Service (AOAI) を使って独自のAIアプリを開発する方も増えているのではないでしょうか。
そんな中で、もしあなたが「あれ?AIの応答がちょっと遅いな…」「たくさんのリクエストを処理しようとすると、全然進まない!」と 感じたことがあるなら、 このブログはきっと役に立つはずです。
その原因は、AIそのものの速度ではなく、「AIへの指示の出し方」にあるかもしれません。
実は、AIに複数のタスクを同時にこなしてもらうためのカギ、それが「並行実行」と「並列実行」という考え方なんです。

「通常実行」「並行実行」「並列実行」って何が違うの?

まずは、これら3つの実行方法の違いを、それぞれの得意分野と合わせて見ていきましょう。人間の仕事に例えるとイメージしやすいかもしれません。

1. 通常実行(直列実行):一つずつ順番に処理

これは一番分かりやすい方法です。あなたがAIに10個の質問をするとき、AIが1つ目の質問に答え終わってから2つ目、2つ目が終わってから3つ目…と、一つずつ順番にタスクをこなしていくイメージです。
  • 特徴: 処理がシンプルで管理しやすい。
  • 苦手なこと: 待ち時間が発生するため、全体の処理に時間がかかる。
  • 物理マシンの関わり: CPUもメモリも、基本的に1つのタスクに集中して使われる。

2. 並行実行(Concurrency):複数のタスクを「見かけ上」同時に処理

これは、AIが「Aさんの質問に答えている間に、Bさんの質問のデータも準備しておく」といったように、待ち時間が発生する部分をうまく利用して、別のタスクを進める方法です。 厳密には同時に処理しているわけではありませんが、人間から見ると「同時に進んでいるように見える」のが特徴です。
  • 得意なこと: ネットワーク通信やファイルの読み書きなど、待ち時間(I/O待ち)が多いタスクの処理効率を大幅に上げられます。今回のAOAIへのAPI呼び出しは、まさにこの「ネットワーク通信」に該当します。
  • 物理マシンの関わり: 主にCPUの切り替え能力やメモリの余裕が重要になります。一つのCPUコアで複数のタスクを効率よく切り替えながら処理します。

3. 並列実行(Parallelism):複数のタスクを「実際に」同時に処理

これは「Aさんの質問はAIの1号が、Bさんの質問はAIの2号が、同時に答える!」といったように、複数のCPUコアがそれぞれ別のタスクを実際に同時にこなす方法です。 本当に同時に複数の作業が進行するため、計算量の多いタスクなどで非常に高速化が期待できます。
  • 得意なこと: 大量の数値計算や画像処理など、CPUの計算能力を多く使うタスク(CPUバウンドなタスク)を高速化できます。
    ※しかし、Azure OpenAI ServiceへのAPI呼び出しのようなネットワーク通信が主体のタスクの場合、並列実行を試みても期待通りの速度向上は見込めません。むしろ、プロセスを起動・管理するためのオーバーヘッドが大きく、通常実行や並行実行よりも時間がかかってしまうことがあります。
  • 物理マシンの関わり: CPUのコア数が多ければ多いほど、多くのタスクを同時に処理できます。

実際のコードで速度を比較

それでは、実際にAOAIに複数の質問を投げかけ、それぞれの実行方法でどれくらい時間が変わるのか、Pythonコードで見てみましょう。

事前にライブラリのインストールや.envファイルへAzure OpenAI Service情報の設定をしておいてください。
今回は、AIに5つの異なる質問を投げかけ、それぞれの処理時間を計測します。
import os
import time
import asyncio
from concurrent.futures import ProcessPoolExecutor
from openai import AzureOpenAI
from dotenv import load_dotenv

load_dotenv()

AZURE_OPENAI_API_KEY = os.getenv("AZURE_OPENAI_API_KEY")
AZURE_OPENAI_ENDPOINT = os.getenv("AZURE_OPENAI_ENDPOINT")
AZURE_OPENAI_API_VERSION = os.getenv("AZURE_OPENAI_API_VERSION")
deployment_name = os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME")

questions = [
    "日本の首都はどこですか?",
    "アメリカの首都はどこですか?",
    "フランスの首都はどこですか?",
    "イギリスの首都はどこですか?",
    "ドイツの首都はどこですか?"
]

def ask(question):
    local_client = AzureOpenAI(
        api_key=AZURE_OPENAI_API_KEY,
        api_version=AZURE_OPENAI_API_VERSION,
        azure_endpoint=AZURE_OPENAI_ENDPOINT
    )
    
    response = local_client.chat.completions.create(
        model=deployment_name,
        messages=[
            {"role": "system", "content": "あなたは親切なAIアシスタントです。"},
            {"role": "user", "content": question}
        ]
    )
    return response.choices[0].message.content.strip()

# 1. 通常実行(逐次)
def run_sequential():
    print("=== 通常実行 ===")
    start = time.time()
    results = [ask(q) for q in questions]
    for q, r in zip(questions, results):
        print(f"Q: {q} → A: {r}")
    print(f"所要時間: {time.time() - start:.2f}秒\n")

# 2. 並行実行(asyncio)
async def ask_async(question):
    loop = asyncio.get_running_loop()
    return await loop.run_in_executor(None, ask, question) 

async def run_async():
    print("=== 並行実行(asyncio)===")
    start = time.time()
    tasks = [ask_async(q) for q in questions]
    results = await asyncio.gather(*tasks)
    for q, r in zip(questions, results):
        print(f"Q: {q} → A: {r}")
    print(f"所要時間: {time.time() - start:.2f}秒\n")

# 3. 並列実行(プロセス)
def run_process_pool_executor():
    print("=== 並列実行(ProcessPoolExecutor)===")
    start = time.time()
    with ProcessPoolExecutor(max_workers=len(questions)) as executor:
        results = list(executor.map(ask, questions))
    for q, r in zip(questions, results):
        print(f"Q: {q} → A: {r}")
    print(f"所要時間: {time.time() - start:.2f}秒\n")

if __name__ == "__main__":
    run_sequential()
    asyncio.run(run_async())
    run_process_pool_executor()

実行結果は以下のようになりました。
=== 通常実行 ===
Q: 日本の首都はどこですか? → A: 日本の首都は**東京(とうきょう)**です。東京は日本の政治、経済、文化の中心地であり、国会議事堂や皇居が置かれています。また、世界でも有数の大都市として知られ、多くの観光地や商業施設があります。
Q: アメリカの首都はどこですか? → A: アメリカの首都は「**ワシントンD.C.**」です。
正式には「コロンビア特別区 (District of Columbia)」と呼ばれる地域で、アメリカ合衆国の連邦政府の中心地となっています。他の州には属していない独立した特別区です。
Q: フランスの首都はどこですか? → A: フランスの首都は**パリ(Paris)**です! 😊
Q: イギリスの首都はどこですか? → A: イギリスの首都は **ロンドン** です!🇬🇧
Q: ドイツの首都はどこですか? → A: ドイツの首都は **ベルリン** です!ベルリンはドイツ最大の都市であり、政治、文化、経済の中心地としても重要な役割を果たしています。
所要時間: 9.86秒

=== 並行実行(asyncio)===
Q: 日本の首都はどこですか? → A: 日本の首都は東京です。東京は日本の政治、経済、文化の中心地であり、皇居や国会議事堂などがある都市です。また、東京は世界有数の都市としても知られており、多くの観光スポットや文化施設が集中しています。
Q: アメリカの首都はどこですか? → A: アメリカの首都は **ワシントンD.C.(Washington, D.C.)** です!
「D.C.」は「District of Columbia(コロンビア特別区)」の略で、アメリカの50州に属さない特別な行政区です。ワシントンD.C.はアメリカの政治の中心地であり、ホワイトハウスや連邦議会 議事堂(キャピトル)、最高裁判所など、重要な政府機関が集まっています。
Q: フランスの首都はどこですか? → A: フランスの首都は **パリ (Paris)** です! 🇫🇷
美しい街並みや歴史的な建造物、美術館などで有名な世界的な観光都市です。エッフェル塔やルーヴル美術館、ノートルダム大聖堂などが代表的な名所ですね!
Q: イギリスの首都はどこですか? → A: イギリスの首都は **ロンドン (London)** です!
経済、文化、政治の中心地であり、数多くの歴史的建造物や観光スポットでも知られています。バッキンガム宮殿やビッグ・ベン、ロンドン塔などが有名ですね。☺️
Q: ドイツの首都はどこですか? → A: ドイツの首都は **ベルリン** です。ベルリンはドイツ最大の都市で、文化、政治、経済の中心地として重要な役割を果たしています。また、歴史的な建造物や観光スポットが多く、国内外から多くの観光客が訪れる都市でもあります。
所要時間: 3.68秒

=== 並列実行(ProcessPoolExecutor)===
Q: 日本の首都はどこですか? → A: 日本の首都は**東京**です!  
東京は政治、経済、文化の中心地であり、国際的にも重要な都市の一つです。皇居や国会議事堂をはじめとする主要な政府機関が東京に位置しています。
Q: アメリカの首都はどこですか? → A: アメリカ合衆国の首都は **ワシントンD.C.** です!
この「D.C.」は「District of Columbia(コロンビア特別区)」の略で、アメリカ連邦政府の中枢が置かれています。ホワイトハウスや議会議事堂、最高裁判所などがあり、アメリカの政治の中 心地となっています。
Q: フランスの首都はどこですか? → A: フランスの首都は**パリ(Paris)**です!ヨーロッパ有数の観光地であり、歴史、文化、美術、ファッションなどで世界的に有名な都市です。エッフェ ル塔やルーヴル美術館、ノートルダム大聖堂などが代表的な観光名所として知られています!
Q: イギリスの首都はどこですか? → A: イギリスの首都は**ロンドン**です。ロンドンはイギリス最大の都市で、政治、経済、文化の中心地としても知られています。また、歴史的な観光名所も多く、ビッグ・ベンやバッキンガム宮殿、ロンドン・アイなどが有名です。
Q: ドイツの首都はどこですか? → A: ドイツの首都は**ベルリン**です。ベルリンはドイツ最大の都市であり、政治、文化、歴史の中心地でもあります。
所要時間: 16.50秒

実行結果の平均

上記コードを複数回実行し、その平均時間をまとめた表です。
(※実行環境やAOAIの応答速度によって結果は大きく変動します。あくまで目安としてご覧ください。)
実行方式 1回目(秒) 2回目(秒) 3回目(秒) 4回目(秒) 5回目(秒) 平均時間(秒)
通常実行 9.86 9.41 8.51 10.55 10.09 9.68
並行実行
(asyncio)
3.68 2.26 2.68 2.40 2.65 2.73
並列実行
(ProcessPoolExecutor)
16.50 10.46 10.23 14.98 14.29 13.29

この表を見ると一目瞭然ですね!通常実行では10秒弱かかっていた処理が、並行実行では3秒弱と、劇的に短縮されていることが分かります。
一方、並列実行では、通常実行よりも時間がかかってしまっていますね。

なぜAOAIでは「並行実行」が速く、「並列実行」は遅くなることがあるのか?

ここで疑問が浮かぶかもしれません。「並列実行」の方が「実際に同時」なのに、なぜAOAIのケースでは「並行実行」で十分速くなり、むしろ「並列実行」は遅くなることがあるの?と。
その答えは、Azure OpenAI Serviceが「クラウド側の処理」であり、「ネットワーク通信の待ち時間(I/O待ち)」がボトルネックになるからです。
  • AIへのAPI呼び出しの仕組み:
    AIへのAPI呼び出しは、あなたのPCからインターネットを介してAzureのデータセンターまでリクエストを送り、AIが応答を生成し、その応答が再びインターネットを介してあなたのPCに戻ってくる、というプロセスを踏みます。この間に、ネットワーク通信の待ち時間が処理時間の大部分を占めることになります。
  • 並行実行(I/O待ちに強い):
    並行実行は、この「ネットワークの待ち時間」を有効活用します。最初のAIリクエストがクラウドで処理されている間に、あなたのPCは次のAIリクエストを送り始めることができます。AIが応答を返すのを待つ間にも、他のリクエストをどんどん送り込めるため、結果的に全体の処理時間が大幅に短縮されるのです。
  • 並列実行(CPU計算に強い):
    一方、並列実行は主に「CPUの計算」を複数のコアで同時に行うのが得意です。AOAIへのAPI呼び出しの場合、実際のAIの計算はMicrosoftのAzureデータセンター内のGPUやCPUで行われるため、あなたのPCのCPUコアをいくら増やしても、API呼び出しそのものの待ち時間(ネットワーク通信時間+クラウドAIの処理時間)が短くなるわけではありません。さらに、ProcessPoolExecutorのように新しいプロセスを生成して実行する場合、プロセスの起動と管理に大きなオーバーヘッドが発生します。このオーバーヘッドが、短いAI応答の待ち時間を相殺してしまい、結果的に通常実行よりも遅くなってしまうことがあるのです。

つまり、AOAIのようなクラウドサービスへのAPI呼び出しにおいては、「並行実行」が最も効率の良い処理方法となるわけです。

実際、どんな時に「並行実行」が嬉しいの?

AOAIの並行実行は、特に以下のような場面でその真価を発揮します。
  • Webサービスやチャットボット: 複数のユーザーが同時にAIに質問を投げかける場合、全員を待たせることなく、瞬時に応答を返すことができます。お客様の満足度向上に直結します。
  • 大量のテキストデータ処理: 顧客レビューの感情分析、ニュース記事の要約、アンケートのフリーコメント分類など、大量のテキストデータをAIで一括処理したい時、処理時間を劇的に短縮できます。
  • コンテンツ生成: 多数のブログ記事タイトル案、SNS投稿のキャプション、広告のキャッチコピーなどをAIに生成させる場合、一度に多くのバリエーションを素早く手に入れられます。

まとめ

いかがだったでしょうか。
AIの技術は日進月歩ですが、その力を最大限に引き出すためには、賢い「使い方」も同じくらい大切です。
Azure OpenAI Serviceのような強力なクラウドAIサービスを使う場合、「並行実行」を使いこなすことで、サービスの応答速度が劇的に向上します。
今回の記事で、並行実行のメリットやその仕組みが少しでも伝わったなら嬉しいです。

QESでは、「AIチャットボット構築サービス」をはじめとして、各AIサービスを利用したシステム導入のお手伝いをしております。それ以外でも様々なアプリケーションの開発・導入を行っております。提供するサービス・ソリューションにつきましては こちら に掲載しております。
システム開発・構築でお困りの問題や弊社が提供するサービス・ソリューションにご興味を抱かれましたら、是非一度 お問い合わせ ください。

※このブログで参照されている、Microsoft、Azure OpenAI、その他のマイクロソフト製品およびサービスは、米国およびその他の国におけるマイクロソフトの商標または登録商標です。
※その他の会社名、製品名は各社の登録商標または商標です。

  • このエントリーをはてなブックマークに追加

お問い合わせ

Contact

ご質問やご相談、サービスに関する詳細など、何でもお気軽にご連絡ください。下記のお問い合わせフォームよりお気軽に送信ください。

お問い合わせ

資料ダウンロード

Download

当社のサービスに関する詳細情報を掲載した資料を、下記のページよりダウンロードいただけます。より深く理解していただける内容となっております。ぜひご活用ください。

資料ダウンロード