Bagikan melalui


Performa dan memori Windows ML

Dalam artikel ini, kami akan membahas cara mengelola performa aplikasi Anda saat menggunakan Windows Pembelajaran Mesin.

Threading dan konkurensi

Setiap objek yang terekspos dari runtime bahasa umum gesar, yang berarti bahwa objek tersebut dapat diakses dari utas apa pun. Lihat Objek tangkas di C++/WinRT untuk informasi selengkapnya tentang agile.

Satu objek kunci yang akan Anda kerjakan adalah Pembelajaran ModelSession. Objek ini selalu aman untuk dipanggil dari utas apa pun.

  • Untuk sesi GPU: Objek akan mengunci dan menyinkronkan panggilan bersamaan. Jika Anda memerlukan konkurensi, Anda perlu membuat beberapa sesi untuk mencapainya.

  • Untuk sesi CPU: Objek tidak akan mengunci dan akan mengizinkan panggilan bersamaan pada satu sesi. Anda harus berhati-hati untuk mengelola status, buffer, dan objek pengikatan Anda sendiri.

Anda harus berhati-hati dan mengukur tujuan Anda untuk skenario Anda. Arsitektur GPU modern bekerja secara berbeda dari CPU. Misalnya, jika latensi rendah adalah tujuan Anda, Anda mungkin ingin mengelola cara Anda menjadwalkan pekerjaan di seluruh mesin CPU dan GPU Menggunakan pipelining, bukan konkurensi. Artikel tentang sinkronisasi multi-mesin ini adalah tempat yang bagus untuk memulai. Jika throughput adalah tujuan Anda (seperti memproses gambar sebanyak mungkin pada satu waktu) Anda sering ingin menggunakan beberapa utas dan konkurensi untuk menjenuhkan CPU.

Dalam hal threading dan konkurensi, Anda ingin menjalankan eksperimen dan mengukur waktu. Performa Anda akan berubah secara signifikan berdasarkan tujuan dan skenario Anda.

Penggunaan memori

Setiap instans Pembelajaran Model dan Pembelajaran ModelSession memiliki salinan model dalam memori. Jika Anda bekerja dengan model kecil, Anda mungkin tidak khawatir, tetapi jika Anda bekerja dengan model yang sangat besar, ini menjadi penting.

Untuk merilis memori, panggil Buang model atau sesi. Jangan hanya menghapusnya, karena beberapa bahasa melakukan pengumpulan sampah yang malas.

Pembelajaran Model menyimpan salinan dalam memori untuk mengaktifkan pembuatan sesi baru. Ketika Anda membuang Pembelajaran Model, semua sesi yang ada akan terus berfungsi. Namun, Anda tidak akan lagi dapat membuat sesi baru dengan instans Pembelajaran Model tersebut. Untuk model besar, Anda dapat membuat model dan sesi, lalu membuang model. Dengan menggunakan satu sesi untuk semua panggilan ke Evaluasi, Anda akan memiliki satu salinan model besar dalam memori.

Dukungan Float16

Untuk performa yang lebih baik dan mengurangi jejak model, Anda dapat menggunakan ONNXMLTools untuk mengonversi model Anda ke float16.

Setelah dikonversi, semua bobot dan input adalah float16. Berikut adalah cara Anda dapat bekerja dengan input dan output float16:

  • ImageFeatureValue

    • Penggunaan yang disarankan.
    • Mengonversi warna dan menegangkan menjadi float16.
    • Mendukung format gambar bgr8 dan 8-bit, yang dapat dikonversi dengan aman menjadi float16 tanpa kehilangan data.
  • TensorFloat

    • Jalur tingkat lanjut.
    • Float32 dilemparkan ke float16.
    • Untuk gambar, ini aman untuk dilemparkan, karena bgr8 kecil dan pas.
    • Untuk non-gambar, Bind akan gagal, dan Anda harus meneruskan TensorFloat16Bit sebagai gantinya.
  • TensorFloat16Bit

    • Jalur tingkat lanjut.
    • Anda perlu mengonversi ke float16 dan meneruskan input sebagai float32, yang akan dilemparkan ke float16.

Catatan

Sebagian besar waktu, operator masih melakukan matematika 32-bit. Ada lebih sedikit risiko untuk luapan, dan hasilnya dipotong menjadi float16. Namun, jika perangkat keras mengiklankan dukungan float16, maka runtime akan memanfaatkannya.

Data input pra-pemrosesan

WinML melakukan beberapa langkah pra-pemrosesan di bawah sampul untuk membuat pemrosesan data input lebih sederhana dan lebih efisien. Misalnya, gambar input yang diberikan bisa dalam berbagai format dan bentuk warna, dan mungkin berbeda dari yang diharapkan model. WinML melakukan konversi pada gambar untuk mencocokkannya, mengurangi beban pada pengembang.

WinML juga memanfaatkan seluruh tumpukan perangkat keras (CPU, GPU, dan sebagainya) untuk memberikan konversi yang paling efisien untuk perangkat dan skenario tertentu.

Namun, dalam kasus tertentu Anda mungkin ingin menyewakan data input Anda secara manual karena beberapa persyaratan khusus yang Anda miliki. Misalnya, mungkin Anda tidak ingin menggunakan VideoFrame untuk gambar Anda, atau Anda ingin menormalkan nilai piksel dari rentang 0-255 hingga rentang 0-1. Dalam kasus ini, Anda dapat melakukan tensorisasi kustom Anda sendiri pada data. Lihat Sampel Tensorisasi Kustom untuk contoh ini.

Catatan

Gunakan sumber daya berikut untuk bantuan dengan Windows ML:

  • Untuk mengajukan atau menjawab pertanyaan teknis tentang Windows ML, silakan gunakan tag windows-machine-learning di Stack Overflow.
  • Untuk melaporkan bug, silakan ajukan masalah di GitHub kami.