Aracılığıyla paylaş


Windows ML ile yürütme sağlayıcılarını başlatma

Bu sayfada, uygulamanızın Windows ML kullanarak yürütme sağlayıcılarını (IP' ler) indirme ve kaydetme işlemlerini düzgün bir şekilde işleyebileceği daha gelişmiş yollar açıklanır. Cihaza zaten bir EP indirilmiş olsa bile, uygulamanız her çalıştırıldığında ONNX Çalışma Zamanı'nda görünmeleri için EP'leri kaydetmeniz gerekir.

Tek bir adımda indir ve kayıt ol

Başlangıç geliştirme aşamasında, cihazınızla uyumlu EP'lerin mevcut olduğundan emin olacak (ve mevcut değilse EP'leri indirecek) ve ardından mevcut tüm EP'leri ONNX Çalışma Zamanı'na kaydedecek olan EnsureAndRegisterCertifiedAsync() ifadesini çağırmak faydalı olabilir. İlk çalıştırmada, bu yöntemin ağ hızınıza ve indirilmesi gereken IP'lere bağlı olarak birkaç saniye, hatta dakikalar sürebileceğini unutmayın.

// Get the default ExecutionProviderCatalog
var catalog = ExecutionProviderCatalog.GetDefault();

// Ensure execution providers compatible with device are present (downloads if necessary)
// and then registers all present execution providers with ONNX Runtime
await catalog.EnsureAndRegisterCertifiedAsync();

Tavsiye

Üretim uygulamalarında, olası ağ veya indirme hatalarını düzgün bir şekilde ele almak için EnsureAndRegisterCertifiedAsync() çağrısını try-catch bloğuna sarmalayın.

Yalnızca mevcut sağlayıcıları kaydetme

İndirmekten kaçınmak ve yalnızca makinede zaten mevcut olan yürütme sağlayıcılarını kaydetmek istiyorsanız:

var catalog = ExecutionProviderCatalog.GetDefault();

// Register only providers already present on the machine
// This avoids potentially long download times
await catalog.RegisterCertifiedAsync();

EP'lerin olup olmadığını kontrol edin (indirmeden)

Cihazınız ve sürücülerinizle uyumlu, ancak mevcut olmayan EP'leri görmek istiyor, fakat indirmeyi başlatmak istemiyorsanız, FindAllProviders() yöntemini kullanarak herhangi bir sağlayıcının ReadyState durumunun NotPresent olup olmadığını kontrol edebilirsiniz. Daha sonra bunu istediğiniz gibi işlemeye karar verebilirsiniz (kullanıcılarınızı bir "Yükleme ekranına" başlatma, yüklemek isteyip istemediklerini sorma vb.). Kullanıcılarınızın şu anda beklemesini istemiyorsanız, daha önce indirilmiş herhangi bir EP'yi (yukarıda gösterildiği gibi arayarak RegisterCertifiedAsync()) kullanmaya devam etmeyi seçebilirsiniz.

var catalog = ExecutionProviderCatalog.GetDefault();

// Check if there are new EPs that need to be downloaded
if (catalog.FindAllProviders().Any(provider => provider.ReadyState == ExecutionProviderReadyState.NotPresent))
{
    // TODO: There are new EPs, decide how your app wants to handle that
}
else
{
    // All EPs are already present, just register them
    await catalog.RegisterCertifiedAsync();
}

Belirli bir EP'i indirme ve kaydetme

Uygulamanızın kullanmak istediği belirli bir yürütme sağlayıcısı varsa, tüm uyumlu IP'leri indirmeden belirli bir yürütme sağlayıcısını indirebilir ve kaydedebilirsiniz.

Önce tüm uyumlu EP'leri almak için kullanacaksınız FindAllProviders() ve ardından belirli bir EnsureReadyAsync() çağırarak belirli bir yürütme sağlayıcısını indirebilir ve belirli bir yürütme sağlayıcısını kaydetmek için çağırabilirsinizTryRegister().

var catalog = ExecutionProviderCatalog.GetDefault();

// Get the QNN provider, if present
var qnnProvider = catalog.FindAllProviders()
    .FirstOrDefault(i => i.Name == "QNNExecutionProvider");

if (qnnProvider != null)
{
    // Download it
    var result = await qnnProvider.EnsureReadyAsync();

    // If download succeeded
    if (result != null && result.Status == ExecutionProviderReadyResultState.Success)
    {
        // Register it
        bool registered = qnnProvider.TryRegister();
    }
}

Üretim uygulaması örneği

Üretim uygulamaları için, aşağıda uygulamanızın kendinize ve kullanıcılarınıza indirmelerin ne zaman gerçekleşebileceği üzerinde denetim vermek için neler yapmak isteyebileceğine ilişkin bir örnek verilmiştır. Yeni yürütme sağlayıcılarının kullanılabilir olup olmadığını denetleyebilir ve bunları koşullu olarak indirebilirsiniz:

using Microsoft.Windows.AI.MachineLearning;

var catalog = ExecutionProviderCatalog.GetDefault();

// Filter to the EPs our app supports/uses
var providers = catalog.FindAllProviders().Where(p =>
    p.Name == "MIGraphXExecutionProvider" ||
    p.Name == "VitisAIExecutionProvider" ||
    p.Name == "OpenVINOExecutionProvider" ||
    p.Name == "QNNExecutionProvider" ||
    p.Name == "NvTensorRtRtxExecutionProvider"
);

if (providers.Any(p => p.ReadyState == ExecutionProviderReadyState.NotPresent))
{
    // Show UI to user asking if they want to download new execution providers
    bool userWantsToDownload = await ShowDownloadDialogAsync();

    if (userWantsToDownload)
    {
        // Download all EPs
        foreach (var p in providers)
        {
            if (p.ReadyState == ExecutionProviderReadyState.NotPresent)
            {
                // Ignore result handling here; production code could inspect status
                await p.EnsureReadyAsync();
            }
        }

        // And register all EPs
        await catalog.RegisterCertifiedAsync();
    }
    else
    {
        // Register only already-present EPs
        await catalog.RegisterCertifiedAsync();
    }
}

Ayrıca bakınız