ONNX Runtime Generative AI ile Windows uygulamanızda Phi3 ve diğer dil modellerini kullanmaya başlama
Bu makale, basit bir oluşturucu yapay zeka sohbet uygulaması uygulamak için Phi3 modeli ve ONNX Runtime Generative AI kitaplığı kullanan bir WinUI 3 uygulaması oluşturma işleminde size yol gösterir. Büyük dil modelleri (LLM'ler), uygulamanıza metin oluşturma, dönüştürme, mantık yürütme ve çeviri özellikleri eklemenize olanak tanır. Windows uygulamanızda yapay zeka ve makine öğrenmesi modellerini kullanma hakkında daha fazla bilgi için bkz. Windows 'da yapay zekayı kullanmaya başlama. ONNX çalışma zamanı ve üretken yapay zeka hakkında daha fazla bilgi için bkz.
Yapay zeka özelliklerini kullanırken şunları gözden geçirmenizi öneririz: WindowsÜzerinde Sorumlu Üretken Yapay Zeka Uygulamaları ve Özellikleri Geliştirme.
ONNX Runtime nedir?
ONNX Runtime, donanıma özgü kitaplıkları tümleştirmeye yönelik esnek bir arabirime sahip platformlar arası bir makine öğrenmesi model hızlandırıcısıdır. ONNX Runtime PyTorch, Tensorflow/Keras, TFLite, scikit-learnve diğer çerçevelerden modellerle kullanılabilir. Daha fazla bilgi için ONNX Runtimekonumundaki https://onnxruntime.ai/docs/ web sitesine bakın.
Önkoşullar
- Cihazınızda geliştirici modu etkinleştirilmiş olmalıdır. Daha fazla bilgi için bkz. Cihazınızı geliştirme için etkinleştirin.
- .NET masaüstü geliştirme iş yüküyle Visual Studio 2022 veya üzeri.
Yeni bir C# WinUI uygulaması oluşturma
Visual Studio'da yeni bir proje oluşturun. Yeni proje oluştur iletişim
ONNX Runtime Generative AI Nuget paketine referanslar ekleyin
Projenize model ve sözlük dosyası ekleme
Çözüm Gezginibölümünde projenize sağ tıklayın ve Yeni Klasör Ekle>seçeneğini seçin. Yeni klasörü "Models" olarak adlandırın. Bu örnekte, https://huggingface.co/microsoft/Phi-3-mini-4k-instruct-onnx/tree/main/directml/directml-int4-awq-block-128modelini kullanacağız.
Modelleri almanın birkaç farklı yolu vardır. Bu açıklamalı kılavuzda Hugging Face Komut Satırı Arabirimi'ni (CLI) kullanacağız. Modelleri başka bir yöntem kullanarak alırsanız, örnek kodda modele yönelik dosya yollarını ayarlamanız gerekebilir. Hugging Face CLI'yi yükleme ve hesabınızı kullanmak üzere ayarlama hakkında bilgi için bkz. Komut Satırı Arabirimi (CLI).
CLI'yı yükledikten sonra bir terminal açın, oluşturduğunuz Models
dizinine gidin ve aşağıdaki komutu yazın.
huggingface-cli download microsoft/Phi-3-mini-4k-instruct-onnx --include directml/* --local-dir .
İşlem tamamlandığında şu dosyanın mevcut olduğunu doğrulayın: [Project Directory]\Models\directml\directml-int4-awq-block-128\model.onnx
.
Çözüm Gezgini"directml-int4-awq-block-128" klasörünü genişletin ve klasördeki tüm dosyaları seçin. Dosya Özellikleri bölmesinde, Çıkış Dizinine Kopyala seçeneğini "Daha yeniyse kopyala" olarak ayarlayın.
Modelle etkileşime geçmek için basit bir kullanıcı arabirimi ekleme
Bu örnekte, istem belirtmek için TextBox, istemi göndermek için bir Düğmesi ve durum iletilerini ve modelden gelen yanıtları görüntülemek için bir TextBlock içeren çok basit bir kullanıcı arabirimi oluşturacağız.
'daki varsayılan MainWindow.xaml
öğesini aşağıdaki XAML ile değiştirin.
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column ="0">
<TextBox x:Name="promptTextBox" Text="Compose a haiku about coding."/>
<Button x:Name="myButton" Click="myButton_Click">Submit prompt</Button>
</StackPanel>
<Border Grid.Column="1" Margin="20">
<TextBlock x:Name="responseTextBlock" TextWrapping="WrapWholeWords"/>
</Border>
</Grid>
Modeli başlatma
MainWindow.xaml.cs
içinde, Microsoft.ML.OnnxRuntimeGenAI ad alanı için bir using yönergesi ekleyin.
using Microsoft.ML.OnnxRuntimeGenAI;
Modeli ve Belirteç Oluşturucuiçin MainPage sınıf tanımı içinde üye değişkenleri bildirin. Önceki adımlarda eklediğimiz model dosyalarının konumunu ayarlayın.
private Model? model = null;
private Tokenizer? tokenizer = null;
private readonly string ModelDir =
Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
@"Models\directml\directml-int4-awq-block-128");
Modeli zaman uyumsuz olarak başlatmak için bir yardımcı yöntemi oluşturun. Bu yöntem, model dizinine giden yolu geçirerek Model sınıfı için oluşturucuyu çağırır. Ardından modelden yeni bir Belirteci oluşturur.
public Task InitializeModelAsync()
{
DispatcherQueue.TryEnqueue(() =>
{
responseTextBlock.Text = "Loading model...";
});
return Task.Run(() =>
{
var sw = Stopwatch.StartNew();
model = new Model(ModelDir);
tokenizer = new Tokenizer(model);
sw.Stop();
DispatcherQueue.TryEnqueue(() =>
{
responseTextBlock.Text = $"Model loading took {sw.ElapsedMilliseconds} ms";
});
});
}
Bu örnekte, ana pencere etkinleştirildiğinde modeli yükleyeceğiz. Activated olayı için bir işleyici kaydetmek üzere sayfa oluşturucusunu güncelleyin.
public MainWindow()
{
this.InitializeComponent();
this.Activated += MainWindow_Activated;
}
Etkinleştirildi olayı birden çok kez oluşturulabilir, bu nedenle olay işleyicisinde modeli başlatmadan önce null olduğundan emin olun.
private async void MainWindow_Activated(object sender, WindowActivatedEventArgs args)
{
if (model == null)
{
await InitializeModelAsync();
}
}
Komutu modele gönder
İstemi modele gönderen ve ardından IAsyncEnumerableile sonuçları çağırana zaman uyumsuz bir şekilde döndüren bir yardımcı yöntemi oluşturun.
Bu yöntemde, Generator sınıfı bir döngü içinde kullanılır ve her geçişte GenerateNextToken çağrılarak, modelin giriş istemine dayanarak bir belirteç olarak adlandırılan sonraki birkaç karakteri tahmin etmesi sağlanır. Döngü, oluşturucu IsDone yöntemi true değerini döndürdüğünde veya "<|end|>", "<|system|>", ya da "<|user|>" belirteçlerinden herhangi biri alındığında, yani belirteç oluşturmayı durdurabileceğimizi belirten bir sinyal aldığımızda sonlanır.
public async IAsyncEnumerable<string> InferStreaming(string prompt)
{
if (model == null || tokenizer == null)
{
throw new InvalidOperationException("Model is not ready");
}
var generatorParams = new GeneratorParams(model);
var sequences = tokenizer.Encode(prompt);
generatorParams.SetSearchOption("max_length", 2048);
generatorParams.SetInputSequences(sequences);
generatorParams.TryGraphCaptureWithMaxBatchSize(1);
using var tokenizerStream = tokenizer.CreateStream();
using var generator = new Generator(model, generatorParams);
StringBuilder stringBuilder = new();
while (!generator.IsDone())
{
string part;
try
{
await Task.Delay(10).ConfigureAwait(false);
generator.ComputeLogits();
generator.GenerateNextToken();
part = tokenizerStream.Decode(generator.GetSequence(0)[^1]);
stringBuilder.Append(part);
if (stringBuilder.ToString().Contains("<|end|>")
|| stringBuilder.ToString().Contains("<|user|>")
|| stringBuilder.ToString().Contains("<|system|>"))
{
break;
}
}
catch (Exception ex)
{
Debug.WriteLine(ex);
break;
}
yield return part;
}
}
İstemi göndermek ve sonuçları görüntülemek için kullanıcı arabirimi kodu ekleme
Düğmesi tıklama işleyicisinde, önce modelin null olmadığını doğrulayın. Sistem ve kullanıcı istemiyle bir istem metni oluşturun ve InferStreamingçağrısı yaparak TextBlock yanıtın her bölümüyle güncelleyin.
Bu örnekte kullanılan model, istemleri kabul etmek için aşağıdaki biçimde eğitilmiştir. Burada systemPrompt
modelin nasıl davranması gerektiğine ilişkin yönergelerdir ve userPrompt
kullanıcıdan gelen sorudur.
<|system|>{systemPrompt}<|end|><|user|>{userPrompt}<|end|><|assistant|>
Modeller, tetikleme kurallarını belgelemelidir. Bu modelin biçimi, Huggingface model kartında belgelenmiştir.
private async void myButton_Click(object sender, RoutedEventArgs e)
{
responseTextBlock.Text = "";
if(model != null)
{
var systemPrompt = "You are a helpful assistant.";
var userPrompt = promptTextBox.Text;
var prompt = $@"<|system|>{systemPrompt}<|end|><|user|>{userPrompt}<|end|><|assistant|>";
await foreach (var part in InferStreaming(prompt))
{
responseTextBlock.Text += part;
}
}
}
Örneği çalıştırma
Visual Studio'daki Çözüm Platformları açılan listesinde hedef işlemcinin x64 olarak ayarlandığından emin olun. ONNXRuntime Generative AI kitaplığı x86'yi desteklemez. Projeyi derleyin ve çalıştırın. TextBlock modelin yüklendiğini belirtmesini bekleyin. İstem metin kutusuna bir istem yazın ve gönder düğmesine tıklayın. Sonuçların metin bloğunu yavaş yavaş doldurduğunu görmelisiniz.
Ayrıca bkz.
- Windows'da yapay zekayı kullanmaya başlama
ile Üretken Yapay Zeka