Compartir a través de


Novedades de ML.NET

Nota:

Este artículo es un trabajo en curso.

Puede encontrar todas las notas de lanzamiento de la API de ML.NET en el repositorio dotnet/machinelearning.

Nuevas tareas de aprendizaje profundo

ML.NET 3.0 se ha agregado compatibilidad con las siguientes tareas de aprendizaje profundo:

  • Detección de objetos (respaldada por TorchSharp)
  • Reconocimiento de entidades nombradas (NER)
  • Respuesta a preguntas (QA)

Estos instructores se incluyen en el paquete Microsoft.ML.TorchSharp . Para obtener más información, vea Anuncio de ML.NET 3.0.

AutoML (aprendizaje automático automatizado)

En ML.NET 3.0, el barrido de AutoML se actualizó para admitir la similitud de oraciones, la respuesta a preguntas y las tareas de detección de objetos. Para obtener más información sobre AutoML, consulte Uso de la API de Machine Learning automatizado (AutoML) de ML.NET.

Compatibilidad adicional con tokenizadores

La tokenización es un componente fundamental en el preprocesamiento de texto de lenguaje natural para los modelos de IA. Los tokenizadores son responsables de dividir una cadena de texto en partes más pequeñas y manejables, a menudo denominadas tokens. Al usar servicios como Azure OpenAI, puede usar tokenizadores para comprender mejor el costo y administrar el contexto. Al trabajar con modelos autohospedados o locales, los tokens son las entradas proporcionadas a esos modelos. Para obtener más información sobre la tokenización en la biblioteca Microsoft.ML.Tokenizers, consulte Anuncio de ML.NET 2.0.

El paquete Microsoft.ML.Tokenizers proporciona una biblioteca de tokenización multiplataforma de código abierto. En ML.NET 4.0, la biblioteca se ha mejorado de las siguientes maneras:

  • API refinadas y funcionalidad existente.
  • Se ha agregado compatibilidad con Tiktoken.
  • Se ha agregado compatibilidad con el tokenizador para el Llama modelo.
  • Se ha agregado el CodeGen tokenizador, que es compatible con modelos como codegen-350M-mono y phi-2.
  • Se han agregado EncodeToIds sobrecargas que aceptan Span<char> instancias y permiten personalizar la normalización y la pretokenización.
  • Colaboró estrechamente con las comunidades de DeepDev TokenizerLib y SharpToken para abordar escenarios cubiertos por esas bibliotecas. Si usa DeepDev o SharpToken, se recomienda migrar a Microsoft.ML.Tokenizers. Para más información, consulte la guía de migración.

En los ejemplos siguientes se muestra cómo usar el Tiktoken tokenizador de texto.

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

En los ejemplos siguientes se muestra cómo usar el Llama tokenizador de texto.

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

En los ejemplos siguientes se muestra cómo usar el CodeGen tokenizador.

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

En el ejemplo siguiente se muestra cómo usar el tokenizador con Span<char> y cómo deshabilitar la normalización o la pretokenización en las llamadas de codificación.

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

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

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

Compatibilidad a nivel de bytes en el tokenizador BPE

Ahora BpeTokenizer admite la codificación de nivel de bytes, lo que permite la compatibilidad con modelos como DeepSeek. Esta mejora procesa el vocabulario como bytes UTF-8. Además, el nuevo BpeOptions tipo simplifica la configuración del tokenizador.

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

Opción determinista para el entrenador de LightGBM

Los instructores de LightGBM ahora exponen opciones para el entrenamiento determinista, lo que garantiza resultados coherentes con los mismos datos y inicialización aleatoria. Estas opciones incluyen deterministic, force_row_wisey force_col_wise.

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

Generador de modelos (extensión de Visual Studio)

Model Builder se ha actualizado para consumir la versión de ML.NET 3.0. Model Builder versión 17.18.0 agregó escenarios de respuesta a preguntas (QA) y reconocimiento de entidades con nombre (NER).

Puede encontrar todas las notas de la versión del Generador de modelos en el repositorio dotnet/machinelearning-modelbuilder.

Consulte también