İçeriğe geç

Hızlı Başlangıç Kılavuzu: NVIDIA Jetson ile Ultralytics YOLOv8

Bu kapsamlı kılavuz, NVIDIA Jetson cihazlarında Ultralytics YOLOv8 dağıtımı için ayrıntılı bir yol göstermektedir. Ayrıca, bu küçük ve güçlü cihazlarda YOLOv8 'un yeteneklerini göstermek için performans kıyaslamalarını sergilemektedir.



İzle: NVIDIA Jetson ile Nasıl Kurulur Ultralytics YOLOv8

NVIDIA Jetson Ekosistemi

Not

Bu kılavuz, JP5.1.3 'ün en son kararlı JetPack sürümünü çalıştıran NVIDIA Jetson Orin NX 16GB tabanlı Seeed Studio reComputer J4012 ve JP4.6.1'in JetPack sürümünü çalıştıran NVIDIA Jetson Nano 4GB tabanlı Seeed Studio reComputer J1020 v2 ile test edilmiştir. En yeni ve eski dahil olmak üzere tüm NVIDIA Jetson donanım serisinde çalışması beklenmektedir.

NVIDIA Jetson nedir?

NVIDIA Jetson, uç cihazlara hızlandırılmış AI (yapay zeka) bilişimi getirmek için tasarlanmış bir dizi gömülü bilgi işlem kartıdır. Bu kompakt ve güçlü cihazlar NVIDIA'un GPU mimarisi üzerine inşa edilmiştir ve bulut bilişim kaynaklarına ihtiyaç duymadan karmaşık yapay zeka algoritmalarını ve derin öğrenme modellerini doğrudan cihaz üzerinde çalıştırabilmektedir. Jetson kartları genellikle robotik, otonom araçlar, endüstriyel otomasyon ve yapay zeka çıkarımının düşük gecikme süresi ve yüksek verimlilikle yerel olarak gerçekleştirilmesi gereken diğer uygulamalarda kullanılır. Ayrıca, bu kartlar ARM64 mimarisini temel alır ve geleneksel GPU bilgi işlem cihazlarına kıyasla daha düşük güçle çalışır.

NVIDIA Jetson Serisi Karşılaştırması

Jetson Orin, NVIDIA Ampere mimarisine dayanan NVIDIA Jetson ailesinin en son yinelemesidir ve önceki nesillere kıyasla büyük ölçüde geliştirilmiş AI performansı sunar. Aşağıdaki tabloda ekosistemdeki Jetson cihazlarından birkaçı karşılaştırılmıştır.

Jetson AGX Orin 64GB Jetson Orin NX 16GB Jetson Orin Nano 8GB Jetson AGX Xavier Jetson Xavier NX Jetson Nano
Yapay Zeka Performansı 275 TOPS 100 TOPS 40 TOP 32 TOPS 21 TOPS 472 GFLOPS
GPU 2048 çekirdekli NVIDIA Amper mimarisi 64 Tensor Çekirdekli GPU 1024 çekirdekli NVIDIA Amper mimarisi 32 Tensor Çekirdekli GPU 1024 çekirdekli NVIDIA Amper mimarisi 32 Tensor Çekirdekli GPU 64 Tensor Çekirdekli 512 çekirdekli NVIDIA Volta mimarisi GPU 48 Tensor Çekirdekli 384 çekirdekli NVIDIA Volta™ mimarisi GPU 128 çekirdekli NVIDIA Maxwell™ mimarisi GPU
GPU Maksimum Frekans 1,3 GHz 918 MHz 625 MHz 1377 MHz 1100 MHz 921MHz
CPU 12 çekirdekli NVIDIA Arm® Cortex A78AE v8.2 64-bit CPU 3MB L2 + 6MB L3 8 çekirdekli NVIDIA Arm® Cortex A78AE v8.2 64-bit CPU 2MB L2 + 4MB L3 6 çekirdekli Arm® Cortex®-A78AE v8.2 64-bit CPU 1,5MB L2 + 4MB L3 8 çekirdekli NVIDIA Carmel Arm®v8.2 64-bit CPU 8MB L2 + 4MB L3 6 çekirdekli NVIDIA Carmel Arm®v8.2 64-bit CPU 6MB L2 + 4MB L3 Dört Çekirdekli Arm® Cortex®-A57 MPCore işlemci
CPU Maksimum Frekans 2,2 GHz 2.0 GHz 1,5 GHz 2,2 GHz 1,9 GHz 1.43GHz
Hafıza 64GB 256-bit LPDDR5 204,8GB/sn 16GB 128-bit LPDDR5 102,4GB/s 8GB 128-bit LPDDR5 68 GB/sn 32GB 256-bit LPDDR4x 136,5GB/s 8GB 128-bit LPDDR4x 59,7GB/sn 4GB 64-bit LPDDR4 25,6GB/s"

Daha ayrıntılı bir karşılaştırma tablosu için lütfen resmi NVIDIA Jetson sayfasının Teknik Özellikler bölümünü ziyaret edin.

NVIDIA JetPack nedir?

NVIDIA Jetson modüllerine güç veren JetPack SDK en kapsamlı çözümdür ve uçtan uca hızlandırılmış yapay zeka uygulamaları oluşturmak için tam geliştirme ortamı sağlar ve pazara sunma süresini kısaltır. JetPack, önyükleyicili Jetson Linux, Linux çekirdeği, Ubuntu masaüstü ortamı ve GPU hesaplama, multimedya, grafik ve bilgisayarla görmenin hızlandırılması için eksiksiz bir kütüphane seti içerir. Ayrıca hem ana bilgisayar hem de geliştirici kiti için örnekler, belgeler ve geliştirici araçları içerir ve video analizi akışı için DeepStream, robotik için Isaac ve konuşma yapay zekası için Riva gibi daha üst düzey SDK'ları destekler.

Flash JetPack - NVIDIA Jetson

Elinize bir NVIDIA Jetson cihazı aldıktan sonraki ilk adım, NVIDIA JetPack'i cihaza flash'lamaktır. NVIDIA Jetson cihazlarını flaşlamanın birkaç farklı yolu vardır.

  1. Jetson Orin Nano Geliştirici Kiti gibi resmi bir NVIDIA Geliştirme Kitine sahipseniz, bir görüntü indirebilir ve cihazı başlatmak için JetPack ile bir SD kart hazırlayabilirsiniz.
  2. Başka bir NVIDIA Geliştirme Kitine sahipseniz, SDK Yöneticisini kullanarak JetPack'i cihaza flaşlayabilirsiniz.
  3. Seeed Studio reComputer J4012 cihazınız varsa, JetPack'i birlikte verilen SSD 'ye ve Seeed Studio reComputer J1020 v2 cihazınız varsa, JetPack'i eMMC / SSD'ye flaşlayabilirsiniz.
  4. NVIDIA Jetson modülü ile çalışan başka bir üçüncü taraf cihazınız varsa, komut satırı yanıp sönmesini izlemeniz önerilir.

Not

Yukarıdaki 3. ve 4. yöntemler için, sistemi flaşladıktan ve cihazı açtıktan sonra, lütfen cihaz terminaline "sudo apt update && sudo apt install nvidia-jetpack -y" yazarak gerekli tüm diğer JetPack bileşenlerini yükleyin.

JetPack 5.x'te çalıştırın

JetPack 5.x'i destekleyen bir Jetson Xavier NX, AGX Xavier, AGX Orin, Orin Nano veya Orin NX'e sahipseniz, bu kılavuzu takip etmeye devam edebilirsiniz. Ancak, Jetson Nano gibi eski bir cihazınız varsa, lütfen JetPack 4.x'te Çalıştır bölümüne geçin.

Kurulum Ultralytics

Bir sonraki Bilgisayarla Görme projenizi oluşturmak için NVIDIA Jetson'da Ultralytics paketini kurmanın iki yolu vardır. Bunlardan birini kullanabilirsiniz.

Docker ile başlayın

NVIDIA Jetson üzerinde Ultralytics YOLOv8 kullanmaya başlamanın en hızlı yolu, Jetson için önceden oluşturulmuş docker görüntüsü ile çalıştırmaktır.

Docker konteynerini çekmek ve Jetson üzerinde çalıştırmak için aşağıdaki komutu yürütün. Bu, Python3 ortamında PyTorch ve Torchvision içeren l4t-pytorch docker görüntüsüne dayanmaktadır.

t=ultralytics/ultralytics:latest-jetson-jetpack5 && sudo docker pull $t && sudo docker run -it --ipc=host --runtime=nvidia $t

Bu işlem tamamlandıktan sonra TensorRT adresini NVIDIA Jetson'da Kullan bölümüne geçin.

Docker olmadan başlayın

Ultralytics Paketini Yükleyin

Burada Ultralytics paketini isteğe bağlı bağımlılıklarla birlikte Jetson'a kuracağız, böylece PyTorch modellerini diğer farklı formatlara aktarabiliriz. Esas olarak NVIDIA TensorRT dışa aktarımlarına odaklanacağız çünkü TensorRT Jetson cihazlarından maksimum performansı almamızı sağlayacaktır.

  1. Paket listesini güncelleyin, pip yükleyin ve en son sürüme yükseltin

    sudo apt update
    sudo apt install python3-pip -y
    pip install -U pip
    
  2. Kurulum ultralytics isteğe bağlı bağımlılıklarla pip paketi

    pip install ultralytics[export]
    
  3. Cihazı yeniden başlatın

    sudo reboot
    
PyTorch ve Torchvision'ı yükleyin

Yukarıdaki ultralytics kurulumu Torch ve Torchvision paketlerini yükleyecektir. Ancak, pip ile yüklenen bu 2 paket ARM64 mimarisine dayanan Jetson platformunda çalışmak için uyumlu değildir. Bu nedenle, önceden oluşturulmuş PyTorch pip wheel'i manuel olarak yüklememiz ve Torchvision'ı kaynaktan derlememiz / yüklememiz gerekir.

  1. Şu anda yüklü olan PyTorch ve Torchvision'ı kaldırın

    pip uninstall torch torchvision
    
  2. JP5.1.3'e göre PyTorch 2.1.0'ı yükleyin

    sudo apt-get install -y libopenblas-base libopenmpi-dev
    wget https://developer.download.nvidia.com/compute/redist/jp/v512/pytorch/torch-2.1.0a0+41361538.nv23.06-cp38-cp38-linux_aarch64.whl -O torch-2.1.0a0+41361538.nv23.06-cp38-cp38-linux_aarch64.whl
    pip install torch-2.1.0a0+41361538.nv23.06-cp38-cp38-linux_aarch64.whl
    
  3. Torchvision v0.16.2'yi PyTorch v2.1.0'a göre yükleyin

    sudo apt install -y libjpeg-dev zlib1g-dev
    git clone https://github.com/pytorch/vision torchvision
    cd torchvision
    git checkout v0.16.2
    python3 setup.py install --user
    

Farklı JetPack sürümleri için PyTorch 'un tüm farklı sürümlerine erişmek için Jetson içinPyTorch sayfasını ziyaret edin. PyTorch , Torchvision uyumluluğu hakkında daha ayrıntılı bir liste için PyTorch ve Torchvision uyumluluğu sayfasını ziyaret edin.

Kurulum onnxruntime-gpu

Bu onnxruntime-gpu PyPI'da barındırılan paketin aarch64 Jetson için ikili dosyalar. Bu yüzden bu paketi manuel olarak yüklememiz gerekiyor. Bu paket bazı dışa aktarımlar için gereklidir.

Hepsi farklı onnxruntime-gpu Farklı JetPack ve Python sürümlerine karşılık gelen paketler listelenmiştir Burada. Ancak, burada indirip kuracağız onnxruntime-gpu 1.17.0 ile Python3.8 Bu kılavuz için kullandığımız JetPack için destek.

wget https://nvidia.box.com/shared/static/zostg6agm00fb6t5uisw51qi6kpcuwzd.whl -O onnxruntime_gpu-1.17.0-cp38-cp38-linux_aarch64.whl
pip install onnxruntime_gpu-1.17.0-cp38-cp38-linux_aarch64.whl

Not

onnxruntime-gpu numpy sürümünü otomatik olarak en son sürüme geri döndürecektir. Bu yüzden numpy'yi yeniden yüklememiz gerekiyor 1.23.5 çalıştırarak bir sorunu düzeltmek için:

pip install numpy==1.23.5

JetPack 4.x'te çalıştırın

Burada koşmayı destekliyoruz Ultralytics Jetson Nano gibi eski donanımlarda. Şu anda bunu başarmak için Docker kullanıyoruz.

Docker konteynerini çekmek ve Jetson üzerinde çalıştırmak için aşağıdaki komutu yürütün. Bu, bir L4T ortamında CUDA içeren l4t-cuda docker görüntüsüne dayanmaktadır.

t=ultralytics/ultralytics:latest-jetson-jetpack4 && sudo docker pull $t && sudo docker run -it --ipc=host --runtime=nvidia $t

TensorRT adresini NVIDIA Jetson'da kullanın

Ultralytics tarafından desteklenen tüm model dışa aktarma formatları arasında TensorRT , NVIDIA Jetson cihazlarıyla çalışırken en iyi çıkarım performansını sunar ve bizim tavsiyemiz Jetson ile TensorRT kullanılmasıdır. Ayrıca TensorRT ile ilgili ayrıntılı bir belgeyeburadan ulaşabilirsiniz.

Modeli TensorRT 'a Dönüştürün ve Çıkarım Çalıştırın

PyTorch biçimindeki YOLOv8n modeli, dışa aktarılan modelle çıkarım yapmak için TensorRT biçimine dönüştürülür.

Örnek

from ultralytics import YOLO

# Load a YOLOv8n PyTorch model
model = YOLO("yolov8n.pt")

# Export the model
model.export(format="engine")  # creates 'yolov8n.engine'

# Load the exported TensorRT model
trt_model = YOLO("yolov8n.engine")

# Run inference
results = trt_model("https://ultralytics.com/images/bus.jpg")
# Export a YOLOv8n PyTorch model to TensorRT format
yolo export model=yolov8n.pt format=engine  # creates 'yolov8n.engine'

# Run inference with the exported model
yolo predict model=yolov8n.engine source='https://ultralytics.com/images/bus.jpg'

Not

Modelleri farklı model formatlarına aktarırken ek argümanlara erişmek için Dışa Aktar sayfasını ziyaret edin

NVIDIA Jetson Orin YOLOv8 Benchmarklar

YOLOv8 Karşılaştırmalar tarafından çalıştırıldı. Ultralytics Hız ve doğruluğu ölçen 10 farklı model formatı ekibi: PyTorch, TorchScript, ONNX, OpenVINO, TensorRT, TF SavedModel, TF GraphDef, TF Lite PaddlePaddle, NCNN. Karşılaştırmalar, Jetson Orin NX 16GB cihazı tarafından desteklenen Seeed Studio reComputer J4012'de, varsayılan giriş görüntü boyutu 640 olan FP32 hassasiyetinde çalıştırıldı.

Karşılaştırma Tablosu

Tüm model dışa aktarımları NVIDIA Jetson ile çalışıyor olsa da, aşağıdaki karşılaştırma tablosuna yalnızca PyTorch, TorchScript, TensorRT adreslerini dahil ettik, çünkü bunlar Jetson'daki GPU adresini kullanıyor ve en iyi sonuçları üretmeleri garanti ediliyor. Diğer tüm dışa aktarımlar yalnızca CPU adresini kullanır ve performans yukarıdaki üçü kadar iyi değildir. Bu tablodan sonraki bölümde tüm dışa aktarmalar için kıyaslamaları bulabilirsiniz.

NVIDIA Jetson Ekosistemi

Detaylı Karşılaştırma Tablosu

Aşağıdaki tablo, beş farklı model için kıyaslama sonuçlarını temsil etmektedir (YOLOv8n, YOLOv8s, YOLOv8m, YOLOv8l, YOLOv8x) on farklı formatta (PyTorch, TorchScript, ONNX, OpenVINO, TensorRT, TF SavedModel, TF GraphDef, TF Lite PaddlePaddle, NCNN), bize her kombinasyon için durum, boyut, mAP50-95(B) metriğini ve çıkarım süresini verir.

Performans

Biçim Durum Disk üzerindeki boyut (MB) mAP50-95(B) Çıkarım süresi (ms/im)
PyTorch 6.2 0.6381 14.3
TorchScript 12.4 0.6117 13.3
ONNX 12.2 0.6092 70.6
OpenVINO 12.3 0.6092 104.2
TensorRT 13.6 0.6117 8.9
TF SavedModel 30.6 0.6092 141.74
TF GraphDef 12.3 0.6092 199.93
TF Lite 12.3 0.6092 349.18
PaddlePaddle 24.4 0.6030 555
NCNN 12.2 0.6092 32
Biçim Durum Disk üzerindeki boyut (MB) mAP50-95(B) Çıkarım süresi (ms/im)
PyTorch 21.5 0.6967 18
TorchScript 43.0 0.7136 23.81
ONNX 42.8 0.7136 185.55
OpenVINO 42.9 0.7136 243.97
TensorRT 44.0 0.7136 14.82
TF SavedModel 107 0.7136 260.03
TF GraphDef 42.8 0.7136 423.4
TF Lite 42.8 0.7136 1046.64
PaddlePaddle 85.5 0.7140 1464
NCNN 42.7 0.7200 63
Biçim Durum Disk üzerindeki boyut (MB) mAP50-95(B) Çıkarım süresi (ms/im)
PyTorch 49.7 0.7370 36.4
TorchScript 99.2 0.7285 53.58
ONNX 99 0.7280 452.09
OpenVINO 99.1 0.7280 544.36
TensorRT 100.3 0.7285 33.21
TF SavedModel 247.5 0.7280 543.65
TF GraphDef 99 0.7280 906.63
TF Lite 99 0.7280 2758.08
PaddlePaddle 197.9 0.7280 3678
NCNN 98.9 0.7260 135
Biçim Durum Disk üzerindeki boyut (MB) mAP50-95(B) Çıkarım süresi (ms/im)
PyTorch 83.7 0.7768 61.3
TorchScript 167.2 0.7554 87.9
ONNX 166.8 0.7551 852.29
OpenVINO 167 0.7551 1012.6
TensorRT 168.4 0.7554 51.23
TF SavedModel 417.2 0.7551 990.45
TF GraphDef 166.9 0.7551 1649.86
TF Lite 166.9 0.7551 5652.37
PaddlePaddle 333.6 0.7551 7114.67
NCNN 166.8 0.7685 231.9
Biçim Durum Disk üzerindeki boyut (MB) mAP50-95(B) Çıkarım süresi (ms/im)
PyTorch 130.5 0.7759 93
TorchScript 260.7 0.7472 135.1
ONNX 260.4 0.7479 1296.13
OpenVINO 260.6 0.7479 1502.15
TensorRT 261.8 0.7469 84.53
TF SavedModel 651.1 0.7479 1451.76
TF GraphDef 260.5 0.7479 4029.36
TF Lite 260.4 0.7479 8772.86
PaddlePaddle 520.8 0.7479 10619.53
NCNN 260.4 0.7646 376.38

NVIDIA Jetson donanımının farklı sürümlerinde çalışan Seeed Studio'nun daha fazla kıyaslama çalışmasını keşfedin.

Sonuçlarımızı Yeniden Üretin

Yukarıdaki Ultralytics kıyaslamalarını tüm dışa aktarma biçimlerinde yeniden oluşturmak için bu kodu çalıştırın:

Örnek

from ultralytics import YOLO

# Load a YOLOv8n PyTorch model
model = YOLO("yolov8n.pt")

# Benchmark YOLOv8n speed and accuracy on the COCO8 dataset for all all export formats
results = model.benchmarks(data="coco8.yaml", imgsz=640)
# Benchmark YOLOv8n speed and accuracy on the COCO8 dataset for all all export formats
yolo benchmark model=yolov8n.pt data=coco8.yaml imgsz=640

Kıyaslama sonuçlarının, bir sistemin tam donanım ve yazılım yapılandırmasının yanı sıra kıyaslamaların çalıştırıldığı sırada sistemin mevcut iş yüküne bağlı olarak değişebileceğini unutmayın. En güvenilir sonuçlar için çok sayıda görüntü içeren bir veri kümesi kullanın, örn. data='coco8.yaml' (4 val images), ordata='coco.yaml'` (5000 val görüntü).

NVIDIA Jetson kullanırken En İyi Uygulamalar

NVIDIA Jetson kullanırken, YOLOv8 çalıştıran NVIDIA Jetson'da maksimum performans sağlamak için izlenecek birkaç en iyi uygulama vardır.

  1. MAX Güç Modunu Etkinleştir

    Jetson'da MAX Güç Modunun etkinleştirilmesi tüm CPU, GPU çekirdeklerinin açık olmasını sağlayacaktır.

    sudo nvpmodel -m 0
    
  2. Jetson Saatlerini Etkinleştir

    Jetson Saatlerini etkinleştirmek, tüm CPU, GPU çekirdeklerinin maksimum frekanslarında çalışmasını sağlayacaktır.

    sudo jetson_clocks
    
  3. Jetson Stats Uygulamasını Yükleme

    Sistem bileşenlerinin sıcaklıklarını izlemek ve CPU, GPU, RAM kullanımını görüntülemek, güç modlarını değiştirmek, maksimum saatlere ayarlamak, JetPack bilgilerini kontrol etmek gibi diğer sistem ayrıntılarını kontrol etmek için jetson stats uygulamasını kullanabiliriz.

    sudo apt update
    sudo pip install jetson-stats
    sudo reboot
    jtop
    

Jetson İstatistikleri

Sonraki Adımlar

YOLOv8 'u NVIDIA Jetson'unuzda başarıyla kurduğunuz için tebrikler! Daha fazla bilgi ve destek için Ultralytics YOLOv8 Docs adresindeki kılavuzu ziyaret edin!

SSS

Ultralytics YOLOv8 adresini NVIDIA Jetson cihazlarına nasıl dağıtabilirim?

Ultralytics YOLOv8 adresini NVIDIA Jetson cihazlarına dağıtmak basit bir işlemdir. İlk olarak, Jetson cihazınızı NVIDIA JetPack SDK ile flaşlayın. Ardından, hızlı kurulum için önceden oluşturulmuş bir Docker görüntüsü kullanın veya gerekli paketleri manuel olarak yükleyin. Her bir yaklaşım için ayrıntılı adımlar Docker ile Başla ve Docker olmadan Başla bölümlerinde bulunabilir.

NVIDIA Jetson cihazlarındaki YOLOv8 modellerinden hangi performans kıyaslamalarını bekleyebilirim?

YOLOv8 modelleri çeşitli NVIDIA Jetson cihazlarında kıyaslanmış ve önemli performans iyileştirmeleri gösterilmiştir. Örneğin, TensorRT formatı en iyi çıkarım performansını sunmaktadır. Ayrıntılı Karşılaştırma Tablosu bölümündeki tablo, farklı model formatları arasında mAP50-95 ve çıkarım süresi gibi performans ölçümlerinin kapsamlı bir görünümünü sunar.

YOLOv8 'u NVIDIA Jetson'da dağıtmak için neden TensorRT kullanmalıyım?

TensorRT optimum performansı nedeniyle YOLOv8 modellerini NVIDIA Jetson'da dağıtmak için şiddetle tavsiye edilir. Jetson'un GPU özelliklerinden yararlanarak çıkarımı hızlandırır, maksimum verimlilik ve hız sağlar. TensorRT 'a nasıl dönüştürüleceği ve NVIDIA Jetson'da TensorRT 'u kullanma bölümünde çıkarımın nasıl çalıştırılacağı hakkında daha fazla bilgi edinin.

PyTorch ve Torchvision'ı NVIDIA Jetson'a nasıl yükleyebilirim?

PyTorch ve Torchvision'ı NVIDIA Jetson'a yüklemek için, önce pip aracılığıyla yüklenmiş olabilecek mevcut sürümleri kaldırın. Ardından, Jetson'un ARM64 mimarisi için uyumlu PyTorch ve Torchvision sürümlerini manuel olarak yükleyin. Bu işlem için ayrıntılı talimatlar PyTorch ve Torchvision 'ı Yükleme bölümünde verilmiştir.

YOLOv8 kullanırken NVIDIA Jetson'da performansı en üst düzeye çıkarmak için en iyi uygulamalar nelerdir?

NVIDIA Jetson'da YOLOv8 ile performansı en üst düzeye çıkarmak için aşağıdaki en iyi uygulamaları izleyin:

  1. Tüm CPU ve GPU çekirdeklerini kullanmak için MAX Güç Modunu etkinleştirin.
  2. Tüm çekirdekleri maksimum frekanslarında çalıştırmak için Jetson Clocks'u etkinleştirin.
  3. Sistem ölçümlerini izlemek için Jetson Stats uygulamasını yükleyin.

Komutlar ve ek ayrıntılar için NVIDIA Jetson kullanırken En İyi Uygulamalar bölümüne bakın.



Oluşturuldu 2024-04-02, Güncellendi 2024-07-05
Yazarlar: glenn-jocher (9), RizwanMunawar (1), lakshanthad (3), Ahelsamahy (1), Burhan-Q (2)

Yorumlar