Jalankan modul IoT Edge yang ada dari perangkat Azure Stack Edge Pro FPGA di perangkat GPU Azure Stack Edge Pro

BERLAKU UNTUK:Yes for Pro GPU SKUAzure Stack Edge Pro - GPUYes for Pro R SKUAzure Stack Edge Pro R

Catatan

Kami sangat menyarankan Agar Anda menyebarkan versi IoT Edge terbaru di VM Linux. IoT Edge terkelola di Azure Stack Edge menggunakan versi runtime IoT Edge yang lebih lama yang tidak memiliki fitur dan patch terbaru. Untuk petunjuknya, lihat cara Menyebarkan VM Ubuntu. Untuk informasi selengkapnya tentang distribusi Linux lain yang didukung yang dapat menjalankan IoT Edge, lihat Sistem yang didukung Azure IoT Edge – Mesin kontainer.

Artikel ini merinci perubahan yang diperlukan untuk modul IoT Edge berbasis docker yang berjalan pada Azure Stack Edge Pro FPGA sehingga dapat berjalan pada platform IoT Edge berbasis Kube pada perangkat GPU Azure Stack Edge Pro.

Tentang implementasi IoT Edge

Implementasi IoT Edge berbeda pada perangkat Azure Stack Edge Pro FPGA vs. yang ada di perangkat GPU Azure Stack Edge Pro. Untuk perangkat GPU, Kube digunakan sebagai platform hosting untuk IoT Edge. IoT Edge pada perangkat FPGA menggunakan platform berbasis docker. Model aplikasi berbasis docker IoT Edge secara otomatis diterjemahkan ke model aplikasi asli Kube. Namun, beberapa perubahan mungkin masih diperlukan karena hanya subset kecil dari model aplikasi Kube yang didukung.

Jika Anda memigrasikan beban kerja dari perangkat FPGA ke perangkat GPU, Anda harus membuat perubahan pada modul IoT Edge yang ada agar dapat berjalan dengan sukses di platform Kube. Anda mungkin perlu menentukan persyaratan penyimpanan, jaringan, penggunaan sumber daya, dan proksi web secara berbeda.

Penyimpanan

Pertimbangkan informasi berikut saat menentukan penyimpanan untuk modul IoT Edge.

  • Penyimpanan untuk kontainer pada Kube dispesifikasikan menggunakan pemasangan volume.
  • Penyebaran pada Kube tidak dapat memiliki ikatan untuk mengaitkan penyimpanan persisten atau jalur host.
    • Untuk penyimpanan persisten, gunakan Mounts dengan jenis volume.
    • Untuk jalur host, gunakan Mounts dengan jenis bind.
  • Untuk IoT Edge di Kube, Ikat hanya melaluiMounts pekerjaan untuk direktori, dan bukan untuk file.

Contoh - Storage melalui pemasangan volume

Untuk IoT Edge pada docker, pengikatan jalur host digunakan untuk memetakan berbagi pada perangkat ke jalur di dalam kontainer. Berikut adalah opsi buat kontainer yang digunakan pada perangkat FPGA:

{
  "HostConfig": 
  {
   "Binds": 
    [
     "<Host storage path for Edge local share>:<Module storage path>"
    ]
   }
}

Untuk jalur hosting untuk IoT Edge pada Kube, contoh penggunaan Mounts dengan jenis bind ditampilkan di sini:

{
    "HostConfig": {
        "Mounts": [
            {
                "Target": "<Module storage path>",
                "Source": "<Host storage path>",
                "Type": "bind"
            }
        ]
    }
}

Untuk perangkat GPU yang menjalankan IoT Edge pada Kube, pemasangan volume digunakan untuk menentukan penyimpanan. Untuk menyediakan penyimpanan menggunakan berbagi, nilai Mounts.Source adalah nama berbagi SMB atau NFS yang disediakan di perangkat GPU Anda. /home/input merupakan jalur tempat volume dapat diakses dalam kontainer. Berikut adalah opsi buat kontainer yang digunakan pada perangkat FPGA:

{
    "HostConfig": {
        "Mounts": [
        {
            "Target": "/home/input",
            "Source": "<nfs-or-smb-share-name-here>",
            "Type": "volume"
        },
        {
            "Target": "/home/output",
            "Source": "<nfs-or-smb-share-name-here>",
            "Type": "volume"
        }]
    }
}

Jaringan

Pertimbangkan informasi berikut saat menentukan jaringan untuk modul IoT Edge.

  • Spesifikasi HostPort diperlukan untuk mengekspos layanan baik di dalam maupun di luar kluster.
    • Opsi K8sExperimental untuk membatasi paparan layanan ke kluster saja.
  • Komunikasi antar modul memerlukan spesifikasi HostPort, dan koneksi menggunakan port yang dipetakan (dan tidak menggunakan port kontainer yang di ekspos).
  • Jaringan host bekerja dengan dnsPolicy = ClusterFirstWithHostNet, dengan semua kontainer (terutama edgeHub) tidak harus berada di jaringan host juga.
  • Menambahkan pemetaan port untuk TCP, UDP dalam permintaan yang sama tidak berfungsi.

Contoh - Akses eksternal ke modul

Untuk modul IoT Edge yang menentukan pengikatan port, sebuah alamat IP ditugaskan menggunakan rentang IP layanan eksternal Kube yang ditentukan dalam UI lokal perangkat. Tidak ada perubahan opsi buat kontainer antara IoT Edge pada docker vs IoT Edge pada Kube seperti yang ditunjukkan pada contoh berikut.

{
    "HostConfig": {
        "PortBindings": {
            "5000/tcp": [
                {
                    "HostPort": "5000"
                }
            ]
        }
    }
}

Namun, untuk mengkueri alamat IP yang ditetapkan ke modul, kamu dapat menggunakan dasbor Kube seperti yang dijelaskan dalam Dapatkan alamat IP untuk layanan atau modul.

Atau, Anda dapat Menyambungkan ke antarmuka PowerShell perangkat dan menggunakan perintah daftar iotedge untuk mencantumkan semua modul yang berjalan di perangkat Anda. Output Perintah juga akan menunjukkan IP eksternal yang terkait dengan modul.

Penggunaan sumber daya

Dengan pengaturan IoT Edge berbasis Kube pada perangkat GPU, sumber daya seperti akselerasi perangkat keras, memori, dan persyaratan CPU ditentukan berbeda dari pada perangkat FPGA.

Penggunaan akselerasi komputasi

Untuk menyebarkan modul pada FPGA, gunakan opsi buat kontainer seperti yang ditunjukkan pada konfigurasi berikut:

{
    "HostConfig": {
    "Privileged": true,
    "PortBindings": {
        "50051/tcp": [
        {
            "HostPort": "50051"
        }
        ]
    }
    },
    "k8s-experimental": {
    "resources": {
        "limits": {
        "microsoft.com/fpga_catapult": 2
        },
        "requests": {
        "microsoft.com/fpga_catapult": 2
        }
    }
    },
    "Env": [
    "WIRESERVER_ADDRESS=10.139.218.1"
    ]
}

Untuk GPU, gunakan spesifikasi permintaan sumber daya alih-alih Pengikatan Perangkat seperti yang ditunjukkan dalam konfigurasi minimal berikut. Anda meminta sumber daya nvidia dari pada catapult, dan Anda tidak perlu menentukan wireserver.

{
    "HostConfig": {
    "Privileged": true,
    "PortBindings": {
        "50051/tcp": [
        {
            "HostPort": "50051"
        }
        ]
    }
    },
    "k8s-experimental": {
    "resources": {
        "limits": {
        "nvidia.com/gpu": 2
        }    
    }
}

Penggunaan memori dan CPU

Untuk mengatur memori dan penggunaan CPU, gunakan batas prosesor untuk modul di bagian k8s-experimental tersebut.

    "k8s-experimental": {
    "resources": {
        "limits": {
            "memory": "128Mi",
            "cpu": "500m",
            "nvidia.com/gpu": 2
        },
        "requests": {
            "nvidia.com/gpu": 2
        }
}

Memori dan spesifikasi CPU tidak diperlukan tetapi umumnya praktik yang baik. Jika requests tidak ditentukan, nilai yang ditetapkan dalam batas digunakan sebagai minimum yang diperlukan.

Menggunakan memori bersama untuk modul juga memerlukan cara yang berbeda. Misalnya, Anda dapat menggunakan mode IPC Host untuk akses memori bersama antara Solusi Analitik Video Langsung dan Inferensi seperti yang dijelaskan dalam Sebarkan Analitik Video Langsung di Azure Stack Edge.

Proksi web

Pertimbangkan informasi berikut saat mengonfigurasi proksi web:

Jika Anda memiliki proksi web yang dikonfigurasi di jaringan Anda, konfigurasikan variabel lingkungan berikut untuk edgeHub penyebaran pada penyiapan IoT Edge berbasis docker Anda di perangkat FPGA:

  • https_proxy : <proxy URL>
  • UpstreamProtocol : AmqpWs (kecuali web proksi memungkinkan lalu lintas Amqp)

Untuk penyiapan IoT Edge berbasis Kube pada perangkat GPU, Anda harus mengonfigurasi variabel tambahan ini selama penyebaran:

  • no_proxy: localhost

  • Proxy IoT Edge pada platform Kube menggunakan port 35000 dan 35001. Pastikan bahwa modul Anda tidak berjalan pada port ini atau dapat menyebabkan konflik port.

Perbedaan lain

  • Strategi penerapan: Anda mungkin perlu mengubah perilaku penyebaran untuk setiap pembaruan pada modul. Perilaku default untuk modul IoT Edge adalah pembaruan bergulir. Perilaku ini mencegah modul yang diperbarui dihidupkan ulang jika modul menggunakan sumber daya seperti akselerasi perangkat keras atau port jaringan. Perilaku ini dapat memiliki efek yang tidak terduga, khususnya ketika berhadapan dengan volume persisten pada platform Kube untuk perangkat GPU. Untuk menimpa perilaku default ini, Anda dapat menentukan Recreatedi k8s-experimental bagian di modul Anda.

    {
      "k8s-experimental": {
        "strategy": {
          "type": "Recreate"
        }
      }
    }
    
  • Nama modul :Nama modul harus mengikuti konvensi penamaan Kube. Anda mungkin perlu mengganti nama modul yang berjalan di IoT Edge dengan Docker saat kamu memindahkan modul tersebut ke IoT Edge dengan Kube. Untuk informasi lebih lanjut tentang penamaan, lihat Konvensi penamaan Kube.

  • Opsi lainnya:

    • Opsi buat docker tertentu yang bekerja pada perangkat FPGA tidak akan berfungsi di lingkungan Kube pada perangkat GPU Anda. Misalnya: , seperti – EntryPoint.
    • Variabel lingkungan seperti : perlu diganti dengan __.
    • Status Pembuatan Kontainer untuk pod Kube mengarah ke status backoff untuk modul pada sumber daya IoT Hub. Meskipun ada sejumlah alasan bagi pod untuk berada dalam status ini, alasan umumnya adalah ketika gambar kontainer besar ditarik melalui koneksi bandwidth jaringan rendah. Ketika pod dalam keadaan ini, status modul muncul sebagai backoff di IOT Hub meskipun modul baru dimulai.

Langkah berikutnya