共用方式為


從 Azure Stack Edge Pro GPU 裝置上的 Azure Stack Edge Pro FPGA 裝置執行現有的 IoT Edge 模組

適用於:Yes for Pro GPU SKUAzure Stack Edge Pro - GPUYes for Pro R SKUAzure Stack Edge Pro R

注意

強烈建議您在 Linux VM 中部署最新的 IoT Edge 版本。 Azure Stack Edge 上的受控 IoT Edge 所使用的 IoT Edge 執行階段版本較舊,不含最新功能和修補檔。 如需指示,請參閱如何部署 Ubuntu VM (機器翻譯)。 如需其他可執行 IoT Edge 的 Linux 發行版本的詳細資訊,請參閱 Azure IoT Edge 支援系統 – 容器引擎

本文詳細說明 Azure Stack Edge Pro FPGA 上執行的 Docker 型 IoT Edge 模組所需變更,以便其可在 Azure Stack Edge Pro GPU 裝置上的 Kubernetes 型 IoT Edge 平台上執行。

關於 IoT Edge 實作

Azure Stack Edge Pro FPGA 裝置上與 Azure Stack Edge Pro GPU 裝置上各有不同的 IoT Edge 實作。 針對 GPU 裝置,Kubernetes 會用作 IoT Edge 的裝載平台。 FPGA 裝置上的 IoT Edge 會使用 Docker 型平台。 IoT Edge Docker 型應用程式模型會自動轉換為 Kubernetes 原生應用程式模型。 不過,仍可能需要某些變更,因為僅支援小型 Kubernetes 應用程式模型子集。

如果您要將工作負載從 FPGA 裝置移轉至 GPU 裝置,則必須對現有的 IoT Edge 模組進行變更,讓這些模組在 Kubernetes 平台上順利執行。 您可能需要以不同的方式指定儲存體、網路、資源使用量和 Web Proxy 需求。

儲存體

指定 IoT Edge 模組的儲存體時,請考慮下列資訊。

  • Kubernetes 上容器的儲存體是使用磁碟區掛接所指定。
  • Kubernetes 上的部署無法具有繫結,以建立永續性儲存體或主機路徑的關聯。
    • 若為永續性儲存體,請搭配類型 volume 使用 Mounts
    • 若為主機路徑,請搭配 bind 類型使用 Mounts
  • 若為 Kubernetes 上的 IoT Edge,透過 Mounts 的繫結只適用於目錄,不適用於檔案。

範例 - 儲存體與磁碟區掛接

若為 Docker 上的 IoT Edge,主機路徑繫結用來將裝置上的共用對應至容器內的路徑。 以下是在 FPGA 裝置上使用的容器建立選項:

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

若為 Kubernetes 上 IoT Edge 的主機路徑,這裡會顯示搭配類型 bind 使用 Mounts 的範例:

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

若為在 Kubernetes 上執行 IoT Edge 的 GPU 裝置,磁碟區掛接用來指定儲存體。 若要使用共用來佈建儲存體,Mounts.Source 的值將是已在您 GPU 裝置上佈建的 SMB 或 NFS 共用名稱。 /home/input 是可在容器內存取磁碟區的路徑。 以下是在 GPU 裝置上使用的容器建立選項:

{
    "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"
        }]
    }
}

網路

指定 IoT Edge 模組的網路時,請考慮下列資訊。

  • 需要 HostPort 規格,才能公開叢集內外的服務。
    • K8sExperimental 選項,只限制將服務公開至叢集。
  • 模組間通訊需要 HostPort 規格,並使用對應的連接埠 (而不是使用容器公開的連接埠) 進行連線。
  • 主機網路會使用 dnsPolicy = ClusterFirstWithHostNet,而所有容器 (特別是 edgeHub) 不需要同時也在主機網路上。
  • 在相同要求中新增 TCP、UDP 的連接埠對應無法運作。

範例 - 模組的外部存取

對於任何指定連接埠繫結 IoT Edge 模組,都會使用裝置本機 UI 中指定的 Kubernetes 外部服務 IP 範圍來指派 IP 位址。 Docker 上的 IoT Edge 與 Kubernetes 上的 IoT Edge 之間沒有容器建立選項的變更,如下列範例所示。

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

不過,若要查詢指派給模組的 IP 位址,您可以使用 Kubernetes 儀表板,如取得服務或模組的 IP 位址中所述。

或者,您可以連線到裝置的 PowerShell 介面,並使用 iotedge list 命令列出您裝置上執行的所有模組。 命令輸出也會指出與模組相關聯的外部 IP。

資源使用量

透過 GPU 裝置上的 Kubernetes 型 IoT Edge 設定,會以不同於 FPGA 裝置上的方式指定硬體加速、記憶體和 CPU 需求等資源。

計算加速使用量

若要在 FPGA 上部署模組,請使用容器建立選項 ,如下列設定所示:

{
    "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"
    ]
}

針對 GPU,請使用資源要求規格,而不是裝置繫結,如下列最小設定所示。 您要求 nvidia 資源,而不是 catapult,而且您不需要指定 wireserver

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

記憶體和 CPU 使用量

若要設定記憶體和 CPU 使用量,請使用 k8s-experimental 區段中模組的處理器限制。

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

記憶體和 CPU 規格並非必要,但通常卻是很好的做法。 如果未指定 requests,則限制中設定的值會用作所需的最小值。

針對模組使用共用記憶體也需要不同的方式。 例如,您可以使用主機 IPC 模式,在即時影片分析與推斷解決方案之間進行共用記憶體存取,如在 Azure Stack Edge 上部署即時影片分析中所述。

Web Proxy

設定 Web Proxy 時,請考慮下列資訊:

如果您已在網路中設定 Web Proxy,請在 FPGA 裝置的 Docker 型 IoT Edge 設定上,針對 edgeHub 部署設定下列環境變數:

  • https_proxy : <proxy URL>
  • UpstreamProtocol : AmqpWs (除非 Web Proxy 允許 Amqp 流量)

對於 GPU 裝置上的 Kubernetes 型 IoT Edge 設定,您必須在部署期間設定此額外的變數:

  • no_proxy:localhost

  • Kubernetes 平台上的 IoT Edge Proxy 會使用連接埠 35000 和 35001。 確定您的模組不會在這些連接埠上執行,否則可能會導致連接埠衝突。

其他差異

  • 部署策略:您可能需要變更部署行為,才能對模組進行任何更新。 IoT Edge 模組的預設行為是輪流更新。 如果模組正在使用硬體加速或網路連接埠等資源,此行為可防止更新的模組重新啟動。 此行為可能具有非預期的影響,特別是在 GPU 裝置的 Kubernetes 平台上處理永續性磁碟區時。 若要覆寫此預設行為,您可以在模組的 k8s-experimental 區段中指定 Recreate

    {
      "k8s-experimental": {
        "strategy": {
          "type": "Recreate"
        }
      }
    }
    
  • 模組名稱:模組名稱應遵循 Kubernetes 命名慣例。 當您使用 Kubernetes 將這些模組移至 IoT Edge 時,可能需要使用 Docker 重新命名在 IoT Edge 上執行的模組。 如需命名的詳細資訊,請參閱 Kubernetes 命名慣例

  • 其他選項

    • 在 FPGA 裝置上運作的特定 Docker 建立選項不適用於 GPU 裝置上的 Kubernetes 環境。 例如:像是 – EntryPoint。
    • : 之類的環境變數需要由 __ 取代。
    • Kubernetes Pod 的容器建立中狀態會導致 IoT 中樞資源上模組的輪詢狀態。 雖然 Pod 處於此狀態有許多原因,但常見的原因是大型容器映像是透過低網路頻寬連線提取。 當 Pod 處於此狀態時,模組的狀態會在 IOT 中樞顯示為輪詢,但模組剛啟動。

下一步