教學課程:使用 PyTorch 將預先定型的影像分類模型部署到 Azure Functions
在本文中,您將了解如何使用 Python、PyTorch 和 Azure Functions 根據影像的內容載入預先定型的模型,以將影像分類。 您將在本機上執行所有工作,且不會在雲端中建立任何 Azure 資源,因此完成本教學課程並不會產生任何費用。
- 初始化本機環境以在 Python 中開發 Azure Functions。
- 將預先定型的 PyTorch 機器學習模型匯入至函式應用程式。
- 建置無伺服器 HTTP API,將影像分類為 1000 個 ImageNet 分類中的其中一種。
- 從 Web 應用程式取用 API。
必要條件
- 具有有效訂用帳戶的 Azure 帳戶。 免費建立帳戶。
- Python 3.7.4 或更新版本。 (Python 3.8. x 和 Python 3.6. x 也會使用 Azure Functions 進行驗證。)
- Azure Functions Core Tools
- 程式碼編輯器,例如 Visual Studio Code
先決條件檢查
- 在終端機或命令視窗中,執行
func --version
,以確認 Azure Functions Core Tools 為 2.7.1846 版或更新版本。 - 執行
python --version
(Linux/MacOS) 或py --version
(Windows),以確認您的 Python 版本回報為 3.7.x。
複製教學課程存放庫
在終端機或命令視窗中,使用 Git 複製下列存放庫:
git clone https://github.com/Azure-Samples/functions-python-pytorch-tutorial.git
瀏覽至資料夾,並檢查其內容。
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 端點。 您將在後續章節中新增更具體的程式碼。
在 start 資料夾中,使用 Azure Functions Core Tools 來初始化 Python 函式應用程式:
func init --worker-runtime python
初始化之後,start 資料夾會包含專案的各種檔案,包括名為 local.settings.json 和 host.json 的組態檔。 由於 local.settings.json 可能會包含從 Azure 下載的秘密,因此 .gitignore 檔案依預設會將該檔案排除在原始檔控制以外。
提示
由於函式專案會繫結至特定執行階段,因此專案中的所有函式都必須以相同的語言撰寫。
使用下列命令,將函式新增至您的專案,其中
--name
引數是函式的唯一名稱,而--template
引數可指定函式的觸發程序。func new
建立符合函式名稱的子資料夾,其中包含適合專案所選語言的程式碼檔案,以及名為 function.json 的組態檔。func new --name classify --template "HTTP trigger"
此命令會建立符合函式名稱的資料夾,即 classify。 該資料夾中有兩個檔案:__init__.py 包含函式程式碼,而 function.json 則描述函式的觸發程序及其輸入和輸出繫結。 如需這些檔案內容的詳細資料,請參閱 Python 開發人員指南中的 程式設計模型。
在本機執行函式
啟動 start 資料夾中的本機 Azure Functions 執行階段主機,以啟動函式:
func start
如果您看到
classify
端點出現在輸出中,請瀏覽至 URLhttp://localhost:7071/api/classify?name=Azure
。 輸出結果應顯示訊息「Hello Azure!」。使用 Ctrl-C 將主機停止。
匯入 PyTorch 模型並新增協助程式程式碼
若要修改 classify
函式以根據影像的內容來分類,您可以使用預先定型的 ResNet 模型。 預先定型的模型 (來自 PyTorch) 會將影像分類為 1000 個 ImageNet 類別中的其中 1 種。 接著,您可以將一些協助程式碼和相依性新增至您的專案。
在 [start] 資料夾中執行下列命令,將預測程式碼和標籤複製到 [classify] 資料夾中。
cp ../resources/predict.py classify cp ../resources/labels.txt classify
確認 classify 資料夾包含名為 predict.py 和 labels.txt 的檔案。 如果沒有,請確認您已執行 start 資料夾中的命令。
在文字編輯器中開啟 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 存放庫的版本表中所列的值相符。
儲存 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 解譯器的安裝位置。 如果該位置具有長路徑,請嘗試在路徑較短的資料夾中重新安裝。
更新函式以執行預測
在文字編輯器中開啟 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
將
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) 需求。在生產應用程式中,將
*
變更為網頁的特定來源以提高安全性。儲存您的變更,然後假設相依性已完成安裝,使用
func start
重新啟動本機函式主機。 請務必在已啟用虛擬環境的 start 資料夾中執行主機。 否則,主機將會啟動,但您會在叫用函式時會看到錯誤。func start
在瀏覽器中開啟下列 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
讓主機保持執行狀態,因為您在後續步驟將會用到此主機。
執行本機 Web 應用程式前端以測試函式
若要測試從另一個 Web 應用程式叫用函式端點的功能,存放庫的 frontend 資料夾中有一個簡單的應用程式可供使用。
開啟新的終端機或命令提示字元,並啟用虛擬環境 (如先前的建立並啟用 Python 虛擬環境所說明)。
瀏覽至存放庫的 frontend 資料夾。
使用 Python 啟動 HTTP 伺服器:
python -m http.server
在瀏覽器中瀏覽至
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
選取 [提交] 叫用函式端點,以進行影像分類。
如果瀏覽器在您提交影像 URL 時回報了錯誤,請檢查函式應用程式執行所在的終端機。 如果您看到「找不到模組 'PIL'」之類的錯誤,表示您可能未事先啟用先前建立的虛擬環境,即在 start 資料夾中啟動了函式應用程式。 如果您仍看到錯誤,請在啟用虛擬環境後再次執行
pip install -r requirements.txt
,並觀察是否有錯誤。
清除資源
本教學課程全都會在機器本機上執行,因此並沒有需要清除的 Azure 資源或服務。
下一步
在本教學課程中,您已了解如何使用 Azure Functions 來建置和自訂 HTTP API 端點,以使用 PyTorch 模型來分類影像。 您也已了解如何從 Web 應用程式呼叫 API。 不論多麼複雜的 API 都可以使用本教學課程的技術來建置,而且都在 Azure Functions 提供的無伺服器計算模型上執行。
另請參閱: