Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Dalam artikel ini, kami akan membahas cara mengelola performa aplikasi Anda saat menggunakan Windows Machine Learning.
Threading dan konkurensi
Setiap objek yang terekspos dari runtime bahasa umum lincah, artinya objek tersebut dapat diakses dari utas mana pun. Lihat Objek Agile di C++/WinRT untuk informasi selengkapnya mengenai agile.
Salah satu objek kunci yang akan Anda kerjakan adalah LearningModelSession. 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 dengan cermat 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 unit CPU dan GPU dengan 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 secara bersamaan), Anda sering ingin menggunakan beberapa thread dan konkuren untuk menjenuhkan CPU.
Dalam hal threading dan keserempakan, Anda ingin menjalankan eksperimen dan melakukan pengukuran waktu. Performa Anda akan berubah secara signifikan berdasarkan tujuan dan skenario Anda.
Penggunaan memori
Setiap instans LearningModel dan LearningModelSession 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 Dispose pada model atau sesi. Jangan hanya menghapusnya, karena beberapa bahasa melakukan pengumpulan sampah yang malas.
LearningModel menyimpan salinan dalam memori untuk mengaktifkan pembuatan sesi baru. Saat Anda membuang LearningModel, semua sesi yang ada akan terus berfungsi. Namun, Anda tidak akan lagi dapat membuat sesi baru dengan instans LearningModel tersebut. Untuk model besar, Anda dapat membuat model dan sesi, lalu menghapus 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:
-
- Penggunaan yang disarankan.
- Mengonversi warna dan mengubahnya menjadi tensor float16.
- Mendukung format gambar bgr8 dan 8-bit, yang dapat dikonversi dengan aman menjadi float16 tanpa kehilangan data.
-
- Jalur tingkat lanjut.
- Float32 diubah menjadi float16.
- Untuk gambar, ini aman untuk dilemparkan, karena bgr8 kecil dan pas.
- Untuk non-gambar, Bind akan gagal, dan Anda perlu meneruskan TensorFloat16Bit sebagai pengganti.
-
- Jalur tingkat lanjut.
- Anda perlu mengonversi ke float16 dan meneruskan input sebagai float32, yang akan diubah menjadi float16.
Nota
Sebagian besar waktu, operator masih melakukan matematika 32-bit. Ada risiko overflow yang lebih sedikit, dan hasilnya dibulatkan ke float16. Namun, jika perangkat keras mengiklankan dukungan float16, maka runtime akan memanfaatkannya.
Pra-pemrosesan data input
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 mentensor 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.
Nota
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 laporkan masalah di GitHub kami .