移行
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ではGeneratorにAppendTokensメソッドが追加され、これにより複数ターンの会話が可能になりました。以前は、入力はGeneratorの作成前にGeneratorParamsで設定されていました。
会話ループの外でAppendTokensを呼び出すと、システムプロンプトのキャッシングを実装できます。
注意:チャットモードとシステムプロンプトのキャッシングは、バッチサイズ1でのみサポートされています。さらに、現在サポートされているのは、CPU、CUDA EPを搭載したNVIDIA GPU、およびWeb GPUネイティブEPを搭載したすべてのGPUです。NPUやDirecML EPで実行されているGPUではサポートされていません。質疑応答(Q&A)モードの場合、以下で説明する移行は引き続き必要です。
Python
Section titled “Python”Pythonの質疑応答(シングルターン)コードを0.6.0に移行する
Section titled “Pythonの質疑応答(シングルターン)コードを0.6.0に移行する”params.input_ids = input_tokensの呼び出しを、ジェネレーターオブジェクトの作成後にgenerator.append_tokens(input_tokens)に置き換えます。generator.compute_logits()の呼び出しを削除します。- アプリケーションにQ&Aループがある場合は、
append_token呼び出しの間でgeneratorを削除して、モデルの状態をリセットします。
Pythonアプリケーションにシステムプロンプトのキャッシングを追加する
Section titled “Pythonアプリケーションにシステムプロンプトのキャッシングを追加する”-
システムプロンプトを作成してトークン化し、
generator.append_tokens(system_tokens)を呼び出します。この呼び出しは、ユーザーにプロンプトを尋ねる前に行うことができます。system_tokens = tokenizer.encode(system_prompt)generator.append_tokens(system_tokens)
Pythonアプリケーションにチャットモードを追加する
Section titled “Pythonアプリケーションにチャットモードを追加する”-
アプリケーションにループを作成し、ユーザーが新しい入力を提供するたびに
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に移行する”params->SetInputSequences(*sequences)の呼び出しをgenerator->AppendTokenSequences(*sequences)に置き換えます。generator->ComputeLogits()の呼び出しを削除します。
C++アプリケーションにシステムプロンプトのキャッシングを追加する
Section titled “C++アプリケーションにシステムプロンプトのキャッシングを追加する”-
システムプロンプトを作成してトークン化し、
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++アプリケーションにチャットモードを追加する”- アプリケーションにチャットループを追加します。
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に移行する”generatorParams.SetInputSequences(sequences)の呼び出しをgenerator.AppendTokenSequences(sequences)`に置き換えます。generator.ComputeLogits()の呼び出しを削除します。
C#アプリケーションにシステムプロンプトのキャッシングを追加する
Section titled “C#アプリケーションにシステムプロンプトのキャッシングを追加する”-
システムプロンプトを作成してトークン化し、
generator->AppendTokenSequences()を呼び出します。この呼び出しは、ユーザーにプロンプトを尋ねる前に行うことができます。var systemPrompt = "..."auto sequences = OgaSequences::Create();tokenizer->Encode(systemPrompt, *sequences);generator->AppendTokenSequences(*sequences);
C#アプリケーションにチャットモードを追加する
Section titled “C#アプリケーションにチャットモードを追加する”- アプリケーションにチャットループを追加します。
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);
近日公開