pyACL API’a Giriş

Serkan Celik
Huawei Developers - Türkiye
4 min readFeb 8, 2023
Görsel Referansı

Giriş

Merhaba! Bu makalede geliştiricilere; Python Ascend Computing Language (pyACL) tarafından sağlanan mevcut modellere ve Python API’larına dayalı derin sinir ağı (DNN) uygulamaları geliştirmeleri için rehberlik edeceğiz.

Python Ascend Computing Language (pyACL), AscendCL tabanlı CPython kullanılarak kapsüllenmiş bir Python API kütüphanesidir. Kullanıcılar, cihaz yönetimi, bağlam yönetimi, akış yönetimi, bellek yönetimi, model yükleme ve yürütme, operatör yükleme ve yürütme ve medya veri işleme gibi Ascend AI işlemcilerinin çalışmasını ve kaynaklarını yönetmek için Python programlama dilini kullanabilir.

Örnekten önce cihaz(device), akış(stream) ve bağlam(context) terimlerine derinlemesine bakalım.

Görsel Referansı

Geliştirme İş Akışı

  1. Geliştirme ortamının ve çalışma ortamının hazırlanması.
  2. Geliştirme gereksinimlerinin analiz edilmesi: Belirli senaryoya dayalı geliştirme için gerekli işlevlerin (veri kopyalama ve model çıkarımı gibi), komutların ve API’lerin belirlenmesi.
  3. Kod dizininin oluşturulması: Kod dosyalarını depolamak, komut dosyalarını oluşturmak, görüntüleri test etmek ve model dosyalarını oluşturmak için çalışma dizininin oluşturulması. Örnek bir dizin yapısı:

Uygulama geliştirme aşamaları:

  1. pyACL’yi başlatılması, pyACL başlatma ve sonlandırma.
  2. Çalışma zamanı kaynaklarının tahsis edilmesi, Çalışma kaynaklarını tanımlama ve serbest bırakma.
  3. Veri aktarımını gerçekleştirme, Veri kopyalama.
  4. (Opsiyonel) Görüntü kırpma ve yeniden boyutlandırma gerekirse, model çıkarımının girişi olarak YUV420SP görüntüleri için veri ön işleme aşamasının eklenmesi, Veri ön işleme.
  5. Model çıkarımının yapılması, Model çıkarımı için basit seneryolar.
  6. Veri işleme tamamlandıktan sonra çalışma zamanı tahsislerinin kaldırılması, Çalışma kaynaklarını tanımlama ve serbest bırakma.
  7. pyACL’yi kaynaklarının serbest bırakılması, pyACL başlatma ve sonlandırma.

API Çalışma Sekansı

Görsel Referansı

Bir modelin çıkarım seneryosunu ele alalım; NPU (Neural Processing Unit) cihazını kontrol etmek için pyACL kütüphanesini tanımlamamız gerekiyor. İkinci aşamada, çalışma kaynaklarını tahsis etmeliyiz. Çalışma kaynaklarının tahsis edilmesinden sonra kullanacağımız modelin çıkarım aşamasına geçebiliriz.

Çıkarım yapılacak verileri cihaz belleğine yüklemeliyiz. Bunun için cihaz hafızasında yer ayırıp verileri yükleyebiliriz. Verileri yükledikten sonra modelimize verileri gönderebiliriz. Aynı zamanda çıkarım işlemini gerçekleştirecek modelimizi de cihaz belleğine yüklemeliyiz.

Verilerimiz ve modelimiz NPU hafızasına yüklendikten sonra pyACL API komutlarını kullanarak modelimizi çalıştırabiliriz. Modelin yürütülme işlemi bittikten sonra çıktıları pyACL ile NumPy nesnesi olarak alabiliriz.

Tüm aşamalar bittikten sonra ayrılan kaynakları serbest bırakarak işlemimizi sonlandırabiliriz. Daha iyi anlamak adına ResNet-50 modeli ile bir örnek yapalım.

pyACL Başlatma & Çalışma Kaynaklarını Tahsis Etme

Başlamak için öncelikle sınıf değişkenlerini tanımlamamız gerekiyor. Başlatma işlemi için cihaz kimliğini ve model yolunu tanımlamalıyız.

Net sınıfını daha detaylı inceleyelim;

Gördüğünüz gibi, sınıf değişkenlerine giden cihaz kimliğimizi ve model yolumuzu tanımladık. Başlatma ve Çalışma Zamanı Kaynak Tahsisi aşamalarını anlamak için init_resource() işlevine bir göz atalım.

Bir uygulama geliştirmek için pyACL API’lerini kullanırken, önce pyACL’yi başlatmanız gerekir. Aksi takdirde, dahili sistem kaynaklarının başlatılması sırasında hatalar meydana gelebilir ve diğer hizmetlerde istisnalara neden olabilir. acl.init() işlevi, başlatma durumunu kontrol etmek için bir ret kodu döndürür. Bu ret kodları ile durumu kontrol edebiliriz.

Başlatmadan sonra, bilgi işlem ve yönetim görevlerinin yürütülmesini desteklemek için cihazı, bağlamı ve modeli sırayla tahsis etmemiz gerekir.

Veri Aktarımı

Çıkarım görevi için çalışma zamanı kaynakları tahsis edildi. Bu noktada modeli yürütmek için verileri hazırlamamız gerekiyor.

Modelin çalıştırılması için görselimizi, tahsis edilen NPU cihazına gönderiyoruz. Orada neler olduğunu anlamak için run() işlevine bakalım.

Gördüğünüz gibi run() fonksiyonunda 3 ana aşamamız var. İlk aşama verilerimizi NPU cihazına göndermektir. İkinci aşamada modelimizi çalıştırıyoruz. Bunların ardından NPU cihazından çıktılarımızı alıyoruz.

Nasıl çalıştığını anlamak için daha derinlemesine bakmalıyız. _data_interaction() işlevinde neler oluyor? Haydi bakalım.

Veri aktarımı for döngüsünde başlamaktadır. Görüntüleri NPU aygıtına aktarmak için bytes_to_ptr() işlevini kullanıyoruz. Bu satırlar üzerinde girdi resimlerimizi bytes formatına çeviriyoruz, ardından bu bytes tipindeki veriyi pointer’a çeviriyoruz. Bu noktada tüm verilerimizi NPU cihazına aktarabilecek hale getirdik. acl.rt.memcpy() fonksiyonunu kullanarak verileri NPU cihazına aktarabiliriz.

Bu aşamada verilerimizi NPU cihazına yüklüyoruz. Çıkarım sonuçları almak için modelimizi çalıştırmalıyız. forward() fonksiyonuna bakalım.

Bu aşamada modelimizi başarıyla çalıştırdık. Oluşturduğumuz veri arabelleğini yok etmemiz gerekiyor.

Modeli çalıştırdıktan sonra NPU cihazından sonuçlarımızı almamız gerekiyor. Bu amaçla _data_from_device_to_host() işlevine bakalım.

Sonuçlarımızı get_result() fonksiyonu ile alabiliriz. Çıktılarımızı aldıktan sonra tüm çıkarım aşaması sona erer. Eğer kullanılmayacaksa tahsis edilen tüm kaynakları yok etmeliyiz.

pyACL Sonlandırma & Çalışma Kaynaklarını Serbest Bırakma

Tüm gerekli pyACL API’leri çağrıldıktan sonra veya işlemden çıkmadan önce, pyACL’yi kaldırmak için çalışma kaynaklarını serbest bırakma komutlarını çağırmalıyız.

Sonuç

pyACL ile NPU kaynaklarının nasıl yönetileceğini, çıkarım seneryosunun nasıl gerçekleştirileceğini ve kullanılacağını Resnet örneği ile öğrenmiş olduk. pyACL ve özelliklerini kullanarak daha gelişmiş örneklere göz atmak ve daha fazla bilgi edinmek isterseniz bu bağlantıya göz atabilirsiniz.

Gelecek yazılarda görüşmek üzere :)

Görsel Referansı

Referanslar

--

--