共用方式為


教學課程:使用 PyTorch 將預先定型的影像分類模型部署到 Azure Functions

在本文中,您將了解如何使用 Python、PyTorch 和 Azure Functions 根據影像的內容載入預先定型的模型,以將影像分類。 您將在本機上執行所有工作,且不會在雲端中建立任何 Azure 資源,因此完成本教學課程並不會產生任何費用。

  • 初始化本機環境以在 Python 中開發 Azure Functions。
  • 將預先定型的 PyTorch 機器學習模型匯入至函式應用程式。
  • 建置無伺服器 HTTP API,將影像分類為 1000 個 ImageNet 分類中的其中一種。
  • 從 Web 應用程式取用 API。

必要條件

先決條件檢查

  1. 在終端機或命令視窗中,執行 func --version,以確認 Azure Functions Core Tools 為 2.7.1846 版或更新版本。
  2. 執行 python --version (Linux/macOS) 或 py --version (Windows) 來檢查 Python 版本報告 3.7.x。

複製教學課程存放庫

  1. 在終端機或命令視窗中,使用 Git 複製下列存放庫:

    git clone https://github.com/Azure-Samples/functions-python-pytorch-tutorial.git
    
  2. 瀏覽至資料夾,並檢查其內容。

    cd functions-python-pytorch-tutorial
    
    • start 是教學課程的工作資料夾。
    • end 是供您參考的最終結果和完整實作。
    • resources 包含機器學習模型和協助程式庫。
    • frontend 是呼叫函式應用程式的網站。

建立並啟用 Python 虛擬環境

瀏覽至start 資料夾,並執行下列命令以建立並啟用名為 .venv 的虛擬環境。

cd start
python -m venv .venv
source .venv/bin/activate

如果 Python 未在您的 Linux 發行版本上安裝 venv 套件,請執行下列命令:

sudo apt-get install python3-venv

您將在這個已啟用的虛擬環境中執行所有後續命令。 (若要退出虛擬環境,請執行 deactivate。)

建立本機 Functions 專案

在 Azure Functions 中,函式專案是包含一或多個個別函式的容器,而每個函式分別會回應特定的觸發程序。 專案中的所有函式會共用相同的本機和裝載設定。 在本節中,您將建立一個函式專案,其中包含名為 classify 的單一重複使用函式,可提供 HTTP 端點。 您將在後續章節中新增更具體的程式碼。

  1. 在 start 資料夾中,使用 Azure Functions Core Tools 來初始化 Python 函式應用程式:

    func init --worker-runtime python
    

    初始化之後,start 資料夾會包含專案的各種檔案,包括名為 local.settings.jsonhost.json 的組態檔。 由於 local.settings.json 可能會包含從 Azure 下載的秘密,因此 .gitignore 檔案依預設會將該檔案排除在原始檔控制以外。

    提示

    由於函式專案會繫結至特定執行階段,因此專案中的所有函式都必須以相同的語言撰寫。

  2. 使用下列命令,將函式新增至您的專案,其中 --name 引數是函式的唯一名稱,而 --template 引數可指定函式的觸發程序。 func new 建立符合函式名稱的子資料夾,其中包含適合專案所選語言的程式碼檔案,以及名為 function.json 的組態檔。

    func new --name classify --template "HTTP trigger"
    

    此命令會建立符合函式名稱的資料夾,即 classify。 該資料夾中有兩個檔案:__init__.py 包含函式程式碼,而 function.json 則描述函式的觸發程序及其輸入和輸出繫結。 如需這些檔案內容的詳細資料,請參閱 Python 開發人員指南中的 程式設計模型

在本機執行函式

  1. 啟動 start 資料夾中的本機 Azure Functions 執行階段主機,以啟動函式:

    func start
    
  2. 如果您看到 classify 端點出現在輸出中,請瀏覽至 URL http://localhost:7071/api/classify?name=Azure。 輸出結果應顯示訊息「Hello Azure!」。

  3. 使用 Ctrl-C 將主機停止。

匯入 PyTorch 模型並新增協助程式程式碼

若要修改 classify 函式以根據影像的內容來分類,您可以使用預先定型的 ResNet 模型。 預先定型的模型 (來自 PyTorch) 會將影像分類為 1000 個 ImageNet 類別中的其中 1 種。 接著,您可以將一些協助程式碼和相依性新增至您的專案。

  1. 在 [start] 資料夾中執行下列命令,將預測程式碼和標籤複製到 [classify] 資料夾中。

    cp ../resources/predict.py classify
    cp ../resources/labels.txt classify
    
  2. 確認 classify 資料夾包含名為 predict.py 和 labels.txt 的檔案。 如果沒有,請確認您已執行 start 資料夾中的命令。

  3. 在文字編輯器中開啟 start/requirements.txt,並新增協助程式程式碼所需相依性,其應如下所示:

    azure-functions
    requests
    -f https://download.pytorch.org/whl/torch_stable.html
    torch==1.13.0+cpu
    torchvision==0.14.0+cpu
    

    提示

    torch 和 torchvision 的版本必須與 PyTorch vision 存放庫的版本表中所列的值相符。

  4. 儲存 requirements.txt,然後從 [start] 資料夾執行下列命令,以安裝相依性。

    pip install --no-cache-dir -r requirements.txt
    

安裝可能需要幾分鐘的時間,在這段期間,您可以繼續修改下一節中的函式。

提示

在 Windows 上,如果檔案的路徑名稱較長 (例如 sharded_mutable_dense_hashtable.cpython-37.pyc),則可能會出現錯誤「無法安裝套件,因為發生 EnvironmentError:[Errno 2] 沒有此類檔案或目錄:」。 之所以發生此錯誤,通常是因為資料夾路徑的深度太長所致。 在此情況下,請將登錄機碼 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled 設定為 1,以啟用長路徑。 或者,請檢查 Python 解譯器的安裝位置。 如果該位置具有長路徑,請嘗試在路徑較短的資料夾中重新安裝。

更新函式以執行預測

  1. 在文字編輯器中開啟 classify/__init__.py,並在現有的 import 陳述式後面新增以下幾行,以匯入標準 JSON 程式庫和 predict 協助程式:

    import logging
    import azure.functions as func
    import json
    
    # Import helper script
    from .predict import predict_image_from_url
    
  2. main 函式的整個內容取代為下列程式碼:

    def main(req: func.HttpRequest) -> func.HttpResponse:
        image_url = req.params.get('img')
        logging.info('Image URL received: ' + image_url)
    
        results = predict_image_from_url(image_url)
    
        headers = {
            "Content-type": "application/json",
            "Access-Control-Allow-Origin": "*"
        }
    
        return func.HttpResponse(json.dumps(results), headers = headers)
    

    此函式會在名為 img 的查詢字串參數中接收影像 URL。 接著會從協助程式程式庫呼叫 predict_image_from_url,以下載影像並使用 PyTorch 模型加以分類。 然後,函式會傳回包含結果的 HTTP 回應。

    重要

    由於此 HTTP 端點會由裝載於另一個網域的網頁呼叫,因此回應會包含 Access-Control-Allow-Origin 標頭以符合瀏覽器的跨原始來源資源共用 (CORS) 需求。

    在生產應用程式中,將 * 變更為網頁的特定來源以提高安全性。

  3. 儲存您的變更,然後假設相依性已完成安裝,使用 func start 重新啟動本機函式主機。 請務必在已啟用虛擬環境的 start 資料夾中執行主機。 否則,主機將會啟動,但您會在叫用函式時會看到錯誤。

    func start
    
  4. 在瀏覽器中開啟下列 URL,以使用伯恩山犬影像的 URL 叫用函式,並確認傳回的 JSON 將影像分類為伯恩山犬。

    http://localhost:7071/api/classify?img=https://raw.githubusercontent.com/Azure-Samples/functions-python-pytorch-tutorial/master/resources/assets/Bernese-Mountain-Dog-Temperament-long.jpg
    
  5. 讓主機保持執行狀態,因為您在後續步驟將會用到此主機。

執行本機 Web 應用程式前端以測試函式

若要測試從另一個 Web 應用程式叫用函式端點的功能,存放庫的 frontend 資料夾中有一個簡單的應用程式可供使用。

  1. 開啟新的終端機或命令提示字元,並啟用虛擬環境 (如先前的建立並啟用 Python 虛擬環境所說明)。

  2. 瀏覽至存放庫的 frontend 資料夾。

  3. 使用 Python 啟動 HTTP 伺服器:

    python -m http.server
    
  4. 在瀏覽器中瀏覽至 localhost:8000,然後在文字方塊中輸入下列其中一個相片 URL,或使用任何可公開存取之影像的 URL。

    • https://raw.githubusercontent.com/Azure-Samples/functions-python-pytorch-tutorial/master/resources/assets/Bernese-Mountain-Dog-Temperament-long.jpg
    • https://github.com/Azure-Samples/functions-python-pytorch-tutorial/blob/master/resources/assets/bald-eagle.jpg?raw=true
    • https://raw.githubusercontent.com/Azure-Samples/functions-python-pytorch-tutorial/master/resources/assets/penguin.jpg
  5. 選取 [提交] 叫用函式端點,以進行影像分類。

    已完成項目的螢幕快照

    如果瀏覽器在您提交影像 URL 時回報了錯誤,請檢查函式應用程式執行所在的終端機。 如果您看到「找不到模組 'PIL'」之類的錯誤,表示您可能未事先啟用先前建立的虛擬環境,即在 start 資料夾中啟動了函式應用程式。 如果您仍看到錯誤,請在啟用虛擬環境後再次執行 pip install -r requirements.txt,並觀察是否有錯誤。

清除資源

本教學課程全都會在機器本機上執行,因此並沒有需要清除的 Azure 資源或服務。

下一步

在本教學課程中,您已了解如何使用 Azure Functions 來建置和自訂 HTTP API 端點,以使用 PyTorch 模型來分類影像。 您也已了解如何從 Web 應用程式呼叫 API。 不論多麼複雜的 API 都可以使用本教學課程的技術來建置,而且都在 Azure Functions 提供的無伺服器計算模型上執行。

另請參閱: