비고
이 문서는 진행 중인 작업입니다.
dotnet/machinelearning 리포지토리에서 ML.NET API에 대한 모든 릴리스 정보를 찾을 수 있습니다.
새로운 심층 학습 작업
ML.NET 3.0은 다음과 같은 딥 러닝 작업에 대한 지원을 추가했습니다.
- 개체 감지(TorchSharp에서 지원)
- NER(명명된 엔터티 인식)
- QA(질문 답변)
이러한 트레이너는 Microsoft.ML.TorchSharp 패키지에 포함되어 있습니다. 자세한 내용은 ML.NET 3.0 발표를 참조하세요.
AutoML (자동화된 기계 학습)
ML.NET 3.0에서는 문장 유사성, 질문 답변 및 개체 검색 작업을 지원하도록 AutoML 스위퍼가 업데이트되었습니다. AutoML에 대한 자세한 내용은 ML.NET AutoML(자동화된 Machine Learning) API를 사용하는 방법을 참조하세요.
추가 토크나이저 지원
토큰화는 AI 모델에 대한 자연어 텍스트 전처리의 기본 구성 요소입니다. Tokenizer는 텍스트 문자열을 토큰이라고도 하는 더 작고 관리하기 쉬운 부분으로 나누는 역할을 담당 합니다. Azure OpenAI와 같은 서비스를 사용하는 경우 tokenizer를 사용하여 비용을 더 잘 이해하고 컨텍스트를 관리할 수 있습니다. 자체 호스팅 또는 로컬 모델로 작업할 때 토큰은 해당 모델에 제공되는 입력입니다. Microsoft.ML.Tokenizers 라이브러리의 토큰화에 대한 자세한 내용은 ML.NET 2.0 발표를 참조하세요.
Microsoft.ML.Tokenizers 패키지는 오픈 소스 플랫폼 간 토큰화 라이브러리를 제공합니다. ML.NET 4.0에서는 다음과 같은 방법으로 라이브러리가 향상되었습니다.
- 구체화된 API 및 기존 기능
-
Tiktoken
지원이 추가되었습니다. - 모델에 대한 토케나이저 지원이 추가되었습니다
Llama
. -
CodeGen
codegen-350M-mono 및 phi-2와 같은 모델과 호환되는 tokenizer가 추가되었습니다. -
EncodeToIds
오버로드가 추가되어Span<char>
인스턴스를 허용하고 정규화 및 사전 토큰화를 사용자 지정할 수 있습니다. - DeepDev
TokenizerLib
및 커뮤니티와SharpToken
긴밀히 협력하여 해당 라이브러리에서 다루는 시나리오를 다루었습니다.DeepDev
또는SharpToken
을 사용하는 경우,Microsoft.ML.Tokenizers
로 마이그레이션할 것을 권장합니다. 자세한 내용은 마이그레이션 가이드를 참조하세요.
다음 예제에서는 텍스트 토큰 변환기를 사용하는 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
다음 예제에서는 텍스트 토큰 변환기를 사용하는 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
다음 예제에서는 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");
다음 예제에서는 토큰화기를 Span<char>
사용하는 방법과 인코딩 호출에서 정규화 또는 사전 토큰화를 사용하지 않도록 설정하는 방법을 보여 줍니다.
ReadOnlySpan<char> textSpan = "Hello World".AsSpan();
// Bypass normalization.
IReadOnlyList<int> ids = llamaTokenizer.EncodeToIds(textSpan, considerNormalization: false);
// Bypass pretokenization.
ids = llamaTokenizer.EncodeToIds(textSpan, considerPreTokenization: false);
BPE 토큰화 도우미의 바이트 수준 지원
BpeTokenizer은 이제 바이트 수준 인코딩을 지원하여 DeepSeek과 같은 모델과의 호환성을 가능하게 합니다. 이 향상된 기능은 어휘를 UTF-8바이트로 처리합니다. 또한 새 BpeOptions
형식은 토큰화기 구성을 간소화합니다.
BpeOptions bpeOptions = new BpeOptions(vocabs);
BpeTokenizer tokenizer = BpeTokenizer.Create(bpeOptions);
LightGBM 트레이너를 위한 결정론적 옵션
이제 LightGBM 트레이너는 결정적 학습 옵션을 노출하여 동일한 데이터와 임의 시드를 사용하여 일관된 결과를 보장합니다. 이러한 옵션에는 deterministic
, force_row_wise
및 force_col_wise
.
LightGbmBinaryTrainer trainer = ML.BinaryClassification.Trainers.LightGbm(new LightGbmBinaryTrainer.Options
{
Deterministic = true,
ForceRowWise = true
});
모델 작성기(Visual Studio 확장)
모델 작성기에서 ML.NET 3.0 릴리스를 사용하도록 업데이트되었습니다. Model Builder 버전 17.18.0에는 QA(질문 답변) 및 명명된 NER(엔터티 인식) 시나리오가 추가되었습니다.
dotnet/machinelearning-modelbuilder 리포지토리에서 모든 Model Builder 릴리스 정보를 찾을 수 있습니다.
참고하십시오
.NET