Language
Important
Windows ML Runtime とテキスト生成 API は現在、実験的な機能であり、運用環境での使用はサポートされていません。 これらの API を試しているアプリは、Microsoft Store に公開しないでください。
Important
Windows ML ランタイムとテキスト生成 API は、現在 C++ および Python で利用可能です。C# については、現時点ではサポートされていません。C# からこれらの API を利用することにご興味がある場合は、Windows ML の GitHub リポジトリにイシューを投稿して、ぜひお知らせください!
Windows ML テキスト生成 API を使用すると、独自の言語モデルでテキスト生成を簡単に実行できます。 それは、Windows ML ランタイム API の上で、トークン化、自動回帰デコード、ストリーミング出力、および取り消しをユーザーに代わって処理します。これは、ONNX Runtime GenAI が ONNX Runtime の上でそのループを簡略化するのと同様です。 Windows には、この API 用のモデルは同梱されていません。ONNX ファイルまたは GGUF ファイルとトークナイザーからなるモデルを、ユーザー自身が選択し、パッケージ化して、アプリとともに配布する必要があります。
Tip
特定のモデルを必要とせず、Microsoft が管理するモデルによる端末上でのテキスト生成だけを行いたい場合は、すぐに使えるローカル LLM のいずれかをご利用ください。
基になるランタイム オブジェクト (モデル、実行ターゲット、パイプライン) を作成し、セッションに渡します。 この API では、ハードウェアの配置は非表示になりません。独自のトークン ループを記述する必要がなくなるだけです。
サポートされているモデル
The Text Generation API は以下を受け付けます。
-
ONNX (
.onnx) または ORT 形式 (.ort) モデルは、ONNX ランタイムを介して実行されます。 このモデルでは、トークン ID 入力、logits 出力、およびキー/値キャッシュとシーケンス位置を保持する 1 つの固定容量状態テンソル ペアを公開する必要があります。 個別のトークナイザー ソース (たとえば、tokenizer.json) を用意します。 -
GGUF (
.gguf) モデルは、llama.cpp バックエンドを介して実行されます。 トークナイザーはモデルに埋め込まれているため、個別のトークナイザー ソースは必要ありません。
サンプルでは、キー/値キャッシュとシーケンス位置を 1 つの状態ペアにパックするタスク固有のグラフでエクスポートされた Qwen2.5-0.5B-Instruct モデル ファミリに対してこのコントラクトを検証します。 同じトークン入力、logits 出力、および状態コントラクトを公開する他のデコーダー専用言語モデルも機能するはずです。
テキストを生成する
テキスト生成セッションは、トークナイザーとステートフル パイプライン (キー/値キャッシュを所有するモデル) をラップします。 モデルとトークナイザーを読み込み、モデルのトークン入力、logits 出力、状態コントラクトを記述して、セッションを構築します。
// Create the runtime and an execution target (CPU here; GPU/NPU also available).
ComPtr<IWinMLRuntime> runtime;
THROW_IF_FAILED(WinMLCreateRuntime(IID_PPV_ARGS(runtime.GetAddressOf())));
ComPtr<IWinMLExecutionTarget> target;
THROW_IF_FAILED(runtime->CreateCpuExecutionTarget(target.GetAddressOf()));
// Load your ONNX model and its tokenizer.
ComPtr<IWinMLModel> model;
THROW_IF_FAILED(runtime->LoadModelFromFile(
L"C:\\models\\qwen2.5-0.5b-instruct\\task_model.onnx",
nullptr,
model.GetAddressOf()));
ComPtr<IWinMLTokenizer> tokenizer;
THROW_IF_FAILED(WinMLCreateTokenizerFromFile(
L"C:\\models\\qwen2.5-0.5b-instruct\\tokenizer.json",
tokenizer.GetAddressOf()));
// Describe the model's token input, logits output, and KV-cache state pair.
winml::tasks::text_generation::onnx::StateTensorPair stateTensorPairs[] = {{1, 1}};
winml::tasks::text_generation::Options options;
options.values = winml::tasks::MakeTextGenerationOptions(/* maxNewTokens */ 64);
winml::tasks::text_generation::onnx::BuildTextGenerationArguments arguments;
arguments.runtime = runtime.Get();
arguments.model = model.Get();
arguments.target = target.Get();
arguments.tokenizer = tokenizer.Get();
arguments.tokenInputName = L"input_ids";
arguments.outputName = L"logits";
arguments.debugName = L"my-text-generation";
arguments.stateTensorPairs = stateTensorPairs;
arguments.sequenceCapacityHint = 128;
arguments.outputKind = WINML_TEXT_GENERATION_OUTPUT_KIND_LOGITS;
arguments.eosPolicy = WINML_TEXT_GENERATION_EOS_POLICY_TOKENIZER_DEFAULT;
arguments.options = &options;
winml::tasks::text_generation::TextGeneration textGeneration;
THROW_IF_FAILED(winml::tasks::text_generation::onnx::BuildTextGeneration(
arguments, textGeneration));
ストリーミング操作を開始するプロンプトで GenerateText を呼び出し、完了を報告するまで返されたストリームからフラグメントをプルします。
ComPtr<IWinMLCancellationSource> cancellation;
THROW_IF_FAILED(textGeneration.tasks->CreateCancellationSource(
cancellation.GetAddressOf()));
ComPtr<IWinMLTextGenerationPullStream> stream;
THROW_IF_FAILED(textGeneration.session->GenerateText(
L"The sky is often",
textGeneration.options.Get(),
cancellation.Get(),
stream.GetAddressOf()));
// Pull generated text one fragment at a time until the stream completes.
WINML_TEXT_GENERATION_READ_STATUS status{};
UINT32 tokenId = 0;
LPCWSTR fragment = nullptr;
while (SUCCEEDED(stream->ReadNext(&status, &tokenId, &fragment)) &&
status == WINML_TEXT_GENERATION_READ_STATUS_UPDATE)
{
std::wprintf(L"%ls", fragment);
}
// The terminal result is the authoritative text, token counts, and finish reason.
ComPtr<IWinMLTextGenerationResult> result;
THROW_IF_FAILED(stream->GetResult(result.GetAddressOf()));
完了した結果は次のとおりです:
- 生成された全文とトークン ID
- プロンプトと生成されたトークンの数
- 終了理由 - シーケンス終了トークン、停止トークン、要求されたトークン制限、シーケンス容量、取り消し、またはエラー
C++とPython
ネイティブ API は WinMLTasks.h を通じて公開され、winml/tasks/text_generation/TextGeneration.hpp 配下に型付き C++ ヘルパーがあります。 Python アプリケーションでは、windowsml.runtimeプロジェクションをwindowsml.tasksと共に使用します。
Windows ML サンプルには、C++ とPythonテキスト生成のサンプルが含まれています。 このサンプルでは、テキスト生成構成の横に完全なランタイム 設定が示されているため、抽象化が開始される場所と、基になるワークフローをカスタマイズする方法を確認できます。
参照
- Windowsですぐに使用できるローカル LLM (Phi Silica およびその他のMicrosoftマネージド モデル)
- Windows ML ランタイム API の概要
- Windows ML Runtime API の概念
- Windows ML を使用して独自の Whisper モデルで音声を認識する
- Windows ML のサンプル
- ONNX Runtime GenAI