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.
Annotazioni
Questo articolo è un lavoro in corso.
Tutte le note sulla versione per l'API ML.NET sono disponibili nel repository dotnet/machinelearning.
Nuove attività di Deep Learning
ML.NET 3.0 aggiunto il supporto per le attività di Deep Learning seguenti:
- Individuazione oggetti (supportata da TorchSharp)
- Riconoscimento entità denominata
- Risposta alle domande (QA)
Questi trainer sono inclusi nel pacchetto Microsoft.ML.TorchSharp . Per altre informazioni, vedere Annuncio ML.NET 3.0.
AutoML (Automazione dell'apprendimento automatico)
In ML.NET 3.0, lo sweeper AutoML è stato aggiornato per supportare la somiglianza delle frasi, la risposta alle domande e le attività di rilevamento degli oggetti. Per ulteriori informazioni su AutoML, consultare Come utilizzare l'API di ML.NET Automated Machine Learning (AutoML).
Supporto aggiuntivo del tokenizer
La tokenizzazione è un componente fondamentale nella pre-elaborazione del testo in linguaggio naturale per i modelli di intelligenza artificiale. I tokenizer sono responsabili della suddivisione di una stringa di testo in parti più piccole e gestibili, spesso definite token. Quando si usano servizi come Azure OpenAI, è possibile usare tokenizer per comprendere meglio i costi e gestire il contesto. Quando si lavora con modelli self-hosted o locali, i token sono gli input forniti a tali modelli. Per altre informazioni sulla tokenizzazione nella libreria Microsoft.ML.Tokenizers, vedere Annuncio di ML.NET 2.0.
Il pacchetto Microsoft.ML.Tokenizers fornisce una libreria di tokenizzazione multipiattaforma open source. In ML.NET 4.0, la libreria è stata migliorata nei modi seguenti:
- API perfezionate e funzionalità esistenti.
- Aggiunto supporto
Tiktoken - Aggiunto il supporto per il tokenizer al modello
Llama. - Aggiunto il
CodeGentokenizer, compatibile con modelli come codegen-350M-mono e phi-2. - Sono stati aggiunti
EncodeToIdsoverload che accettano istanzeSpan<char>e consentono di personalizzare la normalizzazione e la pretokenizzazione. - Ha lavorato a stretto contatto con le comunità DeepDev
TokenizerLibeSharpTokenper affrontare gli scenari coperti da tali librerie. Se si usaDeepDevoSharpToken, è consigliabile eseguire la migrazione aMicrosoft.ML.Tokenizers. Per altri dettagli, vedere la guida alla migrazione.
Gli esempi seguenti illustrano come usare il Tiktoken tokenizzatore di testo.
Tokenizer tokenizer = TiktokenTokenizer.CreateForModel("gpt-4");
string text = "Hello, World!";
// Encode to IDs.
IReadOnlyList<int> encodedIds = tokenizer.EncodeToIds(text);
Console.WriteLine($"encodedIds = {{{string.Join(", ", encodedIds)}}}");
// encodedIds = {9906, 11, 4435, 0}
// Decode IDs to text.
string? decodedText = tokenizer.Decode(encodedIds);
Console.WriteLine($"decodedText = {decodedText}");
// decodedText = Hello, World!
// Get token count.
int idsCount = tokenizer.CountTokens(text);
Console.WriteLine($"idsCount = {idsCount}");
// idsCount = 4
// Full encoding.
IReadOnlyList<EncodedToken> result = tokenizer.EncodeToTokens(text, out string? normalizedString);
Console.WriteLine($"result.Tokens = {{'{string.Join("', '", result.Select(t => t.Value))}'}}");
// result.Tokens = {'Hello', ',', ' World', '!'}
Console.WriteLine($"result.Ids = {{{string.Join(", ", result.Select(t => t.Id))}}}");
// result.Ids = {9906, 11, 4435, 0}
// Encode up to number of tokens limit.
int index1 = tokenizer.GetIndexByTokenCount(
text,
maxTokenCount: 1,
out string? processedText1,
out int tokenCount1
); // Encode up to one token.
Console.WriteLine($"tokenCount1 = {tokenCount1}");
// tokenCount1 = 1
Console.WriteLine($"index1 = {index1}");
// index1 = 5
int index2 = tokenizer.GetIndexByTokenCountFromEnd(
text,
maxTokenCount: 1,
out string? processedText2,
out int tokenCount2
); // Encode from end up to one token.
Console.WriteLine($"tokenCount2 = {tokenCount2}");
// tokenCount2 = 1
Console.WriteLine($"index2 = {index2}");
// index2 = 12
Gli esempi seguenti illustrano come usare il Llama tokenizzatore di testo.
// Create the Tokenizer.
string modelUrl = @"https://huggingface.co/hf-internal-testing/llama-llamaTokenizer/resolve/main/llamaTokenizer.model";
using Stream remoteStream = File.OpenRead(modelUrl);
Tokenizer llamaTokenizer = LlamaTokenizer.Create(remoteStream);
string text = "Hello, World!";
// Encode to IDs.
IReadOnlyList<int> encodedIds = llamaTokenizer.EncodeToIds(text);
Console.WriteLine($"encodedIds = {{{string.Join(", ", encodedIds)}}}");
// encodedIds = {1, 15043, 29892, 2787, 29991}
// Decode IDs to text.
string? decodedText = llamaTokenizer.Decode(encodedIds);
Console.WriteLine($"decodedText = {decodedText}");
// decodedText = Hello, World!
// Get token count.
int idsCount = llamaTokenizer.CountTokens(text);
Console.WriteLine($"idsCount = {idsCount}");
// idsCount = 5
// Full encoding.
IReadOnlyList<EncodedToken> result = llamaTokenizer.EncodeToTokens(text, out string? normalizedString);
Console.WriteLine($"result.Tokens = {{'{string.Join("', '", result.Select(t => t.Value))}'}}");
// result.Tokens = {'<s>', '▁Hello', ',', '▁World', '!'}
Console.WriteLine($"result.Ids = {{{string.Join(", ", result.Select(t => t.Id))}}}");
// result.Ids = {1, 15043, 29892, 2787, 29991}
// Encode up 2 tokens.
int index1 = llamaTokenizer.GetIndexByTokenCount(text, maxTokenCount: 2, out string? processedText1, out int tokenCount1);
Console.WriteLine($"tokenCount1 = {tokenCount1}");
// tokenCount1 = 2
Console.WriteLine($"index1 = {index1}");
// index1 = 6
// Encode from end up to one token.
int index2 = llamaTokenizer.GetIndexByTokenCountFromEnd(text, maxTokenCount: 1, out string? processedText2, out int tokenCount2);
Console.WriteLine($"tokenCount2 = {tokenCount2}");
// tokenCount2 = 1
Console.WriteLine($"index2 = {index2}");
// index2 = 13
Negli esempi seguenti viene illustrato come usare il CodeGen tokenizer.
string phi2VocabPath = "https://huggingface.co/microsoft/phi-2/resolve/main/vocab.json?download=true";
string phi2MergePath = "https://huggingface.co/microsoft/phi-2/resolve/main/merges.txt?download=true";
using Stream vocabStream = File.OpenRead(phi2VocabPath);
using Stream mergesStream = File.OpenRead(phi2MergePath);
Tokenizer phi2Tokenizer = CodeGenTokenizer.Create(vocabStream, mergesStream);
IReadOnlyList<int> ids = phi2Tokenizer.EncodeToIds("Hello, World");
Nell'esempio seguente viene illustrato come usare il tokenizer con Span<char> e come disabilitare la normalizzazione o la pretokenizzazione nelle chiamate di codifica.
ReadOnlySpan<char> textSpan = "Hello World".AsSpan();
// Bypass normalization.
IReadOnlyList<int> ids = llamaTokenizer.EncodeToIds(textSpan, considerNormalization: false);
// Bypass pretokenization.
ids = llamaTokenizer.EncodeToIds(textSpan, considerPreTokenization: false);
Supporto a livello di byte nel tokenizer BPE
Ora BpeTokenizer supporta la codifica a livello di byte, abilitando la compatibilità con modelli come DeepSeek. Questo miglioramento elabora il vocabolario come byte UTF-8. Inoltre, il nuovo BpeOptions tipo semplifica la configurazione del tokenizer.
BpeOptions bpeOptions = new BpeOptions(vocabs);
BpeTokenizer tokenizer = BpeTokenizer.Create(bpeOptions);
Opzione deterministica per il formatore LightGBM
I trainer LightGBM ora offrono opzioni per l'allenamento deterministico, garantendo risultati coerenti con gli stessi dati e seme casuale. Queste opzioni includono deterministic, force_row_wisee force_col_wise.
LightGbmBinaryTrainer trainer = ML.BinaryClassification.Trainers.LightGbm(new LightGbmBinaryTrainer.Options
{
Deterministic = true,
ForceRowWise = true
});
Generatore modelli (estensione di Visual Studio)
Generatore modelli è stato aggiornato per utilizzare la versione ML.NET 3.0. Model Builder versione 17.18.0 ha aggiunto scenari di question answering (QA) e riconoscimento di entità nominate (NER).
Tutte le note sulla versione di Model Builder sono disponibili nel repository dotnet/machinelearning-modelbuilder.