Azure OpenAI Service と OpenAI 本家で同じモデルに同じプロンプトを投げて時間はかってみた

2023/05/11に公開

追記

お試し期間だと思ったら普通に課金対象でした orz

はじめに

Semantic Kernel を使うと、同じインターフェースで Azure OpenAI Service と OpenAI 本家の API を割と簡単に呼び出せるので、それを使ってどれくらい時間がかかるのかを計測してみました。

ただ、私は OpenAI 側は無課金トライアル勢なので、そのせいで今回のような結果になってるのかもしれません…。

計測に使用したコード

計測に使用したコードは以下のようなものです。
どちらも API キーによる認証で、叩いているモデルは text-davinci-003 です。

API キーなどの構成情報は .NET のユーザーシークレットから取るようにしています。Azure 側も OpenAI 側も同じプロンプトを同じパラメーターで叩いています。10 回呼び出した結果の時間と返ってきた結果を標準出力に出しています。

using Microsoft.Extensions.Configuration;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.AI.TextCompletion;
using System.Diagnostics;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Unicode;

var c = new ConfigurationBuilder()
    .AddUserSecrets<Program>()
    .Build();

var kernel = Kernel.Builder
    .Configure(config =>
    {
        var azure = c.GetSection("AzureOpenAI");
        config.AddAzureTextCompletionService(
            azure["ModelDeployName"],
            azure["Endpoint"],
            azure["Key"],
            serviceId: "Azure");

        var openAI = c.GetSection("OpenAI");
        config.AddOpenAITextCompletionService(
            "text-davinci-003",
            openAI["Key"],
            serviceId: "OpenAI");
    })
    .Build();

await ExecuteAsync(kernel, "Azure");
await ExecuteAsync(kernel, "OpenAI");


async ValueTask ExecuteAsync(IKernel kernel, string serviceName)
{
    const int IterationCount = 10;
    var textCompletion = kernel.GetService<ITextCompletion>(serviceName);
    var result = new List<string>(IterationCount);
    var stopwatch = Stopwatch.StartNew();
    
    for (int i = 0; i < IterationCount; i++)
    {
        result.Add(await textCompletion.CompleteAsync($"Generate {i + 2} interasting words", requestSettings: new()
        {
            MaxTokens = 100,
            Temperature = 0.3,
        }));
    }

    stopwatch.Stop();

    Console.WriteLine($"{serviceName}: {stopwatch.ElapsedMilliseconds}ms");
    Console.WriteLine(JsonSerializer.Serialize(result, options: new()
    {
        WriteIndented = true,
        Encoder = JavaScriptEncoder.Create(UnicodeRanges.All),
    }));
}

実行結果

実行すると以下のような結果になりました。

1 回目

Azure: 10722ms
[
  "\n\nFlamboyant and whimsical.",
  "\n\n1. Glittery\n2. Flamboyant\n3. Magnanimous",
  "\n\n1. Glittery\n2. Flamboyant\n3. Quixotic\n4. Jubilant",
  "\n\n1. Quixotic\n2. Serendipity\n3. Jubilant\n4. Flamboyant\n5. Exuberant",
  "\n\n1. Quixotic\n2. Serendipity\n3. Jubilant\n4. Flamboyant\n5. Exuberant\n6. Whimsical",
  "\n\n1. Quixotic\n2. Serendipity\n3. Jubilant\n4. Flamboyant\n5. Magnanimous\n6. Exuberant\n7. Whimsical",
  "\n\n1. Quixotic\n2. Serendipity\n3. Jubilant\n4. Flamboyant\n5. Exuberant\n6. Whimsical\n7. Ethereal\n8. Magnanimous",
  "\n\n1. Glittery\n2. Quirky\n3. Whimsical\n4. Enchanting\n5. Jubilant\n6. Exuberant\n7. Magnificent\n8. Splendid\n9. Marvelous",
  "\n\n1. Quixotic\n2. Serendipity\n3. Jubilant\n4. Flamboyant\n5. Ethereal\n6. Bewilderment\n7. Exuberant\n8. Magnanimous\n9. Whimsical\n10. Amalgamate",
  "\n\n1. Glittery\n2. Jubilant\n3. Quixotic\n4. Serendipity\n5. Whimsical\n6. Flamboyant\n7. Exuberant\n8. Fantastical\n9. Magnanimous\n10. Splendid\n11. Enchanting"
]
OpenAI: 47627ms
[
  "\n\nFlamboyant\nGargantuan",
  "\n\n1. Glittery\n2. Flamboyant\n3. Magnanimous",
  "\n\n1. Glittery\n2. Flamboyant\n3. Quixotic\n4. Jubilant",
  "\n\n1. Quixotic\n2. Serendipity\n3. Jubilant\n4. Flamboyant\n5. Exuberant",
  "\n\n1. Quixotic\n2. Serendipity\n3. Jubilant\n4. Flamboyant\n5. Exuberant\n6. Whimsical",
  "\n\n1. Quixotic\n2. Serendipity\n3. Jubilant\n4. Flamboyant\n5. Magnanimous\n6. Exuberant\n7. Whimsical",
  "\n\n1. Quixotic\n2. Serendipity\n3. Jubilant\n4. Flamboyant\n5. Exuberant\n6. Whimsical\n7. Ethereal\n8. Magnanimous",
  "\n\n1. Glittery\n2. Quirky\n3. Whimsical\n4. Enchanting\n5. Jubilant\n6. Exuberant\n7. Magnificent\n8. Splendid\n9. Marvelous",
  "\n\n1. Quixotic\n2. Serendipity\n3. Jubilant\n4. Flamboyant\n5. Ethereal\n6. Bewilderment\n7. Exuberant\n8. Magnanimous\n9. Whimsical\n10. Amalgamate",
  "\n\n1. Glittery\n2. Jubilant\n3. Quixotic\n4. Serendipity\n5. Whimsical\n6. Flamboyant\n7. Exuberant\n8. Fantastical\n9. Magnanimous\n10. Splendid\n11. Enchanting"
]

2 回目

Azure: 10830ms
[
  "\n\nFlamboyant and whimsical.",
  "\n\n1. Glittery\n2. Flamboyant\n3. Magnanimous",
  "\n\n1. Glittery\n2. Flamboyant\n3. Quixotic\n4. Jubilant",
  "\n\n1. Quixotic\n2. Serendipity\n3. Jubilant\n4. Flamboyant\n5. Exuberant",
  "\n\n1. Quixotic\n2. Serendipity\n3. Jubilant\n4. Flamboyant\n5. Exuberant\n6. Whimsical",
  "\n\n1. Quixotic\n2. Serendipity\n3. Jubilant\n4. Flamboyant\n5. Magnanimous\n6. Exuberant\n7. Whimsical",
  "\n\n1. Quixotic\n2. Serendipity\n3. Jubilant\n4. Flamboyant\n5. Exuberant\n6. Whimsical\n7. Ethereal\n8. Magnanimous",
  "\n\n1. Glittery\n2. Quirky\n3. Whimsical\n4. Enchanting\n5. Jubilant\n6. Exuberant\n7. Magnificent\n8. Splendid\n9. Marvelous",
  "\n\n1. Quixotic\n2. Serendipity\n3. Jubilant\n4. Flamboyant\n5. Ethereal\n6. Bewilderment\n7. Exuberant\n8. Magnanimous\n9. Whimsical\n10. Amalgamate",
  "\n\n1. Glittery\n2. Jubilant\n3. Quixotic\n4. Serendipity\n5. Whimsical\n6. Flamboyant\n7. Exuberant\n8. Fantastical\n9. Magnanimous\n10. Splendid\n11. Enchanting"
]
OpenAI: 44508ms
[
  "\n\nFlamboyant and whimsical.",
  "\n\n1. Glittery\n2. Flamboyant\n3. Magnanimous",
  "\n\n1. Glittery\n2. Flamboyant\n3. Quixotic\n4. Jubilant",
  "\n\n1. Quixotic\n2. Serendipity\n3. Jubilant\n4. Flamboyant\n5. Exuberant",
  "\n\n1. Quixotic\n2. Serendipity\n3. Jubilant\n4. Flamboyant\n5. Exuberant\n6. Whimsical",
  "\n\n1. Quixotic\n2. Serendipity\n3. Jubilant\n4. Flamboyant\n5. Magnanimous\n6. Exuberant\n7. Whimsical",
  "\n\n1. Quixotic\n2. Serendipity\n3. Jubilant\n4. Flamboyant\n5. Exuberant\n6. Whimsical\n7. Ethereal\n8. Magnanimous",
  "\n\n1. Glittery\n2. Quirky\n3. Whimsical\n4. Enchanting\n5. Jubilant\n6. Exuberant\n7. Magnificent\n8. Splendid\n9. Marvelous",
  "\n\n1. Quixotic\n2. Serendipity\n3. Jubilant\n4. Flamboyant\n5. Ethereal\n6. Bewilderment\n7. Exuberant\n8. Magnanimous\n9. Whimsical\n10. Amalgamate",
  "\n\n1. Glittery\n2. Jubilant\n3. Quixotic\n4. Serendipity\n5. Whimsical\n6. Flamboyant\n7. Exuberant\n8. Fantastical\n9. Magnanimous\n10. Splendid\n11. Enchanting"
]

性能差

ということで text-davinci-003 を呼んでみた結果は Azure 側が 10 回のコールで 10 秒程度で終わっていて OpenAI 側が 45 秒くらいという結果になりました。
時間帯によっても結構変わるのかもしれないですが、思ったより差があってびっくりしました。

ということで、どっちが早いのか気になったので雑にですが試してみました。

Microsoft (有志)

Discussion