Dela via


Nyheter i ML.NET

Anmärkning

Den här artikeln är ett pågående arbete.

Du hittar alla viktig information för ML.NET-API:et i lagringsplatsen dotnet/machinelearning.

Nya djupinlärningsuppgifter

ML.NET 3.0 har lagts till stöd för följande djupinlärningsuppgifter:

  • Objektidentifiering (som backas upp av TorchSharp)
  • Namngiven entitetsigenkänning (NER)
  • Svar på frågor (QA)

Dessa utbildare ingår i Microsoft.ML.TorchSharp-paketet . Mer information finns i Meddelande om ML.NET 3.0.

Automatisk maskininlärning (AutoML)

I ML.NET 3.0 uppdaterades AutoML-funktionen för att stödja uppgifter inom meningslikhet, frågehantering och objektigenkänning. Mer information om AutoML finns i Använda API:et ML.NET Automated Machine Learning (AutoML).

Ytterligare stöd för tokenizer

Tokenisering är en grundläggande komponent i förbearbetningen av text på naturligt språk för AI-modeller. Tokenizers ansvarar för att dela upp en textsträng i mindre, mer hanterbara delar, som ofta kallas token. När du använder tjänster som Azure OpenAI kan du använda tokenizers för att få en bättre förståelse för kostnader och hantera kontext. När du arbetar med självhostade eller lokala modeller är "tokens" det material som ges till dessa modeller. Mer information om tokenisering i biblioteket Microsoft.ML.Tokenizers finns i Meddelande om ML.NET 2.0.

Paketet Microsoft.ML.Tokenizers tillhandahåller ett tokeniseringsbibliotek med öppen källkod och plattformsoberoende. I ML.NET 4.0 har biblioteket förbättrats på följande sätt:

  • Förfinade API:er och befintliga funktioner.
  • Stöd för Tiktoken har lagts till.
  • Tokenizer-stöd har lagts till för Llama-modellen.
  • En tokenizer har lagts CodeGen till, som är kompatibel med modeller som codegen-350M-mono och phi-2.
  • Lagt till EncodeToIds överlagringar som accepterar Span<char> instanser och låter dig anpassa normalisering och förtokenisering.
  • Arbetade nära med DeepDev TokenizerLib och SharpToken-gemenskaperna för att täcka de scenarier som dessa bibliotek omfattar. Om du använder DeepDev eller SharpTokenrekommenderar vi att du migrerar till Microsoft.ML.Tokenizers. Mer information finns i migreringsguiden.

I följande exempel visas hur du använder texttokeniseraren Tiktoken .

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

I följande exempel visas hur du använder texttokeniseraren Llama .

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

I följande exempel visas hur du använder tokenizern CodeGen .

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

I följande exempel visas hur du använder tokeniseraren med Span<char> och hur du inaktiverar normalisering eller förinläsning på kodningsanropen.

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

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

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

Stöd på bytenivå i BPE-tokeniserare

Nu BpeTokenizer har stöd för kodning på bytenivå, vilket möjliggör kompatibilitet med modeller som DeepSeek. Den här förbättringen bearbetar ordförråd som UTF-8 byte. Dessutom förenklar den nya BpeOptions typen tokenizerkonfigurationen.

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

Deterministiskt alternativ för LightGBM-tränare

LightGBM-utbildare exponerar nu alternativ för deterministisk träning, vilket säkerställer konsekventa resultat med samma data och slumpmässiga frö. Dessa alternativ inkluderar deterministic, force_row_wiseoch force_col_wise.

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

Model Builder (Visual Studio-tillägg)

Model Builder har uppdaterats för att använda versionen ML.NET 3.0. Model Builder version 17.18.0 lade till frågesvar (QA) och namngivna scenarier för entitetsigenkänning (NER).

Du hittar alla viktig information om Model Builder i lagringsplatsen dotnet/machinelearning-modelbuilder.

Se även