Kayıtlı R modelini çevrimiçi (gerçek zamanlı) uç noktaya dağıtma

ŞUNUN IÇIN GEÇERLIDIR: Azure CLI ml uzantısı v2 (geçerli)

Bu makalede, uygulamanızın modele göre neredeyse gerçek zamanlı olarak yeni veriler puanlayabilmesi için bir R modelini yönetilen uç noktaya (Web API' sine) dağıtmayı öğreneceksiniz.

Önkoşullar

Bu yapıya sahip bir klasör oluşturun

Projeniz için şu klasör yapısını oluşturun:

📂 r-deploy-azureml
 ├─📂 docker-context
 │  ├─ Dockerfile
 │  └─ start_plumber.R
 ├─📂 src
 │  └─ plumber.R
 ├─ deployment.yml
 ├─ endpoint.yml

Bu dosyaların her birinin içeriği bu makalede gösterilmiştir ve açıklanmıştır.

Dockerfile

Bu, kapsayıcı ortamını tanımlayan dosyadır. Ayrıca burada ek R paketlerinin yüklenmesini de tanımlayacaksınız.

Örnek bir Dockerfile şöyle görünür:

# REQUIRED: Begin with the latest R container with plumber
FROM rstudio/plumber:latest

# REQUIRED: Install carrier package to be able to use the crated model (whether from a training job
# or uploaded)
RUN R -e "install.packages('carrier', dependencies = TRUE, repos = 'https://cloud.r-project.org/')"

# OPTIONAL: Install any additional R packages you may need for your model crate to run
RUN R -e "install.packages('<PACKAGE-NAME>', dependencies = TRUE, repos = 'https://cloud.r-project.org/')"
RUN R -e "install.packages('<PACKAGE-NAME>', dependencies = TRUE, repos = 'https://cloud.r-project.org/')"

# REQUIRED
ENTRYPOINT []

COPY ./start_plumber.R /tmp/start_plumber.R 

CMD ["Rscript", "/tmp/start_plumber.R"]

Puanlama betiğiniz için ihtiyacınız olan paketleri eklemek için dosyayı değiştirin.

Tesisatçı. R

Önemli

Bu bölümde tesisatçının nasıl yapılandırılası gösterilmektedir . R betiği. Paket hakkında ayrıntılı bilgi için plumber belgelere bakınplumber .

Dosya tesisatçısı. R , puanlama işlevini tanımlayabileceğiniz R betiğidir. Bu betik, uç noktanızın çalışması için gereken görevleri de gerçekleştirir. Betik şunları yapar:

  • Modelin kapsayıcıdaki ortam değişkeninden AZUREML_MODEL_DIR bağlandığı yolu alır.
  • paketlendiğinde crate.bin olarak kaydedilen paketten carrier işleviyle crate oluşturulan bir model nesnesini yükler.
  • Model nesnesinin seri durumdan çıkarılma
  • Puanlama işlevini tanımlar

Bahşiş

Puanlama işlevinizin ürettiği her şeyin JSON'a geri dönüştürülediğinden emin olun. Bazı R nesneleri kolayca dönüştürülmez.

# plumber.R
# This script will be deployed to a managed endpoint to do the model scoring

# REQUIRED
# When you deploy a model as an online endpoint, Azure Machine Learning mounts your model
# to your endpoint. Model mounting enables you to deploy new versions of the model without
# having to create a new Docker image.

model_dir <- Sys.getenv("AZUREML_MODEL_DIR")

# REQUIRED
# This reads the serialized model with its respecive predict/score method you 
# registered. The loaded load_model object is a raw binary object.
load_model <- readRDS(paste0(model_dir, "/models/crate.bin"))

# REQUIRED
# You have to unserialize the load_model object to make it its function
scoring_function <- unserialize(load_model)

# REQUIRED
# << Readiness route vs. liveness route >>
# An HTTP server defines paths for both liveness and readiness. A liveness route is used to
# check whether the server is running. A readiness route is used to check whether the 
# server's ready to do work. In machine learning inference, a server could respond 200 OK 
# to a liveness request before loading a model. The server could respond 200 OK to a
# readiness request only after the model has been loaded into memory.

#* Liveness check
#* @get /live
function() {
  "alive"
}

#* Readiness check
#* @get /ready
function() {
  "ready"
}

# << The scoring function >>
# This is the function that is deployed as a web API that will score the model
# Make sure that whatever you are producing as a score can be converted 
# to JSON to be sent back as the API response
# in the example here, forecast_horizon (the number of time units to forecast) is the input to scoring_function.  
# the output is a tibble
# we are converting some of the output types so they work in JSON


#* @param forecast_horizon 
#* @post /score
function(forecast_horizon) {
  scoring_function(as.numeric(forecast_horizon)) |> 
    tibble::as_tibble() |> 
    dplyr::transmute(period = as.character(yr_wk),
                     dist = as.character(logmove),
                     forecast = .mean) |> 
    jsonlite::toJSON()
}

start_plumber. R

Dosya start_plumber. R , kapsayıcı başlatıldığında çalıştırılacak R betiğidir ve tesisatçınızı çağırır. R betiği. Aşağıdaki betiği olduğu gibi kullanın.

entry_script_path <- paste0(Sys.getenv('AML_APP_ROOT'),'/', Sys.getenv('AZUREML_ENTRY_SCRIPT'))

pr <- plumber::plumb(entry_script_path)

args <- list(host = '0.0.0.0', port = 8000); 

if (packageVersion('plumber') >= '1.0.0') {
  pr$setDocs(TRUE)
} else { 
  args$swagger <- TRUE 
} 

do.call(pr$run, args)

Kapsayıcı oluşturma

Bu adımlarda, çalışma alanınızla ilişkilendirilmiş ve ilk özel ortamınızı oluştururken oluşturulan bir Azure Container Registry'niz olduğu varsayılır. Özel bir ortamınız olup olmadığını görmek için:

  1. Azure Machine Learning stüdyosu oturum açın.
  2. Gerekirse çalışma alanınızı seçin.
  3. Sol gezinti bölmesinde Ortamlar'ı seçin.
  4. Üst kısımda Özel ortamlar'ı seçin.
  5. Özel ortamlar görürseniz, başka bir şey gerekmez.
  6. Özel ortam görmüyorsanız bir R ortamı veya başka bir özel ortam oluşturun. (Bu ortamı dağıtım için kullanmayacaksınız, ancak sizin için de oluşturulan kapsayıcı kayıt defterini kullanacaksınız.)

En az bir özel ortamınız olduğunu doğruladıktan sonra, kapsayıcı oluşturmak için aşağıdaki adımları kullanın.

  1. Bir terminal penceresi açın ve Azure'da oturum açın. Bunu bir Azure Machine Learning işlem örneğinden yapıyorsanız şunu kullanın:

    az login --identity
    

    İşlem örneğinde değilseniz, kimlik doğrulaması için bir tarayıcı penceresi açmak için istemi atlayıp --identity izleyin.

  2. CLI'nın ve uzantının en son sürümlerine sahip olduğunuzdan ml emin olun:

    az upgrade
    
  3. Birden çok Azure aboneliğiniz varsa, etkin aboneliği çalışma alanınız için kullandığınız abonelik olarak ayarlayın. (Yalnızca tek bir aboneliğe erişiminiz varsa bu adımı atlayabilirsiniz.) değerini abonelik adınız ile değiştirin <SUBSCRIPTION-NAME> . Ayrıca köşeli ayraçları <>da kaldırın.

    az account set --subscription "<SUBSCRIPTION-NAME>"
    
  4. Varsayılan çalışma alanını ayarlayın. Bunu bir işlem örneğinden yapıyorsanız, aşağıdaki komutu olduğu gibi kullanabilirsiniz. Başka bir bilgisayardaysanız, bunun yerine kaynak grubunuzu ve çalışma alanı adınızı değiştirin. (Bu değerleri Azure Machine Learning stüdyosu.)

    az configure --defaults group=$CI_RESOURCE_GROUP workspace=$CI_WORKSPACE
    
  5. Proje dizininizde olduğunuzdan emin olun.

    cd r-deploy-azureml
    
  6. Görüntüyü bulutta oluşturmak için terminalinizde aşağıdaki bash komutlarını yürütebilirsiniz. yerine <IMAGE-NAME> resmi vermek istediğiniz adı yazın.

    Çalışma alanınız bir sanal ağdaysa, bu kodun son satırındaki komuta eklenecek az acr build--image-build-compute ek adımlar için bkz. Azure Container Registry'yi (ACR) etkinleştirme.

    WORKSPACE=$(az config get --query "defaults[?name == 'workspace'].value" -o tsv)
    ACR_NAME=$(az ml workspace show -n $WORKSPACE --query container_registry -o tsv | cut -d'/' -f9-)
    IMAGE_TAG=${ACR_NAME}.azurecr.io/<IMAGE-NAME>
    
    az acr build ./docker-context -t $IMAGE_TAG -r $ACR_NAME
    

Önemli

Görüntünün derlenmiş olması birkaç dakika sürer. Sonraki bölüme geçmeden önce derleme işleminin tamamlanmasını bekleyin. Bu terminali kapatmayın, dağıtımı oluşturmak için yanındaki terminali kullanacaksınız.

Komut, az acr görüntüyü derlemek için yapıtları içeren docker-context klasörünüzü otomatik olarak görüntünün derlendiği ve bir Azure Container Registry'de barındırılacağı buluta yükler.

Model dağıtma

Makalenin bu bölümünde, önceki adımlarda oluşturulan modeli ve görüntüyü yönetilen bir çevrimiçi uç noktaya dağıtmak için bir uç nokta ve dağıtım tanımlayacak ve oluşturacaksınız.

Uç nokta, istemcilerin (uygulama gibi) eğitilmiş bir modelin puanlama çıkışını almak için çağırabileceği bir HTTPS uç noktasıdır. Şunları sağlar:

  • "Anahtar ve belirteç" tabanlı kimlik doğrulaması kullanarak kimlik doğrulaması
  • SSL sonlandırma
  • Kararlı bir puanlama URI'si (endpoint-name.region.inference.ml.Azure.com)

Dağıtım, gerçek puanlama işlemini yapan modeli barındırmak için gereken bir kaynak kümesidir. Tekbir uç nokta birden çokdağıtım içerebilir. Azure Machine Learning yönetilen uç noktalarının yük dengeleme özellikleri, her dağıtıma trafiğin herhangi bir yüzdesini vermenizi sağlar. Trafik ayırma, farklı örnekler arasındaki istekleri dengeleyerek mavi/yeşil dağıtımları güvenli bir şekilde dağıtmak için kullanılabilir.

Yönetilen çevrimiçi uç nokta oluşturma

  1. Proje dizininize endpoint.yml dosyasını aşağıdaki kodla ekleyin. değerini yönetilen uç noktanıza vermek istediğiniz adla değiştirin <ENDPOINT-NAME> .

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
    name: <ENDPOINT-NAME>
    auth_mode: aml_token
    
  2. Görüntüyü oluşturduğunuz terminali kullanarak aşağıdaki CLI komutunu yürüterek bir uç nokta oluşturun:

    az ml online-endpoint create -f endpoint.yml
    
  3. Sonraki bölümde kullanmaya devam etmek için terminali açık bırakın.

Dağıtım oluşturma

  1. Dağıtımınızı oluşturmak için deployment.yml dosyasına aşağıdaki kodu ekleyin.

    • değerini endpoint.yml dosyasında tanımladığınız uç nokta adıyla değiştirin <ENDPOINT-NAME>

    • değerini dağıtıma vermek istediğiniz adla değiştirin <DEPLOYMENT-NAME>

    • değerini kayıtlı modelin URI'siyle şu biçimde değiştirin <MODEL-URI> : azureml:modelname@latest

    • değerini şu değerle değiştirin <IMAGE-TAG> :

      echo $IMAGE_TAG
      
    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: <DEPLOYMENT-NAME>
    endpoint_name: <ENDPOINT-NAME>
    code_configuration:
      code: ./src
      scoring_script: plumber.R
    model: <MODEL-URI>
    environment:
      image: <IMAGE-TAG>
      inference_config:
        liveness_route:
          port: 8000
          path: /live
        readiness_route:
          port: 8000
          path: /ready
        scoring_route:
          port: 8000
          path: /score
    instance_type: Standard_DS2_v2
    instance_count: 1
    
  2. Ardından terminalinizde aşağıdaki CLI komutunu yürüterek dağıtımı oluşturun (trafiğin %100'unu bu modele ayarladığınıza dikkat edin):

    az ml online-deployment create -f deployment.yml --all-traffic --skip-script-validation
    

Dekont

Hizmetin dağıtılması birkaç dakika sürebilir. Sonraki bölüme geçmeden önce dağıtımın tamamlanmasını bekleyin.

Test etme

Dağıtımınız başarıyla oluşturulduktan sonra, studio veya CLI kullanarak uç noktayı test edebilirsiniz:

Azure Machine Learning stüdyosu gidin ve sol taraftaki Uç Noktalar menüsünden öğesini seçin. Ardından, daha önce oluşturduğunuz r-endpoint-iris öğesini seçin.

Gerçek zamanlı uç nokta metin kutusuna giriş verilerine aşağıdaki json kodunu girin:

{
    "forecast_horizon" : [2]
}

Test'i seçin. Aşağıdaki çıkışı görmeniz gerekir:

Screenshot shows results from testing a model.

Kaynakları temizleme

Artık uç noktanızla başarılı bir şekilde puanladığınıza göre, devam eden maliyetler doğurmaması için bu puanı silebilirsiniz:

az ml online-endpoint delete --name r-endpoint-forecast

Sonraki adımlar

Azure Machine Learning ile R kullanma hakkında daha fazla bilgi için bkz . Azure Machine Learning'de R özelliklerine genel bakış