Öğretici: PyTorch ile Azure İşlevleri için önceden eğitilmiş bir görüntü sınıflandırma modeli dağıtma
Bu makalede, python, PyTorch ve Azure İşlevleri kullanarak bir görüntüyü içeriğine göre sınıflandırmak için önceden eğitilmiş bir model yüklemeyi öğreneceksiniz. Tümünü yerel olarak yaptığınız ve bulutta Azure kaynağı oluşturmadığınız için bu öğreticiyi tamamlamanız gerekmez.
- Python'da Azure İşlevleri geliştirmek için yerel bir ortam başlatın.
- Önceden eğitilmiş bir PyTorch makine öğrenmesi modelini bir işlev uygulamasına içeri aktarın.
- Görüntüyü 1000 ImageNet sınıfından biri olarak sınıflandırmak için sunucusuz bir HTTP API'si oluşturun.
- Web uygulamasından API’yi kullanma.
Önkoşullar
- Etkin aboneliği olan bir Azure hesabı. Ücretsiz bir hesap oluşturun.
- Python 3.7.4 veya üzeri. (Python 3.8.x ve Python 3.6.x de Azure İşlevleri ile doğrulanır.)
- Azure İşlevleri Temel Araçları
- Visual Studio Code gibi bir kod düzenleyicisi
Önkoşul denetimi
- Terminalde veya komut penceresinde, Azure İşlevleri Core Tools'un 2.7.1846 veya sonraki bir sürüm olup olmadığını denetlemek için komutunu çalıştırın
func --version
. - Python sürüm raporlarınızı 3.7.x denetlemek için (Linux/MacOS) veya
py --version
(Windows) komutunu çalıştırınpython --version
.
Öğretici deposunu kopyalama
Terminal veya komut penceresinde Git'i kullanarak aşağıdaki depoyu kopyalayın:
git clone https://github.com/Azure-Samples/functions-python-pytorch-tutorial.git
Klasöre gidin ve içeriğini inceleyin.
cd functions-python-pytorch-tutorial
- başlangıç , öğretici için çalışma klasörünüzdür.
- end , başvurunuzun nihai sonucu ve tam uygulamasıdır.
- kaynakları makine öğrenmesi modelini ve yardımcı kitaplıklarını içerir.
- ön uç , işlev uygulamasını çağıran bir web sitesidir.
Python sanal ortamı oluşturma ve etkinleştirme
başlangıç klasörüne gidin ve adlı .venv
sanal ortamı oluşturmak ve etkinleştirmek için aşağıdaki komutları çalıştırın.
cd start
python -m venv .venv
source .venv/bin/activate
Python Venv paketini Linux dağıtımınıza yüklemediyse aşağıdaki komutu çalıştırın:
sudo apt-get install python3-venv
Bu etkinleştirilmiş sanal ortamda sonraki tüm komutları çalıştırırsınız. (Sanal ortamdan çıkmak için komutunu çalıştırın deactivate
.)
Yerel işlevler projesi oluşturma
Azure İşlevleri işlev projesi, her birinin belirli bir tetikleyiciye yanıt verdiği bir veya daha fazla işlev için kapsayıcıdır. Projedeki tüm işlevler aynı yerel ve barındırma yapılandırmalarını paylaşır. Bu bölümde, HTTP uç noktası sağlayan adlı classify
tek bir ortak işlev içeren bir işlev projesi oluşturursunuz. Daha sonraki bir bölümde daha ayrıntılı kod ekleyebilirsiniz.
Başlangıç klasöründe Azure İşlevleri Temel Araçları'nı kullanarak bir Python işlev uygulaması başlatın:
func init --worker-runtime python
Başlatma işleminden sonra başlangıç klasörü, local.settings.json ve host.json adlı yapılandırma dosyaları da dahil olmak üzere proje için çeşitli dosyalar içerir. local.settings.json Azure'dan indirilen gizli dizileri içerebileceğinden, dosya .gitignore dosyasında varsayılan olarak kaynak denetiminden dışlanır.
İpucu
İşlev projesi belirli bir çalışma zamanına bağlı olduğundan, projedeki tüm işlevlerin aynı dille yazılması gerekir.
Aşağıdaki komutu kullanarak projenize bir işlev ekleyin. Burada
--name
bağımsız değişken işlevinizin benzersiz adıdır ve--template
bağımsız değişken işlevin tetikleyicisini belirtir.func new
projenin seçilen diline uygun bir kod dosyası ve function.json adlı bir yapılandırma dosyası içeren işlev adıyla eşleşen bir alt klasör oluşturun.func new --name classify --template "HTTP trigger"
Bu komut işlevin adıyla eşleşen bir klasör oluşturur ve sınıflandırır. Bu klasörde iki dosya vardır: işlev kodunu içeren __init__.py ve işlevin tetikleyicisini ve giriş ve çıkış bağlamalarını açıklayan function.json. Bu dosyaların içeriği hakkında ayrıntılı bilgi için Python geliştirici kılavuzundaki Programlama modeli bölümüne bakın.
İşlevi yerel olarak çalıştırma
Başlangıç klasöründe yerel Azure İşlevleri çalışma zamanı konasını başlatarak işlevi başlatın:
func start
Çıkışta uç noktanın
classify
göründüğünü gördüğünüzde URL'yehttp://localhost:7071/api/classify?name=Azure
gidin. Çıkışta "Hello Azure!" iletisi görünmelidir.Konağı durdurmak için Ctrl-C kullanın.
PyTorch modelini içeri aktarma ve yardımcı kod ekleme
bir görüntüyü içeriğine göre sınıflandırmak üzere işlevini değiştirmek classify
için önceden eğitilmiş bir ResNet modeli kullanırsınız.
PyTorch'tan gelen önceden eğitilmiş model, bir görüntüyü 1000 ImageNet sınıfından 1'inde sınıflandırır. Ardından projenize bazı yardımcı kodlar ve bağımlılıklar eklersiniz.
Start klasöründe aşağıdaki komutu çalıştırarak tahmin kodunu ve etiketlerini classify klasörüne kopyalayın.
cp ../resources/predict.py classify cp ../resources/labels.txt classify
Classify klasörünün predict.py ve labels.txtadlı dosyalar içerdiğini doğrulayın. Aksi takdirde , komutu başlat klasöründe çalıştırıp çalıştırmadığınızdan denetleyin.
Başlat/requirements.txt bir metin düzenleyicisinde açın ve yardımcı kodun gerektirdiği bağımlılıkları ekleyin. Bu, aşağıdaki gibi görünmelidir:
azure-functions requests -f https://download.pytorch.org/whl/torch_stable.html torch==1.13.0+cpu torchvision==0.14.0+cpu
İpucu
Torch ve torchvision sürümlerinin PyTorch görüntü deposunun sürüm tablosunda listelenen değerlerle eşleşmesi gerekir.
requirements.txtkaydedin ve ardından bağımlılıkları yüklemek için başlangıç klasöründen aşağıdaki komutu çalıştırın.
pip install --no-cache-dir -r requirements.txt
Yükleme birkaç dakika sürebilir ve bu süre boyunca sonraki bölümde işlevi değiştirmeye devam edebilirsiniz.
İpucu
Windows'da " EnvironmentError nedeniyle paketler yüklenemedi: [Errno 2] Böyle bir dosya veya dizin yok:" hatasını ve ardından sharded_mutable_dense_hashtable.cpython-37.pyc gibi bir dosyanın uzun yol adını alabilirsiniz. Bu hata genellikle klasör yolunun derinliği çok uzun hale geldiğinden oluşur. Bu durumda, uzun yolları etkinleştirmek için kayıt defteri anahtarını
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled
olarak1
ayarlayın. Alternatif olarak, Python yorumlayıcınızın yüklü olduğu yeri de kontrol edin. Bu konumun yolu uzunsa, daha kısa bir yolu olan bir klasöre yeniden yüklemeyi deneyin.
İşlevi tahminleri çalıştıracak şekilde güncelleştirme
Classify/__init__.py dosyasını bir metin düzenleyicisinde açın ve standart JSON kitaplığını ve tahmin yardımcılarını içeri aktarmak için mevcut
import
deyimlerden sonra aşağıdaki satırları ekleyin:import logging import azure.functions as func import json # Import helper script from .predict import predict_image_from_url
İşlevin tüm içeriğini
main
aşağıdaki kodla değiştirin: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)
Bu işlev adlı
img
sorgu dizesi parametresinde bir görüntü URL'si alır. Ardından PyTorch modelini kullanarak görüntüyü indirmek ve sınıflandırmak için yardımcı kitaplığından çağrılarpredict_image_from_url
. İşlev daha sonra sonuçlarla birlikte bir HTTP yanıtı döndürür.Önemli
Bu HTTP uç noktası başka bir etki alanında barındırılan bir web sayfası tarafından çağrıldığından, yanıt tarayıcının Çıkış Noktaları Arası Kaynak Paylaşımı (CORS) gereksinimlerini karşılayan bir
Access-Control-Allow-Origin
üst bilgi içerir.Üretim uygulamasında, ek güvenlik için web sayfasının özel çıkış noktasıyla değiştirin
*
.Değişikliklerinizi kaydedin, sonra bağımlılıkların yüklenmesinin tamamlandığını varsayarsak, yerel işlev ana bilgisayarını ile
func start
yeniden başlatın. Sanal ortamın etkinleştirildiği başlangıç klasöründe konağı çalıştırdığınızdan emin olun. Aksi takdirde konak başlatılır, ancak işlevi çağırırken hatalar görürsünüz.func start
Bir tarayıcıda, Bernese Mountain Dog görüntüsünün URL'siyle işlevi çağırmak için aşağıdaki URL'yi açın ve döndürülen JSON dosyasının görüntüyü Bernese Mountain Dog olarak sınıflandırır.
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
Sonraki adımda kullandığınız için konağı çalışır durumda tutun.
İşlevi test etmek için yerel web uygulaması ön ucunu çalıştırma
İşlev uç noktasını başka bir web uygulamasından çağırmayı test etmek için deponun ön uç klasöründe basit bir uygulama vardır.
Yeni bir terminal veya komut istemi açın ve sanal ortamı etkinleştirin (daha önce Python sanal ortamı oluşturma ve etkinleştirme bölümünde açıklandığı gibi).
Deponun ön uç klasörüne gidin.
Python ile bir HTTP sunucusu başlatın:
python -m http.server
Tarayıcıda adresine gidin, ardından metin kutusuna
localhost:8000
aşağıdaki fotoğraf URL'lerinden birini girin veya genel olarak erişilebilen herhangi bir resmin URL'sini kullanın.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
Görüntüyü sınıflandırmak üzere işlev uç noktasını çağırmak için Gönder'i seçin.
Görüntü URL'sini gönderdiğinizde tarayıcı bir hata bildirirse işlev uygulamasını çalıştırdığınız terminali denetleyin. "'PIL' modülü bulunamadı" gibi bir hata görürseniz, işlev uygulamasını daha önce oluşturduğunuz sanal ortamı etkinleştirmeden başlangıç klasöründe başlatmış olabilirsiniz. Hala hatalar görüyorsanız, sanal ortam etkinleştirildiğinde yeniden çalıştırın
pip install -r requirements.txt
ve hataları arayın.
Kaynakları temizleme
Bu öğreticinin tamamı makinenizde yerel olarak çalıştırıldığından temizlenir azure kaynakları veya hizmetleri yoktur.
Sonraki adımlar
Bu öğreticide, PyTorch modeli kullanarak görüntüleri sınıflandırmak için Azure İşlevleri ile bir HTTP API uç noktası oluşturmayı ve özelleştirmeyi öğrendiniz. Ayrıca bir web uygulamasından API'yi çağırmayı da öğrendinsiniz. Bu öğreticideki teknikleri kullanarak her türlü karmaşıklıkta API'ler oluşturabilir ve bunların tümünü Azure İşlevleri tarafından sağlanan sunucusuz işlem modelinde çalıştırabilirsiniz.
Ayrıca bkz: