Bagikan melalui


Menginisialisasi penyedia eksekusi dengan Windows ML

Halaman ini membahas cara yang lebih canggih untuk menangani pengunduhan dan pendaftaran penyedia eksekusi (PS) menggunakan Windows ML dengan lancar. Bahkan jika EP sudah diunduh di perangkat, Anda harus mendaftarkan EPs setiap kali aplikasi Anda berjalan sehingga EP akan muncul di ONNX Runtime.

Mengunduh dan mendaftar dalam satu panggilan

Untuk pengembangan awal, ada baiknya untuk hanya memanggil EnsureAndRegisterCertifiedAsync(), yang akan memastikan EP yang kompatibel dengan perangkat Anda ada (dan akan mengunduh EP jika tidak ada), dan kemudian mendaftarkan semua EP yang ada dengan ONNX Runtime. Perhatikan bahwa pada eksekusi pertama, metode ini dapat memakan waktu beberapa detik atau bahkan menit tergantung pada kecepatan jaringan dan IP Anda yang perlu diunduh.

// 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();

Petunjuk / Saran

Dalam aplikasi produksi, bungkus EnsureAndRegisterCertifiedAsync() panggilan dalam blok try-catch untuk menangani potensi kegagalan jaringan atau unduhan dengan anggun.

Daftarkan penyedia yang ada saja

Jika Anda ingin menghindari pengunduhan dan hanya mendaftarkan penyedia eksekusi yang sudah ada di komputer:

var catalog = ExecutionProviderCatalog.GetDefault();

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

Temukan apakah ada EP (tanpa mengunduh)

Jika Anda ingin melihat apakah ada EP yang tidak hadir yang kompatibel dengan perangkat dan driver Anda, tetapi tidak ingin memulai pengunduhan, Anda dapat menggunakan metode FindAllProviders() dan melihat apakah ada penyedia yang memiliki ReadyState dari TidakHadir. Anda kemudian dapat memutuskan untuk menangani ini sesuka Anda (meluncurkan pengguna Anda ke "Layar penginstalan", menanyakan apakah mereka ingin menginstal, dll). Anda dapat memilih untuk terus menggunakan EPs yang sudah diunduh (dengan memanggil seperti yang RegisterCertifiedAsync() ditunjukkan di atas) jika Anda tidak ingin membuat pengguna Anda menunggu sekarang.

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();
}

Mengunduh dan mendaftarkan EP tertentu

Jika ada penyedia eksekusi tertentu yang ingin digunakan oleh aplikasi Anda, Anda dapat mengunduh dan mendaftarkan penyedia eksekusi tersebut tanpa mengunduh semua penyedia eksekusi yang kompatibel.

Anda akan terlebih dahulu menggunakan FindAllProviders() untuk mendapatkan semua EP yang kompatibel, lalu Anda dapat memanggil EnsureReadyAsync() pada ExecutionProvider untuk mengunduh penyedia eksekusi, dan memanggil TryRegister() untuk mendaftarkan penyedia eksekusi tersebut.

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();
    }
}

Contoh aplikasi produksi

Untuk aplikasi produksi, berikut adalah contoh apa yang mungkin ingin dilakukan aplikasi Anda untuk memberi diri Anda dan pengguna Anda mengontrol kapan unduhan terjadi. Anda dapat memeriksa apakah penyedia eksekusi baru tersedia dan mengunduhnya secara kondisional:

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();
    }
}

Lihat juga