Freigeben über


Neuerungen in ML.NET

Hinweis

Dieser Artikel ist eine laufende Arbeit.

Alle Versionshinweise für die ML.NET-API finden Sie im Dotnet/machinelearning-Repository.

Neue Deep-Learning-Aufgaben

ML.NET 3.0 hat Unterstützung für die folgenden Deep-Learning-Aufgaben hinzugefügt:

  • Objekterkennung (unterstützt von TorchSharp)
  • Erkennung benannter Entitäten (NER)
  • Frageantwort (QS)

Diese Trainer sind im Microsoft.ML.TorchSharp-Paket enthalten. Weitere Informationen finden Sie unter Ankündigung ML.NET 3.0.

Automatisiertes maschinelles Lernen (AutoML)

In ML.NET 3.0 wurde der AutoML-Sweeper aktualisiert, um die Satzähnlichkeit, Fragebeantwortung und Objekterkennung zu unterstützen. Weitere Informationen zu AutoML finden Sie unter How to use the ML.NET Automated Machine Learning (AutoML) API.

Zusätzliche Tokenizerunterstützung

Die Tokenisierung ist eine grundlegende Komponente bei der Vorverarbeitung von Text in natürlicher Sprache für KI-Modelle. Tokenizer sind dafür verantwortlich, eine Textzeichenfolge in kleinere, besser verwaltbare Teile zu unterteilen, die häufig als Token bezeichnet werden. Wenn Sie Dienste wie Azure OpenAI verwenden, können Sie Tokenizer verwenden, um ein besseres Verständnis von Kosten zu erhalten und den Kontext zu verwalten. Bei der Arbeit mit selbst gehosteten oder lokalen Modellen sind Token die Eingaben, die für diese Modelle bereitgestellt werden. Weitere Informationen zur Tokenisierung in der Microsoft.ML.Tokenizers-Bibliothek finden Sie unter Ankündigung ML.NET 2.0.

Das Microsoft.ML.Tokenizers-Paket stellt eine plattformübergreifende Open-Source-Tokenisierungsbibliothek bereit. In ML.NET 4.0 wurde die Bibliothek auf folgende Weise verbessert:

  • Verfeinerte APIs und bestehende Funktionen.
  • Unterstützung für Tiktoken wurde hinzugefügt.
  • Tokenizerunterstützung für das Llama Modell hinzugefügt.
  • Der Tokenizer wurde hinzugefügt, der CodeGen mit Modellen wie Codegen-350M-Mono und phi-2 kompatibel ist.
  • Überladungen wurden hinzugefügtEncodeToIds, die Span<char> Instanzen akzeptieren und es Ihnen ermöglichen, die Normalisierung und Prätokenisierung anzupassen.
  • Arbeiten Sie eng mit den DeepDev TokenizerLib - und SharpToken Communitys zusammen, um Szenarien abzudecken, die von diesen Bibliotheken abgedeckt werden. Wenn Sie DeepDev oder SharpToken verwenden, empfehlen wir, zu Microsoft.ML.Tokenizers zu migrieren. Weitere Informationen finden Sie im Migrationshandbuch.

Die folgenden Beispiele zeigen, wie Sie den Tiktoken Texttokenizer verwenden.

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

Die folgenden Beispiele zeigen, wie Sie den Llama Texttokenizer verwenden.

// 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

Die folgenden Beispiele zeigen die Verwendung des CodeGen Tokenizers.

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");

Im folgenden Beispiel wird veranschaulicht, wie sie den Tokenizer verwenden Span<char> und wie die Normalisierung oder Prätokenisierung für die Codierungsaufrufe deaktiviert wird.

ReadOnlySpan<char> textSpan = "Hello World".AsSpan();

// Bypass normalization.
IReadOnlyList<int> ids = llamaTokenizer.EncodeToIds(textSpan, considerNormalization: false);

// Bypass pretokenization.
ids = llamaTokenizer.EncodeToIds(textSpan, considerPreTokenization: false);

Unterstützung auf Byteebene in BPE-Tokenizer

Die BpeTokenizer unterstützt jetzt die Byte-Level-Codierung, wodurch die Kompatibilität mit Modellen wie DeepSeek ermöglicht wird. Diese Erweiterung verarbeitet Vokabular als UTF-8 Bytes. Darüber hinaus vereinfacht der neue BpeOptions Typ die Tokenizerkonfiguration.

BpeOptions bpeOptions = new BpeOptions(vocabs);
BpeTokenizer tokenizer = BpeTokenizer.Create(bpeOptions);

Deterministische Option für LightGBM-Trainer

LightGBM-Trainer stellen jetzt Optionen für deterministische Schulungen bereit, um konsistente Ergebnisse mit denselben Daten und zufälligem Seed sicherzustellen. Diese Optionen umfassen deterministic, force_row_wise und force_col_wise.

LightGbmBinaryTrainer trainer = ML.BinaryClassification.Trainers.LightGbm(new LightGbmBinaryTrainer.Options
{
    Deterministic = true,
    ForceRowWise = true
});

Modell-Generator (Visual Studio-Erweiterung)

Der Model Builder wurde aktualisiert, um die Version ML.NET 3.0 zu verwenden. Modell-Generator Version 17.18.0 hat Frage-Antwort-Szenarien (FAQ) und benannte Entitätserkennungsszenarien (NER) hinzugefügt.

Alle Versionshinweise des Modell-Generators finden Sie im Repository "dotnet/machinelearning-modelbuilder".

Siehe auch