コンテンツにスキップ

移行

ONNX Runtime generate() APIを0.5.2から0.6.0に移行する

Section titled “ONNX Runtime generate() APIを0.5.2から0.6.0に移行する”

ONNX Runtime generate()バージョン0.5.2からバージョン0.6.0に移行する方法を学びます。

バージョン0.6.0では、「チャットモード」(継続連続デコード、_インタラクティブデコード_とも呼ばれます)のサポートが追加されました。チャットモードの導入に伴い、APIに破壊的変更が行われました。

要約すると、新しいAPIではGeneratorAppendTokensメソッドが追加され、これにより複数ターンの会話が可能になりました。以前は、入力はGeneratorの作成前にGeneratorParamsで設定されていました。

会話ループの外でAppendTokensを呼び出すと、システムプロンプトのキャッシングを実装できます。

注意:チャットモードとシステムプロンプトのキャッシングは、バッチサイズ1でのみサポートされています。さらに、現在サポートされているのは、CPU、CUDA EPを搭載したNVIDIA GPU、およびWeb GPUネイティブEPを搭載したすべてのGPUです。NPUやDirecML EPで実行されているGPUではサポートされていません。質疑応答(Q&A)モードの場合、以下で説明する移行は引き続き必要です。

Pythonの質疑応答(シングルターン)コードを0.6.0に移行する

Section titled “Pythonの質疑応答(シングルターン)コードを0.6.0に移行する”
  1. params.input_ids = input_tokensの呼び出しを、ジェネレーターオブジェクトの作成後にgenerator.append_tokens(input_tokens)に置き換えます。
  2. generator.compute_logits()の呼び出しを削除します。
  3. アプリケーションにQ&Aループがある場合は、append_token呼び出しの間でgeneratorを削除して、モデルの状態をリセットします。

Pythonアプリケーションにシステムプロンプトのキャッシングを追加する

Section titled “Pythonアプリケーションにシステムプロンプトのキャッシングを追加する”
  1. システムプロンプトを作成してトークン化し、generator.append_tokens(system_tokens)を呼び出します。この呼び出しは、ユーザーにプロンプトを尋ねる前に行うことができます。

    system_tokens = tokenizer.encode(system_prompt)
    generator.append_tokens(system_tokens)

Pythonアプリケーションにチャットモードを追加する

Section titled “Pythonアプリケーションにチャットモードを追加する”
  1. アプリケーションにループを作成し、ユーザーが新しい入力を提供するたびにgenerator.append_tokens(prompt)を呼び出します。

    while True:
    user_input = input("入力: ")
    input_tokens = tokenizer.encode(user_input)
    generator.append_tokens(input_tokens)
    while not generator.is_done():
    generator.generate_next_token()
    new_token = generator.get_next_tokens()[0]
    print(tokenizer_stream.decode(new_token), end='', flush=True)
    except KeyboardInterrupt:
    print()

C++の質疑応答(シングルターン)コードを0.6.0に移行する

Section titled “C++の質疑応答(シングルターン)コードを0.6.0に移行する”
  1. params->SetInputSequences(*sequences)の呼び出しをgenerator->AppendTokenSequences(*sequences)に置き換えます。
  2. generator->ComputeLogits()の呼び出しを削除します。

C++アプリケーションにシステムプロンプトのキャッシングを追加する

Section titled “C++アプリケーションにシステムプロンプトのキャッシングを追加する”
  1. システムプロンプトを作成してトークン化し、generator->AppendTokenSequences(*sequences)を呼び出します。この呼び出しは、ユーザーにプロンプトを尋ねる前に行うことができます。

    auto sequences = OgaSequences::Create();
    tokenizer->Encode(system_prompt.c_str(), *sequences);
    generator->AppendTokenSequences(*sequences);
    generator.append_tokens(system_tokens)

C++アプリケーションにチャットモードを追加する

Section titled “C++アプリケーションにチャットモードを追加する”
  1. アプリケーションにチャットループを追加します。
    std::cout << "応答を生成しています..." << std::endl;
    auto params = OgaGeneratorParams::Create(*model);
    params->SetSearchOption("max_length", 1024);
    auto generator = OgaGenerator::Create(*model, *params);
    while (true) {
    std::string text;
    std::cout << "プロンプト: " << std::endl;
    std::getline(std::cin, prompt);
    auto sequences = OgaSequences::Create();
    tokenizer->Encode(prompt.c_str(), *sequences);
    generator->AppendTokenSequences(*sequences);
    while (!generator->IsDone()) {
    generator->GenerateNextToken();
    const auto num_tokens = generator->GetSequenceCount(0);
    const auto new_token = generator->GetSequenceData(0)[num_tokens - 1];
    std::cout << tokenizer_stream->Decode(new_token) << std::flush;
    }
    }

C#の質疑応答(シングルターン)コードを0.6.0に移行する

Section titled “C#の質疑応答(シングルターン)コードを0.6.0に移行する”
  1. generatorParams.SetInputSequences(sequences)の呼び出しをgenerator.AppendTokenSequences(sequences)`に置き換えます。
  2. generator.ComputeLogits()の呼び出しを削除します。

C#アプリケーションにシステムプロンプトのキャッシングを追加する

Section titled “C#アプリケーションにシステムプロンプトのキャッシングを追加する”
  1. システムプロンプトを作成してトークン化し、generator->AppendTokenSequences()を呼び出します。この呼び出しは、ユーザーにプロンプトを尋ねる前に行うことができます。

    var systemPrompt = "..."
    auto sequences = OgaSequences::Create();
    tokenizer->Encode(systemPrompt, *sequences);
    generator->AppendTokenSequences(*sequences);

C#アプリケーションにチャットモードを追加する

Section titled “C#アプリケーションにチャットモードを追加する”
  1. アプリケーションにチャットループを追加します。
    using var tokenizerStream = tokenizer.CreateStream();
    using var generator = new Generator(model, generatorParams);
    Console.WriteLine("プロンプト:");
    prompt = Console.ReadLine();
    // Phi-3テンプレートの例
    var sequences = tokenizer.Encode($"<|user|>{prompt}<|end|><|assistant|>");
    do
    {
    generator.AppendTokenSequences(sequences);
    var watch = System.Diagnostics.Stopwatch.StartNew();
    while (!generator.IsDone())
    {
    generator.GenerateNextToken();
    Console.Write(tokenizerStream.Decode(generator.GetSequence(0)[^1]));
    }
    Console.WriteLine();
    watch.Stop();
    var runTimeInSeconds = watch.Elapsed.TotalSeconds;
    var outputSequence = generator.GetSequence(0);
    var totalTokens = outputSequence.Length;
    Console.WriteLine($"ストリーミングトークン: {totalTokens} 時間: {runTimeInSeconds:0.00} トークン/秒: {totalTokens / runTimeInSeconds:0.00}");
    Console.WriteLine("次のプロンプト:");
    var nextPrompt = Console.ReadLine();
    sequences = tokenizer.Encode($"<|user|>{prompt}<|end|><|assistant|>");
    } while (prompt != null);

近日公開