Lingua
Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Importante
Le API di Windows ML Runtime e di generazione del testo sono attualmente sperimentali e non sono supportate per l'uso in ambienti di produzione. Le app che provano queste API non devono essere pubblicate in Microsoft Store.
Importante
Le API Windows ML Runtime e Generazione di testo sono attualmente disponibili in C++ e Python; C# non è attualmente supportato. Facci sapere se sei interessato a usare queste API da C# pubblicando un problema nel repository GitHub di Windows ML!
L'API Windows ML Text Generation semplifica l'esecuzione della generazione di testo tramite un modello linguistico personalizzato. Gestisce automaticamente la creazione di token, la decodifica autoregressiva, l'output di streaming e l'annullamento, oltre all'API di Windows ML Runtime, in modo analogo a come ONNX Runtime GenAI semplifica tale ciclo su ONNX Runtime. Windows non distribuisce un modello per questa API. È possibile scegliere, impacchettare e distribuire il modello, ovvero un file ONNX o GGUF, oltre a un tokenizer, con l'app.
Tip
Se non è necessario un modello specifico e si vuole solo la generazione di testo sul dispositivo con un modello gestito da Microsoft, usare invece uno degli LLM locali pronti per l'uso.
È comunque possibile creare gli oggetti Runtime sottostanti, ovvero il modello, la destinazione di esecuzione e la pipeline, e passarli alla sessione. L'API non nasconde il posizionamento hardware; rimuove solo la necessità di scrivere un ciclo di token personalizzato.
Modelli supportati
L'API Generazione di testo accetta:
-
I modelli ONNX (
.onnx) o formato ORT (.ort) vengono eseguiti tramite ONNX Runtime. Il modello deve esporre un input token-ID, un output logits e una coppia di tensori a capacità fissa che contiene la cache chiave/valore e la posizione della sequenza. Si fornisce una sorgente del tokenizer separata, ad esempio untokenizer.json. -
Modelli GGUF (
.gguf), eseguiti nel back-end di llama.cpp. Il tokenizer è incorporato nel modello, quindi non è necessaria alcuna sorgente del tokenizer separata.
Gli esempi convalidano questo contratto rispetto alla famiglia di modelli Qwen2.5-0.5B-Instruct, esportata con un grafo specifico dell'attività che raggruppa la cache chiave/valore e la posizione della sequenza in un'unica coppia di stati. Dovrebbero funzionare anche altri modelli linguistici di solo decodificatore che espongono lo stesso input di token, output logits e interfaccia dello stato.
Genera testo
Una sessione di generazione di testo racchiude un tokenizer e una pipeline con stato (il modello che gestisce la cache chiave/valore). Caricare il modello e il tokenizer, descrivere l'input di token del modello, l'output dei logits e il contratto di stato e creare la sessione:
// 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));
Chiamare GenerateText con un prompt per avviare un'operazione di streaming, quindi eseguire il pull dei frammenti dal flusso restituito fino a quando non segnala il completamento:
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()));
Il risultato completato riporta:
- Il testo completo generato e gli ID dei token
- Conteggi di prompt e token generati
- Un motivo di fine: un token di fine sequenza, un token di arresto, il limite di token richiesto, la capacità della sequenza, l'annullamento o un errore
C++ e Python
L'API nativa viene esposta tramite WinMLTasks.h e gli helper C++ tipizzati in winml/tasks/text_generation/TextGeneration.hpp. Python applicazioni usano la windowsml.tasks proiezione insieme a windowsml.runtime.
Gli esempi di Windows ML includono un esempio di generazione del testo in C++ e Python. L'esempio mostra l'installazione completa del runtime accanto alla configurazione di generazione del testo, in modo da poter vedere dove inizia l'astrazione e come personalizzare il flusso di lavoro sottostante.