Remarque
L’accès à cette page requiert une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page requiert une autorisation. Vous pouvez essayer de modifier des répertoires.
Remarque
Cet article est un travail en cours.
Vous trouverez toutes les notes de publication de l’API ML.NET dans le référentiel dotnet/machinelearning.
Nouvelles tâches d’apprentissage profond
ML.NET 3.0 a ajouté la prise en charge des tâches d’apprentissage profond suivantes :
- Détection d’objets (soutenue par TorchSharp)
- La reconnaissance d’entités nommées (NER)
- Réponse aux questions (AQ)
Ces formateurs sont inclus dans le package Microsoft.ML.TorchSharp . Pour plus d’informations, consultez Annonce ML.NET 3.0.
AutoML (Apprentissage automatique automatisé)
Dans ML.NET 3.0, le balayage AutoML a été mis à jour pour prendre en charge la similarité de phrase, la réponse aux questions et les tâches de détection d’objets. Pour plus d’informations sur AutoML, consultez Comment utiliser l’API Machine Learning automatisé (AutoML) ML.NET.
Prise en charge supplémentaire du générateur de jetons
La tokenisation est un composant fondamental du prétraitement du texte en langage naturel pour les modèles IA. Les tokenizers sont chargés de décomposer une chaîne de texte en parties plus petites et plus gérables, souvent appelées jetons. Lorsque vous utilisez des services comme Azure OpenAI, vous pouvez utiliser des tokenizers pour mieux comprendre les coûts et gérer le contexte. Lorsque vous utilisez des modèles auto-hébergés ou locaux, les jetons sont les entrées fournies à ces modèles. Pour plus d’informations sur la tokenisation dans la bibliothèque Microsoft.ML.Tokenizers, consultez Annonce ML.NET 2.0.
Le package Microsoft.ML.Tokenizers fournit une bibliothèque de jetons open source multiplateforme. Dans ML.NET 4.0, la bibliothèque a été améliorée de la manière suivante :
- API affinées et fonctionnalités existantes.
- Ajout de la prise en
Tiktokencharge. - Ajout de la prise en charge du générateur de jetons pour le
Llamamodèle. - Ajout du
CodeGentokenizer, qui est compatible avec les modèles tels que codegen-350M-mono et phi-2. - Ajout de surcharges
EncodeToIdsqui acceptent des instancesSpan<char>et vous permettent de personnaliser la normalisation et la prétokenisation. - A collaboré étroitement avec les communautés DeepDev
TokenizerLibetSharpTokenpour couvrir les scénarios pris en charge par ces bibliothèques. Si vous utilisezDeepDevouSharpTokensi nous vous recommandons de migrer versMicrosoft.ML.Tokenizers. Pour plus d’informations, consultez le guide de migration.
Les exemples suivants montrent comment utiliser le Tiktoken générateur de jetons de texte.
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
Les exemples suivants montrent comment utiliser le Llama générateur de jetons de texte.
// 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
Les exemples suivants montrent comment utiliser le 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");
L’exemple suivant montre comment utiliser le tokenizer avec Span<char> et comment désactiver la normalisation ou la prétokenisation sur les appels d’encodage.
ReadOnlySpan<char> textSpan = "Hello World".AsSpan();
// Bypass normalization.
IReadOnlyList<int> ids = llamaTokenizer.EncodeToIds(textSpan, considerNormalization: false);
// Bypass pretokenization.
ids = llamaTokenizer.EncodeToIds(textSpan, considerPreTokenization: false);
Prise en charge au niveau des octets dans le tokenizer BPE
Le BpeTokenizer prend désormais en charge l'encodage au niveau de l'octet, permettant la compatibilité avec les modèles comme DeepSeek. Cette amélioration traite le vocabulaire sous forme d'octets UTF-8. En outre, le nouveau BpeOptions type simplifie la configuration du générateur de jetons.
BpeOptions bpeOptions = new BpeOptions(vocabs);
BpeTokenizer tokenizer = BpeTokenizer.Create(bpeOptions);
Option déterministe pour le formateur LightGBM
Les formateurs LightGBM exposent désormais des options d’entraînement déterministe, garantissant ainsi des résultats cohérents avec les mêmes données et les mêmes semences aléatoires. Ces options incluent deterministic, force_row_wiseet force_col_wise.
LightGbmBinaryTrainer trainer = ML.BinaryClassification.Trainers.LightGbm(new LightGbmBinaryTrainer.Options
{
Deterministic = true,
ForceRowWise = true
});
Model Builder (extension Visual Studio)
Model Builder a été mis à jour pour consommer la version ML.NET 3.0. Model Builder version 17.18.0 ajout de scénarios de réponse aux questions (QA) et de reconnaissance d’entité nommée (NER).
Vous trouverez toutes les notes de publication du Générateur de modèles dans le dépôt dotnet/machinelearning-modelbuilder.