Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Windows ML, GPU yolunu dikkatlice iyileştirerek model zincirlerinin yüksek performanslı yük ve yürütmesini destekler. Model zincirleri, sırayla yürütülen iki veya daha fazla model tarafından tanımlanır ve burada bir modelin çıkışları zincirde bir sonraki modele giriş haline gelir.
Windows ML ile modelleri verimli bir şekilde zincirlemeyi açıklamak için oyuncak örneği olarak FNS-Candy Stil Aktarımı ONNX modelini kullanalım. Bu model türünü GitHub'ımızdaki FNS-Candy Stil Aktarımı örnek klasöründe bulabilirsiniz.
Aynı FNS-Candy modelinin iki örneğinden oluşan ve burada mozaik.onnx adlı bir zincir yürütmek istediğimizi düşünelim. Uygulama kodu bir görüntüyü zincirdeki ilk modele geçirir, çıkışları hesaplamasına izin verir ve ardından dönüştürülmüş görüntüyü FNS-Candy'nin başka bir örneğine geçirerek son görüntüyü oluşturur.
Aşağıdaki adımlar, Windows ML kullanarak bunu nasıl gerçekleştireceklerini göstermektedir.
Uyarı
Gerçek bir sözcük senaryosunda büyük olasılıkla iki farklı model kullanırsınız, ancak bu, kavramları göstermek için yeterli olmalıdır.
- İlk olarak , mozaik.onnx modelini yükleyelim, böylece bunu kullanabiliriz.
std::wstring filePath = L"path\\to\\mosaic.onnx";
LearningModel model = LearningModel::LoadFromFilePath(filePath);
string filePath = "path\\to\\mosaic.onnx";
LearningModel model = LearningModel.LoadFromFilePath(filePath);
- Ardından giriş parametresiyle aynı modeli kullanarak cihazın varsayılan GPU'sunun aynı iki oturumu oluşturalım.
LearningModelSession session1(model, LearningModelDevice(LearningModelDeviceKind::DirectX));
LearningModelSession session2(model, LearningModelDevice(LearningModelDeviceKind::DirectX));
LearningModelSession session1 =
new LearningModelSession(model, new LearningModelDevice(LearningModelDeviceKind.DirectX));
LearningModelSession session2 =
new LearningModelSession(model, new LearningModelDevice(LearningModelDeviceKind.DirectX));
Uyarı
Zincirlemenin performans avantajlarından yararlanmak için tüm modelleriniz için aynı GPU oturumları oluşturmanız gerekir. Bunun yapılmaması, GPU'nun dışına ve CPU'ya ek veri hareketi yapılmasına neden olur ve bu da performansı düşürür.
- Aşağıdaki kod satırları her oturum için bağlamalar oluşturur:
LearningModelBinding binding1(session1);
LearningModelBinding binding2(session2);
LearningModelBinding binding1 = new LearningModelBinding(session1);
LearningModelBinding binding2 = new LearningModelBinding(session2);
- Ardından, ilk modelimiz için bir giriş bağlayacağız. Modelimizle aynı yolda bulunan bir görüntüyü kullanacağız. Bu örnekte görüntü "fish_720.png" olarak adlandırılır.
//get the input descriptor
ILearningModelFeatureDescriptor input = model.InputFeatures().GetAt(0);
//load a SoftwareBitmap
hstring imagePath = L"path\\to\\fish_720.png";
// Get the image and bind it to the model's input
try
{
StorageFile file = StorageFile::GetFileFromPathAsync(imagePath).get();
IRandomAccessStream stream = file.OpenAsync(FileAccessMode::Read).get();
BitmapDecoder decoder = BitmapDecoder::CreateAsync(stream).get();
SoftwareBitmap softwareBitmap = decoder.GetSoftwareBitmapAsync().get();
VideoFrame videoFrame = VideoFrame::CreateWithSoftwareBitmap(softwareBitmap);
ImageFeatureValue image = ImageFeatureValue::CreateFromVideoFrame(videoFrame);
binding1.Bind(input.Name(), image);
}
catch (...)
{
printf("Failed to load/bind image\n");
}
//get the input descriptor
ILearningModelFeatureDescriptor input = model.InputFeatures[0];
//load a SoftwareBitmap
string imagePath = "path\\to\\fish_720.png";
// Get the image and bind it to the model's input
try
{
StorageFile file = await StorageFile.GetFileFromPathAsync(imagePath);
IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read);
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
SoftwareBitmap softwareBitmap = await decoder.GetSoftwareBitmapAsync();
VideoFrame videoFrame = VideoFrame.CreateWithSoftwareBitmap(softwareBitmap);
ImageFeatureValue image = ImageFeatureValue.CreateFromVideoFrame(videoFrame);
binding1.Bind(input.Name, image);
}
catch
{
Console.WriteLine("Failed to load/bind image");
}
- Zincirdeki bir sonraki modelin ilk modelin değerlendirmesinin çıkışlarını kullanabilmesi için boş bir çıkış tensörü oluşturmamız ve çıkışı eşleştirip zincirleme yapabilmek için bir işaretçimiz olması gerekir.
//get the output descriptor
ILearningModelFeatureDescriptor output = model.OutputFeatures().GetAt(0);
//create an empty output tensor
std::vector<int64_t> shape = {1, 3, 720, 720};
TensorFloat outputValue = TensorFloat::Create(shape);
//bind the (empty) output
binding1.Bind(output.Name(), outputValue);
//get the output descriptor
ILearningModelFeatureDescriptor output = model.OutputFeatures[0];
//create an empty output tensor
List<long> shape = new List<long> { 1, 3, 720, 720 };
TensorFloat outputValue = TensorFloat.Create(shape);
//bind the (empty) output
binding1.Bind(output.Name, outputValue);
Uyarı
Çıkışı bağlarken TensorFloat veri türünü kullanmanız gerekir. Bu, ilk model için değerlendirme tamamlandıktan sonra tensorizasyonun çözümlenmesini önler ve bu nedenle ikinci model için yükleme ve bağlama işlemleri için ek GPU kuyrukta beklemesini de önler.
- Şimdi ilk modelin değerlendirmesini çalıştıracak ve çıkışlarını bir sonraki modelin girişine bağlayacağız:
//run session1 evaluation
session1.EvaluateAsync(binding1, L"");
//bind the output to the next model input
binding2.Bind(input.Name(), outputValue);
//run session2 evaluation
auto session2AsyncOp = session2.EvaluateAsync(binding2, L"");
//run session1 evaluation
await session1.EvaluateAsync(binding1, "");
//bind the output to the next model input
binding2.Bind(input.Name, outputValue);
//run session2 evaluation
LearningModelEvaluationResult results = await session2.EvaluateAsync(binding2, "");
- Son olarak, aşağıdaki kod satırını kullanarak her iki modeli de çalıştırdıktan sonra üretilen son çıkışı alalım.
auto finalOutput = session2AsyncOp.get().Outputs().First().Current().Value();
var finalOutput = results.Outputs.First().Value;
Hepsi bu kadar! Artık her iki modeliniz de kullanılabilir GPU kaynaklarından en iyi şekilde yararlanarak sırayla yürütülebilir.
Uyarı
Windows ML ile ilgili yardım için aşağıdaki kaynakları kullanın:
- Windows ML hakkında teknik sorular sormak veya yanıtlamak için lütfen Stack Overflowüzerindeki windows-machine-learning etiketini kullanın.
- Bir hatayı bildirmek için lütfen GitHubile ilgili bir sorun oluşturun.