Sprache
Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Important
Die Windows ML-Runtime- und Textgenerierungs-APIs sind derzeit experimentell und werden für die Verwendung in Produktionsumgebungen nicht unterstützt. Apps, die diese APIs ausprobieren, sollten nicht im Microsoft Store veröffentlicht werden.
Important
Die Windows ML-Runtime- und Textgenerierungs-APIs sind derzeit in C++ und Python verfügbar; C# wird derzeit nicht unterstützt. Lassen Sie uns wissen, ob Sie diese APIs von C# verwenden möchten, indem Sie ein Problem im Windows ML GitHub-Repository veröffentlichen!
Die Windows ML-Textgenerierungs-API vereinfacht das Ausführen der Textgenerierung über Ihr eigenes Sprachmodell. Es übernimmt Tokenisierung, autoregressive Decodierung, Streamingausgabe und Abbruch für Sie, über die Windows ML-Runtime-API – ähnlich wie ONNX Runtime GenAI diese Schleife über ONNX Runtime vereinfacht. Windows enthält kein Modell für diese API. Sie wählen, packen und verteilen das Modell – eine ONNX- oder GGUF-Datei sowie ein Tokenizer – mit Ihrer App.
Tip
Wenn Sie kein bestimmtes Modell benötigen und nur geräteinterne Textgenerierung mit einem Modell benötigen, das von Microsoft verwaltet wird, verwenden Sie stattdessen eines der einsatzbereiten lokalen LLMs.
Sie erstellen weiterhin die zugrunde liegenden Runtime-Objekte – das Modell, das Ausführungsziel und die Pipeline – und übergeben sie an die Session. Die API blendet die Platzierung der Hardware nicht aus. Es entfernt nur die Notwendigkeit, eine eigene Token-Schleife zu schreiben.
Unterstützte Modelle
Die Textgenerierungs-API akzeptiert Folgendes:
-
ONNX-Modelle (
.onnx) oder Modelle im ORT-Format (.ort), die mit ONNX Runtime ausgeführt werden. Das Modell muss eine Token-ID-Eingabe, eine Logits-Ausgabe und ein Tensorpaar mit fester Kapazität bereitstellen, das den Schlüssel-Wert-Cache und die Sequenzposition enthält. Sie geben eine separate Tokenizerquelle an (z. B. einetokenizer.json). -
GGUF-Modelle (
.gguf), die über das llama.cpp-Backend ausgeführt werden. Der Tokenizer ist in das Modell eingebettet, daher ist keine separate Tokenizerquelle erforderlich.
Die Beispiele überprüfen diesen Vertrag anhand der Qwen2.5-0.5B-Instruct-Modellfamilie, die mit einem aufgabenspezifischen Diagramm exportiert wird, das den Schlüssel-Wert-Cache und die Sequenzposition in ein Zustandspaar packt. Andere Nur-Decoder-Sprachmodelle, die die gleiche Tokeneingabe, Logits-Ausgabe und Zustandsvertrag verfügbar machen, sollten ebenfalls funktionieren.
Generieren von Text
Eine Textgenerierungssitzung umschließt einen Tokenizer und eine zustandsbehaftete Pipeline (das Modell, das den Schlüssel-Wert-Cache besitzt). Laden Sie das Modell und den Tokenizer, beschreiben Sie die Tokeneingabe, die Logits-Ausgabe und den Zustandsvertrag des Modells, und erstellen Sie die Sitzung:
// 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));
Rufen Sie GenerateText mit einer Aufforderung zum Starten eines Streamingvorgangs auf, und rufen Sie dann Fragmente aus dem zurückgegebenen Datenstrom ab, bis der Stream die Fertigstellung meldet:
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()));
Das fertige Ergebnis lautet:
- Der vollständige generierte Text und Token-IDs
- Anzahl von Prompts und generierten Token
- Ein Abschlussgrund – ein End-of-Sequence-Token, ein Stopptoken, der angeforderte Tokengrenzwert, die Sequenzkapazität, der Abbruch oder ein Fehler
C++ und Python
Die systemeigene API wird über WinMLTasks.h verfügbar gemacht und die typisierten C++-Hilfsprogramme unter winml/tasks/text_generation/TextGeneration.hpp. Python Anwendungen verwenden die windowsml.tasks Projektion zusammen mit windowsml.runtime.
Die Windows ML-Beispiele umfassen ein C++- und Python Beispiel für die Textgenerierung. Das Beispiel zeigt das vollständige Laufzeitsetup neben der Konfiguration der Textgenerierung, damit Sie sehen können, wo die Abstraktion beginnt und wie Sie den zugrunde liegenden Workflow anpassen können.
Siehe auch
- Einsatzbereite lokale LLMs unter Windows (Phi Silica und andere von Microsoft verwaltete Modelle)
- Übersicht über Windows ML-Runtime-API
- Windows ML-Runtime-API-Konzepte
- Sprache erkennen mit Ihrem eigenen Whisper-Modell mit Windows ML
- Windows ML-Beispiele
- ONNX Runtime GenAI