Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 aceptanSpan<char>
instancias y permiten personalizar la normalización y la pretokenización. - Colaboró estrechamente con las comunidades de DeepDev
TokenizerLib
ySharpToken
para abordar escenarios cubiertos por esas bibliotecas. Si usaDeepDev
oSharpToken
, se recomienda migrar aMicrosoft.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_wise
y 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.