Ascend İşlemcilerin Temel Komponentleri

Alper Balmumcu
Huawei Developers - Türkiye
5 min readFeb 7, 2023

Giriş

Selamlar! Bugün ATC, AIPP, DVPP ve ACL hakkında konuşacağız. Bu terimlerin neler olduğuna, nasıl çalıştıklarına değineceğiz. Son olarak ise ACL’in Python ve C++ kullanımları için bir örnek gerçekleştireceğiz.

Hadi başlayalım!

Ascend Tensor Compiler (ATC)

Peki, ATC Nedir?

Ascend AI işlemci üzerinde bir model koşturmak istiyorsak, bu modeli Da Vinci mimarisine sahip olan bu işlemcilerle uyumlu olacak şekilde dönüştürmeniz gerekebilir.

ATC Mimarisi ve Akış Diagramı

Ascend Tensor Compiler, Ascend mimarisine sahip işlemciler üzerinde çalışan bir tensor derleyicisidir. Temel olarak, ATC komutlarıyla modelleri dönüştürebileceğiniz bir arka plan konsol aracıdır. Özellikle, ağ modellerini ve tek operatörlü .json dosyalarını Ascend AI işlemcisi tarafından desteklenen offline modellere dönüştürebilir. Ve bu dönüştürme işlemi; operator schedualing optimizasyonu, weight datasının yeniden düzenlenmesi, bellek optimizasyonu ve model ön işleme süreçlerini kapsar.

Ayrıca, ATC half precision hesaplama işlemlerini destekler. Çünkü half tipindeki sayılar 16 bit kullanılarak depolanır, 32 bit kullanan single tip veya 64 bit kullanan double tip sayılardan daha az bellek gerektirirler.

Şu an için ATC; Caffe, MindSpore, Tensorflow ve Onnx modellerini desteklemektedir.

Peki, nasıl kullanabiliriz? ATC komutları modelden modele değişebilir ama örneğin onnx modeli için örnek bir kullanım gösterelim.

Artificial Intelligence Pre-Processing (AIPP)

Peki, ATC kullanarak modeli dönüştürürken görüntü tabanlı veri seti için donanım üzerinde ön işleme yapabilir miyiz? İşte cevap.

Bir modeli dönüştürürken, AIPP ile verilerin önceden işlemesini sağlayabilirsiniz. Artificial Intelligence Pre-Processing (AIPP), model çıkarımından önce görüntü yeniden boyutlandırma, renk alanı dönüştürme, ortalama çıkarma ve faktör çarpma (piksel değişimi için) dahil olmak üzere AI Core tabanlı görüntü ön işleme kısımlarını gerçekleştirmesi amacıyla geliştirilmiştir. AIPP, Ascend 310 tarafından sağlanan bir donanım görüntü ön işleme yöntemidir. AIPP ile ön işleme; renk alanı dönüştürme, görüntü normalleştirme (ortalama değeri çıkararak veya bir katsayıyı çarparak), görüntü kırpmayı (kırpmanın başlangıç ​​noktasını belirleyerek ve görüntüyü sinir ağının gerektirdiği boyuta göre kırparak) ve çok daha fazlasını içerir.

Daha fazla bilgi için: AIPP, AIPP Configuration

Digital Vision Pre-Processing (DVPP)

Ayrıca, video veri kümeleri için de ön işleme yapabiliriz. Bakalım DVPP neymiş…

Digital Vision Pre-Processing, Ascend 310 tarafından sağlanan bir görüntü ön işleme donanım hızlandırma modülüdür. DVPP modülü, görüntüleri kodlama, kod çözme ve format dönüştürme yoluyla önceden işler. DVPP, sistem belleğinden ve ağdan gelen video veya görüntü veri girişini, Da Vinci Mimarisi tarafından sinir ağı hesaplamasından önce Ascend AI İşlemcileri tarafından desteklenen bir formata dönüştürür.

Video veri kümeleri için ön işleme, NPU veya CPU üzerinde yapılabilir. CPU üzerinde video ön işleme kullanıyorsanız, örneğin OpenCV kullanıyorsanız, bu işlemler CPU üzerinde çalıştırılacaktır. Ve OpenCV’nin yüksek bellek tüketimine sahip olduğunu bildiğimiz için, aynı ön işleme DVPP kullanılarak daha düşük tüketimle ve NPU’da daha hızlı yapılabilir.

Bu modül aşağıdaki altı işlevi entegre eder.

Biçim dönüştürme, görüntü kırpma ve ölçekleme (VPC tarafından)
H.264/H.265 video decoding (by the VDEC)
H.264/H.265 video encoding (by the VENC)
JPEG image decoding (by the JPEGD)
JPEG image encoding (by the JPEGE)
PNG image decoding (by the PNGD)

Daha fazla bilgi için: DVPP, DVPP API, DVPP I/O Memory Allocation

Ascend Computing Language (ACL)

ACL, inference kodunu yazmak için bir arabirim fonksiyon koleksiyonu sağlar.

ACL, Ascend Computing Language’ın kısaltmasıdır. ACL, kullanıcıların cihazları, bağlamları, akışları ve belleğin yönetilmesi, modeli veya operator yükleyip yürütmesi ve ortam verilerini işlemesi için bir C++ arabirim fonksiyon koleksiyonu sağlar. Birçok arabirim fonksiyonu C dilini de desteklemektedir. Kullanıcılar; nesne tanıma, görüntü sınıflandırma ve çok daha fazlası için derin sinir ağı uygulamaları geliştirebilir.

Çalışan sistem üzerinde ACL, modelleri ve operatorleri yürütmek ve yüklemek için grafik motoru yürütücüsü(graph engine executor) adı verilen bir arabirimi çağırır. Ardından, cihazlar, context, stream ve bellek gibi kaynakları yönetmek için Runtime’ı çağırır. Alt katman, Ascend AI işlemcinin donanım hesaplama temeli olan hesaplama bölümüdür. Esas olarak sinir ağlarının matrisle ilgili hesaplamasını, kontrol operatörlerinin ve vektörlerin genel hesaplamasını ve bu işlemlerin yürütme kontrolünü ve ayrıca görüntü ve video verilerinin ön işlemesini gerçekleştirir.

Python Ascend Computing Language (pyACL) ise, ACL tabanlı CPython kullanılarak kapsüllenmiş bir Python API kütüphanesidir. Kullanıcılar ayrıca Ascend AI işlemcilerinin çalışmasını ve kaynaklarını yönetmek için Python’u kullanabilir.

PyACL Örnek Kullanımı

Peki Python API üzerinde ACL yapısı nasıl yapılır?

Örnek olarak bu repoda bulunan YOLOv4 modeli ile inference nasıl yapılıyor inceleyelim. ACL’nin nasıl kullanıldığını görmek için main fonksiyonun içine bakalım.

main fonksiyon

2. satırda gördüğümüz gibi AclLiteResource fonksiyonu tanımlandı ve 3. satırda init() fonksiyonu çağırılarak başlatıldı. ACL Resource başlatılırken neler yapıldığını olduğunu görmek ve anlamak için, fonksiyonun nasıl tanımlandığına bakalım.

Yapılan ilk adım, ACL modülünü import etmek ve PyACL’i başlatmaktır.
Ardından cihaz seçilir ve runtime kaynakları tanımlanıp bu işlem için ayrılır. Daha sonra ise, main fonksiyondaki Satır 6'da bulunan model yüklenir ve model içeriği çekilir.

Bu aşamalar sonunda, yürütmeye ve inference işlemini başlatmaya hazır hale geliriz. Ama öncesinde, input datalarının önceden modele göre işlenmesi gerekmektedir. Biz şu an için, ön işleme sürecini modelden modele değiştiği için atlıyoruz.

Yürütme işlemini başlatmak için main fonksiyonda satır 9'da bulunan “model.execute()” fonksiyonunu çağırıyoruz. Fonksiyonun içeriğine bakalım.

Son adım, postprocessing işlemdir. Yukarıda ön işlemenin(preprocessing) modelden modele değiştiğini belirttiğim gibi, aynı durum postprocessing için de geçerlidir. Bu sebeple, bundan sonraki adımlarda kendi modelinize ve istediğiniz çıktı yapısına göre postprocessing işlemini gerçekleştirerek çıktınızı alabilirsiniz.

ACL Örnek Kullanımı

Şimdi sıra C++ örneğimize geldi!

Yukarıda yaptığımız python örneğindekine benzer fonksiyonları kullanacağız. Temelde API farklı görünse de fonksiyonların genel amacı aynıdır. Hadi başlayalım!

Örnek olarak, daha önce PyACL örneğinde yaptığımız gibi YOLOv4 model çıkarımını bu repoyu kullanarak yapacağız. Bu şekilde, Python ve C++ API’lerinin kullanımını anlamak ve karşılaştırmak daha iyi olacaktır.

Bütün süreç aynı. ACL’yi başlatıyoruz, modeli yüklüyoruz ve ardından execute fonksiyonunu çağırıp inference örneğini tamamlıyoruz. Yukarıda PyACL bölümünde bahsettiğim gibi, modelinize bağlı olarak ön işleme (preprocessing) ve son işleme (postprocessing) kısımlarını kendiniz yapmalısınız. Başlayalım!

Satır 3'te, ACL’yi Başlatıyoruz ve runtime kaynakları tanımlanıp bu işlem için ayırıyoruz. İçeriğine bakacak olursak;

Main fonksiyon 7. satırında yer alan “modelProcess.LoadModel()” fonksiyonu ile aşağıda gösterildiği gibi modeli yüklüyor ve model içeriğini çıkartıyoruz.

Inference için artık hazırız. Main fonksiyondaki 11.satırda bulunan yürütme işlemini uygulayalım. “ModelProcess”in içine bakarsak, ACL yapısı ile model yürütmeyi göreceğiz. Yürütme komutunu inceleyelim.

Inference işlemi tamamlandı. Bundan sonraki adımlarda kendi modelinize ve istediğiniz çıktı yapısına göre postprocessing işlemini gerçekleştirerek çıktınızı alabilirsiniz.

Sonuç

Bu yazımızda donanım üzerinde model dönüştürme işlemi için ATC, AIPP ve DVPP hakkında bilgi sahibi olduk. Ayrıca kısaca ACL ve ACL’in C++ ve Python API’lerini ayrı ayrı kullanarak inference işleminden bahsettik. Bir sonraki yazımızda, örneklerle ACL’i ve kullanımını anlamak için daha derine ineceğiz.

Tebrikler!

Bir sonraki yazımız için takipte kalın!

“Durmadığın sürece ne kadar yavaş gittiğin önemli değil.” — Konfiçyüs

Referanslar

--

--