Aracılığıyla paylaş


Windows ML performansı ve belleği

Bu makalede, Windows Machine Learning kullanırken uygulamanızın performansını yönetmeyi ele alacağız.

İş parçacığı işleme ve eşzamanlılık

Çalışma zamanından kullanıma sunulan her nesne çeviktir, yani bunlara herhangi bir iş parçacığından erişilebilir. Çevik hakkında daha fazla bilgi için C++/WinRT'de çevik nesneler bölümüne bakın.

Birlikte çalışacağınız anahtar nesnelerden biri LearningModelSession'dır. Bu nesne her zaman herhangi bir iş parçacığından çağrı yapmak için güvenlidir.

  • GPU oturumları için: Nesne eşzamanlı çağrıları kilitler ve eşitler. Eşzamanlılık gerekiyorsa, bunu başarmak için birden çok oturum oluşturmanız gerekir.

  • CPU oturumları için: Nesne kilitlenmez ve tek bir oturumda eşzamanlı çağrılara izin verir. Kendi durumunuzu, arabelleklerinizi ve bağlama nesnelerinizi yönetmeye dikkat etmeniz gerekir.

Senaryonuza dikkat etmeli ve hedefinizi ölçmelisiniz. Modern GPU mimarileri CPU'lardan farklı çalışır. Örneğin, düşük gecikme süresi hedefinizse eşzamanlılık değil, kanal oluşturma kullanarak CPU ve GPU altyapılarınızda çalışmayı zamanlama yönteminizi yönetmek isteyebilirsiniz. Çok motorlu eşitlemeyle ilgili bu makale, başlamak için harika bir başlangıç noktasıdır. Hedefiniz aktarım hızıysa (aynı anda mümkün olduğunca çok görüntüyü işleme gibi), CPU'yu maksimum kapasiteye çıkarmak için genellikle birden çok iş parçacığı ve eş zamanlılık kullanmak istersiniz.

İş parçacığı oluşturma ve eşzamanlılık söz konusu olduğunda denemeler çalıştırmak ve zamanlamaları ölçmek istiyorsunuz. Hedeflerinize ve senaryonuza göre performansınız önemli ölçüde değişir.

Bellek kullanımı

LearningModel ve LearningModelSession'ın her örneğinde bellekte modelin bir kopyası bulunur. Küçük modellerle çalışıyorsanız endişelenmeyebilirsiniz, ancak çok büyük modellerle çalışıyorsanız bu önemli hale gelir.

Belleği serbest bırakmak için modelde veya oturumda Dispose'ı çağırın. Bazı diller gecikmeli çöp toplama işlemi gerçekleştirdiğinden, bunları yalnızca silmeyin.

LearningModel , yeni oturum oluşturmayı etkinleştirmek için bellekte bir kopya tutar. LearningModel'i attığınızda, mevcut tüm oturumlar çalışmaya devam eder. Ancak, artık bu LearningModel örneğiyle yeni oturumlar oluşturamazsınız. Büyük modeller için bir model ve oturum oluşturabilir ve ardından modeli atabilirsiniz. Evaluate için yapılan tüm çağrılar için tek bir oturum kullanarak, bellekte büyük modelin tek bir kopyasına sahip olursunuz.

Float16 desteği

Daha iyi performans ve azaltılmış model ayak izi için ONNXMLTools kullanarak modelinizi float16'ya dönüştürebilirsiniz.

Dönüştürüldükten sonra tüm ağırlıklar ve girişler float16 olur. Float16 giriş ve çıkışlarıyla şu şekilde çalışabilirsiniz:

  • ImageFeatureValue (Görüntü ÖzelliğiDeğeri)

    • Önerilen kullanım.
    • Renkleri dönüştürür ve tensorlaştırarak float16'a dönüştürür.
    • Veri kaybı olmadan güvenli bir şekilde float16'ya dönüştürülebilen bgr8 ve 8 bit görüntü biçimlerini destekler.
  • Tensör Şamandırası

    • Gelişmiş yol.
    • Float32, float16'ya dönüştürüldü.
    • Bgr8 küçük ve uygun olduğundan, görüntüler için bu döküm güvenlidir.
    • Görüntü olmayanlar için Bağlanma başarısız olur ve bunun yerine TensorFloat16Bit geçirmeniz gerekir.
  • TensorFloat16 Bit

    • Gelişmiş yol.
    • Öncelikle float16’ya dönüştürmeli ve ardından girişleri float32 olarak geçirmelisiniz; bu da sonra float16’ya düşürülecektir.

Uyarı

Çoğu zaman işleç hala 32 bit matematik işlemi gerçekleştiriyor. Taşma riski daha düşüktür ve sonuç float16 olarak kısaltılır. Ancak donanım float16 desteğini tanıtıyorsa çalışma zamanı bundan yararlanacaktır.

Giriş verilerini ön işleme

WinML, giriş verilerinin işlenmesini daha basit ve daha verimli hale getirmek için kapaklar altında bazı ön işleme adımları gerçekleştirir. Örneğin, verilen giriş görüntüleri çeşitli renk biçimlerinde ve şekillerde olabilir ve modelin beklediğinden farklı olabilir. WinML, görüntüleri eşleştirmek için dönüştürmeler gerçekleştirerek geliştirici üzerindeki yükü azaltır.

WinML ayrıca belirli bir cihaz ve senaryo için en verimli dönüştürmeleri sağlamak için tüm donanım yığınından (CPU, GPU vb.) yararlanıyor.

Ancak bazı durumlarda, bazı özel gereksinimleriniz nedeniyle giriş verilerinizi el ile tensorize etmek isteyebilirsiniz. Örneğin, görüntüleriniz için VideoFrame kullanmak istemiyor olabilirsiniz veya piksel değerlerini 0-255 aralığından 0-1 aralığına kadar normalleştirmek isteyebilirsiniz. Bu gibi durumlarda, veriler üzerinde kendi özel tensorizasyonunuzu gerçekleştirebilirsiniz. Bunun bir örneği için Bkz. Özel Tensorizasyon Örneği .

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 stack overflow'dawindows-machine-learning etiketini kullanın.
  • Bir hatayı bildirmek için lütfen GitHub'ımızda bir sorun oluşturun.